From d951f4bbce1102ddab30e3a5f65ddac8ab221ac9 Mon Sep 17 00:00:00 2001 From: iximeow Date: Sat, 26 Jun 2021 01:32:08 -0700 Subject: add long-mode avx512 support, except for compressed displacements --- src/shared/evex.in | 4874 ++++++++++++++++++++++++++++++++++++++++++ src/shared/generated_evex.in | 1499 +++++++++++++ 2 files changed, 6373 insertions(+) create mode 100644 src/shared/evex.in create mode 100644 src/shared/generated_evex.in (limited to 'src/shared') diff --git a/src/shared/evex.in b/src/shared/evex.in new file mode 100644 index 0000000..e997cf0 --- /dev/null +++ b/src/shared/evex.in @@ -0,0 +1,4874 @@ +use super::OperandSpec; + +#[inline(never)] +pub(crate) fn read_evex>(bytes: &mut T, instruction: &mut Instruction, mut length: u8) -> Result<(), DecodeError> { + let evex_byte_one = bytes.next().ok_or(DecodeError::ExhaustedInput)?; + let evex_byte_two = bytes.next().ok_or(DecodeError::ExhaustedInput)?; + let evex_byte_three = bytes.next().ok_or(DecodeError::ExhaustedInput)?; + length += 3; + let p = evex_byte_two & 0x03; + let m = evex_byte_one & 0x03; + if m == 0 { + return Err(DecodeError::InvalidOpcode); + } + let m = m - 1; + // instead of enums for the lookup bits, these are used to select a TABLES entry in the first + // place + /* + let p = [ + EVEXOpcodePrefix::None, + EVEXOpcodePrefix::Prefix66, + EVEXOpcodePrefix::PrefixF3, + EVEXOpcodePrefix::PrefixF2, + ][p]; + let m = [ + Ok(EVEXOpcodeMap::Map0F), + Ok(EVEXOpcodeMap::Map0F38), + Ok(EVEXOpcodeMap::Map0F3A), + Err(DecodeError::InvalidOpcode), + ][m - 1]?; + */ + + let vp = ((evex_byte_three >> 3) & 1) << 4; + let vvvvv = ((evex_byte_two >> 3) & 0b1111) | vp; + + instruction.vex_reg = RegSpec { + bank: RegisterBank::X, + num: vvvvv ^ 0b11111 // `vvvvv` is provided in inverted form + }; + + instruction.prefixes.evex_from(evex_byte_one, evex_byte_two, evex_byte_three); + + let opc = bytes.next().ok_or(DecodeError::ExhaustedInput)?; + length += 1; + let table_idx = ((m << 2) | p) as usize; + let table = generated::TABLES[table_idx]; + if table as *const [_] == &generated::DUMMY[..] as *const [_] { + panic!("no table for m={}, p={}", m, p); + } + let mut index_lower = 0; + if instruction.prefixes.evex_unchecked().vex().l() { + index_lower |= 1; + } + if instruction.prefixes.evex_unchecked().lp() { + index_lower |= 2; + } + if let Ok(entry) = table.binary_search_by_key(&opc, |x| x.0) { + let (opcode, operand_code) = table[entry].1[index_lower]; + instruction.opcode = opcode; + read_evex_operands(bytes, instruction, operand_code, &mut length)?; + // TODO: apply rp and bp? + } else { + return Err(DecodeError::InvalidOpcode); + } + instruction.length = length; + Ok(()) +} + +fn deny_z(inst: &Instruction) -> Result<(), DecodeError> { + if inst.prefixes.evex_unchecked().merge() { + Err(DecodeError::InvalidOperand) + } else { + Ok(()) + } +} + +fn deny_vex_reg(inst: &Instruction) -> Result<(), DecodeError> { + if inst.vex_reg.num != 0 { + Err(DecodeError::InvalidOperand) + } else { + Ok(()) + } +} + +#[allow(non_snake_case)] +fn ensure_W(inst: &Instruction, w: u8) -> Result<(), DecodeError> { + if inst.prefixes.evex_unchecked().vex().w() ^ (w != 0) { + Err(DecodeError::InvalidOpcode) + } else { + Ok(()) + } +} + +fn deny_mask_reg(inst: &Instruction) -> Result<(), DecodeError> { + if inst.prefixes.evex_unchecked().mask_reg() != 0 { + Err(DecodeError::InvalidOperand) + } else { + Ok(()) + } +} + +fn check_mask_reg(inst: &Instruction) -> Result<(), DecodeError> { + // if an operand is to be zeroed on mask bits but mask register 0 is + // selected, this instruction is nonsense and will #UD + if inst.prefixes.evex_unchecked().merge() && inst.prefixes.evex_unchecked().mask_reg() == 0 { + Err(DecodeError::InvalidOperand) + } else { + Ok(()) + } +} + +fn apply_broadcast(inst: &mut Instruction, item_size: u8, reg_size: u8) { + if inst.prefixes.evex_unchecked().broadcast() { + inst.mem_size = item_size; + } else { + inst.mem_size = reg_size; + } +} + +fn set_rrr(inst: &mut Instruction, modrm: u8) { + inst.modrm_rrr.num = (modrm >> 3) & 7; + if inst.prefixes.evex_unchecked().vex().r() { + inst.modrm_rrr.num |= 8; + } + if inst.prefixes.evex_unchecked().rp() { + inst.modrm_rrr.num |= 16; + } +} + +fn set_reg_sizes(inst: &mut Instruction, size: RegisterBank) { + inst.modrm_rrr.bank = size; + inst.vex_reg.bank = size; + for i in 0..inst.operand_count { + if [OperandSpec::RegMMM, OperandSpec::RegMMM_maskmerge, OperandSpec::RegMMM_maskmerge_sae_noround].contains(&inst.operands[i as usize]) { + inst.modrm_mmm.bank = size; + } + } +} + +fn regs_size(inst: &Instruction) -> u8 { + if inst.prefixes.evex_unchecked().lp() { + 64 + } else if inst.prefixes.evex_unchecked().vex().l() { + 32 + } else { + 16 + } +} + +fn set_reg_sizes_from_ll(inst: &mut Instruction) -> Result<(), DecodeError> { + if inst.prefixes.evex_unchecked().lp() { + if inst.prefixes.evex_unchecked().vex().l() { + return Err(DecodeError::InvalidOperand); + } + set_reg_sizes(inst, RegisterBank::Z); + } else if inst.prefixes.evex_unchecked().vex().l() { + set_reg_sizes(inst, RegisterBank::Y); + } else { + set_reg_sizes(inst, RegisterBank::X); + } + Ok(()) +} + +pub(crate) fn read_evex_operands>(bytes: &mut T, instruction: &mut Instruction, operand_code: generated::EVEXOperandCode, length: &mut u8) -> Result<(), DecodeError> { + match operand_code { + generated::EVEXOperandCode::Gm_V_E_LL_imm8_sae_bcast => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VRANGEPS { + instruction.opcode = Opcode::VRANGEPD; + } else if instruction.opcode == Opcode::VFIXUPIMMPS { + instruction.opcode = Opcode::VFIXUPIMMPD; + } + } + + if let OperandSpec::RegMMM = mem_oper { + if instruction.prefixes.evex_unchecked().broadcast() { + if [Opcode::VRANGEPS, Opcode::VRANGEPD, Opcode::VFIXUPIMMPS, Opcode::VFIXUPIMMPD].contains(&instruction.opcode) { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } + set_reg_sizes(instruction, RegisterBank::Z); + } else { + set_reg_sizes_from_ll(instruction)?; + } + } else { + let sz = regs_size(instruction); + + if instruction.prefixes.evex_unchecked().vex().w() { + apply_broadcast(instruction, 8, sz); + } else { + apply_broadcast(instruction, 4, sz); + } + + set_reg_sizes_from_ll(instruction)?; + } + } + generated::EVEXOperandCode::Gm_V_Ed_xmm => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + if instruction.prefixes.evex_unchecked().broadcast() { + return Err(DecodeError::InvalidOpcode); + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + + instruction.operand_count = 3; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VRSQRT14SS { + instruction.opcode = Opcode::VRSQRT14SD; + } + } + + if let OperandSpec::RegMMM = mem_oper { + instruction.mem_size = 0; + } else { + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.mem_size = 8; + } else { + instruction.mem_size = 4; + } + } + set_reg_sizes(instruction, RegisterBank::X); + } + generated::EVEXOperandCode::Gm_V_Eq_xmm_sae_W1 => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + + instruction.operand_count = 3; + + if let OperandSpec::RegMMM = mem_oper { + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } + instruction.mem_size = 0; + } else { + if instruction.prefixes.evex_unchecked().broadcast() { + return Err(DecodeError::InvalidOpcode); + } + instruction.mem_size = 8; + } + set_reg_sizes(instruction, RegisterBank::X); + } + generated::EVEXOperandCode::Gm_V_Ed_xmm_sae_bcast => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + + instruction.operand_count = 3; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VGETEXPSS { + instruction.opcode = Opcode::VGETEXPSD; + } + } + + if let OperandSpec::RegMMM = mem_oper { + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } + } else { + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.mem_size = 8; + } else { + instruction.mem_size = 4; + } + } + set_reg_sizes(instruction, RegisterBank::X); + } + generated::EVEXOperandCode::Gm_V_Ed_LL_sae => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + + instruction.operand_count = 3; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VFMADD132SS { + instruction.opcode = Opcode::VFMADD132SD; + } else if instruction.opcode == Opcode::VFMSUB132SS { + instruction.opcode = Opcode::VFMSUB132SD; + } else if instruction.opcode == Opcode::VFNMADD132SS { + instruction.opcode = Opcode::VFNMADD132SD; + } else if instruction.opcode == Opcode::VFNMSUB132SS { + instruction.opcode = Opcode::VFNMSUB132SD; + } else if instruction.opcode == Opcode::VFMADD213SS { + instruction.opcode = Opcode::VFMADD213SD; + } else if instruction.opcode == Opcode::VFMSUB213SS { + instruction.opcode = Opcode::VFMSUB213SD; + } else if instruction.opcode == Opcode::VFNMADD213SS { + instruction.opcode = Opcode::VFNMADD213SD; + } else if instruction.opcode == Opcode::VFNMSUB213SS { + instruction.opcode = Opcode::VFNMSUB213SD; + } else if instruction.opcode == Opcode::VFMADD231SS { + instruction.opcode = Opcode::VFMADD231SD; + } else if instruction.opcode == Opcode::VFMSUB231SS { + instruction.opcode = Opcode::VFMSUB231SD; + } else if instruction.opcode == Opcode::VFNMADD231SS { + instruction.opcode = Opcode::VFNMADD231SD; + } else if instruction.opcode == Opcode::VFNMSUB231SS { + instruction.opcode = Opcode::VFNMSUB231SD; + } + } + + set_reg_sizes(instruction, RegisterBank::X); + + if let OperandSpec::RegMMM = mem_oper { + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } + } else { + if instruction.prefixes.evex_unchecked().broadcast() { + return Err(DecodeError::InvalidOpcode); + } + + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.mem_size = 8; + } else { + instruction.mem_size = 4; + } + } + } + generated::EVEXOperandCode::Gm_V_E_LL_sae_bcast => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + + instruction.operand_count = 3; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VSCALEFPS { + instruction.opcode = Opcode::VSCALEFPD; + } else if instruction.opcode == Opcode::VFNMADD132PS { + instruction.opcode = Opcode::VFNMADD132PD; + } else if instruction.opcode == Opcode::VFNMSUB132PS { + instruction.opcode = Opcode::VFNMSUB132PD; + } else if instruction.opcode == Opcode::VFMADDSUB132PS { + instruction.opcode = Opcode::VFMADDSUB132PD; + } else if instruction.opcode == Opcode::VFMSUBADD132PS { + instruction.opcode = Opcode::VFMSUBADD132PD; + } else if instruction.opcode == Opcode::VFMADD132PS { + instruction.opcode = Opcode::VFMADD132PD; + } else if instruction.opcode == Opcode::VFMSUB132PS { + instruction.opcode = Opcode::VFMSUB132PD; + } else if instruction.opcode == Opcode::VFMADDSUB213PS { + instruction.opcode = Opcode::VFMADDSUB213PD; + } else if instruction.opcode == Opcode::VFMSUBADD213PS { + instruction.opcode = Opcode::VFMSUBADD213PD; + } else if instruction.opcode == Opcode::VFMADD213PS { + instruction.opcode = Opcode::VFMADD213PD; + } else if instruction.opcode == Opcode::VFMSUB213PS { + instruction.opcode = Opcode::VFMSUB213PD; + } else if instruction.opcode == Opcode::VFNMADD213PS { + instruction.opcode = Opcode::VFNMADD213PD; + } else if instruction.opcode == Opcode::VFNMSUB213PS { + instruction.opcode = Opcode::VFNMSUB213PD; + } else if instruction.opcode == Opcode::VFMADDSUB231PS { + instruction.opcode = Opcode::VFMADDSUB231PD; + } else if instruction.opcode == Opcode::VFMSUBADD231PS { + instruction.opcode = Opcode::VFMSUBADD231PD; + } else if instruction.opcode == Opcode::VFMADD231PS { + instruction.opcode = Opcode::VFMADD231PD; + } else if instruction.opcode == Opcode::VFMSUB231PS { + instruction.opcode = Opcode::VFMSUB231PD; + } else if instruction.opcode == Opcode::VFNMADD231PS { + instruction.opcode = Opcode::VFNMADD231PD; + } else if instruction.opcode == Opcode::VFNMSUB231PS { + instruction.opcode = Opcode::VFNMSUB231PD; + } + } + + if let OperandSpec::RegMMM = mem_oper { + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + set_reg_sizes(instruction, RegisterBank::Z); + } else { + set_reg_sizes_from_ll(instruction)?; + } + } else { + let sz = regs_size(instruction); + + if instruction.prefixes.evex_unchecked().vex().w() { + apply_broadcast(instruction, 8, sz); + } else { + apply_broadcast(instruction, 4, sz); + } + + set_reg_sizes_from_ll(instruction)?; + } + } + generated::EVEXOperandCode::Gm_E_LL_imm8_sae => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.opcode = Opcode::VREDUCEPD; + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + + if let OperandSpec::RegMMM = mem_oper { + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.mem_size = 0; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + + set_reg_sizes(instruction, RegisterBank::Z); + } else { + set_reg_sizes_from_ll(instruction)?; + } + } else { + let sz = regs_size(instruction); + + if instruction.prefixes.evex_unchecked().vex().w() { + apply_broadcast(instruction, 8, sz); + } else { + apply_broadcast(instruction, 4, sz); + } + + set_reg_sizes_from_ll(instruction)?; + } + } + generated::EVEXOperandCode::Gm_E_LL_imm8_sae_W0 => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + + if let OperandSpec::RegMMM = mem_oper { + if instruction.prefixes.evex_unchecked().broadcast() { + // this mode is only used for `vcvtps2ph` and `vrndscaleps`, neither use sae rounding + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + + set_reg_sizes(instruction, RegisterBank::Z); + } else { + set_reg_sizes_from_ll(instruction)?; + } + } else { + let sz = regs_size(instruction); + + apply_broadcast(instruction, 4, sz); + + set_reg_sizes_from_ll(instruction)?; + } + } + generated::EVEXOperandCode::Gm_E_LL_imm8_sae_W1 => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + + if let OperandSpec::RegMMM = mem_oper { + if instruction.prefixes.evex_unchecked().broadcast() { + // this mode is only used for `vrndscalepd`, does not use sae rounding + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + + set_reg_sizes(instruction, RegisterBank::Z); + } else { + set_reg_sizes_from_ll(instruction)?; + } + } else { + let sz = regs_size(instruction); + + apply_broadcast(instruction, 8, sz); + + set_reg_sizes_from_ll(instruction)?; + } + } + generated::EVEXOperandCode::Mq_G_xmm_W1 => { + deny_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 1)?; + + instruction.mem_size = 8; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + return Err(DecodeError::InvalidOperand); + } + instruction.operands[0] = mem_oper; + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + + set_reg_sizes(instruction, RegisterBank::X); + } + generated::EVEXOperandCode::G_V_Ed_xmm_imm8_W0 => { + deny_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::X; + instruction.vex_reg.bank = RegisterBank::X; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 4; + } + instruction.operands[0] = OperandSpec::RegRRR; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + } + generated::EVEXOperandCode::G_V_xmm_Edq_sae => { + deny_mask_reg(instruction)?; + deny_z(instruction)?; + + let (sz, bank) = if instruction.prefixes.evex_unchecked().vex().w() { + (8, RegisterBank::Q) + } else { + (4, RegisterBank::D) + }; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::X; + instruction.vex_reg.bank = RegisterBank::X; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.modrm_mmm.bank = bank; + instruction.mem_size = 0; + } else { + instruction.mem_size = sz; + } + if instruction.prefixes.evex_unchecked().broadcast() { + if mem_oper == OperandSpec::RegMMM { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } else { + return Err(DecodeError::InvalidOperand); + } + } else { + instruction.operands[0] = OperandSpec::RegRRR; + } + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + } + generated::EVEXOperandCode::G_V_xmm_Edq_imm8 => { + deny_mask_reg(instruction)?; + + let (sz, bank) = if instruction.prefixes.evex_unchecked().vex().w() { + instruction.opcode = Opcode::VPINSRQ; + (8, RegisterBank::Q) + } else { + (4, RegisterBank::D) + }; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::X; + instruction.vex_reg.bank = RegisterBank::X; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.modrm_mmm.bank = bank; + instruction.mem_size = 0; + } else { + instruction.mem_size = sz; + } + instruction.operands[0] = OperandSpec::RegRRR; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + } + generated::EVEXOperandCode::G_V_xmm_Ebd_imm8 => { + deny_mask_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::X; + instruction.vex_reg.bank = RegisterBank::X; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.modrm_mmm.bank = RegisterBank::D; + instruction.mem_size = 0; + } else { + instruction.mem_size = 1; + } + instruction.operands[0] = OperandSpec::RegRRR; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + } + generated::EVEXOperandCode::G_V_Mq_xmm_W1 => { + deny_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + instruction.mem_size = 8; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + return Err(DecodeError::InvalidOperand); + } + instruction.operands[0] = OperandSpec::RegRRR; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + set_reg_sizes(instruction, RegisterBank::X); + } + generated::EVEXOperandCode::Gm_V_E_LL_bcast_W1 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + let sz = regs_size(instruction); + + // specifically for vunpcklpd!!! probably need to reconsider. + apply_broadcast(instruction, 8, sz); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::M_G_LL_W0 => { + deny_vex_reg(instruction)?; + deny_mask_reg(instruction)?; + + instruction.mem_size = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + return Err(DecodeError::InvalidOperand); + } + instruction.operands[0] = mem_oper; + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::M_G_LL_W1 => { + deny_vex_reg(instruction)?; + deny_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + instruction.mem_size = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + return Err(DecodeError::InvalidOperand); + } + instruction.operands[0] = mem_oper; + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Em_G_LL_W1 => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + instruction.mem_size = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[0] = mem_oper.masked(); + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::G_Ed_xmm_sae_W0 => { + deny_vex_reg(instruction)?; + deny_mask_reg(instruction)?; + // vucomiss and vcomiss both are W=0 + ensure_W(instruction, 0)?; + + instruction.mem_size = 4; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::X; + + // in specific support of vcomisd/vucomisd + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } else { + instruction.operands[0] = OperandSpec::RegRRR; + } + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_Eq_xmm_sae_W1 => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + // vucomisd and vcomisd both are W=1 + ensure_W(instruction, 1)?; + + instruction.mem_size = 8; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::X; + + // in specific support of vcomisd/vucomisd + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } else { + instruction.operands[0] = OperandSpec::RegRRR; + } + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_E_LL_W1 => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + instruction.mem_size = regs_size(instruction); + + if instruction.opcode == Opcode::VMOVDDUP && instruction.mem_size == 16 { + instruction.mem_size = 8; + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::VCVTUDQ2PD => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let sz = regs_size(instruction); + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VCVTUDQ2PD { + instruction.opcode = Opcode::VCVTUQQ2PD; + } else if instruction.opcode == Opcode::VCVTDQ2PD { + instruction.opcode = Opcode::VCVTQQ2PD; + } + } else { + if instruction.prefixes.evex_unchecked().lp() && instruction.prefixes.evex_unchecked().vex().l() { + return Err(DecodeError::InvalidOperand); + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + set_reg_sizes(instruction, RegisterBank::Z); + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + set_reg_sizes_from_ll(instruction)?; + if !instruction.prefixes.evex_unchecked().vex().w() { + if instruction.modrm_rrr.bank == RegisterBank::Z { + instruction.modrm_mmm.bank = RegisterBank::Y; + } else if instruction.modrm_rrr.bank == RegisterBank::Y { + instruction.modrm_mmm.bank = RegisterBank::X; + } + } + } + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + set_reg_sizes_from_ll(instruction)?; + if instruction.prefixes.evex_unchecked().vex().w() { + apply_broadcast(instruction, 8, sz); + } else { + apply_broadcast(instruction, 4, sz / 2); + } + } + } + generated::EVEXOperandCode::Maskm_V_E_LL_imm8_sae_bcast_W1 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + let sz = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + set_reg_sizes(instruction, RegisterBank::Z); + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + set_reg_sizes_from_ll(instruction)?; + } + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + apply_broadcast(instruction, 8, sz); + set_reg_sizes_from_ll(instruction)?; + } + instruction.modrm_rrr.bank = RegisterBank::K; + if instruction.modrm_rrr.num > 7 { + return Err(DecodeError::InvalidOperand); + } + } + generated::EVEXOperandCode::Gm_E_LL_sae_bcast_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + set_reg_sizes(instruction, RegisterBank::Z); + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + set_reg_sizes_from_ll(instruction)?; + } + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + apply_broadcast(instruction, 8, sz); + set_reg_sizes_from_ll(instruction)?; + } + } + generated::EVEXOperandCode::Gm_E_LL_sae_bcast_W1 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 1)?; + + let sz = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + set_reg_sizes(instruction, RegisterBank::Z); + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + set_reg_sizes_from_ll(instruction)?; + } + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + apply_broadcast(instruction, 8, sz); + set_reg_sizes_from_ll(instruction)?; + } + } + generated::EVEXOperandCode::Gm_V_Ed_LL_bcast => { + check_mask_reg(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VPERMPS { + instruction.opcode = Opcode::VPERMPD; + } else if instruction.opcode == Opcode::VBLENDMPS { + instruction.opcode = Opcode::VBLENDMPD; + } else if instruction.opcode == Opcode::VPERMI2PS { + instruction.opcode = Opcode::VPERMI2PD; + } else if instruction.opcode == Opcode::VPERMT2PS { + instruction.opcode = Opcode::VPERMT2PD + } + } + + let sz = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + return Err(DecodeError::InvalidOpcode); + } else { + instruction.mem_size = 0; + } + } else { + if instruction.prefixes.evex_unchecked().vex().w() { + apply_broadcast(instruction, 8, sz); + } else { + apply_broadcast(instruction, 4, sz); + } + } + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_V_Ed_LL_bcast_W0 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + return Err(DecodeError::InvalidOpcode); + } else { + instruction.mem_size = 0; + } + } else { + apply_broadcast(instruction, 4, sz); + } + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_V_E_LL_W0 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + if instruction.prefixes.evex_unchecked().broadcast() { + return Err(DecodeError::InvalidOpcode); + } + + let sz = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = sz; + } + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_V_E_LL_W1 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + if instruction.prefixes.evex_unchecked().broadcast() { + return Err(DecodeError::InvalidOpcode); + } + + let sz = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = sz; + } + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_V_E_LL_sae_W1 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + let sz = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + set_reg_sizes(instruction, RegisterBank::Z); + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + set_reg_sizes_from_ll(instruction)?; + } + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.mem_size = sz; + set_reg_sizes_from_ll(instruction)?; + } + } + generated::EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + if instruction.opcode == Opcode::VMINPS || instruction.opcode == Opcode::VMAXPS { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } + set_reg_sizes(instruction, RegisterBank::Z); + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + set_reg_sizes_from_ll(instruction)?; + } + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + apply_broadcast(instruction, 4, sz); + set_reg_sizes_from_ll(instruction)?; + } + } + generated::EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + let sz = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + if instruction.opcode == Opcode::VMINPD || instruction.opcode == Opcode::VMAXPD { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } + set_reg_sizes(instruction, RegisterBank::Z); + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + set_reg_sizes_from_ll(instruction)?; + } + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + apply_broadcast(instruction, 8, sz); + set_reg_sizes_from_ll(instruction)?; + } + } + generated::EVEXOperandCode::G_V_E_LL => { + deny_mask_reg(instruction)?; + + let sz = regs_size(instruction); + + if instruction.prefixes.evex_unchecked().vex().w() { + apply_broadcast(instruction, 8, sz); + } else { + apply_broadcast(instruction, 4, sz); + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_V_E_LL_bcast => { + check_mask_reg(instruction)?; + + let sz = regs_size(instruction); + + if instruction.prefixes.evex_unchecked().vex().w() { + apply_broadcast(instruction, 8, sz); + instruction.opcode = if instruction.opcode == Opcode::VPANDD { + Opcode::VPANDQ + } else if instruction.opcode == Opcode::VPANDND { + Opcode::VPANDNQ + } else if instruction.opcode == Opcode::VPORD { + Opcode::VPORQ + } else if instruction.opcode == Opcode::VPXORD { + Opcode::VPXORQ + } else if instruction.opcode == Opcode::VPRORVD { + Opcode::VPRORVQ + } else if instruction.opcode == Opcode::VPROLVD { + Opcode::VPROLVQ + } else if instruction.opcode == Opcode::VPERMD { + Opcode::VPERMQ + } else if instruction.opcode == Opcode::VPMINSD { + Opcode::VPMINSQ + } else if instruction.opcode == Opcode::VPMINUD { + Opcode::VPMINUQ + } else if instruction.opcode == Opcode::VPMAXSD { + Opcode::VPMAXSQ + } else if instruction.opcode == Opcode::VPMAXUD { + Opcode::VPMAXUQ + } else if instruction.opcode == Opcode::VPSRLVD { + Opcode::VPSRLVQ + } else if instruction.opcode == Opcode::VPSRAVD { + Opcode::VPSRAVQ + } else if instruction.opcode == Opcode::VPSLLVD { + Opcode::VPSLLVQ + } else if instruction.opcode == Opcode::VPMULLD { + Opcode::VPMULLQ + } else if instruction.opcode == Opcode::VPBLENDMD { + Opcode::VPBLENDMQ + } else if instruction.opcode == Opcode::VPSHLDVD { + Opcode::VPSHLDVQ + } else if instruction.opcode == Opcode::VPSHRDVD { + Opcode::VPSHRDVQ + } else if instruction.opcode == Opcode::VPERMI2D { + Opcode::VPERMI2Q + } else if instruction.opcode == Opcode::VPERMT2D { + Opcode::VPERMT2Q + } else { + instruction.opcode + }; + } else { + apply_broadcast(instruction, 4, sz); + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_E_LL_imm8_bcast_W0 => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + apply_broadcast(instruction, 4, sz); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_E_LL_imm8_bcast_W1 => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + let sz = regs_size(instruction); + + apply_broadcast(instruction, 8, sz); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_Ed_LL_imm8_sae_noround_bcast => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let sz = regs_size(instruction); + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VGETMANTPS { + instruction.opcode = Opcode::VGETMANTPD; + } + apply_broadcast(instruction, 8, sz); + } else { + apply_broadcast(instruction, 4, sz); + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[1] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + + if instruction.prefixes.evex_unchecked().broadcast() { + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + set_reg_sizes(instruction, RegisterBank::Z); + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + set_reg_sizes_from_ll(instruction)?; + } + } else { + if instruction.prefixes.evex_unchecked().lp() && instruction.prefixes.evex_unchecked().vex().l() { + return Err(DecodeError::InvalidOperand); + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + set_reg_sizes_from_ll(instruction)?; + } + } + generated::EVEXOperandCode::Gm_Ed_LL_sae_noround_bcast_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + apply_broadcast(instruction, 4, sz); + + if instruction.prefixes.evex_unchecked().broadcast() { + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + set_reg_sizes(instruction, RegisterBank::Z); + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + set_reg_sizes_from_ll(instruction)?; + } + } else { + if instruction.prefixes.evex_unchecked().lp() && instruction.prefixes.evex_unchecked().vex().l() { + return Err(DecodeError::InvalidOperand); + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + set_reg_sizes_from_ll(instruction)?; + } + } + generated::EVEXOperandCode::Gm_V_Ed_xmm_sae_noround_W0 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } else { + if instruction.prefixes.evex_unchecked().lp() && instruction.prefixes.evex_unchecked().vex().l() { + return Err(DecodeError::InvalidOperand); + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + } + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 4; + } + set_reg_sizes(instruction, RegisterBank::X); + } + generated::EVEXOperandCode::Gm_V_Ed_xmm_sae => { + check_mask_reg(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VSCALEFSS { + instruction.opcode = Opcode::VSCALEFSD; + } else if instruction.opcode == Opcode::VRCP14SS { + instruction.opcode = Opcode::VRCP14SD; + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } else { + if instruction.prefixes.evex_unchecked().lp() && instruction.prefixes.evex_unchecked().vex().l() { + return Err(DecodeError::InvalidOperand); + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + } + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.mem_size = 8; + } else { + instruction.mem_size = 4; + } + } + set_reg_sizes(instruction, RegisterBank::X); + } + generated::EVEXOperandCode::Gm_V_Ed_xmm_sae_W0 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if instruction.prefixes.evex_unchecked().broadcast() { + if instruction.opcode == Opcode::VMINSS || instruction.opcode == Opcode::VMAXSS { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } + } else { + if instruction.prefixes.evex_unchecked().lp() && instruction.prefixes.evex_unchecked().vex().l() { + return Err(DecodeError::InvalidOperand); + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + } + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 4; + } + set_reg_sizes(instruction, RegisterBank::X); + } + generated::EVEXOperandCode::Eqm_G_xmm_imm8_sae_W0 => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + // sae sets this to `vcvtps2ph ymm, zmm, imm8` + instruction.modrm_mmm.bank = RegisterBank::Y; + instruction.modrm_rrr.bank = RegisterBank::Z; + instruction.operands[0] = OperandSpec::RegMMM_maskmerge_sae_noround; + } else { + instruction.modrm_mmm.bank = RegisterBank::X; + instruction.modrm_rrr.bank = RegisterBank::X; + instruction.operands[0] = OperandSpec::RegMMM_maskmerge; + } + } else { + if instruction.prefixes.evex_unchecked().broadcast() { + return Err(DecodeError::InvalidOperand); + } else { + instruction.mem_size = 8; + instruction.modrm_rrr.bank = RegisterBank::X; + instruction.operands[0] = mem_oper.masked(); + } + } + instruction.operands[1] = OperandSpec::RegRRR; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + } + generated::EVEXOperandCode::Em_xmm_G_ymm_imm8_sae_W0 => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + // sae sets this to `vcvtps2ph ymm, zmm, imm8` + instruction.modrm_mmm.bank = RegisterBank::Y; + instruction.modrm_rrr.bank = RegisterBank::Z; + instruction.operands[0] = OperandSpec::RegMMM_maskmerge_sae_noround; + } else { + instruction.modrm_mmm.bank = RegisterBank::X; + instruction.modrm_rrr.bank = RegisterBank::Y; + instruction.operands[0] = OperandSpec::RegMMM_maskmerge; + } + } else { + if instruction.prefixes.evex_unchecked().broadcast() { + return Err(DecodeError::InvalidOperand); + } else { + instruction.modrm_rrr.bank = RegisterBank::Y; + instruction.operands[0] = mem_oper.masked(); + } + } + instruction.operands[1] = OperandSpec::RegRRR; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.mem_size = 16; + instruction.operand_count = 3; + } + generated::EVEXOperandCode::Em_ymm_G_zmm_imm8_sae_W0 => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::Z; + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegMMM_maskmerge_sae_noround; + } else { + instruction.operands[0] = OperandSpec::RegMMM_maskmerge; + } + } else { + if instruction.prefixes.evex_unchecked().broadcast() { + return Err(DecodeError::InvalidOperand); + } else { + instruction.operands[0] = mem_oper.masked(); + } + } + instruction.mem_size = 32; + instruction.operands[1] = OperandSpec::RegRRR; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + } + generated::EVEXOperandCode::Gm_V_zmm_E_xmm_imm8 => { + check_mask_reg(instruction)?; + + instruction.opcode = if instruction.prefixes.evex_unchecked().vex().w() { + Opcode::VINSERTI64X2 + } else { + Opcode::VINSERTI32X4 + }; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::Z; + instruction.vex_reg.bank = RegisterBank::Z; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 16; + } + instruction.operands[0] = OperandSpec::RegRRR.masked(); + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + } + generated::EVEXOperandCode::Gm_V_ymm_E_xmm_imm8 => { + check_mask_reg(instruction)?; + + instruction.opcode = if instruction.prefixes.evex_unchecked().vex().w() { + Opcode::VINSERTI64X2 + } else { + Opcode::VINSERTI32X4 + }; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::Y; + instruction.vex_reg.bank = RegisterBank::Y; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 16; + } + instruction.operands[0] = OperandSpec::RegRRR.masked(); + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + } + generated::EVEXOperandCode::Gm_V_zmm_E_ymm_imm8 => { + check_mask_reg(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VINSERTF32X8 { + instruction.opcode = Opcode::VINSERTF64X4; + } else if instruction.opcode == Opcode::VINSERTI32X8 { + instruction.opcode = Opcode::VINSERTI64X4; + } + }; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::Z; + instruction.vex_reg.bank = RegisterBank::Z; + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.mem_size = 32; + instruction.operands[0] = OperandSpec::RegRRR.masked(); + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + } + generated::EVEXOperandCode::Em_ymm_G_zmm_imm8 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VEXTRACTF32X8 { + instruction.opcode = Opcode::VEXTRACTF64X4; + } else if instruction.opcode == Opcode::VEXTRACTI32X8 { + instruction.opcode = Opcode::VEXTRACTI64X4; + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::Z; + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.mem_size = 32; + instruction.operands[0] = mem_oper.masked(); + instruction.operands[1] = OperandSpec::RegRRR; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + } + generated::EVEXOperandCode::Gm_zmm_Eq_xmm => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Z; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 8; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_ymm_Ed_xmm => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Y; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 4; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_xmm_Ew_xmm => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::X; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 2; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_zmm_E_xmm => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Z; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 16; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_ymm_Eq_xmm => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Y; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 8; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_xmm_Ed_xmm => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::X; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 4; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_zmm_E_ymm_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Z; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 32; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_zmm_E_ymm => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Z; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 32; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_ymm_E_xmm_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Y; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 16; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_ymm_E_xmm => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Y; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 16; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_xmm_Eq_xmm_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::X; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 8; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_xmm_Eq_xmm => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::X; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 8; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Em_ymm_G_zmm_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Z; + instruction.mem_size = 32; + instruction.operands[0] = mem_oper.masked(); + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Em_xmm_G_zmm_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Z; + instruction.mem_size = 16; + instruction.operands[0] = mem_oper.masked(); + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Em_xmm_G_ymm_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Y; + instruction.mem_size = 16; + instruction.operands[0] = mem_oper.masked(); + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Eqm_xmm_G_zmm_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Z; + instruction.mem_size = 8; + instruction.operands[0] = mem_oper.masked(); + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Eqm_xmm_G_xmm_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::X; + instruction.mem_size = 8; + instruction.operands[0] = mem_oper.masked(); + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Edm_xmm_G_ymm_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Y; + instruction.mem_size = 4; + instruction.operands[0] = mem_oper.masked(); + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Edm_xmm_G_xmm_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::X; + instruction.mem_size = 4; + instruction.operands[0] = mem_oper.masked(); + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Ewm_xmm_G_xmm_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::X; + instruction.mem_size = 2; + instruction.operands[0] = mem_oper.masked(); + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Eqm_xmm_G_ymm_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Y; + instruction.mem_size = 8; + instruction.operands[0] = mem_oper.masked(); + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_xmm_Ed_xmm_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::X; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 4; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_ymm_Ed_xmm_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Y; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 4; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_zmm_M_ymm => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VBROADCASTF32X8 { + instruction.opcode = Opcode::VBROADCASTF64X4; + } else if instruction.opcode == Opcode::VBROADCASTI32X8 { + instruction.opcode = Opcode::VBROADCASTI64X4; + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Z; + if mem_oper == OperandSpec::RegMMM { + return Err(DecodeError::InvalidOperand); + } else { + instruction.mem_size = 32; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_zmm_M_xmm => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VBROADCASTF32X4 { + instruction.opcode = Opcode::VBROADCASTF64X2; + } else if instruction.opcode == Opcode::VBROADCASTI32X4 { + instruction.opcode = Opcode::VBROADCASTI64X2; + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Z; + if mem_oper == OperandSpec::RegMMM { + return Err(DecodeError::InvalidOperand); + } else { + instruction.mem_size = 16; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_ymm_M_xmm => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VBROADCASTF32X4 { + instruction.opcode = Opcode::VBROADCASTF64X2; + } else if instruction.opcode == Opcode::VBROADCASTI32X4 { + instruction.opcode = Opcode::VBROADCASTI64X2; + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Y; + if mem_oper == OperandSpec::RegMMM { + return Err(DecodeError::InvalidOperand); + } else { + instruction.mem_size = 16; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_zmm_Ed_xmm => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.opcode = Opcode::VBROADCASTSD; + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Z; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 8; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::VBROADCASTF32X2_Gm_ymm_Ed_xmm => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.opcode = Opcode::VBROADCASTSD; + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Y; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 8; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_zmm_Ed_xmm_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Z; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 4; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Em_xmm_G_LL_imm8 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.opcode = if instruction.opcode == Opcode::VEXTRACTF32X4 { + Opcode::VEXTRACTF64X2 + } else if instruction.opcode == Opcode::VEXTRACTI32X4 { + Opcode::VEXTRACTI64X2 + } else { + instruction.opcode + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + if instruction.prefixes.evex_unchecked().lp() { + instruction.modrm_rrr.bank = RegisterBank::Z; + } else { + instruction.modrm_rrr.bank = RegisterBank::Y; + } + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.mem_size = 16; + instruction.operands[0] = mem_oper.masked(); + instruction.operands[1] = OperandSpec::RegRRR; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + } + generated::EVEXOperandCode::Gm_V_LL_E_xmm_imm8 => { + check_mask_reg(instruction)?; + + instruction.opcode = if instruction.prefixes.evex_unchecked().vex().w() { + Opcode::VINSERTF64X2 + } else { + Opcode::VINSERTF32X4 + }; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + set_reg_sizes_from_ll(instruction)?; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.mem_size = 16; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + } + generated::EVEXOperandCode::Gm_V_LL_E_xmm_W0 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + set_reg_sizes_from_ll(instruction)?; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.mem_size = 16; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + } + generated::EVEXOperandCode::Gm_V_LL_E_xmm_W1 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + set_reg_sizes_from_ll(instruction)?; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.mem_size = 16; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + } + generated::EVEXOperandCode::Gm_V_LL_E_xmm => { + check_mask_reg(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.opcode = if instruction.opcode == Opcode::VPSRAD { + Opcode::VPSRAQ + } else { + instruction.opcode + }; + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + set_reg_sizes_from_ll(instruction)?; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.mem_size = 16; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + } + generated::EVEXOperandCode::VPEXTRW => { + deny_mask_reg(instruction)?; + deny_z(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::D; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + + if mem_oper == OperandSpec::RegMMM { + instruction.modrm_mmm.bank = RegisterBank::X; + } else { + return Err(DecodeError::InvalidOperand); + } + + instruction.operands[0] = OperandSpec::RegRRR; + instruction.operands[1] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + } + generated::EVEXOperandCode::VPINSRW => { + deny_mask_reg(instruction)?; + deny_z(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::X; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + + if mem_oper == OperandSpec::RegMMM { + instruction.modrm_mmm.bank = RegisterBank::D; + } else { + instruction.mem_size = 2; + } + + instruction.operands[0] = OperandSpec::RegRRR; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + } + generated::EVEXOperandCode::VMOVQ_G_Ed_xmm => { + deny_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 1)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::X; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 8; + } + + instruction.operands[0] = OperandSpec::RegRRR; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::VMOVQ_Ed_G_xmm => { + deny_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 1)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::X; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 8; + } + + instruction.operands[0] = mem_oper; + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::VMOVQ_7e => { + deny_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 1)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::X; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + + if mem_oper != OperandSpec::RegMMM { + instruction.mem_size = 8; + } + + instruction.operands[0] = OperandSpec::RegRRR; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::VMOVD_7e => { + deny_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::X; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.opcode = Opcode::VMOVQ; + if mem_oper == OperandSpec::RegMMM { + instruction.modrm_mmm.bank = RegisterBank::Q; + } else { + instruction.mem_size = 8; + } + } else { + if mem_oper == OperandSpec::RegMMM { + instruction.modrm_mmm.bank = RegisterBank::D; + } else { + instruction.mem_size = 4; + } + } + + instruction.operands[0] = mem_oper; + instruction.operands[1] = OperandSpec::RegRRR_maskmerge; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::VMOVD_6e => { + deny_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::X; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.opcode = Opcode::VMOVQ; + if mem_oper == OperandSpec::RegMMM { + instruction.modrm_mmm.bank = RegisterBank::Q; + } else { + instruction.mem_size = 8; + } + } else { + if mem_oper == OperandSpec::RegMMM { + instruction.modrm_mmm.bank = RegisterBank::D; + } else { + instruction.mem_size = 4; + } + } + + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Mask_V_E_LL_bcast => { + check_mask_reg(instruction)?; + + let sz = regs_size(instruction); + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VP2INTERSECTD { + instruction.opcode = Opcode::VP2INTERSECTQ; + } else if instruction.opcode == Opcode::VPTESTNMD { + instruction.opcode = Opcode::VPTESTNMQ; + } else if instruction.opcode == Opcode::VPTESTMD { + instruction.opcode = Opcode::VPTESTMQ; + } + apply_broadcast(instruction, 8, sz); + } else { + apply_broadcast(instruction, 4, sz); + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + set_reg_sizes_from_ll(instruction)?; + if instruction.modrm_rrr.num >= 8 { + return Err(DecodeError::InvalidOperand); + } else { + instruction.modrm_rrr.bank = RegisterBank::K; + } + } + generated::EVEXOperandCode::Mask_V_E_LL_bcast_W1 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + let sz = regs_size(instruction); + + apply_broadcast(instruction, 8, sz); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + set_reg_sizes_from_ll(instruction)?; + if instruction.modrm_rrr.num >= 8 { + return Err(DecodeError::InvalidOperand); + } else { + instruction.modrm_rrr.bank = RegisterBank::K; + } + } + generated::EVEXOperandCode::Mask_V_E_LL_bcast_W0 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + apply_broadcast(instruction, 4, sz); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + set_reg_sizes_from_ll(instruction)?; + if instruction.modrm_rrr.num >= 8 { + return Err(DecodeError::InvalidOperand); + } else { + instruction.modrm_rrr.bank = RegisterBank::K; + } + } + generated::EVEXOperandCode::Em_G_LL => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VMOVDQA32 { + instruction.opcode = Opcode::VMOVDQA64; + } else if instruction.opcode == Opcode::VMOVDQU32 { + instruction.opcode = Opcode::VMOVDQU64; + } else if instruction.opcode == Opcode::VMOVDQU8 { + instruction.opcode = Opcode::VMOVDQU16; + } else if instruction.opcode == Opcode::VPCOMPRESSB { + instruction.opcode = Opcode::VPCOMPRESSW; + } else if instruction.opcode == Opcode::VPCOMPRESSD { + instruction.opcode = Opcode::VPCOMPRESSQ; + } else if instruction.opcode == Opcode::VCOMPRESSPS { + instruction.opcode = Opcode::VCOMPRESSPD; + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + instruction.operands[0] = mem_oper.masked(); + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Mask_U_LL => { + deny_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VPMOVB2M { + instruction.opcode = Opcode::VPMOVW2M; + } else { + instruction.opcode = Opcode::VPMOVQ2M; + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + instruction.modrm_rrr.bank = RegisterBank::K; + } else { + return Err(DecodeError::InvalidOperand); + } + } + generated::EVEXOperandCode::G_LL_Mask => { + deny_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VPMOVM2B { + instruction.opcode = Opcode::VPMOVM2W; + } else { + instruction.opcode = Opcode::VPMOVM2Q; + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + instruction.modrm_mmm.bank = RegisterBank::K; + } else { + return Err(DecodeError::InvalidOperand); + } + } + generated::EVEXOperandCode::G_LL_Mask_W1 => { + deny_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 1)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + instruction.modrm_mmm.bank = RegisterBank::K; + } else { + return Err(DecodeError::InvalidOperand); + } + } + generated::EVEXOperandCode::G_LL_Mask_W0 => { + deny_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + instruction.modrm_mmm.bank = RegisterBank::K; + } else { + return Err(DecodeError::InvalidOperand); + } + } + generated::EVEXOperandCode::G_E_LL_W0 => { + deny_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + instruction.operands[0] = OperandSpec::RegRRR; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::E_G_LL_W0 => { + deny_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + instruction.operands[0] = mem_oper; + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Em_G_LL_W0 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + instruction.operands[0] = mem_oper.masked(); + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Operands_72_W0 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + let (r_sz, m_sz, m_data_sz) = match ( + instruction.prefixes.evex_unchecked().lp(), + instruction.prefixes.evex_unchecked().vex().l(), + ) { + (true, true) => { return Err(DecodeError::InvalidOpcode); }, + (true, false) => (RegisterBank::Y, RegisterBank::Z, 64), + (false, true) => (RegisterBank::X, RegisterBank::Y, 32), + (false, false) => (RegisterBank::X, RegisterBank::X, 16), + }; + instruction.modrm_rrr.bank = r_sz; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + instruction.modrm_mmm.bank = m_sz; + } else { + apply_broadcast(instruction, 4, m_data_sz); + } + } + generated::EVEXOperandCode::Gm_E_LL_bcast => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let sz = regs_size(instruction); + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VPLZCNTD { + instruction.opcode = Opcode::VPLZCNTQ; + } else if instruction.opcode == Opcode::VRCP14PS { + instruction.opcode = Opcode::VRCP14PD; + } else if instruction.opcode == Opcode::VPOPCNTD { + instruction.opcode = Opcode::VPOPCNTQ; + } else if instruction.opcode == Opcode::VPCONFLICTD { + instruction.opcode = Opcode::VPCONFLICTQ; + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + return Err(DecodeError::InvalidOpcode); + } + instruction.mem_size = 0; + } else { + if instruction.prefixes.evex_unchecked().vex().w() { + apply_broadcast(instruction, 8, sz); + } else { + apply_broadcast(instruction, 4, sz); + } + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_E_LL_bcast_W1 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 1)?; + + let sz = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + return Err(DecodeError::InvalidOpcode); + } + instruction.mem_size = 0; + } else { + apply_broadcast(instruction, 8, sz); + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_E_LL_bcast_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + return Err(DecodeError::InvalidOpcode); + } + instruction.mem_size = 0; + } else { + apply_broadcast(instruction, 4, sz); + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_LL_Ud => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VPBROADCASTD { + instruction.opcode = Opcode::VPBROADCASTQ; + } + } + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.modrm_mmm.bank = RegisterBank::Q; + } else { + instruction.modrm_mmm.bank = RegisterBank::D; + } + } else { + return Err(DecodeError::InvalidOperand); + } + } + generated::EVEXOperandCode::Gm_LL_Ud_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + instruction.modrm_mmm.bank = RegisterBank::D; + } else { + return Err(DecodeError::InvalidOperand); + } + } + generated::EVEXOperandCode::Gm_LL_Eq_xmm => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.opcode = Opcode::VPBROADCASTQ; + } else { + instruction.opcode = Opcode::VBROADCASTI32X2; + } + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + instruction.modrm_mmm.bank = RegisterBank::X; + } else { + instruction.mem_size = 8; + } + } + generated::EVEXOperandCode::Gm_LL_Ed_xmm_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + instruction.modrm_mmm.bank = RegisterBank::X; + } else { + instruction.mem_size = 4; + } + } + generated::EVEXOperandCode::Gm_LL_Ew_xmm_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + instruction.modrm_mmm.bank = RegisterBank::X; + } else { + instruction.mem_size = 2; + } + } + generated::EVEXOperandCode::Gm_LL_Eb_xmm_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + instruction.modrm_mmm.bank = RegisterBank::X; + } else { + instruction.mem_size = 1; + } + } + generated::EVEXOperandCode::Gm_E_LL_W0 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_E_LL_imm8 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VMOVDQA32 { + instruction.opcode = Opcode::VMOVDQA64; + } else if instruction.opcode == Opcode::VMOVDQU32 { + instruction.opcode = Opcode::VMOVDQU64; + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gd_Ed_xmm_sae => { + deny_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + deny_z(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.modrm_rrr.bank = RegisterBank::Q; + } else { + instruction.modrm_rrr.bank = RegisterBank::D; + } + + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR; + + if instruction.prefixes.evex_unchecked().broadcast() { + if mem_oper == OperandSpec::RegMMM { + if instruction.opcode == Opcode::VCVTSS2USI || instruction.opcode == Opcode::VCVTSD2SI || instruction.opcode == Opcode::VCVTSD2USI { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } + } else { + return Err(DecodeError::InvalidOperand); + } + } else { + if instruction.prefixes.evex_unchecked().lp() && instruction.prefixes.evex_unchecked().vex().l() { + return Err(DecodeError::InvalidOperand); + } + } + + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + if instruction.opcode == Opcode::VCVTTSD2SI || instruction.opcode == Opcode::VCVTSD2SI || instruction.opcode == Opcode::VCVTTSD2USI || instruction.opcode == Opcode::VCVTSD2USI { + instruction.mem_size = 8; + } else { + instruction.mem_size = 4; + } + } + instruction.operands[1] = mem_oper; + + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_E_LL_sae_bcast => { + check_mask_reg(instruction)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VGETEXPPS { + instruction.opcode = Opcode::VGETEXPPD; + } else if instruction.opcode == Opcode::VRSQRT14PS { + instruction.opcode = Opcode::VRSQRT14PD; + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + if instruction.prefixes.evex_unchecked().broadcast() { + if mem_oper != OperandSpec::RegMMM { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + set_reg_sizes_from_ll(instruction)?; + apply_broadcast(instruction, if instruction.prefixes.evex_unchecked().vex().w() { + 8 + } else { + 4 + }, sz); + } else { + if instruction.opcode == Opcode::VSQRTPS || instruction.opcode == Opcode::VCVTPS2DQ { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } + set_reg_sizes(instruction, RegisterBank::Z); + } + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + set_reg_sizes_from_ll(instruction)?; + } + } + generated::EVEXOperandCode::Gm_E_LL => { + check_mask_reg(instruction)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VMOVDQA32 { + instruction.opcode = Opcode::VMOVDQA64; + } else if instruction.opcode == Opcode::VMOVDQU32 { + instruction.opcode = Opcode::VMOVDQU64; + } else if instruction.opcode == Opcode::VMOVDQU8 { + instruction.opcode = Opcode::VMOVDQU16; + } else if instruction.opcode == Opcode::VPOPCNTB { + instruction.opcode = Opcode::VPOPCNTW; + } else if instruction.opcode == Opcode::VPEXPANDB { + instruction.opcode = Opcode::VPEXPANDW; + } else if instruction.opcode == Opcode::VEXPANDPS { + instruction.opcode = Opcode::VEXPANDPD; + } else if instruction.opcode == Opcode::VPEXPANDD { + instruction.opcode = Opcode::VPEXPANDQ; + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_V_Ed_LL_imm8_bcast => { + check_mask_reg(instruction)?; + + let sz = regs_size(instruction); + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VSHUFF32X4 { + instruction.opcode = Opcode::VSHUFF64X2; + } + apply_broadcast(instruction, 8, sz); + } else { + apply_broadcast(instruction, 4, sz); + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_V_E_LL_bcast_W0 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + apply_broadcast(instruction, 4, sz); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_V_E_LL => { + check_mask_reg(instruction)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VPBLENDMB { + instruction.opcode = Opcode::VPBLENDMW; + } else if instruction.opcode == Opcode::VPERMI2B { + instruction.opcode = Opcode::VPERMI2W; + } else if instruction.opcode == Opcode::VPERMT2B { + instruction.opcode = Opcode::VPERMT2W; + } else if instruction.opcode == Opcode::VPERMB { + instruction.opcode = Opcode::VPERMW; + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Mask_V_E_LL_W0 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + set_reg_sizes_from_ll(instruction)?; + if instruction.modrm_rrr.num >= 8 { + return Err(DecodeError::InvalidOperand); + } else { + instruction.modrm_rrr.bank = RegisterBank::K; + } + } + generated::EVEXOperandCode::Mask_V_E_LL => { + check_mask_reg(instruction)?; + + let sz = regs_size(instruction); + + instruction.mem_size = sz; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VPTESTNMB { + instruction.opcode = Opcode::VPTESTNMW; + } else if instruction.opcode == Opcode::VPTESTMB { + instruction.opcode = Opcode::VPTESTMW; + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + set_reg_sizes_from_ll(instruction)?; + if instruction.modrm_rrr.num >= 8 { + return Err(DecodeError::InvalidOperand); + } else { + instruction.modrm_rrr.bank = RegisterBank::K; + } + } + generated::EVEXOperandCode::Maskm_V_Eq_xmm_imm8_sae_W1 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + deny_z(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 8; + if instruction.prefixes.evex_unchecked().broadcast() { + return Err(DecodeError::InvalidOperand); + } + } + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + } + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + + set_reg_sizes(instruction, RegisterBank::X); + if instruction.modrm_rrr.num >= 8 { + return Err(DecodeError::InvalidOperand); + } else { + instruction.modrm_rrr.bank = RegisterBank::K; + } + } + generated::EVEXOperandCode::Maskm_V_Ed_xmm_imm8_sae_W0 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + deny_z(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 4; + if instruction.prefixes.evex_unchecked().broadcast() { + return Err(DecodeError::InvalidOperand); + } + } + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + } + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + + set_reg_sizes(instruction, RegisterBank::X); + if instruction.modrm_rrr.num >= 8 { + return Err(DecodeError::InvalidOperand); + } else { + instruction.modrm_rrr.bank = RegisterBank::K; + } + } + generated::EVEXOperandCode::Mask_V_E_LL_imm8 => { + check_mask_reg(instruction)?; + if instruction.prefixes.evex_unchecked().broadcast() { + return Err(DecodeError::InvalidOperand); + } + + let sz = regs_size(instruction); + instruction.mem_size = sz; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VPCMPUB { + instruction.opcode = Opcode::VPCMPUW; + } else if instruction.opcode == Opcode::VPCMPB { + instruction.opcode = Opcode::VPCMPW; + } + }; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + + set_reg_sizes_from_ll(instruction)?; + if instruction.modrm_rrr.num >= 8 { + return Err(DecodeError::InvalidOperand); + } else { + instruction.modrm_rrr.bank = RegisterBank::K; + } + } + generated::EVEXOperandCode::Mask_Ed_xmm_imm8 => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + deny_z(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.opcode = if instruction.opcode == Opcode::VFPCLASSSS { + Opcode::VFPCLASSSD + } else { + instruction.opcode + }; + }; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.mem_size = 8; + } else { + instruction.mem_size = 4; + } + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + + set_reg_sizes(instruction, RegisterBank::X); + if instruction.modrm_rrr.num >= 8 { + return Err(DecodeError::InvalidOperand); + } else { + instruction.modrm_rrr.bank = RegisterBank::K; + } + } + generated::EVEXOperandCode::Mask_E_LL_imm8_bcast => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let sz = regs_size(instruction); + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.prefixes.evex_unchecked().broadcast() { + apply_broadcast(instruction, 8, sz); + } else { + instruction.mem_size = sz; + } + instruction.opcode = if instruction.opcode == Opcode::VFPCLASSPS { + Opcode::VFPCLASSPD + } else { + instruction.opcode + }; + } else { + if instruction.prefixes.evex_unchecked().broadcast() { + apply_broadcast(instruction, 4, sz); + } else { + instruction.mem_size = sz; + } + }; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + + set_reg_sizes_from_ll(instruction)?; + if instruction.modrm_rrr.num >= 8 { + return Err(DecodeError::InvalidOperand); + } else { + instruction.modrm_rrr.bank = RegisterBank::K; + } + } + generated::EVEXOperandCode::Mask_V_E_LL_imm8_sae_bcast_W0 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.prefixes.evex_unchecked().broadcast() { + apply_broadcast(instruction, 8, sz); + } else { + instruction.mem_size = sz; + } + } else { + if instruction.prefixes.evex_unchecked().broadcast() { + apply_broadcast(instruction, 4, sz); + } else { + instruction.mem_size = sz; + } + }; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + set_reg_sizes(instruction, RegisterBank::Z); + } else { + set_reg_sizes_from_ll(instruction)?; + } + instruction.mem_size = 0; + } else { + set_reg_sizes_from_ll(instruction)?; + } + if instruction.modrm_rrr.num >= 8 { + return Err(DecodeError::InvalidOperand); + } else { + instruction.modrm_rrr.bank = RegisterBank::K; + } + } + generated::EVEXOperandCode::Mask_V_E_LL_imm8_bcast => { + check_mask_reg(instruction)?; + + let sz = regs_size(instruction); + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.prefixes.evex_unchecked().broadcast() { + apply_broadcast(instruction, 8, sz); + } else { + instruction.mem_size = sz; + } + // this operand code is used in a few places, apply `w` as appropriate + instruction.opcode = if instruction.opcode == Opcode::VPCMPUD { + Opcode::VPCMPUQ + } else { + Opcode::VPCMPQ + }; + } else { + if instruction.prefixes.evex_unchecked().broadcast() { + apply_broadcast(instruction, 4, sz); + } else { + instruction.mem_size = sz; + } + }; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + + set_reg_sizes_from_ll(instruction)?; + if instruction.modrm_rrr.num >= 8 { + return Err(DecodeError::InvalidOperand); + } else { + instruction.modrm_rrr.bank = RegisterBank::K; + } + } + generated::EVEXOperandCode::Opcode_72_Gm_E_LL_imm8_bcast => { + check_mask_reg(instruction)?; + + let sz = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + let rrr = (modrm >> 3) & 7; + + let item_size = if instruction.prefixes.evex_unchecked().vex().w() { + instruction.opcode = [ + Ok(Opcode::VPRORQ), + Ok(Opcode::VPROLQ), + Err(DecodeError::InvalidOpcode), + Err(DecodeError::InvalidOpcode), + Ok(Opcode::VPSRAQ), + Err(DecodeError::InvalidOpcode), + Err(DecodeError::InvalidOpcode), + Err(DecodeError::InvalidOpcode), + ][rrr as usize]?; + 8 + } else { + instruction.opcode = [ + Ok(Opcode::VPRORD), + Ok(Opcode::VPROLD), + Ok(Opcode::VPSRLD), + Err(DecodeError::InvalidOpcode), + Ok(Opcode::VPSRAD), + Ok(Opcode::VPSLLD), + Err(DecodeError::InvalidOpcode), + Err(DecodeError::InvalidOpcode), + ][rrr as usize]?; + 4 + }; + + apply_broadcast(instruction, item_size, sz); + + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegVex_maskmerge; + instruction.operands[1] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_V_E_LL_imm8_W1 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + let sz = regs_size(instruction); + instruction.mem_size = sz; +/* + instruction.opcode = if instruction.prefixes.evex_unchecked().vex().w() { + apply_broadcast(instruction, 8, sz); + if instruction.opcode == Opcode::VALIGND { + Opcode::VALIGNQ + } else if instruction.opcode == Opcode::VPTERNLOGD { + Opcode::VPTERNLOGQ + } else if instruction.opcode == Opcode::VSHUFI32X4 { + Opcode::VSHUFI64X2 + } else { + instruction.opcode + } + } else { + apply_broadcast(instruction, 4, sz); + instruction.opcode + }; +*/ + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_V_E_LL_imm8_bcast => { + check_mask_reg(instruction)?; + + let sz = regs_size(instruction); + + instruction.opcode = if instruction.prefixes.evex_unchecked().vex().w() { + apply_broadcast(instruction, 8, sz); + if instruction.opcode == Opcode::VALIGND { + Opcode::VALIGNQ + } else if instruction.opcode == Opcode::VPTERNLOGD { + Opcode::VPTERNLOGQ + } else if instruction.opcode == Opcode::VSHUFI32X4 { + Opcode::VSHUFI64X2 + } else if instruction.opcode == Opcode::VPSHLDD { + Opcode::VPSHLDQ + } else if instruction.opcode == Opcode::VPSHRDD { + Opcode::VPSHRDQ + } else { + instruction.opcode + } + } else { + apply_broadcast(instruction, 4, sz); + instruction.opcode + }; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_V_E_LL_imm8_W0 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + if instruction.prefixes.evex_unchecked().broadcast() { + return Err(DecodeError::InvalidOperand); + } else { + instruction.mem_size = sz; + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_V_E_LL_imm8_bcast_W0 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let sz = regs_size(instruction); + + if instruction.opcode == Opcode::VSHUFPS { + apply_broadcast(instruction, 4, sz); + } else { + apply_broadcast(instruction, 8, sz); + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::G_V_E_LL_imm8 => { + check_mask_reg(instruction)?; + + instruction.mem_size = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_V_E_LL_imm8 => { + check_mask_reg(instruction)?; + + instruction.mem_size = regs_size(instruction); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_V_E_LL_imm8_bcast_W1 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + let sz = regs_size(instruction); + + apply_broadcast(instruction, 8, sz); + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + + set_reg_sizes_from_ll(instruction)?; + } + generated::EVEXOperandCode::Gm_ymm_E_zmm_sae_bcast_W1 => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_zmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Y; + instruction.operands[1] = mem_oper; + if instruction.prefixes.evex_unchecked().broadcast() { + if mem_oper != OperandSpec::RegMMM { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + apply_broadcast(instruction, 8, 64); + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.mem_size = 64; + } + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_xmm_E_ymm_sae_bcast_W1 => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_ymm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::X; + instruction.operands[1] = mem_oper; + if instruction.prefixes.evex_unchecked().broadcast() { + if mem_oper != OperandSpec::RegMMM { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + apply_broadcast(instruction, 8, 32); + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + instruction.modrm_rrr.bank = RegisterBank::Y; + instruction.modrm_mmm.bank = RegisterBank::Z; + } + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.mem_size = 32; + } + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_xmm_E_xmm_sae_bcast_W1 => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::X; + instruction.operands[1] = mem_oper; + if instruction.prefixes.evex_unchecked().broadcast() { + if mem_oper != OperandSpec::RegMMM { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + apply_broadcast(instruction, 8, 16); + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + instruction.modrm_rrr.bank = RegisterBank::Y; + instruction.modrm_mmm.bank = RegisterBank::Z; + } + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.mem_size = 16; + } + instruction.operand_count = 2; + } + generated::EVEXOperandCode::VCVTTPS2UQQ => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VCVTTPS2UQQ { + instruction.opcode = Opcode::VCVTTPD2UQQ; + } else if instruction.opcode == Opcode::VCVTPS2UQQ { + instruction.opcode = Opcode::VCVTPD2UQQ; + } else if instruction.opcode == Opcode::VCVTTPS2QQ { + instruction.opcode = Opcode::VCVTTPD2QQ; + } else if instruction.opcode == Opcode::VCVTPS2QQ { + instruction.opcode = Opcode::VCVTPD2QQ; + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + instruction.mem_size = 0; + + let mut lp = 0; + if instruction.prefixes.evex_unchecked().lp() { lp |= 2; } + if instruction.prefixes.evex_unchecked().vex().l() { lp |= 1; } + + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + if instruction.opcode == Opcode::VCVTPD2UQQ || instruction.opcode == Opcode::VCVTPS2UQQ || instruction.opcode == Opcode::VCVTPD2QQ || instruction.opcode == Opcode::VCVTPS2QQ { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } + instruction.modrm_rrr.bank = RegisterBank::Z; + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.modrm_mmm.bank = RegisterBank::Z; + } else { + instruction.modrm_mmm.bank = RegisterBank::Y; + } + } else { + let (r_sz, m_sz) = if instruction.prefixes.evex_unchecked().vex().w() { + [ + Ok((RegisterBank::X, RegisterBank::X)), + Ok((RegisterBank::Y, RegisterBank::Y)), + Ok((RegisterBank::Z, RegisterBank::Z)), + Err(DecodeError::InvalidOperand), + ][lp]? + } else { + [ + Ok((RegisterBank::X, RegisterBank::X)), + Ok((RegisterBank::Y, RegisterBank::X)), + Ok((RegisterBank::Z, RegisterBank::Y)), + Err(DecodeError::InvalidOperand), + ][lp]? + }; + instruction.modrm_rrr.bank = r_sz; + instruction.modrm_mmm.bank = m_sz; + } + } else { + let (r_sz, m_sz) = if instruction.prefixes.evex_unchecked().vex().w() { + [ + Ok((RegisterBank::X, 16)), + Ok((RegisterBank::Y, 32)), + Ok((RegisterBank::Z, 64)), + Err(DecodeError::InvalidOperand), + ][lp]? + } else { + [ + Ok((RegisterBank::X, 8)), + Ok((RegisterBank::Y, 16)), + Ok((RegisterBank::Z, 32)), + Err(DecodeError::InvalidOperand), + ][lp]? + }; + instruction.modrm_rrr.bank = r_sz; + if instruction.prefixes.evex_unchecked().vex().w() { + apply_broadcast(instruction, 8, m_sz); + } else { + apply_broadcast(instruction, 4, m_sz); + } + } + } + generated::EVEXOperandCode::VCVTPH2PS => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + if instruction.opcode == Opcode::VCVTPS2PD { + if instruction.prefixes.evex_unchecked().vex().w() { + return Err(DecodeError::InvalidOpcode); + } + } else if instruction.opcode == Opcode::VCVTTPS2UQQ { + instruction.opcode = Opcode::VCVTTPD2UQQ; + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + instruction.mem_size = 0; + + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + instruction.modrm_rrr.bank = RegisterBank::Z; + if instruction.opcode == Opcode::VCVTTPD2UQQ { + instruction.modrm_mmm.bank = RegisterBank::Z; + } else { + instruction.modrm_mmm.bank = RegisterBank::Y; + } + } else { + let (r_sz, m_sz) = match ( + instruction.prefixes.evex_unchecked().vex().l(), + instruction.prefixes.evex_unchecked().lp() + ) { + (true, true) => { return Err(DecodeError::InvalidOperand); } + (false, true) => (RegisterBank::Z, RegisterBank::Y), + (true, false) => (RegisterBank::Y, RegisterBank::X), + (false, false) => (RegisterBank::X, RegisterBank::X), + }; + instruction.modrm_rrr.bank = r_sz; + instruction.modrm_mmm.bank = m_sz; + } + } else { + let (r_sz, m_sz) = match ( + instruction.prefixes.evex_unchecked().vex().l(), + instruction.prefixes.evex_unchecked().lp() + ) { + (true, true) => { return Err(DecodeError::InvalidOperand); } + (true, false) => (RegisterBank::Y, 16), + (false, true) => (RegisterBank::Z, 32), + (false, false) => (RegisterBank::X, 8), + }; + instruction.modrm_rrr.bank = r_sz; + if instruction.opcode == Opcode::VCVTPS2PD { + apply_broadcast(instruction, 4, m_sz); + } else { + apply_broadcast(instruction, 8, m_sz); + } + } + } + generated::EVEXOperandCode::VCVTDQ2PS => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VCVTDQ2PS { + instruction.opcode = Opcode::VCVTQQ2PS; + } else if instruction.opcode == Opcode::VCVTUDQ2PS { + instruction.opcode = Opcode::VCVTUQQ2PS; + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + instruction.mem_size = 0; + + let mut lp = 0; + if instruction.prefixes.evex_unchecked().lp() { lp |= 2; } + if instruction.prefixes.evex_unchecked().vex().l() { lp |= 1; } + + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.modrm_rrr.bank = RegisterBank::Y; + } else { + instruction.modrm_rrr.bank = RegisterBank::Z; + } + instruction.modrm_mmm.bank = RegisterBank::Z; + } else { + let (r_sz, m_sz) = if instruction.prefixes.evex_unchecked().vex().w() { + [ + Ok((RegisterBank::X, RegisterBank::X)), + Ok((RegisterBank::X, RegisterBank::Y)), + Ok((RegisterBank::Y, RegisterBank::Z)), + Err(DecodeError::InvalidOperand), + ][lp]? + } else { + [ + Ok((RegisterBank::X, RegisterBank::X)), + Ok((RegisterBank::Y, RegisterBank::Y)), + Ok((RegisterBank::Z, RegisterBank::Z)), + Err(DecodeError::InvalidOperand), + ][lp]? + }; + instruction.modrm_rrr.bank = r_sz; + instruction.modrm_mmm.bank = m_sz; + } + } else { + let (r_sz, m_sz, item_sz) = if instruction.prefixes.evex_unchecked().vex().w() { + [ + Ok((RegisterBank::X, 16, 8)), + Ok((RegisterBank::X, 32, 8)), + Ok((RegisterBank::Y, 64, 8)), + Err(DecodeError::InvalidOperand), + ][lp]? + } else { + [ + Ok((RegisterBank::X, 16, 4)), + Ok((RegisterBank::Y, 32, 4)), + Ok((RegisterBank::Z, 64, 4)), + Err(DecodeError::InvalidOperand), + ][lp]? + }; + instruction.modrm_rrr.bank = r_sz; + apply_broadcast(instruction, item_sz, m_sz); + } + } + generated::EVEXOperandCode::VCVTTPS2UDQ => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + instruction.mem_size = 0; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VCVTTPS2UDQ { + instruction.opcode = Opcode::VCVTTPD2UDQ; + } else if instruction.opcode == Opcode::VCVTPS2UDQ { + instruction.opcode = Opcode::VCVTPD2UDQ; + } + } + + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + if instruction.opcode == Opcode::VCVTTPD2UDQ || instruction.opcode == Opcode::VCVTTPS2UDQ { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.modrm_rrr.bank = RegisterBank::Y; + } else { + instruction.modrm_rrr.bank = RegisterBank::Z; + } + instruction.modrm_mmm.bank = RegisterBank::Z; + } else { + let (r_sz, m_sz) = match ( + instruction.prefixes.evex_unchecked().vex().l(), + instruction.prefixes.evex_unchecked().lp() + ) { + (true, true) => { return Err(DecodeError::InvalidOperand); } + (false, true) => (if instruction.prefixes.evex_unchecked().vex().w() { RegisterBank::Y } else { RegisterBank::Z }, RegisterBank::Z), + (true, false) => (if instruction.prefixes.evex_unchecked().vex().w() { RegisterBank::X } else { RegisterBank::Y }, RegisterBank::Y), + (false, false) => (RegisterBank::X, RegisterBank::X), + }; + instruction.modrm_rrr.bank = r_sz; + instruction.modrm_mmm.bank = m_sz; + } + } else { + let (r_sz, m_sz) = match ( + instruction.prefixes.evex_unchecked().vex().l(), + instruction.prefixes.evex_unchecked().lp() + ) { + (true, true) => { return Err(DecodeError::InvalidOperand); } +// (true, false) => (RegisterBank::Y, 32), + (true, false) => (if instruction.prefixes.evex_unchecked().vex().w() { RegisterBank::X } else { RegisterBank::Y }, 32), + (false, true) => (if instruction.prefixes.evex_unchecked().vex().w() { RegisterBank::Y } else { RegisterBank::Z }, 64), + (false, false) => (RegisterBank::X, 16), + }; + instruction.modrm_rrr.bank = r_sz; + if instruction.prefixes.evex_unchecked().vex().w() { + apply_broadcast(instruction, 8, m_sz); + } else { + apply_broadcast(instruction, 4, m_sz); + } + } + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VCVTDQ2PS { + instruction.opcode = Opcode::VCVTQQ2PS; + } + } + } + generated::EVEXOperandCode::VCVTTPD2DQ => { + check_mask_reg(instruction)?; + deny_vex_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + instruction.mem_size = 0; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VCVTTPS2UDQ { + instruction.opcode = Opcode::VCVTTPD2UDQ; + } + } + + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + if instruction.opcode == Opcode::VCVTDQ2PS || instruction.opcode == Opcode::VCVTPD2DQ { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } + if instruction.opcode == Opcode::VCVTDQ2PS && !instruction.prefixes.evex_unchecked().vex().w() { + instruction.modrm_rrr.bank = RegisterBank::Z; + } else { + instruction.modrm_rrr.bank = RegisterBank::Y; + } + instruction.modrm_mmm.bank = RegisterBank::Z; + } else { + let (r_sz, m_sz) = match ( + instruction.prefixes.evex_unchecked().vex().l(), + instruction.prefixes.evex_unchecked().lp() + ) { + (true, true) => { return Err(DecodeError::InvalidOperand); } + (false, true) => (RegisterBank::Y, RegisterBank::Z), + (true, false) => (RegisterBank::X, RegisterBank::Y), + (false, false) => (RegisterBank::X, RegisterBank::X), + }; + instruction.modrm_rrr.bank = r_sz; + instruction.modrm_mmm.bank = m_sz; + } + } else { + let (r_sz, m_sz) = match ( + instruction.prefixes.evex_unchecked().vex().l(), + instruction.prefixes.evex_unchecked().lp() + ) { + (true, true) => { return Err(DecodeError::InvalidOperand); } + (true, false) => (RegisterBank::X, 32), + (false, true) => (RegisterBank::Y, 64), + (false, false) => (RegisterBank::X, 16), + }; + instruction.modrm_rrr.bank = r_sz; + apply_broadcast(instruction, 8, m_sz); + } + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VCVTDQ2PS { + instruction.opcode = Opcode::VCVTQQ2PS; + } + } + } + generated::EVEXOperandCode::Gm_ymm_U_zmm_sae_W1 => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_zmm(bytes, instruction, modrm, length)?; + instruction.modrm_rrr.bank = RegisterBank::Y; + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + } + instruction.operands[1] = mem_oper; + if mem_oper != OperandSpec::RegMMM { + return Err(DecodeError::InvalidOperand); + } + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Gm_V_E_xmm_sae_W1 => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + set_reg_sizes(instruction, RegisterBank::X); + + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + if instruction.opcode == Opcode::VMINSD || instruction.opcode == Opcode::VMAXSD { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } + } + } else { + instruction.mem_size = 8; + } + } + generated::EVEXOperandCode::Gm_V_E_xmm_sae => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VEXP2SS { + instruction.opcode = Opcode::VEXP2SD; + } else if instruction.opcode == Opcode::VRCP28SS { + instruction.opcode = Opcode::VRCP28SD; + } else if instruction.opcode == Opcode::VRSQRT28SS { + instruction.opcode = Opcode::VRSQRT28SD; + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + set_reg_sizes(instruction, RegisterBank::X); + + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } + } else { + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.mem_size = 8; + } else { + instruction.mem_size = 4; + } + } + } + generated::EVEXOperandCode::Gm_E_zmm_sae_bcast => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VEXP2PS { + instruction.opcode = Opcode::VEXP2PD; + } else if instruction.opcode == Opcode::VRCP28PS { + instruction.opcode = Opcode::VRCP28PD; + } else if instruction.opcode == Opcode::VRSQRT28PS { + instruction.opcode = Opcode::VRSQRT28PD; + } + } + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_zmm(bytes, instruction, modrm, length)?; + + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + set_reg_sizes(instruction, RegisterBank::Z); + } else { + let sz = regs_size(instruction); + if sz < 64 { + return Err(DecodeError::InvalidOperand); + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + set_reg_sizes_from_ll(instruction)?; + } + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + let sz = regs_size(instruction); + if sz < 64 { + return Err(DecodeError::InvalidOperand); + } + + if instruction.prefixes.evex_unchecked().vex().w() { + apply_broadcast(instruction, 8, sz); + } else { + apply_broadcast(instruction, 4, sz); + } + set_reg_sizes_from_ll(instruction)?; + } + } + generated::EVEXOperandCode::Gm_U_zmm_sae_W0 => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + } + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + set_reg_sizes(instruction, RegisterBank::Z); + } + generated::EVEXOperandCode::Gm_U_zmm_imm8_sae_W0 => { + deny_vex_reg(instruction)?; + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + } + if mem_oper != OperandSpec::RegMMM { + return Err(DecodeError::InvalidOperand); + } + instruction.operands[1] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + + set_reg_sizes(instruction, RegisterBank::Z); + } + generated::EVEXOperandCode::Edd_G_xmm_imm8 => { + deny_vex_reg(instruction)?; + deny_mask_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::X; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = mem_oper; + instruction.operands[1] = OperandSpec::RegRRR; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.opcode = Opcode::VPEXTRQ; + if let OperandSpec::RegMMM = mem_oper { + instruction.modrm_mmm.bank = RegisterBank::Q; + } else { + instruction.mem_size = 8; + } + } else { + instruction.opcode = Opcode::VPEXTRD; + if let OperandSpec::RegMMM = mem_oper { + instruction.modrm_mmm.bank = RegisterBank::D; + } else { + instruction.mem_size = 4; + } + } + } + generated::EVEXOperandCode::VCVTUSI2SD => { + deny_mask_reg(instruction)?; + deny_z(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::X; + instruction.vex_reg.bank = RegisterBank::X; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + if mem_oper == OperandSpec::RegMMM { + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.modrm_mmm.bank = RegisterBank::Q; + } else { + instruction.modrm_mmm.bank = RegisterBank::D; + } + if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } else { + if instruction.prefixes.evex_unchecked().lp() || !instruction.prefixes.evex_unchecked().vex().l() { + return Err(DecodeError::InvalidOpcode); + } + } + } + } else { + if instruction.prefixes.evex_unchecked().broadcast() { + return Err(DecodeError::InvalidOpcode); + } + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.mem_size = 8; + } else { + instruction.mem_size = 4; + } + } + instruction.operand_count = 3; + } + generated::EVEXOperandCode::VEXTRACTPS => { + deny_vex_reg(instruction)?; + deny_mask_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::X; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = mem_oper; + instruction.operands[1] = OperandSpec::RegRRR; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + + if let OperandSpec::RegMMM = mem_oper { + instruction.modrm_mmm.bank = RegisterBank::D; + } else { + instruction.mem_size = 4; + } + } + generated::EVEXOperandCode::Ewd_G_xmm_imm8 => { + deny_vex_reg(instruction)?; + deny_mask_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::X; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = mem_oper; + instruction.operands[1] = OperandSpec::RegRRR; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + + if let OperandSpec::RegMMM = mem_oper { + instruction.modrm_mmm.bank = RegisterBank::D; + } else { + instruction.mem_size = 2; + } + } + generated::EVEXOperandCode::Ebd_G_xmm_imm8 => { + deny_vex_reg(instruction)?; + deny_mask_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::X; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = mem_oper; + instruction.operands[1] = OperandSpec::RegRRR; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[2] = OperandSpec::ImmU8; + instruction.operand_count = 3; + + if let OperandSpec::RegMMM = mem_oper { + instruction.modrm_mmm.bank = RegisterBank::D; + } else { + instruction.mem_size = 1; + } + } + generated::EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae => { + check_mask_reg(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + + let item_size = if instruction.prefixes.evex_unchecked().vex().w() { + if instruction.opcode == Opcode::VRANGESS { + instruction.opcode = Opcode::VRANGESD; + 8 + } else if instruction.opcode == Opcode::VFPCLASSSS { + instruction.opcode = Opcode::VFPCLASSSD; + 8 + } else if instruction.opcode == Opcode::VREDUCESS { + instruction.opcode = Opcode::VREDUCESD; + 8 + } else if instruction.opcode == Opcode::VFIXUPIMMSS { + instruction.opcode = Opcode::VFIXUPIMMSD; + 8 + } else if instruction.opcode == Opcode::VGETMANTSS { + instruction.opcode = Opcode::VGETMANTSD; + 8 + } else { + 4 + } + } else { + 4 + }; + + if let OperandSpec::RegMMM = mem_oper { + instruction.mem_size = 0; + } else{ + instruction.mem_size = item_size; + } + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + } + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + + set_reg_sizes(instruction, RegisterBank::X); + } + generated::EVEXOperandCode::Gm_V_E_xmm_imm8_sae => { + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if let OperandSpec::RegMMM = mem_oper { + /* no mem size */ + } else{ + instruction.mem_size = 8; + } + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + } + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.imm = read_imm_unsigned(bytes, 1, length)?; + instruction.operands[3] = OperandSpec::ImmU8; + instruction.operand_count = 4; + + set_reg_sizes(instruction, RegisterBank::X); + } + generated::EVEXOperandCode::Gm_V_zmm_M_xmm_W0 => { + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + instruction.modrm_rrr.bank = RegisterBank::Z; + instruction.vex_reg.bank = RegisterBank::Z; + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if let OperandSpec::RegMMM = mem_oper { + return Err(DecodeError::InvalidOperand); + } else{ + instruction.mem_size = 16; + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + } + generated::EVEXOperandCode::Gm_V_M_xmm => { + check_mask_reg(instruction)?; + + instruction.mem_size = 16; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if mem_oper == OperandSpec::RegMMM { + return Err(DecodeError::InvalidOperand); + } + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + set_reg_sizes(instruction, RegisterBank::X); + } + generated::EVEXOperandCode::VMOVSD_10 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + if mem_oper == OperandSpec::RegMMM { + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + instruction.mem_size = 0; + } else { + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + instruction.mem_size = 8; + } + set_reg_sizes(instruction, RegisterBank::X); + } + generated::EVEXOperandCode::VMOVSD_11 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 1)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = mem_oper.masked(); + if mem_oper == OperandSpec::RegMMM { + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = OperandSpec::RegRRR; + instruction.operand_count = 3; + + instruction.mem_size = 0; + } else { + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + + instruction.mem_size = 8; + } + set_reg_sizes(instruction, RegisterBank::X); + } + generated::EVEXOperandCode::VMOVSS_10 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR_maskmerge; + if mem_oper == OperandSpec::RegMMM { + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + instruction.mem_size = 0; + } else { + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + + instruction.mem_size = 4; + } + set_reg_sizes(instruction, RegisterBank::X); + } + generated::EVEXOperandCode::VMOVSS_11 => { + check_mask_reg(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = mem_oper.masked(); + if mem_oper == OperandSpec::RegMMM { + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = OperandSpec::RegRRR; + instruction.operand_count = 3; + + instruction.mem_size = 0; + } else { + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + + instruction.mem_size = 4; + } + set_reg_sizes(instruction, RegisterBank::X); + } + generated::EVEXOperandCode::VCVTSI2SS => { + check_mask_reg(instruction)?; + deny_z(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if instruction.prefixes.evex_unchecked().broadcast() && mem_oper == OperandSpec::RegMMM { + if !instruction.prefixes.evex_unchecked().vex().w() && instruction.opcode == Opcode::VCVTSI2SD { + instruction.operands[0] = OperandSpec::RegRRR; + } else { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } + } else { + instruction.operands[0] = OperandSpec::RegRRR; + } + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + set_reg_sizes(instruction, RegisterBank::X); + + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.modrm_mmm.bank = RegisterBank::Q; + } else { + instruction.modrm_mmm.bank = RegisterBank::D; + } + } else { + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.mem_size = 8; + } else { + instruction.mem_size = 4; + } + } + } + generated::EVEXOperandCode::VCVTTSS2SI => { + check_mask_reg(instruction)?; + deny_z(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae_noround; + } else { + instruction.operands[0] = OperandSpec::RegRRR; + } + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.modrm_rrr.bank = RegisterBank::Q; + } else { + instruction.modrm_rrr.bank = RegisterBank::D; + } + + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 4; + } + + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::VCVTSS2SI => { + check_mask_reg(instruction)?; + deny_z(instruction)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + if instruction.prefixes.evex_unchecked().broadcast() { + instruction.operands[0] = OperandSpec::RegRRR_maskmerge_sae; + } else { + instruction.operands[0] = OperandSpec::RegRRR; + } + if instruction.prefixes.evex_unchecked().vex().w() { + instruction.modrm_rrr.bank = RegisterBank::Q; + } else { + instruction.modrm_rrr.bank = RegisterBank::D; + } + + if mem_oper == OperandSpec::RegMMM { + instruction.mem_size = 0; + } else { + instruction.mem_size = 4; + } + + instruction.operands[1] = mem_oper; + instruction.operand_count = 2; + } + generated::EVEXOperandCode::Operands_12_W0 => { + deny_mask_reg(instruction)?; + deny_z(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + set_reg_sizes(instruction, RegisterBank::X); + + if mem_oper == OperandSpec::RegMMM { + instruction.opcode = Opcode::VMOVHLPS; + + instruction.mem_size = 0; + } else { + instruction.opcode = Opcode::VMOVLPS; + + instruction.mem_size = 8; + } + } + generated::EVEXOperandCode::Operands_16_W0 => { + deny_mask_reg(instruction)?; + deny_z(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = OperandSpec::RegRRR; + instruction.operands[1] = OperandSpec::RegVex; + instruction.operands[2] = mem_oper; + instruction.operand_count = 3; + + set_reg_sizes(instruction, RegisterBank::X); + + if mem_oper == OperandSpec::RegMMM { + instruction.opcode = Opcode::VMOVLHPS; + + instruction.mem_size = 0; + } else { + instruction.opcode = Opcode::VMOVHPS; + + instruction.mem_size = 8; + } + } + generated::EVEXOperandCode::Mq_G_W0 => { + deny_mask_reg(instruction)?; + deny_z(instruction)?; + ensure_W(instruction, 0)?; + + let modrm = read_modrm(bytes, length)?; + set_rrr(instruction, modrm); + let mem_oper = read_E_xmm(bytes, instruction, modrm, length)?; + instruction.operands[0] = mem_oper; + instruction.operands[1] = OperandSpec::RegRRR; + instruction.operand_count = 2; + + set_reg_sizes(instruction, RegisterBank::X); + + if mem_oper == OperandSpec::RegMMM { + return Err(DecodeError::InvalidOperand); + } else { + instruction.mem_size = 8; + } + } + generated::EVEXOperandCode::Nothing => {} + o => { + panic!("unhandled operand code {:?}. opcode={}", o, instruction.opcode); + } + } + Ok(()) +} diff --git a/src/shared/generated_evex.in b/src/shared/generated_evex.in new file mode 100644 index 0000000..d98346b --- /dev/null +++ b/src/shared/generated_evex.in @@ -0,0 +1,1499 @@ +#[allow(warnings)] +mod generated { + use super::Opcode::*; +const EVEX_OPCODES: [super::Opcode; 496] = [ + V4FMADDPS, + V4FMADDSS, + V4FNMADDPS, + V4FNMADDSS, + VADDPD, + VADDSD, + VADDSS, + VAESDEC, + VAESDECLAST, + VAESENC, + VAESENCLAST, + VALIGND, + VALIGNQ, + VANDNPD, + VANDPD, + VBLENDMPD, + VBLENDMPS, + VBROADCASTF32X2, + VBROADCASTF32X4, + VBROADCASTF32X8, + VBROADCASTF64X2, + VBROADCASTF64X4, + VBROADCASTI32X2, + VBROADCASTI32X4, + VBROADCASTI32X8, + VBROADCASTI64X2, + VBROADCASTI64X4, + VBROADCASTSD, + VBROADCASTSS, + VCMPPD, + VCMPSD, + VCMPSS, + VCOMISD, + VCOMPRESSPD, + VCOMPRESSPS, + VCVTDQ2PD, + VCVTNE2PS2BF16, + VCVTNEPS2BF16, + VCVTPD2DQ, + VCVTPD2PS, + VCVTPD2QQ, + VCVTPD2UQQ, + VCVTPH2PS, + VCVTPS2DQ, + VCVTPS2PH, + VCVTPS2QQ, + VCVTPS2UQQ, + VCVTQQ2PD, + VCVTSD2SI, + VCVTSD2SS, + VCVTSD2USI, + VCVTSI2SD, + VCVTSI2SS, + VCVTSS2SD, + VCVTSS2SI, + VCVTSS2USI, + VCVTTPD2DQ, + VCVTTPD2QQ, + VCVTTPD2UQQ, + VCVTTPS2DQ, + VCVTTPS2QQ, + VCVTTPS2UQQ, + VCVTTSD2SI, + VCVTTSD2USI, + VCVTTSS2SI, + VCVTTSS2USI, + VCVTUDQ2PD, + VCVTUDQ2PS, + VCVTUQQ2PD, + VCVTUQQ2PS, + VCVTUSI2SD, + VCVTUSI2SS, + VDBPSADBW, + VDIVPD, + VDIVSD, + VDIVSS, + VDPBF16PS, + VEXP2PD, + VEXP2PS, + VEXPANDPD, + VEXPANDPS, + VEXTRACTF32X4, + VEXTRACTF32X8, + VEXTRACTF64X2, + VEXTRACTF64X4, + VEXTRACTI32X4, + VEXTRACTI32X8, + VEXTRACTI64X2, + VEXTRACTI64X4, + VEXTRACTPS, + VFIXUPIMMPD, + VFIXUPIMMPS, + VFIXUPIMMSD, + VFIXUPIMMSS, + VFMADD132PD, + VFMADD132PS, + VFMADD132SD, + VFMADD132SS, + VFMADD213PD, + VFMADD213PS, + VFMADD213SD, + VFMADD213SS, + VFMADD231PD, + VFMADD231PS, + VFMADD231SD, + VFMADD231SS, + VFMADDSUB132PD, + VFMADDSUB132PS, + VFMADDSUB213PD, + VFMADDSUB213PS, + VFMADDSUB231PD, + VFMADDSUB231PS, + VFMSUB132PD, + VFMSUB132PS, + VFMSUB132SD, + VFMSUB132SS, + VFMSUB213PD, + VFMSUB213PS, + VFMSUB213SD, + VFMSUB213SS, + VFMSUB231PD, + VFMSUB231PS, + VFMSUB231SD, + VFMSUB231SS, + VFMSUBADD132PD, + VFMSUBADD132PS, + VFMSUBADD213PD, + VFMSUBADD213PS, + VFMSUBADD231PD, + VFMSUBADD231PS, + VFNMADD132PD, + VFNMADD132PS, + VFNMADD132SD, + VFNMADD132SS, + VFNMADD213PD, + VFNMADD213PS, + VFNMADD213SD, + VFNMADD213SS, + VFNMADD231PD, + VFNMADD231PS, + VFNMADD231SD, + VFNMADD231SS, + VFNMSUB132PD, + VFNMSUB132PS, + VFNMSUB132SD, + VFNMSUB132SS, + VFNMSUB213PD, + VFNMSUB213PS, + VFNMSUB213SD, + VFNMSUB213SS, + VFNMSUB231PD, + VFNMSUB231PS, + VFNMSUB231SD, + VFNMSUB231SS, + VFPCLASSPD, + VFPCLASSPS, + VFPCLASSSD, + VFPCLASSSS, + VGETEXPPD, + VGETEXPPS, + VGETEXPSD, + VGETEXPSS, + VGETMANTPD, + VGETMANTPS, + VGETMANTSD, + VGETMANTSS, + VGF2P8AFFINEINVQB, + VGF2P8AFFINEQB, + VGF2P8MULB, + VINSERTF32X4, + VINSERTF32X8, + VINSERTF64X2, + VINSERTF64X4, + VINSERTI32X4, + VINSERTI32X8, + VINSERTI64X2, + VINSERTI64X4, + VINSERTPS, + VMAXPD, + VMAXSD, + VMAXSS, + VMINPD, + VMINSD, + VMINSS, + VMOVAPD, + VMOVD, + VMOVDDUP, + VMOVDQA32, + VMOVDQA64, + VMOVDQU16, + VMOVDQU32, + VMOVDQU64, + VMOVDQU8, + VMOVHPD, + VMOVLPD, + VMOVNTDQ, + VMOVNTDQA, + VMOVNTPD, + VMOVQ, + VMOVSD, + VMOVSHDUP, + VMOVSLDUP, + VMOVSS, + VMOVUPD, + VMULPD, + VMULSD, + VMULSS, + VORPD, + VP2INTERSECTD, + VP2INTERSECTQ, + VP4DPWSSD, + VP4DPWSSDS, + VPABSB, + VPABSD, + VPABSQ, + VPABSW, + VPACKSSDW, + VPACKSSWB, + VPACKUSDW, + VPACKUSWB, + VPADDB, + VPADDD, + VPADDQ, + VPADDSB, + VPADDSW, + VPADDUSB, + VPADDUSW, + VPADDW, + VPALIGNR, + VPANDD, + VPANDND, + VPANDNQ, + VPANDQ, + VPAVGB, + VPAVGW, + VPBLENDMB, + VPBLENDMD, + VPBLENDMQ, + VPBLENDMW, + VPBROADCASTB, + VPBROADCASTD, + VPBROADCASTMB2Q, + VPBROADCASTMW2D, + VPBROADCASTQ, + VPBROADCASTW, + VPCLMULQDQ, + VPCMPB, + VPCMPD, + VPCMPEQB, + VPCMPEQD, + VPCMPEQQ, + VPCMPEQW, + VPCMPGTB, + VPCMPGTD, + VPCMPGTQ, + VPCMPGTW, + VPCMPQ, + VPCMPUB, + VPCMPUD, + VPCMPUQ, + VPCMPUW, + VPCMPW, + VPCOMPRESSB, + VPCOMPRESSD, + VPCOMPRESSQ, + VPCOMPRESSW, + VPCONFLICTD, + VPCONFLICTQ, + VPDPBUSD, + VPDPBUSDS, + VPDPWSSD, + VPDPWSSDS, + VPERMB, + VPERMD, + VPERMI2B, + VPERMI2D, + VPERMI2PD, + VPERMI2PS, + VPERMI2Q, + VPERMI2W, + VPERMILPD, + VPERMILPS, + VPERMPD, + VPERMPS, + VPERMQ, + VPERMT2B, + VPERMT2D, + VPERMT2PD, + VPERMT2PS, + VPERMT2Q, + VPERMT2W, + VPERMW, + VPEXPANDB, + VPEXPANDD, + VPEXPANDQ, + VPEXPANDW, + VPEXTRB, + VPEXTRD, + VPEXTRQ, + VPEXTRW, + VPINSRB, + VPINSRD, + VPINSRQ, + VPINSRW, + VPLZCNTD, + VPLZCNTQ, + VPMADD52HUQ, + VPMADD52LUQ, + VPMADDUBSW, + VPMADDWD, + VPMAXSB, + VPMAXSD, + VPMAXSQ, + VPMAXSW, + VPMAXUB, + VPMAXUD, + VPMAXUQ, + VPMAXUW, + VPMINSB, + VPMINSD, + VPMINSQ, + VPMINSW, + VPMINUB, + VPMINUD, + VPMINUQ, + VPMINUW, + VPMOVB2M, + VPMOVD2M, + VPMOVDB, + VPMOVDW, + VPMOVM2B, + VPMOVM2D, + VPMOVM2Q, + VPMOVM2W, + VPMOVQ2M, + VPMOVQB, + VPMOVQD, + VPMOVQW, + VPMOVSDB, + VPMOVSDW, + VPMOVSQB, + VPMOVSQD, + VPMOVSQW, + VPMOVSWB, + VPMOVSXBD, + VPMOVSXBQ, + VPMOVSXBW, + VPMOVSXDQ, + VPMOVSXWD, + VPMOVSXWQ, + VPMOVUSDB, + VPMOVUSDW, + VPMOVUSQB, + VPMOVUSQD, + VPMOVUSQW, + VPMOVUSWB, + VPMOVW2M, + VPMOVWB, + VPMOVZXBD, + VPMOVZXBQ, + VPMOVZXBW, + VPMOVZXDQ, + VPMOVZXWD, + VPMOVZXWQ, + VPMULDQ, + VPMULHRSW, + VPMULHUW, + VPMULHW, + VPMULLD, + VPMULLQ, + VPMULLW, + VPMULTISHIFTQB, + VPMULUDQ, + VPOPCNTB, + VPOPCNTD, + VPOPCNTQ, + VPOPCNTW, + VPORD, + VPORQ, + VPROLD, + VPROLQ, + VPROLVD, + VPROLVQ, + VPRORVD, + VPRORVQ, + VPSADBW, + VPSHLDD, + VPSHLDQ, + VPSHLDVD, + VPSHLDVQ, + VPSHLDVW, + VPSHLDW, + VPSHRDD, + VPSHRDQ, + VPSHRDVD, + VPSHRDVQ, + VPSHRDVW, + VPSHRDW, + VPSHUFB, + VPSHUFBITQMB, + VPSHUFD, + VPSHUFHW, + VPSHUFLW, + VPSLLD, + VPSLLQ, + VPSLLVD, + VPSLLVQ, + VPSLLVW, + VPSLLW, + VPSRAD, + VPSRAQ, + VPSRAVD, + VPSRAVQ, + VPSRAVW, + VPSRAW, + VPSRLD, + VPSRLQ, + VPSRLVD, + VPSRLVQ, + VPSRLVW, + VPSRLW, + VPSUBB, + VPSUBD, + VPSUBQ, + VPSUBSB, + VPSUBSW, + VPSUBUSB, + VPSUBUSW, + VPSUBW, + VPTERNLOGD, + VPTERNLOGQ, + VPTESTMB, + VPTESTMD, + VPTESTMQ, + VPTESTMW, + VPTESTNMB, + VPTESTNMD, + VPTESTNMQ, + VPTESTNMW, + VPUNPCKHBW, + VPUNPCKHDQ, + VPUNPCKHQDQ, + VPUNPCKHWD, + VPUNPCKLBW, + VPUNPCKLDQ, + VPUNPCKLQDQ, + VPUNPCKLWD, + VPXORD, + VPXORQ, + VRANGEPD, + VRANGEPS, + VRANGESD, + VRANGESS, + VRCP14PD, + VRCP14PS, + VRCP14SD, + VRCP14SS, + VRCP28PD, + VRCP28PS, + VRCP28SD, + VRCP28SS, + VREDUCEPD, + VREDUCEPS, + VREDUCESD, + VREDUCESS, + VRNDSCALEPD, + VRNDSCALEPS, + VRNDSCALESD, + VRNDSCALESS, + VRSQRT14PD, + VRSQRT14PS, + VRSQRT14SD, + VRSQRT14SS, + VRSQRT28PD, + VRSQRT28PS, + VRSQRT28SD, + VRSQRT28SS, + VSCALEFPD, + VSCALEFPS, + VSCALEFSD, + VSCALEFSS, + VSHUFF32X4, + VSHUFF64X2, + VSHUFI32X4, + VSHUFI64X2, + VSHUFPD, + VSQRTPD, + VSQRTSD, + VSQRTSS, + VSUBPD, + VSUBSD, + VSUBSS, + VUCOMISD, + VUNPCKHPD, + VUNPCKLPD, + VXORPD, +]; + +#[derive(Debug, PartialEq, Eq, Copy, Clone)] +pub(crate) enum EVEXOperandCode { + VCVTTPS2UQQ, + VCVTUSI2SD, + VCVTTPS2UDQ, + Gm_E_LL_sae_bcast_W0, + G_Ed_xmm_sae_W0, + Maskm_V_Eq_xmm_imm8_sae_W1, + VCVTPS2PD_W0, + VCVTPH2PS, + VCVTDQ2PS, + Mask_E_LL_imm8_bcast, + Gm_E_LL_imm8_sae, + Gm_V_LL_E_xmm, + Gm_V_LL_E_xmm_W0, + Gm_V_LL_E_xmm_W1, + VPINSRW, + VPEXTRW, + Maskm_V_E_LL_imm8_sae_bcast_W1, + VCVTSI2SS, + VCVTTSS2SI, + VCVTSS2SI, + VMOVSS_10, + VMOVSS_11, + VMOVQ_Ed_G_xmm, + VMOVQ_G_Ed_xmm, + VMOVD_6e, + VMOVD_7e, + VMOVQ_7e, + Gm_ymm_E_zmm_sae_bcast_W1, + Gm_xmm_E_xmm_sae_bcast_W1, + Gm_xmm_E_ymm_sae_bcast_W1, + Gm_E_zmm_sae_bcast, + Gm_E_zmm_sae_bcast_W0, + G_V_xmm_Ebd_imm8, + G_V_xmm_Edq_imm8, + G_V_xmm_Edq_sae, + E_G_xmm, + E_G_xmm_W0, + E_G_ymm, + E_G_ymm_W0, + E_G_zmm, + E_G_zmm_W0, + E_xmm_G_ymm, + E_xmm_G_ymm_W0, + E_xmm_G_zmm, + E_xmm_G_zmm_W0, + E_ymm_G_xmm, + E_ymm_G_xmm_W0, + E_ymm_G_zmm, + E_ymm_G_zmm_W0, + Ebd_G_xmm_imm8, + Ed_xmm_G_xmm, + Ed_xmm_G_xmm_W0, + Ed_xmm_G_ymm, + Ed_xmm_G_ymm_W0, + Edd_G_xmm_imm8, + Edm_xmm_G_xmm, + Edm_xmm_G_xmm_W0, + Edm_xmm_G_ymm, + Edm_xmm_G_ymm_W0, + Em_G_LL, + M_G_LL_W0, + E_G_LL_W0, + Em_G_LL_W0, + Em_G_LL_W1, + Em_G_xmm, + Em_G_xmm_W0, + Em_G_xmm_W1, + Em_G_ymm, + Em_G_ymm_W0, + Em_G_ymm_W1, + Em_G_zmm, + Em_G_zmm_W0, + Em_G_zmm_W1, + Em_xmm_G_LL_imm8, + Em_xmm_G_ymm, + Em_xmm_G_ymm_W0, + Em_xmm_G_ymm_imm8_sae_W0, + Em_xmm_G_zmm, + Em_xmm_G_zmm_W0, + Em_ymm_G_zmm, + Em_ymm_G_zmm_W0, + Em_ymm_G_zmm_imm8, + Em_ymm_G_zmm_imm8_sae, + Em_ymm_G_zmm_imm8_sae_W0, + Eq_G_xmm_imm8, + Eq_xmm_G_xmm, + Eq_xmm_G_xmm_W0, + Eq_xmm_G_ymm, + Eq_xmm_G_ymm_W0, + Eq_xmm_G_zmm, + Eq_xmm_G_zmm_W0, + Eqm_G_xmm_imm8_sae_W0, + Eqm_xmm_G_xmm, + Eqm_xmm_G_xmm_W0, + Eqm_xmm_G_ymm, + Eqm_xmm_G_ymm_W0, + Eqm_xmm_G_zmm, + Eqm_xmm_G_zmm_W0, + Ew_xmm_G_xmm, + Ew_xmm_G_xmm_W0, + Ewd_G_xmm_imm8, + Ewm_xmm_G_xmm, + Ewm_xmm_G_xmm_W0, + G_E_LL_W0, + G_E_xmm, + G_E_xmm_W0, + G_E_ymm, + G_E_ymm_W0, + G_E_zmm, + G_E_zmm_W0, + G_Ed_xmm_sae, + G_LL_Mask, + G_LL_Mask_W0, + G_LL_Mask_W1, + G_V_E_LL, + G_V_E_LL_W0, + G_V_E_LL_bcast, + G_V_E_LL_bcast_W1, + G_V_E_LL_imm8, + G_V_E_LL_imm8_W0, + G_V_E_xmm, + G_V_E_xmm_imm8, + G_V_E_ymm, + G_V_E_ymm_imm8, + G_V_E_zmm, + G_V_E_zmm_imm8, + G_V_Ed_xmm_imm8, + G_V_Ed_xmm_imm8_W0, + G_V_Mq_xmm_W1, + G_V_U_xmm, + G_xmm_Mask, + G_xmm_Mask_W0, + G_xmm_Mask_W1, + G_ymm_Ed_xmm, + Gm_ymm_Ed_xmm_W0, + G_ymm_M_xmm, + G_ymm_Mask, + G_ymm_Mask_W0, + G_ymm_Mask_W1, + G_zmm_Ed_LL_bcast, + Gm_zmm_Ed_xmm, + G_zmm_Ed_xmm_W0, + Gm_xmm_Ed_xmm_W0, + Gm_zmm_Ed_xmm_W0, + G_zmm_Ed_xmm_bcast, + Gm_zmm_M_ymm, + G_zmm_Mask, + G_zmm_Mask_W0, + G_zmm_Mask_W1, + Gb_Eb_zmm, + Gb_Eb_zmm_W0, + Gb_Ew_LL_W0, + Gb_Ew_xmm, + Gb_Ew_xmm_W0, + Gb_Ew_ymm, + Gb_Ew_ymm_W0, + Gb_Ew_zmm, + Gb_Ew_zmm_W0, + Gd_Ed_xmm, + Gd_Ed_xmm_sae, + Gm_E_LL, + Gm_E_LL_W0, + Gm_E_LL_W1, + Gm_E_LL_sae, + Gm_E_LL_bcast, + Gm_E_LL_bcast_W0, + Gm_E_LL_bcast_W1, + Gm_E_LL_imm8, + Gm_E_LL_imm8_bcast, + Opcode_72_Gm_E_LL_imm8_bcast, + Gm_E_LL_imm8_bcast_W0, + Gm_E_LL_imm8_bcast_W1, + Gm_E_LL_imm8_sae_W0, + Gm_E_LL_imm8_sae_W1, + Gm_E_LL_sae_bcast_W1, + VCVTUDQ2PD, + Gm_E_xmm, + Gm_E_xmm_W0, + Gm_E_xmm_W1, + Gm_E_xmm_bcast, + Gm_E_xmm_bcast_W0, + Gm_E_xmm_bcast_W1, + Gm_E_xmm_imm8, + Gm_E_xmm_imm8_bcast, + Gm_E_xmm_imm8_bcast_W0, + Gm_E_xmm_imm8_bcast_W1, + Gm_E_ymm, + Gm_E_ymm_W0, + Gm_E_ymm_W1, + Gm_E_ymm_bcast, + Gm_E_ymm_bcast_W0, + Gm_E_ymm_bcast_W1, + Gm_E_ymm_imm8, + Gm_E_ymm_imm8_bcast, + Gm_E_ymm_imm8_bcast_W0, + Gm_E_ymm_imm8_bcast_W1, + Gm_E_zmm, + Gm_E_zmm_W0, + Gm_E_zmm_W1, + Gm_E_zmm_bcast, + Gm_E_zmm_bcast_W0, + Gm_E_zmm_bcast_W1, + Gm_E_zmm_imm8, + Gm_E_zmm_imm8_bcast, + Gm_E_zmm_imm8_bcast_W0, + Gm_E_zmm_imm8_bcast_W1, + Gm_E_zmm_imm8_sae, + Gm_E_zmm_imm8_sae_W0, + Gm_E_zmm_imm8_sae_W1, + Gm_E_zmm_sae, + Gm_E_zmm_sae_W0, + Gm_E_zmm_sae_W1, + Gm_Eb_LL_W0, + Gm_LL_Eb_xmm_W0, + Gm_LL_Ew_xmm_W0, + Gm_LL_Ed_xmm_W0, + Gm_LL_Eq_xmm, + Gm_Eb_xmm, + Gm_Eb_xmm_W0, + Gm_Eq_xmm, + Gm_Eq_xmm_W1, + Gm_Eq_xmm_bcast, + Gm_Eq_xmm_sae_W1, + Gm_LL_Ud, + Gm_LL_Ud_W0, + Gm_U_zmm_imm8_sae, + Gm_U_zmm_imm8_sae_W0, + Gm_U_zmm_imm8_sae_W1, + Gm_U_zmm_sae, + Gm_U_zmm_sae_W0, + Gm_U_zmm_sae_W1, + Gm_V_E_LL, + Gm_V_E_LL_W0, + Gm_V_E_LL_W1, + Gm_V_E_LL_bcast, + Gm_V_E_LL_bcast_W0, + Gm_V_E_LL_bcast_W1, + Gm_V_E_LL_imm8, + Gm_V_E_LL_imm8_W0, + Gm_V_E_LL_imm8_W1, + Gm_V_E_LL_imm8_bcast, + Gm_V_Ed_LL_imm8_bcast_W0, + Gm_V_E_LL_imm8_bcast_W0, + Gm_V_E_LL_imm8_bcast_W1, + Gm_V_E_LL_imm8_sae_bcast, + Gm_E_LL_sae_bcast, + Gm_V_E_LL_sae_W1, + Gm_V_Ed_xmm_sae_bcast, + Gm_V_E_LL_sae_bcast, + Gm_V_E_LL_sae_bcast_W0, + Gm_V_E_LL_sae_bcast_W1, + Gm_V_E_xmm, + Gm_V_E_xmm_W0, + Gm_V_E_xmm_W1, + Gm_V_E_xmm_bcast, + Gm_V_E_xmm_bcast_W0, + Gm_V_E_xmm_bcast_W1, + Gm_V_E_xmm_imm8, + Gm_V_E_xmm_imm8_W0, + Gm_V_E_xmm_imm8_W1, + Gm_V_E_xmm_imm8_bcast, + Gm_V_E_xmm_imm8_bcast_W0, + Gm_V_E_xmm_imm8_bcast_W1, + Gm_V_E_xmm_imm8_sae, + Gm_V_E_xmm_sae, + Gm_V_E_xmm_sae_W1, + Gm_V_E_ymm, + Gm_V_E_ymm_W0, + Gm_V_E_ymm_W1, + Gm_V_E_ymm_bcast, + Gm_V_E_ymm_bcast_W0, + Gm_V_E_ymm_bcast_W1, + Gm_V_E_ymm_imm8, + Gm_V_E_ymm_imm8_W0, + Gm_V_E_ymm_imm8_W1, + Gm_V_E_ymm_imm8_bcast, + Gm_V_E_ymm_imm8_bcast_W0, + Gm_V_E_ymm_imm8_bcast_W1, + Gm_V_E_zmm, + Gm_V_E_zmm_W0, + Gm_V_E_zmm_W1, + Gm_V_E_zmm_bcast, + Gm_V_E_zmm_bcast_W0, + Gm_V_E_zmm_bcast_W1, + Gm_V_E_zmm_imm8, + Gm_V_E_zmm_imm8_W0, + Gm_V_E_zmm_imm8_W1, + Gm_V_E_zmm_imm8_bcast, + Gm_V_E_zmm_imm8_bcast_W0, + Gm_V_E_zmm_imm8_bcast_W1, + Gm_V_E_zmm_imm8_sae, + Gm_V_E_zmm_sae, + Gm_V_E_zmm_sae_W1, + Gm_V_Ed_LL_sae, + Gm_V_Ed_LL_bcast, + Gm_V_Ed_LL_bcast_W0, + Gm_V_Ed_LL_imm8_bcast, + Gm_V_Ed_xmm, + Gm_V_Ed_xmm_W0, + Gm_V_Ed_xmm_bcast, + Gm_V_Ed_xmm_bcast_W0, + Gm_V_Ed_xmm_imm8_bcast, + Gm_V_Ed_xmm_imm8_bcast_W0, + Gm_V_Ed_xmm_imm8_sae, + Gm_V_Ed_xmm_sae, + Gm_V_Ed_xmm_sae_W0, + Gm_Ed_LL_imm8_sae_noround_bcast, + Gm_Ed_LL_sae_noround_bcast_W0, + Gm_V_Ed_xmm_sae_noround_W0, + Gm_V_Ed_ymm_bcast, + Gm_V_Ed_ymm_bcast_W0, + Gm_V_Ed_ymm_imm8_bcast, + Gm_V_Ed_ymm_imm8_bcast_W0, + Gm_V_Ed_zmm_bcast, + Gm_V_Ed_zmm_bcast_W0, + Gm_V_Ed_zmm_imm8_bcast, + Gm_V_Ed_zmm_imm8_bcast_W0, + Gm_V_Ed_zmm_imm8_sae, + Gm_V_Ed_zmm_sae, + Gm_V_Ed_zmm_sae_W0, + Gm_V_Eq_LL_imm8_bcast_W1, + Gm_V_Eq_xmm, + Gm_V_Eq_xmm_W1, + Gm_V_Eq_xmm_imm8_bcast, + Gm_V_Eq_xmm_imm8_bcast_W1, + Gm_V_Eq_xmm_sae, + Gm_V_Eq_xmm_sae_W1, + Gm_V_Eq_ymm_imm8_bcast, + Gm_V_Eq_ymm_imm8_bcast_W1, + Gm_V_Eq_zmm_imm8_bcast, + Gm_V_Eq_zmm_imm8_bcast_W1, + Gm_V_LL_E_xmm_imm8, + Gm_V_M_xmm, + Gm_V_U_zmm_sae, + Gm_V_U_zmm_sae_W0, + Gm_V_U_zmm_sae_W1, + Gm_V_ymm_E_xmm, + Gm_V_ymm_E_xmm_W0, + Gm_V_ymm_E_xmm_W1, + Gm_V_ymm_E_xmm_imm8, + Gm_V_zmm_E_xmm, + Gm_V_zmm_E_xmm_W0, + Gm_V_zmm_E_xmm_W1, + Gm_V_zmm_E_xmm_imm8, + Gm_V_zmm_E_ymm_imm8, + Gm_V_zmm_M_xmm, + Gm_V_zmm_M_xmm_W0, + Gm_xmm_Ed_xmm, + Gm_xmm_Eq_xmm, + Gm_xmm_Eq_xmm_W0, + Gm_xmm_Ew_xmm, + Gm_xmm_Ud, + Gm_xmm_Ud_W0, + Gm_ymm_E_xmm, + Gm_ymm_E_xmm_W0, + Gm_ymm_E_xmm_bcast, + Gm_ymm_E_zmm_sae, + Gm_ymm_E_zmm_sae_W1, + Gm_ymm_Ed_xmm, + VBROADCASTF32X2_Gm_ymm_Ed_xmm, + Gm_ymm_Eq_xmm, + Gm_ymm_Eq_xmm_W0, + Gm_ymm_M_xmm, + Gm_ymm_U_zmm_imm8_sae, + Gm_ymm_U_zmm_imm8_sae_W0, + Gm_ymm_U_zmm_sae, + Gm_ymm_U_zmm_sae_W1, + Gm_ymm_Ud, + Gm_ymm_Ud_W0, + Gm_zmm_E_xmm, + Gm_zmm_E_ymm, + Gm_zmm_E_ymm_W0, + Gm_zmm_E_ymm_bcast, + Gm_zmm_E_ymm_sae, + Gm_zmm_E_ymm_sae_W0, + Gm_zmm_Eq_xmm, + Gm_zmm_Eq_xmm_W0, + Gm_zmm_M_xmm, + Gm_zmm_U_ymm_sae, + Gm_zmm_Ud, + Gm_zmm_Ud_W0, + Gmd_Ed_xmm, + Gmd_Ed_xmm_sae, + Mq_G_W0, + MEMf32_XMMf32_AVX512_W0, + MEMf32_YMMf32_AVX512_W0, + MEMf32_ZMMf32_AVX512_W0, + M_G_LL_W1, + M_G_ymm, + M_G_ymm_W1, + M_G_zmm, + M_G_zmm_W1, + Mask_E_xmm_imm8, + Mask_Ed_xmm_imm8, + Mask_U_LL, + Mask_U_xmm, + Mask_U_ymm, + Mask_U_zmm, + Mask_V_E_LL, + Mask_V_E_LL_W0, + Mask_V_E_LL_bcast, + Mask_V_E_LL_bcast_W0, + Mask_V_E_LL_imm8_sae_bcast_W0, + Mask_V_E_LL_bcast_W1, + Mask_V_E_LL_imm8, + Mask_V_E_LL_imm8_bcast, + Mask_V_E_xmm, + Mask_V_E_xmm_W0, + Mask_V_E_xmm_bcast_W0, + Mask_V_E_xmm_bcast_W1, + Mask_V_E_xmm_imm8, + Mask_V_E_xmm_imm8_bcast, + Mask_V_E_ymm, + Mask_V_E_ymm_W0, + Mask_V_E_ymm_bcast_W0, + Mask_V_E_ymm_bcast_W1, + Mask_V_E_ymm_imm8, + Mask_V_E_ymm_imm8_bcast, + Mask_V_E_zmm, + Mask_V_E_zmm_W0, + Mask_V_E_zmm_bcast_W0, + Mask_V_E_zmm_bcast_W1, + Mask_V_E_zmm_imm8, + Mask_V_E_zmm_imm8_bcast, + Mask_V_E_zmm_imm8_sae, + Mask_V_E_zmm_imm8_sae_W1, + Maskm_V_Ed_xmm_imm8_sae_W0, + Maskm_V_Eq_xmm_imm8_sae, + Mq_G_xmm_W1, + Nothing, + Operands_08, + Operands_08_W0, + Operands_09, + Operands_09_W1, + Operands_10, + Operands_11, + Operands_12, + Operands_12_W0, + Operands_13, + Operands_13_W0, + Operands_14, + Operands_15, + Operands_16, + Operands_16_W0, + Operands_17, + Operands_1d, + Operands_1d_W0, + Operands_20, + Operands_22, + Operands_26, + Operands_2a, + Operands_2c, + Operands_42, + Operands_50, + Operands_51, + Operands_51_W0, + Operands_51_W1, + Operands_54, + Operands_56, + Operands_58, + Operands_58_W0, + Operands_58_W1, + Operands_59, + Operands_59_W0, + Operands_59_W1, + Operands_5a, + Operands_5a_W0, + Operands_5a_W1, + Operands_5b, + Operands_5b_W0, + Operands_5c, + Operands_5c_W0, + Operands_5c_W1, + Operands_5d, + Operands_5d_W0, + Operands_5d_W1, + Operands_5e, + Operands_5e_W0, + Operands_5e_W1, + Operands_5f, + Operands_5f_W0, + Operands_5f_W1, + Operands_66, + Operands_6e, + Operands_72, + Operands_72_W0, + Operands_78, + Operands_79, + Operands_7a, + Operands_7b, + Operands_7e, + Operands_96, + Operands_97, + Operands_98, + Operands_9a, + Operands_9c, + Operands_9e, + Operands_a6, + Operands_a7, + Operands_a8, + Operands_aa, + Operands_ac, + Operands_ae, + Operands_b6, + Operands_b7, + Operands_b8, + Operands_ba, + Operands_bc, + Operands_be, + Operands_c2, + Operands_c2_W0, + Operands_c2_W1, + Operands_c4, + Operands_e6, + VCVTTPD2DQ, + Ud_Eq_xmm, + Ud_Eq_xmm_sae, + VEXTRACTPS, + VMOVSD_10, + VMOVSD_11, + XMMu64_XMMu64_AVX512_W1, +} + +pub(crate) const TABLES: [&'static [(u8, [(super::Opcode, EVEXOperandCode); 4])]; 12] = [ + &EVEX_None_0f, + &EVEX_66_0f, + &EVEX_f2_0f, + &EVEX_f3_0f, + &DUMMY, + &EVEX_66_0f38, + &EVEX_f2_0f38, + &EVEX_f3_0f38, + &DUMMY, + &EVEX_66_0f3a, + &DUMMY, + &DUMMY, +]; +pub(crate) const DUMMY: [(u8, [(super::Opcode, EVEXOperandCode); 4]); 0] = [ +]; + +const EVEX_None_0f: [(u8, [(super::Opcode, EVEXOperandCode); 4]); 30] = [ + (0x10, [(super::Opcode::VMOVUPS, EVEXOperandCode::Gm_E_LL_W0), (super::Opcode::VMOVUPS, EVEXOperandCode::Gm_E_LL_W0), (super::Opcode::VMOVUPS, EVEXOperandCode::Gm_E_LL_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x11, [(super::Opcode::VMOVUPS, EVEXOperandCode::Em_G_LL_W0), (super::Opcode::VMOVUPS, EVEXOperandCode::Em_G_LL_W0), (super::Opcode::VMOVUPS, EVEXOperandCode::Em_G_LL_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x12, [(super::Opcode::Invalid, EVEXOperandCode::Operands_12_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x13, [(super::Opcode::VMOVLPS, EVEXOperandCode::Mq_G_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x14, [(super::Opcode::VUNPCKLPS, EVEXOperandCode::Gm_V_Ed_LL_bcast_W0), (super::Opcode::VUNPCKLPS, EVEXOperandCode::Gm_V_Ed_LL_bcast_W0), (super::Opcode::VUNPCKLPS, EVEXOperandCode::Gm_V_Ed_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x15, [(super::Opcode::VUNPCKHPS, EVEXOperandCode::Gm_V_Ed_LL_bcast_W0), (super::Opcode::VUNPCKHPS, EVEXOperandCode::Gm_V_Ed_LL_bcast_W0), (super::Opcode::VUNPCKHPS, EVEXOperandCode::Gm_V_Ed_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x16, [(super::Opcode::Invalid, EVEXOperandCode::Operands_16_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x17, [(super::Opcode::VMOVHPS, EVEXOperandCode::Mq_G_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x28, [(super::Opcode::VMOVAPS, EVEXOperandCode::Gm_E_LL_sae_bcast_W0), (super::Opcode::VMOVAPS, EVEXOperandCode::Gm_E_LL_sae_bcast_W0), (super::Opcode::VMOVAPS, EVEXOperandCode::Gm_E_LL_sae_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x29, [(super::Opcode::VMOVAPS, EVEXOperandCode::Em_G_LL_W0), (super::Opcode::VMOVAPS, EVEXOperandCode::Em_G_LL_W0), (super::Opcode::VMOVAPS, EVEXOperandCode::Em_G_LL_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x2b, [(super::Opcode::VMOVNTPS, EVEXOperandCode::M_G_LL_W0), (super::Opcode::VMOVNTPS, EVEXOperandCode::M_G_LL_W0), (super::Opcode::VMOVNTPS, EVEXOperandCode::M_G_LL_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x2e, [(super::Opcode::VUCOMISS, EVEXOperandCode::G_Ed_xmm_sae_W0), (super::Opcode::VUCOMISS, EVEXOperandCode::G_Ed_xmm_sae_W0), (super::Opcode::VUCOMISS, EVEXOperandCode::G_Ed_xmm_sae_W0), (super::Opcode::VUCOMISS, EVEXOperandCode::G_Ed_xmm_sae_W0)]), + (0x2f, [(super::Opcode::VCOMISS, EVEXOperandCode::G_Ed_xmm_sae_W0), (super::Opcode::VCOMISS, EVEXOperandCode::G_Ed_xmm_sae_W0), (super::Opcode::VCOMISS, EVEXOperandCode::G_Ed_xmm_sae_W0), (super::Opcode::VCOMISS, EVEXOperandCode::G_Ed_xmm_sae_W0)]), + (0x51, [(super::Opcode::VSQRTPS, EVEXOperandCode::Gm_E_LL_sae_bcast), (super::Opcode::VSQRTPS, EVEXOperandCode::Gm_E_LL_sae_bcast), (super::Opcode::VSQRTPS, EVEXOperandCode::Gm_E_LL_sae_bcast), (super::Opcode::VSQRTPS, EVEXOperandCode::Gm_E_LL_sae_bcast)]), + (0x54, [(super::Opcode::VANDPS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VANDPS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VANDPS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x55, [(super::Opcode::VANDNPS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VANDNPS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VANDNPS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x56, [(super::Opcode::VORPS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VORPS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VORPS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x57, [(super::Opcode::VXORPS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VXORPS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VXORPS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x58, [(super::Opcode::VADDPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0), (super::Opcode::VADDPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0), (super::Opcode::VADDPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0), (super::Opcode::VADDPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0)]), + (0x59, [(super::Opcode::VMULPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0), (super::Opcode::VMULPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0), (super::Opcode::VMULPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0), (super::Opcode::VMULPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0)]), + (0x5a, [(super::Opcode::VCVTPS2PD, EVEXOperandCode::VCVTPH2PS), (super::Opcode::VCVTPS2PD, EVEXOperandCode::VCVTPH2PS), (super::Opcode::VCVTPS2PD, EVEXOperandCode::VCVTPH2PS), (super::Opcode::VCVTPS2PD, EVEXOperandCode::VCVTPH2PS)]), + (0x5b, [(super::Opcode::VCVTDQ2PS, EVEXOperandCode::VCVTDQ2PS) +, (super::Opcode::VCVTDQ2PS, EVEXOperandCode::VCVTDQ2PS) +, (super::Opcode::VCVTDQ2PS, EVEXOperandCode::VCVTDQ2PS), (super::Opcode::VCVTDQ2PS, EVEXOperandCode::VCVTDQ2PS)]), + (0x5c, [(super::Opcode::VSUBPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0), (super::Opcode::VSUBPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0), (super::Opcode::VSUBPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0), (super::Opcode::VSUBPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0)]), + (0x5d, [(super::Opcode::VMINPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0), (super::Opcode::VMINPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0), (super::Opcode::VMINPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0), (super::Opcode::VMINPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0)]), + (0x5e, [(super::Opcode::VDIVPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0), (super::Opcode::VDIVPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0), (super::Opcode::VDIVPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0), (super::Opcode::VDIVPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0)]), + (0x5f, [(super::Opcode::VMAXPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0), (super::Opcode::VMAXPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0), (super::Opcode::VMAXPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0), (super::Opcode::VMAXPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W0)]), + (0x78, [(super::Opcode::VCVTTPS2UDQ, EVEXOperandCode::VCVTTPS2UDQ), (super::Opcode::VCVTTPS2UDQ, EVEXOperandCode::VCVTTPS2UDQ), (super::Opcode::VCVTTPS2UDQ, EVEXOperandCode::VCVTTPS2UDQ), (super::Opcode::VCVTTPS2UDQ, EVEXOperandCode::VCVTTPS2UDQ)]), + (0x79, [(super::Opcode::VCVTPS2UDQ, EVEXOperandCode::VCVTTPS2UDQ) // operands=['VCVTPS2UDQ_ZMMu32_MASKmskw_ZMMf32_AVX512_sae', 'VCVTPS2UDQ_XMMu32_MASKmskw_MEMf32_AVX512_sae', 'VCVTPS2UDQ_XMMu32_MASKmskw_XMMf32_AVX512_sae'] +, (super::Opcode::VCVTPS2UDQ, EVEXOperandCode::VCVTTPS2UDQ) // operands=['VCVTPS2UDQ_ZMMu32_MASKmskw_ZMMf32_AVX512_sae', 'VCVTPS2UDQ_YMMu32_MASKmskw_MEMf32_AVX512_sae', 'VCVTPS2UDQ_YMMu32_MASKmskw_YMMf32_AVX512_sae'] +, (super::Opcode::VCVTPS2UDQ, EVEXOperandCode::VCVTTPS2UDQ), (super::Opcode::VCVTPS2UDQ, EVEXOperandCode::VCVTTPS2UDQ)]), + (0xc2, [(super::Opcode::VCMPPS, EVEXOperandCode::Mask_V_E_LL_imm8_sae_bcast_W0), (super::Opcode::VCMPPS, EVEXOperandCode::Mask_V_E_LL_imm8_sae_bcast_W0), (super::Opcode::VCMPPS, EVEXOperandCode::Mask_V_E_LL_imm8_sae_bcast_W0), (super::Opcode::VCMPPS, EVEXOperandCode::Mask_V_E_LL_imm8_sae_bcast_W0)]), + (0xc6, [(super::Opcode::VSHUFPS, EVEXOperandCode::Gm_V_E_LL_imm8_bcast_W0), (super::Opcode::VSHUFPS, EVEXOperandCode::Gm_V_E_LL_imm8_bcast_W0), (super::Opcode::VSHUFPS, EVEXOperandCode::Gm_V_E_LL_imm8_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), +]; + +const EVEX_66_0f: [(u8, [(super::Opcode, EVEXOperandCode); 4]); 100] = [ + (0x10, [(super::Opcode::VMOVUPD, EVEXOperandCode::Gm_E_LL_W1), (super::Opcode::VMOVUPD, EVEXOperandCode::Gm_E_LL_W1), (super::Opcode::VMOVUPD, EVEXOperandCode::Gm_E_LL_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x11, [(super::Opcode::VMOVUPD, EVEXOperandCode::Em_G_LL_W1), (super::Opcode::VMOVUPD, EVEXOperandCode::Em_G_LL_W1), (super::Opcode::VMOVUPD, EVEXOperandCode::Em_G_LL_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x12, [(super::Opcode::VMOVLPD, EVEXOperandCode::G_V_Mq_xmm_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x13, [(super::Opcode::VMOVLPD, EVEXOperandCode::Mq_G_xmm_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x14, [(super::Opcode::VUNPCKLPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VUNPCKLPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VUNPCKLPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x15, [(super::Opcode::VUNPCKHPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VUNPCKHPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VUNPCKHPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x16, [(super::Opcode::VMOVHPD, EVEXOperandCode::G_V_Mq_xmm_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x17, [(super::Opcode::VMOVHPD, EVEXOperandCode::Mq_G_xmm_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x28, [(super::Opcode::VMOVAPD, EVEXOperandCode::Gm_E_LL_W1), (super::Opcode::VMOVAPD, EVEXOperandCode::Gm_E_LL_W1), (super::Opcode::VMOVAPD, EVEXOperandCode::Gm_E_LL_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x29, [(super::Opcode::VMOVAPD, EVEXOperandCode::Em_G_LL_W1), (super::Opcode::VMOVAPD, EVEXOperandCode::Em_G_LL_W1), (super::Opcode::VMOVAPD, EVEXOperandCode::Em_G_LL_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x2b, [(super::Opcode::VMOVNTPD, EVEXOperandCode::M_G_LL_W1), (super::Opcode::VMOVNTPD, EVEXOperandCode::M_G_LL_W1), (super::Opcode::VMOVNTPD, EVEXOperandCode::M_G_LL_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x2e, [(super::Opcode::VUCOMISD, EVEXOperandCode::Gm_Eq_xmm_sae_W1), (super::Opcode::VUCOMISD, EVEXOperandCode::Gm_Eq_xmm_sae_W1), (super::Opcode::VUCOMISD, EVEXOperandCode::Gm_Eq_xmm_sae_W1), (super::Opcode::VUCOMISD, EVEXOperandCode::Gm_Eq_xmm_sae_W1)]), + (0x2f, [(super::Opcode::VCOMISD, EVEXOperandCode::Gm_Eq_xmm_sae_W1), (super::Opcode::VCOMISD, EVEXOperandCode::Gm_Eq_xmm_sae_W1), (super::Opcode::VCOMISD, EVEXOperandCode::Gm_Eq_xmm_sae_W1), (super::Opcode::VCOMISD, EVEXOperandCode::Gm_Eq_xmm_sae_W1)]), + (0x51, [(super::Opcode::VSQRTPD, EVEXOperandCode::Gm_E_LL_sae_bcast_W1), (super::Opcode::VSQRTPD, EVEXOperandCode::Gm_E_LL_sae_bcast_W1), (super::Opcode::VSQRTPD, EVEXOperandCode::Gm_E_LL_sae_bcast_W1), (super::Opcode::VSQRTPD, EVEXOperandCode::Gm_E_LL_sae_bcast_W1)]), + (0x54, [(super::Opcode::VANDPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VANDPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VANDPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x55, [(super::Opcode::VANDNPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VANDNPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VANDNPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x56, [(super::Opcode::VORPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VORPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VORPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x57, [(super::Opcode::VXORPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VXORPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VXORPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x58, [(super::Opcode::VADDPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1), (super::Opcode::VADDPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1), (super::Opcode::VADDPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1), (super::Opcode::VADDPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1)]), + (0x59, [(super::Opcode::VMULPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1), (super::Opcode::VMULPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1), (super::Opcode::VMULPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1), (super::Opcode::VMULPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1)]), + (0x5a, [(super::Opcode::VCVTPD2PS, EVEXOperandCode::Gm_xmm_E_xmm_sae_bcast_W1), (super::Opcode::VCVTPD2PS, EVEXOperandCode::Gm_xmm_E_ymm_sae_bcast_W1), (super::Opcode::VCVTPD2PS, EVEXOperandCode::Gm_ymm_E_zmm_sae_bcast_W1), (super::Opcode::VCVTPD2PS, EVEXOperandCode::Gm_ymm_U_zmm_sae_W1)]), + (0x5b, [(super::Opcode::VCVTPS2DQ, EVEXOperandCode::Gm_E_LL_sae_bcast), (super::Opcode::VCVTPS2DQ, EVEXOperandCode::Gm_E_LL_sae_bcast), (super::Opcode::VCVTPS2DQ, EVEXOperandCode::Gm_E_LL_sae_bcast), (super::Opcode::VCVTPS2DQ, EVEXOperandCode::Gm_E_LL_sae_bcast)]), + (0x5c, [(super::Opcode::VSUBPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1), (super::Opcode::VSUBPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1), (super::Opcode::VSUBPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1), (super::Opcode::VSUBPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1)]), + (0x5d, [(super::Opcode::VMINPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1), (super::Opcode::VMINPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1), (super::Opcode::VMINPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1), (super::Opcode::VMINPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1)]), + (0x5e, [(super::Opcode::VDIVPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1), (super::Opcode::VDIVPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1), (super::Opcode::VDIVPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1), (super::Opcode::VDIVPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1)]), + (0x5f, [(super::Opcode::VMAXPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1), (super::Opcode::VMAXPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1), (super::Opcode::VMAXPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1), (super::Opcode::VMAXPD, EVEXOperandCode::Gm_V_E_LL_sae_bcast_W1)]), + (0x60, [(super::Opcode::VPUNPCKLBW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPUNPCKLBW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPUNPCKLBW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x61, [(super::Opcode::VPUNPCKLWD, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPUNPCKLWD, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPUNPCKLWD, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x62, [(super::Opcode::VPUNPCKLDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPUNPCKLDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPUNPCKLDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x63, [(super::Opcode::VPACKSSWB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPACKSSWB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPACKSSWB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x64, [(super::Opcode::VPCMPGTB, EVEXOperandCode::Mask_V_E_LL), (super::Opcode::VPCMPGTB, EVEXOperandCode::Mask_V_E_LL), (super::Opcode::VPCMPGTB, EVEXOperandCode::Mask_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x65, [(super::Opcode::VPCMPGTW, EVEXOperandCode::Mask_V_E_LL), (super::Opcode::VPCMPGTW, EVEXOperandCode::Mask_V_E_LL), (super::Opcode::VPCMPGTW, EVEXOperandCode::Mask_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x66, [(super::Opcode::VPCMPGTD, EVEXOperandCode::Mask_V_E_LL_bcast_W0), (super::Opcode::VPCMPGTD, EVEXOperandCode::Mask_V_E_LL_bcast_W0), (super::Opcode::VPCMPGTD, EVEXOperandCode::Mask_V_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x67, [(super::Opcode::VPACKUSWB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPACKUSWB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPACKUSWB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x68, [(super::Opcode::VPUNPCKHBW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPUNPCKHBW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPUNPCKHBW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x69, [(super::Opcode::VPUNPCKHWD, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPUNPCKHWD, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPUNPCKHWD, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x6a, [(super::Opcode::VPUNPCKHDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPUNPCKHDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPUNPCKHDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x6b, [(super::Opcode::VPACKSSDW, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPACKSSDW, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPACKSSDW, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x6c, [(super::Opcode::VPUNPCKLQDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPUNPCKLQDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPUNPCKLQDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x6d, [(super::Opcode::VPUNPCKHQDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPUNPCKHQDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPUNPCKHQDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x6e, [(super::Opcode::VMOVD, EVEXOperandCode::VMOVD_6e), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x6f, [(super::Opcode::VMOVDQA32, EVEXOperandCode::Gm_E_LL), (super::Opcode::VMOVDQA32, EVEXOperandCode::Gm_E_LL), (super::Opcode::VMOVDQA32, EVEXOperandCode::Gm_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x70, [(super::Opcode::VPSHUFD, EVEXOperandCode::Gm_E_LL_imm8_bcast_W0), (super::Opcode::VPSHUFD, EVEXOperandCode::Gm_E_LL_imm8_bcast_W0), (super::Opcode::VPSHUFD, EVEXOperandCode::Gm_E_LL_imm8_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x72, [(super::Opcode::VPROLD, EVEXOperandCode::Opcode_72_Gm_E_LL_imm8_bcast), (super::Opcode::VPROLD, EVEXOperandCode::Opcode_72_Gm_E_LL_imm8_bcast), (super::Opcode::VPROLD, EVEXOperandCode::Opcode_72_Gm_E_LL_imm8_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x74, [(super::Opcode::VPCMPEQB, EVEXOperandCode::Mask_V_E_LL), (super::Opcode::VPCMPEQB, EVEXOperandCode::Mask_V_E_LL), (super::Opcode::VPCMPEQB, EVEXOperandCode::Mask_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x75, [(super::Opcode::VPCMPEQW, EVEXOperandCode::Mask_V_E_LL), (super::Opcode::VPCMPEQW, EVEXOperandCode::Mask_V_E_LL), (super::Opcode::VPCMPEQW, EVEXOperandCode::Mask_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x76, [(super::Opcode::VPCMPEQD, EVEXOperandCode::Mask_V_E_LL_bcast_W0), (super::Opcode::VPCMPEQD, EVEXOperandCode::Mask_V_E_LL_bcast_W0), (super::Opcode::VPCMPEQD, EVEXOperandCode::Mask_V_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x78, [(super::Opcode::VCVTTPS2UQQ, EVEXOperandCode::VCVTTPS2UQQ) +, (super::Opcode::VCVTTPS2UQQ, EVEXOperandCode::VCVTTPS2UQQ) +, (super::Opcode::VCVTTPS2UQQ, EVEXOperandCode::VCVTTPS2UQQ), (super::Opcode::VCVTTPS2UQQ, EVEXOperandCode::VCVTTPS2UQQ)]), + (0x79, [(super::Opcode::VCVTPS2UQQ, EVEXOperandCode::VCVTTPS2UQQ) +, (super::Opcode::VCVTPS2UQQ, EVEXOperandCode::VCVTTPS2UQQ) +, (super::Opcode::VCVTPS2UQQ, EVEXOperandCode::VCVTTPS2UQQ), (super::Opcode::VCVTPS2UQQ, EVEXOperandCode::VCVTTPS2UQQ)]), + (0x7a, [(super::Opcode::VCVTTPS2QQ, EVEXOperandCode::VCVTTPS2UQQ) +, (super::Opcode::VCVTTPS2QQ, EVEXOperandCode::VCVTTPS2UQQ) +, (super::Opcode::VCVTTPS2QQ, EVEXOperandCode::VCVTTPS2UQQ), (super::Opcode::VCVTTPS2QQ, EVEXOperandCode::VCVTTPS2UQQ)]), + (0x7b, [(super::Opcode::VCVTPS2QQ, EVEXOperandCode::VCVTTPS2UQQ) +, (super::Opcode::VCVTPS2QQ, EVEXOperandCode::VCVTTPS2UQQ) +, (super::Opcode::VCVTPS2QQ, EVEXOperandCode::VCVTTPS2UQQ), (super::Opcode::VCVTPS2QQ, EVEXOperandCode::VCVTTPS2UQQ)]), + (0x7e, [(super::Opcode::VMOVD, EVEXOperandCode::VMOVD_7e), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x7f, [(super::Opcode::VMOVDQA32, EVEXOperandCode::Em_G_LL), (super::Opcode::VMOVDQA32, EVEXOperandCode::Em_G_LL), (super::Opcode::VMOVDQA32, EVEXOperandCode::Em_G_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xc2, [(super::Opcode::VCMPPD, EVEXOperandCode::Maskm_V_E_LL_imm8_sae_bcast_W1), (super::Opcode::VCMPPD, EVEXOperandCode::Maskm_V_E_LL_imm8_sae_bcast_W1), (super::Opcode::VCMPPD, EVEXOperandCode::Maskm_V_E_LL_imm8_sae_bcast_W1), (super::Opcode::VCMPPD, EVEXOperandCode::Maskm_V_E_LL_imm8_sae_bcast_W1)]), + (0xc4, [(super::Opcode::VPINSRW, EVEXOperandCode::VPINSRW), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xc5, [(super::Opcode::VPEXTRW, EVEXOperandCode::VPEXTRW), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xc6, [(super::Opcode::VSHUFPD, EVEXOperandCode::Gm_V_E_LL_imm8_bcast_W1), (super::Opcode::VSHUFPD, EVEXOperandCode::Gm_V_E_LL_imm8_bcast_W1), (super::Opcode::VSHUFPD, EVEXOperandCode::Gm_V_E_LL_imm8_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xd1, [(super::Opcode::VPSRLW, EVEXOperandCode::Gm_V_LL_E_xmm), (super::Opcode::VPSRLW, EVEXOperandCode::Gm_V_LL_E_xmm), (super::Opcode::VPSRLW, EVEXOperandCode::Gm_V_LL_E_xmm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xd2, [(super::Opcode::VPSRLD, EVEXOperandCode::Gm_V_LL_E_xmm_W0), (super::Opcode::VPSRLD, EVEXOperandCode::Gm_V_LL_E_xmm_W0), (super::Opcode::VPSRLD, EVEXOperandCode::Gm_V_LL_E_xmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xd3, [(super::Opcode::VPSRLQ, EVEXOperandCode::Gm_V_LL_E_xmm_W1), (super::Opcode::VPSRLQ, EVEXOperandCode::Gm_V_LL_E_xmm_W1), (super::Opcode::VPSRLQ, EVEXOperandCode::Gm_V_LL_E_xmm_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xd4, [(super::Opcode::VPADDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPADDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPADDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xd5, [(super::Opcode::VPMULLW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMULLW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMULLW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xd6, [(super::Opcode::VMOVQ, EVEXOperandCode::VMOVQ_Ed_G_xmm), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xd8, [(super::Opcode::VPSUBUSB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPSUBUSB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPSUBUSB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xd9, [(super::Opcode::VPSUBUSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPSUBUSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPSUBUSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xda, [(super::Opcode::VPMINUB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMINUB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMINUB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xdb, [(super::Opcode::VPANDD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPANDD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPANDD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xdc, [(super::Opcode::VPADDUSB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPADDUSB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPADDUSB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xdd, [(super::Opcode::VPADDUSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPADDUSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPADDUSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xde, [(super::Opcode::VPMAXUB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMAXUB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMAXUB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xdf, [(super::Opcode::VPANDND, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPANDND, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPANDND, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xe0, [(super::Opcode::VPAVGB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPAVGB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPAVGB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xe1, [(super::Opcode::VPSRAW, EVEXOperandCode::Gm_V_LL_E_xmm), (super::Opcode::VPSRAW, EVEXOperandCode::Gm_V_LL_E_xmm), (super::Opcode::VPSRAW, EVEXOperandCode::Gm_V_LL_E_xmm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xe2, [(super::Opcode::VPSRAD, EVEXOperandCode::Gm_V_LL_E_xmm), (super::Opcode::VPSRAD, EVEXOperandCode::Gm_V_LL_E_xmm), (super::Opcode::VPSRAD, EVEXOperandCode::Gm_V_LL_E_xmm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xe3, [(super::Opcode::VPAVGW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPAVGW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPAVGW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xe4, [(super::Opcode::VPMULHUW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMULHUW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMULHUW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xe5, [(super::Opcode::VPMULHW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMULHW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMULHW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xe6, [(super::Opcode::VCVTTPD2DQ, EVEXOperandCode::VCVTTPD2DQ), (super::Opcode::VCVTTPD2DQ, EVEXOperandCode::VCVTTPD2DQ), (super::Opcode::VCVTTPD2DQ, EVEXOperandCode::VCVTTPD2DQ), (super::Opcode::VCVTTPD2DQ, EVEXOperandCode::VCVTTPD2DQ)]), + (0xe7, [(super::Opcode::VMOVNTDQ, EVEXOperandCode::E_G_LL_W0), (super::Opcode::VMOVNTDQ, EVEXOperandCode::E_G_LL_W0), (super::Opcode::VMOVNTDQ, EVEXOperandCode::E_G_LL_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xe8, [(super::Opcode::VPSUBSB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPSUBSB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPSUBSB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xe9, [(super::Opcode::VPSUBSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPSUBSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPSUBSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xea, [(super::Opcode::VPMINSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMINSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMINSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xeb, [(super::Opcode::VPORD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPORD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPORD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xec, [(super::Opcode::VPADDSB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPADDSB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPADDSB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xed, [(super::Opcode::VPADDSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPADDSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPADDSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xee, [(super::Opcode::VPMAXSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMAXSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMAXSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xef, [(super::Opcode::VPXORD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPXORD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPXORD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xf1, [(super::Opcode::VPSLLW, EVEXOperandCode::Gm_V_LL_E_xmm), (super::Opcode::VPSLLW, EVEXOperandCode::Gm_V_LL_E_xmm), (super::Opcode::VPSLLW, EVEXOperandCode::Gm_V_LL_E_xmm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xf2, [(super::Opcode::VPSLLD, EVEXOperandCode::Gm_V_LL_E_xmm_W0), (super::Opcode::VPSLLD, EVEXOperandCode::Gm_V_LL_E_xmm_W0), (super::Opcode::VPSLLD, EVEXOperandCode::Gm_V_LL_E_xmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xf3, [(super::Opcode::VPSLLQ, EVEXOperandCode::Gm_V_LL_E_xmm_W1), (super::Opcode::VPSLLQ, EVEXOperandCode::Gm_V_LL_E_xmm_W1), (super::Opcode::VPSLLQ, EVEXOperandCode::Gm_V_LL_E_xmm_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xf4, [(super::Opcode::VPMULUDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPMULUDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPMULUDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xf5, [(super::Opcode::VPMADDWD, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMADDWD, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMADDWD, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xf6, [(super::Opcode::VPSADBW, EVEXOperandCode::G_V_E_LL), (super::Opcode::VPSADBW, EVEXOperandCode::G_V_E_LL), (super::Opcode::VPSADBW, EVEXOperandCode::G_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xf8, [(super::Opcode::VPSUBB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPSUBB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPSUBB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xf9, [(super::Opcode::VPSUBW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPSUBW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPSUBW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xfa, [(super::Opcode::VPSUBD, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPSUBD, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPSUBD, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xfb, [(super::Opcode::VPSUBQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPSUBQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPSUBQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xfc, [(super::Opcode::VPADDB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPADDB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPADDB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xfd, [(super::Opcode::VPADDW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPADDW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPADDW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xfe, [(super::Opcode::VPADDD, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPADDD, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPADDD, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), +]; + +const EVEX_66_0f38: [(u8, [(super::Opcode, EVEXOperandCode); 4]); 141] = [ + (0x00, [(super::Opcode::VPSHUFB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPSHUFB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPSHUFB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x04, [(super::Opcode::VPMADDUBSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMADDUBSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMADDUBSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x0b, [(super::Opcode::VPMULHRSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMULHRSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMULHRSW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x0c, [(super::Opcode::VPERMILPS, EVEXOperandCode::Gm_V_Ed_LL_bcast_W0), (super::Opcode::VPERMILPS, EVEXOperandCode::Gm_V_Ed_LL_bcast_W0), (super::Opcode::VPERMILPS, EVEXOperandCode::Gm_V_Ed_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x0d, [(super::Opcode::VPERMILPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPERMILPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPERMILPD, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x10, [(super::Opcode::VPSRLVW, EVEXOperandCode::Gm_V_E_LL_W1), (super::Opcode::VPSRLVW, EVEXOperandCode::Gm_V_E_LL_W1), (super::Opcode::VPSRLVW, EVEXOperandCode::Gm_V_E_LL_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x11, [(super::Opcode::VPSRAVW, EVEXOperandCode::Gm_V_E_LL_W1), (super::Opcode::VPSRAVW, EVEXOperandCode::Gm_V_E_LL_W1), (super::Opcode::VPSRAVW, EVEXOperandCode::Gm_V_E_LL_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x12, [(super::Opcode::VPSLLVW, EVEXOperandCode::Gm_V_E_LL_W1), (super::Opcode::VPSLLVW, EVEXOperandCode::Gm_V_E_LL_W1), (super::Opcode::VPSLLVW, EVEXOperandCode::Gm_V_E_LL_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x13, [(super::Opcode::VCVTPH2PS, EVEXOperandCode::VCVTPH2PS), (super::Opcode::VCVTPH2PS, EVEXOperandCode::VCVTPH2PS), (super::Opcode::VCVTPH2PS, EVEXOperandCode::VCVTPH2PS), (super::Opcode::VCVTPH2PS, EVEXOperandCode::VCVTPH2PS)]), + (0x14, [(super::Opcode::VPRORVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPRORVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPRORVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x15, [(super::Opcode::VPROLVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPROLVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPROLVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x16, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VPERMPS, EVEXOperandCode::Gm_V_Ed_LL_bcast), (super::Opcode::VPERMPS, EVEXOperandCode::Gm_V_Ed_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x18, [(super::Opcode::VBROADCASTSS, EVEXOperandCode::Gm_xmm_Ed_xmm_W0), (super::Opcode::VBROADCASTSS, EVEXOperandCode::Gm_ymm_Ed_xmm_W0), (super::Opcode::VBROADCASTSS, EVEXOperandCode::Gm_zmm_Ed_xmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x19, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VBROADCASTF32X2, EVEXOperandCode::VBROADCASTF32X2_Gm_ymm_Ed_xmm), (super::Opcode::VBROADCASTF32X2, EVEXOperandCode::Gm_zmm_Ed_xmm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x1a, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VBROADCASTF32X4, EVEXOperandCode::Gm_ymm_M_xmm), (super::Opcode::VBROADCASTF32X4, EVEXOperandCode::Gm_zmm_M_xmm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x1b, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VBROADCASTF32X8, EVEXOperandCode::Gm_zmm_M_ymm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x1c, [(super::Opcode::VPABSB, EVEXOperandCode::Gm_E_LL), (super::Opcode::VPABSB, EVEXOperandCode::Gm_E_LL), (super::Opcode::VPABSB, EVEXOperandCode::Gm_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x1d, [(super::Opcode::VPABSW, EVEXOperandCode::Gm_E_LL), (super::Opcode::VPABSW, EVEXOperandCode::Gm_E_LL), (super::Opcode::VPABSW, EVEXOperandCode::Gm_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x1e, [(super::Opcode::VPABSD, EVEXOperandCode::Gm_E_LL_bcast_W0), (super::Opcode::VPABSD, EVEXOperandCode::Gm_E_LL_bcast_W0), (super::Opcode::VPABSD, EVEXOperandCode::Gm_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x1f, [(super::Opcode::VPABSQ, EVEXOperandCode::Gm_E_LL_bcast_W1), (super::Opcode::VPABSQ, EVEXOperandCode::Gm_E_LL_bcast_W1), (super::Opcode::VPABSQ, EVEXOperandCode::Gm_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x20, [(super::Opcode::VPMOVSXBW, EVEXOperandCode::Gm_xmm_Eq_xmm), (super::Opcode::VPMOVSXBW, EVEXOperandCode::Gm_ymm_E_xmm), (super::Opcode::VPMOVSXBW, EVEXOperandCode::Gm_zmm_E_ymm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x21, [(super::Opcode::VPMOVSXBD, EVEXOperandCode::Gm_xmm_Ed_xmm), (super::Opcode::VPMOVSXBD, EVEXOperandCode::Gm_ymm_Eq_xmm), (super::Opcode::VPMOVSXBD, EVEXOperandCode::Gm_zmm_E_xmm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x22, [(super::Opcode::VPMOVSXBQ, EVEXOperandCode::Gm_xmm_Ew_xmm), (super::Opcode::VPMOVSXBQ, EVEXOperandCode::Gm_ymm_Ed_xmm), (super::Opcode::VPMOVSXBQ, EVEXOperandCode::Gm_zmm_Eq_xmm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x23, [(super::Opcode::VPMOVSXWD, EVEXOperandCode::Gm_xmm_Eq_xmm), (super::Opcode::VPMOVSXWD, EVEXOperandCode::Gm_ymm_E_xmm), (super::Opcode::VPMOVSXWD, EVEXOperandCode::Gm_zmm_E_ymm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x24, [(super::Opcode::VPMOVSXWQ, EVEXOperandCode::Gm_xmm_Ed_xmm), (super::Opcode::VPMOVSXWQ, EVEXOperandCode::Gm_ymm_Eq_xmm), (super::Opcode::VPMOVSXWQ, EVEXOperandCode::Gm_zmm_E_xmm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x25, [(super::Opcode::VPMOVSXDQ, EVEXOperandCode::Gm_xmm_Eq_xmm_W0), (super::Opcode::VPMOVSXDQ, EVEXOperandCode::Gm_ymm_E_xmm_W0), (super::Opcode::VPMOVSXDQ, EVEXOperandCode::Gm_zmm_E_ymm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x26, [(super::Opcode::VPTESTMB, EVEXOperandCode::Mask_V_E_LL), (super::Opcode::VPTESTMB, EVEXOperandCode::Mask_V_E_LL), (super::Opcode::VPTESTMB, EVEXOperandCode::Mask_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x27, [(super::Opcode::VPTESTMD, EVEXOperandCode::Mask_V_E_LL_bcast), (super::Opcode::VPTESTMD, EVEXOperandCode::Mask_V_E_LL_bcast), (super::Opcode::VPTESTMD, EVEXOperandCode::Mask_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x28, [(super::Opcode::VPMULDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPMULDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPMULDQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x29, [(super::Opcode::VPCMPEQQ, EVEXOperandCode::Mask_V_E_LL_bcast_W1), (super::Opcode::VPCMPEQQ, EVEXOperandCode::Mask_V_E_LL_bcast_W1), (super::Opcode::VPCMPEQQ, EVEXOperandCode::Mask_V_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x2a, [(super::Opcode::VMOVNTDQA, EVEXOperandCode::G_E_LL_W0), (super::Opcode::VMOVNTDQA, EVEXOperandCode::G_E_LL_W0), (super::Opcode::VMOVNTDQA, EVEXOperandCode::G_E_LL_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x2b, [(super::Opcode::VPACKUSDW, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPACKUSDW, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPACKUSDW, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x2c, [(super::Opcode::VSCALEFPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VSCALEFPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VSCALEFPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VSCALEFPS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0x2d, [(super::Opcode::VSCALEFSS, EVEXOperandCode::Gm_V_Ed_xmm_sae), (super::Opcode::VSCALEFSS, EVEXOperandCode::Gm_V_Ed_xmm_sae), (super::Opcode::VSCALEFSS, EVEXOperandCode::Gm_V_Ed_xmm_sae), (super::Opcode::VSCALEFSS, EVEXOperandCode::Gm_V_Ed_xmm_sae)]), + (0x30, [(super::Opcode::VPMOVZXBW, EVEXOperandCode::Gm_xmm_Eq_xmm), (super::Opcode::VPMOVZXBW, EVEXOperandCode::Gm_ymm_E_xmm), (super::Opcode::VPMOVZXBW, EVEXOperandCode::Gm_zmm_E_ymm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x31, [(super::Opcode::VPMOVZXBD, EVEXOperandCode::Gm_xmm_Ed_xmm), (super::Opcode::VPMOVZXBD, EVEXOperandCode::Gm_ymm_Eq_xmm), (super::Opcode::VPMOVZXBD, EVEXOperandCode::Gm_zmm_E_xmm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x32, [(super::Opcode::VPMOVZXBQ, EVEXOperandCode::Gm_xmm_Ew_xmm), (super::Opcode::VPMOVZXBQ, EVEXOperandCode::Gm_ymm_Ed_xmm), (super::Opcode::VPMOVZXBQ, EVEXOperandCode::Gm_zmm_Eq_xmm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x33, [(super::Opcode::VPMOVZXWD, EVEXOperandCode::Gm_xmm_Eq_xmm), (super::Opcode::VPMOVZXWD, EVEXOperandCode::Gm_ymm_E_xmm), (super::Opcode::VPMOVZXWD, EVEXOperandCode::Gm_zmm_E_ymm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x34, [(super::Opcode::VPMOVZXWQ, EVEXOperandCode::Gm_xmm_Ed_xmm), (super::Opcode::VPMOVZXWQ, EVEXOperandCode::Gm_ymm_Eq_xmm), (super::Opcode::VPMOVZXWQ, EVEXOperandCode::Gm_zmm_E_xmm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x35, [(super::Opcode::VPMOVZXDQ, EVEXOperandCode::Gm_xmm_Eq_xmm_W0), (super::Opcode::VPMOVZXDQ, EVEXOperandCode::Gm_ymm_E_xmm_W0), (super::Opcode::VPMOVZXDQ, EVEXOperandCode::Gm_zmm_E_ymm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x36, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VPERMD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPERMD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x37, [(super::Opcode::VPCMPGTQ, EVEXOperandCode::Mask_V_E_LL_bcast_W1), (super::Opcode::VPCMPGTQ, EVEXOperandCode::Mask_V_E_LL_bcast_W1), (super::Opcode::VPCMPGTQ, EVEXOperandCode::Mask_V_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x38, [(super::Opcode::VPMINSB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMINSB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMINSB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x39, [(super::Opcode::VPMINSD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPMINSD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPMINSD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x3a, [(super::Opcode::VPMINUW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMINUW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMINUW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x3b, [(super::Opcode::VPMINUD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPMINUD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPMINUD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x3c, [(super::Opcode::VPMAXSB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMAXSB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMAXSB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x3d, [(super::Opcode::VPMAXSD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPMAXSD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPMAXSD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x3e, [(super::Opcode::VPMAXUW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMAXUW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPMAXUW, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x3f, [(super::Opcode::VPMAXUD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPMAXUD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPMAXUD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x40, [(super::Opcode::VPMULLD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPMULLD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPMULLD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x42, [(super::Opcode::VGETEXPPS, EVEXOperandCode::Gm_E_LL_sae_bcast), (super::Opcode::VGETEXPPS, EVEXOperandCode::Gm_E_LL_sae_bcast), (super::Opcode::VGETEXPPS, EVEXOperandCode::Gm_E_LL_sae_bcast), (super::Opcode::VGETEXPPS, EVEXOperandCode::Gm_E_LL_sae_bcast)]), + (0x43, [(super::Opcode::VGETEXPSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_bcast), (super::Opcode::VGETEXPSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_bcast), (super::Opcode::VGETEXPSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_bcast), (super::Opcode::VGETEXPSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_bcast)]), + (0x44, [(super::Opcode::VPLZCNTD, EVEXOperandCode::Gm_E_LL_bcast), (super::Opcode::VPLZCNTD, EVEXOperandCode::Gm_E_LL_bcast), (super::Opcode::VPLZCNTD, EVEXOperandCode::Gm_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x45, [(super::Opcode::VPSRLVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPSRLVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPSRLVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x46, [(super::Opcode::VPSRAVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPSRAVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPSRAVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x47, [(super::Opcode::VPSLLVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPSLLVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPSLLVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x4c, [(super::Opcode::VRCP14PS, EVEXOperandCode::Gm_E_LL_bcast), (super::Opcode::VRCP14PS, EVEXOperandCode::Gm_E_LL_bcast), (super::Opcode::VRCP14PS, EVEXOperandCode::Gm_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x4d, [(super::Opcode::VRCP14SS, EVEXOperandCode::Gm_V_Ed_xmm_sae), (super::Opcode::VRCP14SS, EVEXOperandCode::Gm_V_Ed_xmm_sae), (super::Opcode::VRCP14SS, EVEXOperandCode::Gm_V_Ed_xmm_sae), (super::Opcode::VRCP14SS, EVEXOperandCode::Gm_V_Ed_xmm_sae)]), + (0x4e, [(super::Opcode::VRSQRT14PS, EVEXOperandCode::Gm_E_LL_sae_bcast), (super::Opcode::VRSQRT14PS, EVEXOperandCode::Gm_E_LL_sae_bcast), (super::Opcode::VRSQRT14PS, EVEXOperandCode::Gm_E_LL_sae_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x4f, [(super::Opcode::VRSQRT14SS, EVEXOperandCode::Gm_V_Ed_xmm), (super::Opcode::VRSQRT14SS, EVEXOperandCode::Gm_V_Ed_xmm), (super::Opcode::VRSQRT14SS, EVEXOperandCode::Gm_V_Ed_xmm), (super::Opcode::VRSQRT14SS, EVEXOperandCode::Gm_V_Ed_xmm)]), + (0x50, [(super::Opcode::VPDPBUSD, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPDPBUSD, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPDPBUSD, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x51, [(super::Opcode::VPDPBUSDS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPDPBUSDS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPDPBUSDS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x52, [(super::Opcode::VPDPWSSD, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPDPWSSD, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPDPWSSD, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x53, [(super::Opcode::VPDPWSSDS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPDPWSSDS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VPDPWSSDS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x54, [(super::Opcode::VPOPCNTB, EVEXOperandCode::Gm_E_LL), (super::Opcode::VPOPCNTB, EVEXOperandCode::Gm_E_LL), (super::Opcode::VPOPCNTB, EVEXOperandCode::Gm_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x55, [(super::Opcode::VPOPCNTD, EVEXOperandCode::Gm_E_LL_bcast), (super::Opcode::VPOPCNTD, EVEXOperandCode::Gm_E_LL_bcast), (super::Opcode::VPOPCNTD, EVEXOperandCode::Gm_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x58, [(super::Opcode::VPBROADCASTD, EVEXOperandCode::Gm_LL_Ed_xmm_W0), (super::Opcode::VPBROADCASTD, EVEXOperandCode::Gm_LL_Ed_xmm_W0), (super::Opcode::VPBROADCASTD, EVEXOperandCode::Gm_LL_Ed_xmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x59, [(super::Opcode::VBROADCASTI32X2, EVEXOperandCode::Gm_LL_Eq_xmm), (super::Opcode::VBROADCASTI32X2, EVEXOperandCode::Gm_LL_Eq_xmm), (super::Opcode::VBROADCASTI32X2, EVEXOperandCode::Gm_LL_Eq_xmm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x5a, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VBROADCASTI32X4, EVEXOperandCode::Gm_ymm_M_xmm), (super::Opcode::VBROADCASTI32X4, EVEXOperandCode::Gm_zmm_M_xmm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x5b, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VBROADCASTI32X8, EVEXOperandCode::Gm_zmm_M_ymm), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x62, [(super::Opcode::VPEXPANDB, EVEXOperandCode::Gm_E_LL), (super::Opcode::VPEXPANDB, EVEXOperandCode::Gm_E_LL), (super::Opcode::VPEXPANDB, EVEXOperandCode::Gm_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x63, [(super::Opcode::VPCOMPRESSB, EVEXOperandCode::Em_G_LL), (super::Opcode::VPCOMPRESSB, EVEXOperandCode::Em_G_LL), (super::Opcode::VPCOMPRESSB, EVEXOperandCode::Em_G_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x64, [(super::Opcode::VPBLENDMD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPBLENDMD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPBLENDMD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x65, [(super::Opcode::VBLENDMPS, EVEXOperandCode::Gm_V_Ed_LL_bcast), (super::Opcode::VBLENDMPS, EVEXOperandCode::Gm_V_Ed_LL_bcast), (super::Opcode::VBLENDMPS, EVEXOperandCode::Gm_V_Ed_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x66, [(super::Opcode::VPBLENDMB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPBLENDMB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPBLENDMB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x70, [(super::Opcode::VPSHLDVW, EVEXOperandCode::Gm_V_E_LL_W1), (super::Opcode::VPSHLDVW, EVEXOperandCode::Gm_V_E_LL_W1), (super::Opcode::VPSHLDVW, EVEXOperandCode::Gm_V_E_LL_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x71, [(super::Opcode::VPSHLDVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPSHLDVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPSHLDVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x72, [(super::Opcode::VPSHRDVW, EVEXOperandCode::Gm_V_E_LL_W1), (super::Opcode::VPSHRDVW, EVEXOperandCode::Gm_V_E_LL_W1), (super::Opcode::VPSHRDVW, EVEXOperandCode::Gm_V_E_LL_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x73, [(super::Opcode::VPSHRDVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPSHRDVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPSHRDVD, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x75, [(super::Opcode::VPERMI2B, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPERMI2B, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPERMI2B, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x76, [(super::Opcode::VPERMI2D, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPERMI2D, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPERMI2D, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x77, [(super::Opcode::VPERMI2PS, EVEXOperandCode::Gm_V_Ed_LL_bcast), (super::Opcode::VPERMI2PS, EVEXOperandCode::Gm_V_Ed_LL_bcast), (super::Opcode::VPERMI2PS, EVEXOperandCode::Gm_V_Ed_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x78, [(super::Opcode::VPBROADCASTB, EVEXOperandCode::Gm_LL_Eb_xmm_W0), (super::Opcode::VPBROADCASTB, EVEXOperandCode::Gm_LL_Eb_xmm_W0), (super::Opcode::VPBROADCASTB, EVEXOperandCode::Gm_LL_Eb_xmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x79, [(super::Opcode::VPBROADCASTW, EVEXOperandCode::Gm_LL_Ew_xmm_W0), (super::Opcode::VPBROADCASTW, EVEXOperandCode::Gm_LL_Ew_xmm_W0), (super::Opcode::VPBROADCASTW, EVEXOperandCode::Gm_LL_Ew_xmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x7a, [(super::Opcode::VPBROADCASTB, EVEXOperandCode::Gm_LL_Ud_W0), (super::Opcode::VPBROADCASTB, EVEXOperandCode::Gm_LL_Ud_W0), (super::Opcode::VPBROADCASTB, EVEXOperandCode::Gm_LL_Ud_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x7b, [(super::Opcode::VPBROADCASTW, EVEXOperandCode::Gm_LL_Ud_W0), (super::Opcode::VPBROADCASTW, EVEXOperandCode::Gm_LL_Ud_W0), (super::Opcode::VPBROADCASTW, EVEXOperandCode::Gm_LL_Ud_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x7c, [(super::Opcode::VPBROADCASTD, EVEXOperandCode::Gm_LL_Ud), (super::Opcode::VPBROADCASTD, EVEXOperandCode::Gm_LL_Ud), (super::Opcode::VPBROADCASTD, EVEXOperandCode::Gm_LL_Ud), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x7d, [(super::Opcode::VPERMT2B, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPERMT2B, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPERMT2B, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x7e, [(super::Opcode::VPERMT2D, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPERMT2D, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::VPERMT2D, EVEXOperandCode::Gm_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x7f, [(super::Opcode::VPERMT2PS, EVEXOperandCode::Gm_V_Ed_LL_bcast), (super::Opcode::VPERMT2PS, EVEXOperandCode::Gm_V_Ed_LL_bcast), (super::Opcode::VPERMT2PS, EVEXOperandCode::Gm_V_Ed_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x83, [(super::Opcode::VPMULTISHIFTQB, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPMULTISHIFTQB, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPMULTISHIFTQB, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x88, [(super::Opcode::VEXPANDPS, EVEXOperandCode::Gm_E_LL), (super::Opcode::VEXPANDPS, EVEXOperandCode::Gm_E_LL), (super::Opcode::VEXPANDPS, EVEXOperandCode::Gm_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x89, [(super::Opcode::VPEXPANDD, EVEXOperandCode::Gm_E_LL), (super::Opcode::VPEXPANDD, EVEXOperandCode::Gm_E_LL), (super::Opcode::VPEXPANDD, EVEXOperandCode::Gm_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x8a, [(super::Opcode::VCOMPRESSPS, EVEXOperandCode::Em_G_LL), (super::Opcode::VCOMPRESSPS, EVEXOperandCode::Em_G_LL), (super::Opcode::VCOMPRESSPS, EVEXOperandCode::Em_G_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x8b, [(super::Opcode::VPCOMPRESSD, EVEXOperandCode::Em_G_LL), (super::Opcode::VPCOMPRESSD, EVEXOperandCode::Em_G_LL), (super::Opcode::VPCOMPRESSD, EVEXOperandCode::Em_G_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x8d, [(super::Opcode::VPERMB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPERMB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::VPERMB, EVEXOperandCode::Gm_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x8f, [(super::Opcode::VPSHUFBITQMB, EVEXOperandCode::Mask_V_E_LL_W0), (super::Opcode::VPSHUFBITQMB, EVEXOperandCode::Mask_V_E_LL_W0), (super::Opcode::VPSHUFBITQMB, EVEXOperandCode::Mask_V_E_LL_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x96, [(super::Opcode::VFMADDSUB132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMADDSUB132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMADDSUB132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMADDSUB132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0x97, [(super::Opcode::VFMSUBADD132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMSUBADD132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMSUBADD132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMSUBADD132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0x98, [(super::Opcode::VFMADD132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMADD132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMADD132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMADD132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0x99, [(super::Opcode::VFMADD132SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFMADD132SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFMADD132SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFMADD132SS, EVEXOperandCode::Gm_V_Ed_LL_sae)]), + (0x9a, [(super::Opcode::VFMSUB132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMSUB132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMSUB132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMSUB132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0x9b, [(super::Opcode::VFMSUB132SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFMSUB132SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFMSUB132SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFMSUB132SS, EVEXOperandCode::Gm_V_Ed_LL_sae)]), + (0x9c, [(super::Opcode::VFNMADD132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFNMADD132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFNMADD132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFNMADD132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0x9d, [(super::Opcode::VFNMADD132SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFNMADD132SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFNMADD132SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFNMADD132SS, EVEXOperandCode::Gm_V_Ed_LL_sae)]), + (0x9e, [(super::Opcode::VFNMSUB132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFNMSUB132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFNMSUB132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFNMSUB132PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0x9f, [(super::Opcode::VFNMSUB132SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFNMSUB132SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFNMSUB132SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFNMSUB132SS, EVEXOperandCode::Gm_V_Ed_LL_sae)]), + (0xa6, [(super::Opcode::VFMADDSUB213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMADDSUB213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMADDSUB213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMADDSUB213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0xa7, [(super::Opcode::VFMSUBADD213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMSUBADD213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMSUBADD213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMSUBADD213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0xa8, [(super::Opcode::VFMADD213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMADD213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMADD213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMADD213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0xa9, [(super::Opcode::VFMADD213SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFMADD213SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFMADD213SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFMADD213SS, EVEXOperandCode::Gm_V_Ed_LL_sae)]), + (0xaa, [(super::Opcode::VFMSUB213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMSUB213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMSUB213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMSUB213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0xab, [(super::Opcode::VFMSUB213SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFMSUB213SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFMSUB213SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFMSUB213SS, EVEXOperandCode::Gm_V_Ed_LL_sae)]), + (0xac, [(super::Opcode::VFNMADD213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFNMADD213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFNMADD213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFNMADD213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0xad, [(super::Opcode::VFNMADD213SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFNMADD213SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFNMADD213SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFNMADD213SS, EVEXOperandCode::Gm_V_Ed_LL_sae)]), + (0xae, [(super::Opcode::VFNMSUB213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFNMSUB213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFNMSUB213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFNMSUB213PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0xaf, [(super::Opcode::VFNMSUB213SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFNMSUB213SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFNMSUB213SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFNMSUB213SS, EVEXOperandCode::Gm_V_Ed_LL_sae)]), + (0xb4, [(super::Opcode::VPMADD52LUQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPMADD52LUQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPMADD52LUQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xb5, [(super::Opcode::VPMADD52HUQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPMADD52HUQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::VPMADD52HUQ, EVEXOperandCode::Gm_V_E_LL_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xb6, [(super::Opcode::VFMADDSUB231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMADDSUB231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMADDSUB231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMADDSUB231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0xb7, [(super::Opcode::VFMSUBADD231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMSUBADD231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMSUBADD231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMSUBADD231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0xb8, [(super::Opcode::VFMADD231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMADD231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMADD231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMADD231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0xb9, [(super::Opcode::VFMADD231SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFMADD231SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFMADD231SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFMADD231SS, EVEXOperandCode::Gm_V_Ed_LL_sae)]), + (0xba, [(super::Opcode::VFMSUB231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMSUB231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMSUB231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFMSUB231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0xbb, [(super::Opcode::VFMSUB231SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFMSUB231SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFMSUB231SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFMSUB231SS, EVEXOperandCode::Gm_V_Ed_LL_sae)]), + (0xbc, [(super::Opcode::VFNMADD231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFNMADD231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFNMADD231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFNMADD231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0xbd, [(super::Opcode::VFNMADD231SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFNMADD231SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFNMADD231SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFNMADD231SS, EVEXOperandCode::Gm_V_Ed_LL_sae)]), + (0xbe, [(super::Opcode::VFNMSUB231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFNMSUB231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFNMSUB231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast), (super::Opcode::VFNMSUB231PS, EVEXOperandCode::Gm_V_E_LL_sae_bcast)]), + (0xbf, [(super::Opcode::VFNMSUB231SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFNMSUB231SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFNMSUB231SS, EVEXOperandCode::Gm_V_Ed_LL_sae), (super::Opcode::VFNMSUB231SS, EVEXOperandCode::Gm_V_Ed_LL_sae)]), + (0xc4, [(super::Opcode::VPCONFLICTD, EVEXOperandCode::Gm_E_LL_bcast), (super::Opcode::VPCONFLICTD, EVEXOperandCode::Gm_E_LL_bcast), (super::Opcode::VPCONFLICTD, EVEXOperandCode::Gm_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xc8, [(super::Opcode::VEXP2PS, EVEXOperandCode::Gm_E_zmm_sae_bcast), (super::Opcode::VEXP2PS, EVEXOperandCode::Gm_E_zmm_sae_bcast), (super::Opcode::VEXP2PS, EVEXOperandCode::Gm_E_zmm_sae_bcast), (super::Opcode::VEXP2PS, EVEXOperandCode::Gm_E_zmm_sae_bcast)]), + (0xca, [(super::Opcode::VRCP28PS, EVEXOperandCode::Gm_E_zmm_sae_bcast), (super::Opcode::VRCP28PS, EVEXOperandCode::Gm_E_zmm_sae_bcast), (super::Opcode::VRCP28PS, EVEXOperandCode::Gm_E_zmm_sae_bcast), (super::Opcode::VRCP28PS, EVEXOperandCode::Gm_E_zmm_sae_bcast)]), + (0xcb, [(super::Opcode::VRCP28SS, EVEXOperandCode::Gm_V_E_xmm_sae), (super::Opcode::VRCP28SS, EVEXOperandCode::Gm_V_E_xmm_sae), (super::Opcode::VRCP28SS, EVEXOperandCode::Gm_V_E_xmm_sae), (super::Opcode::VRCP28SS, EVEXOperandCode::Gm_V_E_xmm_sae)]), + (0xcc, [(super::Opcode::VRSQRT28PS, EVEXOperandCode::Gm_E_zmm_sae_bcast), (super::Opcode::VRSQRT28PS, EVEXOperandCode::Gm_E_zmm_sae_bcast), (super::Opcode::VRSQRT28PS, EVEXOperandCode::Gm_E_zmm_sae_bcast), (super::Opcode::VRSQRT28PS, EVEXOperandCode::Gm_E_zmm_sae_bcast)]), + (0xcd, [(super::Opcode::VRSQRT28SS, EVEXOperandCode::Gm_V_E_xmm_sae), (super::Opcode::VRSQRT28SS, EVEXOperandCode::Gm_V_E_xmm_sae), (super::Opcode::VRSQRT28SS, EVEXOperandCode::Gm_V_E_xmm_sae), (super::Opcode::VRSQRT28SS, EVEXOperandCode::Gm_V_E_xmm_sae)]), + (0xcf, [(super::Opcode::VGF2P8MULB, EVEXOperandCode::Gm_V_E_LL_W0), (super::Opcode::VGF2P8MULB, EVEXOperandCode::Gm_V_E_LL_W0), (super::Opcode::VGF2P8MULB, EVEXOperandCode::Gm_V_E_LL_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xdc, [(super::Opcode::VAESENC, EVEXOperandCode::G_V_E_LL), (super::Opcode::VAESENC, EVEXOperandCode::G_V_E_LL), (super::Opcode::VAESENC, EVEXOperandCode::G_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xdd, [(super::Opcode::VAESENCLAST, EVEXOperandCode::G_V_E_LL), (super::Opcode::VAESENCLAST, EVEXOperandCode::G_V_E_LL), (super::Opcode::VAESENCLAST, EVEXOperandCode::G_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xde, [(super::Opcode::VAESDEC, EVEXOperandCode::G_V_E_LL), (super::Opcode::VAESDEC, EVEXOperandCode::G_V_E_LL), (super::Opcode::VAESDEC, EVEXOperandCode::G_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xdf, [(super::Opcode::VAESDECLAST, EVEXOperandCode::G_V_E_LL), (super::Opcode::VAESDECLAST, EVEXOperandCode::G_V_E_LL), (super::Opcode::VAESDECLAST, EVEXOperandCode::G_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), +]; + +const EVEX_66_0f3a: [(u8, [(super::Opcode, EVEXOperandCode); 4]); 51] = [ + (0x00, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VPERMQ, EVEXOperandCode::Gm_E_LL_imm8_bcast_W1), (super::Opcode::VPERMQ, EVEXOperandCode::Gm_E_LL_imm8_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x01, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VPERMPD, EVEXOperandCode::Gm_E_LL_imm8_bcast_W1), (super::Opcode::VPERMPD, EVEXOperandCode::Gm_E_LL_imm8_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x03, [(super::Opcode::VALIGND, EVEXOperandCode::Gm_V_E_LL_imm8_bcast), (super::Opcode::VALIGND, EVEXOperandCode::Gm_V_E_LL_imm8_bcast), (super::Opcode::VALIGND, EVEXOperandCode::Gm_V_E_LL_imm8_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x04, [(super::Opcode::VPERMILPS, EVEXOperandCode::Gm_E_LL_imm8_bcast_W0), (super::Opcode::VPERMILPS, EVEXOperandCode::Gm_E_LL_imm8_bcast_W0), (super::Opcode::VPERMILPS, EVEXOperandCode::Gm_E_LL_imm8_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x05, [(super::Opcode::VPERMILPD, EVEXOperandCode::Gm_E_LL_imm8_bcast_W1), (super::Opcode::VPERMILPD, EVEXOperandCode::Gm_E_LL_imm8_bcast_W1), (super::Opcode::VPERMILPD, EVEXOperandCode::Gm_E_LL_imm8_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x08, [(super::Opcode::VRNDSCALEPS, EVEXOperandCode::Gm_E_LL_imm8_sae_W0), (super::Opcode::VRNDSCALEPS, EVEXOperandCode::Gm_E_LL_imm8_sae_W0), (super::Opcode::VRNDSCALEPS, EVEXOperandCode::Gm_E_LL_imm8_sae_W0), (super::Opcode::VRNDSCALEPS, EVEXOperandCode::Gm_E_LL_imm8_sae_W0)]), + (0x09, [(super::Opcode::VRNDSCALEPD, EVEXOperandCode::Gm_E_LL_imm8_sae_W1), (super::Opcode::VRNDSCALEPD, EVEXOperandCode::Gm_E_LL_imm8_sae_W1), (super::Opcode::VRNDSCALEPD, EVEXOperandCode::Gm_E_LL_imm8_sae_W1), (super::Opcode::VRNDSCALEPD, EVEXOperandCode::Gm_E_LL_imm8_sae_W1)]), + (0x0a, [(super::Opcode::VRNDSCALESS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae), (super::Opcode::VRNDSCALESS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae), (super::Opcode::VRNDSCALESS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae), (super::Opcode::VRNDSCALESS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae)]),// W0 + (0x0b, [(super::Opcode::VRNDSCALESD, EVEXOperandCode::Gm_V_E_xmm_imm8_sae), (super::Opcode::VRNDSCALESD, EVEXOperandCode::Gm_V_E_xmm_imm8_sae), (super::Opcode::VRNDSCALESD, EVEXOperandCode::Gm_V_E_xmm_imm8_sae), (super::Opcode::VRNDSCALESD, EVEXOperandCode::Gm_V_E_xmm_imm8_sae)]),// W1 + (0x0f, [(super::Opcode::VPALIGNR, EVEXOperandCode::Gm_V_E_LL_imm8), (super::Opcode::VPALIGNR, EVEXOperandCode::Gm_V_E_LL_imm8), (super::Opcode::VPALIGNR, EVEXOperandCode::Gm_V_E_LL_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x14, [(super::Opcode::VPEXTRB, EVEXOperandCode::Ebd_G_xmm_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x15, [(super::Opcode::VPEXTRW, EVEXOperandCode::Ewd_G_xmm_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x16, [(super::Opcode::Invalid, EVEXOperandCode::Edd_G_xmm_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x17, [(super::Opcode::VEXTRACTPS, EVEXOperandCode::VEXTRACTPS), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x18, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VINSERTF32X4, EVEXOperandCode::Gm_V_LL_E_xmm_imm8), (super::Opcode::VINSERTF32X4, EVEXOperandCode::Gm_V_LL_E_xmm_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x19, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VEXTRACTF32X4, EVEXOperandCode::Em_xmm_G_LL_imm8), (super::Opcode::VEXTRACTF32X4, EVEXOperandCode::Em_xmm_G_LL_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x1a, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VINSERTF32X8, EVEXOperandCode::Gm_V_zmm_E_ymm_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x1b, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VEXTRACTF32X8, EVEXOperandCode::Em_ymm_G_zmm_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x1d, [(super::Opcode::VCVTPS2PH, EVEXOperandCode::Eqm_G_xmm_imm8_sae_W0), (super::Opcode::VCVTPS2PH, EVEXOperandCode::Em_xmm_G_ymm_imm8_sae_W0), (super::Opcode::VCVTPS2PH, EVEXOperandCode::Em_ymm_G_zmm_imm8_sae_W0), (super::Opcode::VCVTPS2PH, EVEXOperandCode::Em_ymm_G_zmm_imm8_sae_W0)]), + (0x1e, [(super::Opcode::VPCMPUD, EVEXOperandCode::Mask_V_E_LL_imm8_bcast), (super::Opcode::VPCMPUD, EVEXOperandCode::Mask_V_E_LL_imm8_bcast), (super::Opcode::VPCMPUD, EVEXOperandCode::Mask_V_E_LL_imm8_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x1f, [(super::Opcode::VPCMPD, EVEXOperandCode::Mask_V_E_LL_imm8_bcast), (super::Opcode::VPCMPD, EVEXOperandCode::Mask_V_E_LL_imm8_bcast), (super::Opcode::VPCMPD, EVEXOperandCode::Mask_V_E_LL_imm8_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x20, [(super::Opcode::VPINSRB, EVEXOperandCode::G_V_xmm_Ebd_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x21, [(super::Opcode::VINSERTPS, EVEXOperandCode::G_V_Ed_xmm_imm8_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x22, [(super::Opcode::VPINSRD, EVEXOperandCode::G_V_xmm_Edq_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x23, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VSHUFF32X4, EVEXOperandCode::Gm_V_Ed_LL_imm8_bcast), (super::Opcode::VSHUFF32X4, EVEXOperandCode::Gm_V_Ed_LL_imm8_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x25, [(super::Opcode::VPTERNLOGD, EVEXOperandCode::Gm_V_E_LL_imm8_bcast), (super::Opcode::VPTERNLOGD, EVEXOperandCode::Gm_V_E_LL_imm8_bcast), (super::Opcode::VPTERNLOGD, EVEXOperandCode::Gm_V_E_LL_imm8_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x26, [(super::Opcode::VGETMANTPS, EVEXOperandCode::Gm_Ed_LL_imm8_sae_noround_bcast), (super::Opcode::VGETMANTPS, EVEXOperandCode::Gm_Ed_LL_imm8_sae_noround_bcast), (super::Opcode::VGETMANTPS, EVEXOperandCode::Gm_Ed_LL_imm8_sae_noround_bcast), (super::Opcode::VGETMANTPS, EVEXOperandCode::Gm_Ed_LL_imm8_sae_noround_bcast)]), + (0x27, [(super::Opcode::VGETMANTSS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae), (super::Opcode::VGETMANTSS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae), (super::Opcode::VGETMANTSS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae), (super::Opcode::VGETMANTSS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae)]), + (0x38, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VINSERTI32X4, EVEXOperandCode::Gm_V_ymm_E_xmm_imm8), (super::Opcode::VINSERTI32X4, EVEXOperandCode::Gm_V_zmm_E_xmm_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x39, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VEXTRACTI32X4, EVEXOperandCode::Em_xmm_G_LL_imm8), (super::Opcode::VEXTRACTI32X4, EVEXOperandCode::Em_xmm_G_LL_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x3a, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VINSERTI32X8, EVEXOperandCode::Gm_V_zmm_E_ymm_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x3b, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VEXTRACTI32X8, EVEXOperandCode::Em_ymm_G_zmm_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x3e, [(super::Opcode::VPCMPUB, EVEXOperandCode::Mask_V_E_LL_imm8), (super::Opcode::VPCMPUB, EVEXOperandCode::Mask_V_E_LL_imm8), (super::Opcode::VPCMPUB, EVEXOperandCode::Mask_V_E_LL_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x3f, [(super::Opcode::VPCMPB, EVEXOperandCode::Mask_V_E_LL_imm8), (super::Opcode::VPCMPB, EVEXOperandCode::Mask_V_E_LL_imm8), (super::Opcode::VPCMPB, EVEXOperandCode::Mask_V_E_LL_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x42, [(super::Opcode::VDBPSADBW, EVEXOperandCode::Gm_V_E_LL_imm8_W0), (super::Opcode::VDBPSADBW, EVEXOperandCode::Gm_V_E_LL_imm8_W0), (super::Opcode::VDBPSADBW, EVEXOperandCode::Gm_V_E_LL_imm8_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x43, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VSHUFI32X4, EVEXOperandCode::Gm_V_E_LL_imm8_bcast), (super::Opcode::VSHUFI32X4, EVEXOperandCode::Gm_V_E_LL_imm8_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x44, [(super::Opcode::VPCLMULQDQ, EVEXOperandCode::G_V_E_LL_imm8), (super::Opcode::VPCLMULQDQ, EVEXOperandCode::G_V_E_LL_imm8), (super::Opcode::VPCLMULQDQ, EVEXOperandCode::G_V_E_LL_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x50, [(super::Opcode::VRANGEPS, EVEXOperandCode::Gm_V_E_LL_imm8_sae_bcast), + (super::Opcode::VRANGEPS, EVEXOperandCode::Gm_V_E_LL_imm8_sae_bcast), + (super::Opcode::VRANGEPS, EVEXOperandCode::Gm_V_E_LL_imm8_sae_bcast), (super::Opcode::VRANGEPS, EVEXOperandCode::Gm_V_E_LL_imm8_sae_bcast)]), + (0x51, [(super::Opcode::VRANGESS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae), (super::Opcode::VRANGESS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae), (super::Opcode::VRANGESS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae), (super::Opcode::VRANGESS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae)]), + (0x54, [(super::Opcode::VFIXUPIMMPS, EVEXOperandCode::Gm_V_E_LL_imm8_sae_bcast) +, (super::Opcode::VFIXUPIMMPS, EVEXOperandCode::Gm_V_E_LL_imm8_sae_bcast) +, (super::Opcode::VFIXUPIMMPS, EVEXOperandCode::Gm_V_E_LL_imm8_sae_bcast), (super::Opcode::VFIXUPIMMPS, EVEXOperandCode::Gm_V_E_LL_imm8_sae_bcast)]), + (0x55, [(super::Opcode::VFIXUPIMMSS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae), (super::Opcode::VFIXUPIMMSS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae), (super::Opcode::VFIXUPIMMSS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae), (super::Opcode::VFIXUPIMMSS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae)]), + (0x56, [(super::Opcode::VREDUCEPS, EVEXOperandCode::Gm_E_LL_imm8_sae) +, (super::Opcode::VREDUCEPS, EVEXOperandCode::Gm_E_LL_imm8_sae) +, (super::Opcode::VREDUCEPS, EVEXOperandCode::Gm_E_LL_imm8_sae), (super::Opcode::VREDUCEPS, EVEXOperandCode::Gm_E_LL_imm8_sae)]), + (0x57, [(super::Opcode::VREDUCESS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae), (super::Opcode::VREDUCESS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae), (super::Opcode::VREDUCESS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae), (super::Opcode::VREDUCESS, EVEXOperandCode::Gm_V_Ed_xmm_imm8_sae)]), + (0x66, [(super::Opcode::VFPCLASSPS, EVEXOperandCode::Mask_E_LL_imm8_bcast) +, (super::Opcode::VFPCLASSPS, EVEXOperandCode::Mask_E_LL_imm8_bcast) +, (super::Opcode::VFPCLASSPS, EVEXOperandCode::Mask_E_LL_imm8_bcast) +, (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x67, [(super::Opcode::VFPCLASSSS, EVEXOperandCode::Mask_Ed_xmm_imm8), (super::Opcode::VFPCLASSSS, EVEXOperandCode::Mask_Ed_xmm_imm8), (super::Opcode::VFPCLASSSS, EVEXOperandCode::Mask_Ed_xmm_imm8), (super::Opcode::VFPCLASSSS, EVEXOperandCode::Mask_Ed_xmm_imm8)]), + (0x70, [(super::Opcode::VPSHLDW, EVEXOperandCode::Gm_V_E_LL_imm8_W1), (super::Opcode::VPSHLDW, EVEXOperandCode::Gm_V_E_LL_imm8_W1), (super::Opcode::VPSHLDW, EVEXOperandCode::Gm_V_E_LL_imm8_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x71, [(super::Opcode::VPSHLDD, EVEXOperandCode::Gm_V_E_LL_imm8_bcast), (super::Opcode::VPSHLDD, EVEXOperandCode::Gm_V_E_LL_imm8_bcast), (super::Opcode::VPSHLDD, EVEXOperandCode::Gm_V_E_LL_imm8_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x72, [(super::Opcode::VPSHRDW, EVEXOperandCode::Gm_V_E_LL_imm8_W1), (super::Opcode::VPSHRDW, EVEXOperandCode::Gm_V_E_LL_imm8_W1), (super::Opcode::VPSHRDW, EVEXOperandCode::Gm_V_E_LL_imm8_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x73, [(super::Opcode::VPSHRDD, EVEXOperandCode::Gm_V_E_LL_imm8_bcast), (super::Opcode::VPSHRDD, EVEXOperandCode::Gm_V_E_LL_imm8_bcast), (super::Opcode::VPSHRDD, EVEXOperandCode::Gm_V_E_LL_imm8_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xce, [(super::Opcode::VGF2P8AFFINEQB, EVEXOperandCode::Gm_V_E_LL_imm8_bcast_W1), (super::Opcode::VGF2P8AFFINEQB, EVEXOperandCode::Gm_V_E_LL_imm8_bcast_W1), (super::Opcode::VGF2P8AFFINEQB, EVEXOperandCode::Gm_V_E_LL_imm8_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xcf, [(super::Opcode::VGF2P8AFFINEINVQB, EVEXOperandCode::Gm_V_E_LL_imm8_bcast_W1), (super::Opcode::VGF2P8AFFINEINVQB, EVEXOperandCode::Gm_V_E_LL_imm8_bcast_W1), (super::Opcode::VGF2P8AFFINEINVQB, EVEXOperandCode::Gm_V_E_LL_imm8_bcast_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), +]; + +const EVEX_f2_0f: [(u8, [(super::Opcode, EVEXOperandCode); 4]); 26] = [ + (0x10, [(super::Opcode::VMOVSS, EVEXOperandCode::VMOVSS_10), (super::Opcode::VMOVSS, EVEXOperandCode::VMOVSS_10), (super::Opcode::VMOVSS, EVEXOperandCode::VMOVSS_10), (super::Opcode::VMOVSS, EVEXOperandCode::VMOVSS_10) +]),// W0 + (0x11, [(super::Opcode::VMOVSS, EVEXOperandCode::VMOVSS_11), (super::Opcode::VMOVSS, EVEXOperandCode::VMOVSS_11), (super::Opcode::VMOVSS, EVEXOperandCode::VMOVSS_11), (super::Opcode::VMOVSS, EVEXOperandCode::VMOVSS_11) +]),// W0 + (0x12, [(super::Opcode::VMOVSLDUP, EVEXOperandCode::Gm_E_LL_W0), (super::Opcode::VMOVSLDUP, EVEXOperandCode::Gm_E_LL_W0), (super::Opcode::VMOVSLDUP, EVEXOperandCode::Gm_E_LL_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x16, [(super::Opcode::VMOVSHDUP, EVEXOperandCode::Gm_E_LL_W0), (super::Opcode::VMOVSHDUP, EVEXOperandCode::Gm_E_LL_W0), (super::Opcode::VMOVSHDUP, EVEXOperandCode::Gm_E_LL_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x2a, [(super::Opcode::VCVTSI2SS, EVEXOperandCode::VCVTSI2SS), (super::Opcode::VCVTSI2SS, EVEXOperandCode::VCVTSI2SS), (super::Opcode::VCVTSI2SS, EVEXOperandCode::VCVTSI2SS), (super::Opcode::VCVTSI2SS, EVEXOperandCode::VCVTSI2SS)]), + (0x2c, [(super::Opcode::VCVTTSS2SI, EVEXOperandCode::VCVTTSS2SI), (super::Opcode::VCVTTSS2SI, EVEXOperandCode::VCVTTSS2SI), (super::Opcode::VCVTTSS2SI, EVEXOperandCode::VCVTTSS2SI), (super::Opcode::VCVTTSS2SI, EVEXOperandCode::VCVTTSS2SI)]), + (0x2d, [(super::Opcode::VCVTSS2SI, EVEXOperandCode::VCVTSS2SI), (super::Opcode::VCVTSS2SI, EVEXOperandCode::VCVTSS2SI), (super::Opcode::VCVTSS2SI, EVEXOperandCode::VCVTSS2SI), (super::Opcode::VCVTSS2SI, EVEXOperandCode::VCVTSS2SI)]), + (0x51, [(super::Opcode::VSQRTSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VSQRTSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VSQRTSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VSQRTSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0)]), + (0x58, [(super::Opcode::VADDSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VADDSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VADDSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VADDSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0)]), + (0x59, [(super::Opcode::VMULSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VMULSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VMULSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VMULSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0)]), + (0x5a, [(super::Opcode::VCVTSS2SD, EVEXOperandCode::Gm_V_Ed_xmm_sae_noround_W0), (super::Opcode::VCVTSS2SD, EVEXOperandCode::Gm_V_Ed_xmm_sae_noround_W0), (super::Opcode::VCVTSS2SD, EVEXOperandCode::Gm_V_Ed_xmm_sae_noround_W0), (super::Opcode::VCVTSS2SD, EVEXOperandCode::Gm_V_Ed_xmm_sae_noround_W0)]),// W0 + (0x5b, [(super::Opcode::VCVTTPS2DQ, EVEXOperandCode::Gm_Ed_LL_sae_noround_bcast_W0), (super::Opcode::VCVTTPS2DQ, EVEXOperandCode::Gm_Ed_LL_sae_noround_bcast_W0), (super::Opcode::VCVTTPS2DQ, EVEXOperandCode::Gm_Ed_LL_sae_noround_bcast_W0), (super::Opcode::VCVTTPS2DQ, EVEXOperandCode::Gm_Ed_LL_sae_noround_bcast_W0)]), + (0x5c, [(super::Opcode::VSUBSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VSUBSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VSUBSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VSUBSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0)]), + (0x5d, [(super::Opcode::VMINSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VMINSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VMINSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VMINSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0)]),// W0 + (0x5e, [(super::Opcode::VDIVSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VDIVSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VDIVSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VDIVSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0)]), + (0x5f, [(super::Opcode::VMAXSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VMAXSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VMAXSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0), (super::Opcode::VMAXSS, EVEXOperandCode::Gm_V_Ed_xmm_sae_W0)]),// W0 + (0x6f, [(super::Opcode::VMOVDQU32, EVEXOperandCode::Gm_E_LL), (super::Opcode::VMOVDQU32, EVEXOperandCode::Gm_E_LL), (super::Opcode::VMOVDQU32, EVEXOperandCode::Gm_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x70, [(super::Opcode::VPSHUFHW, EVEXOperandCode::Gm_E_LL_imm8), (super::Opcode::VPSHUFHW, EVEXOperandCode::Gm_E_LL_imm8), (super::Opcode::VPSHUFHW, EVEXOperandCode::Gm_E_LL_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x78, [(super::Opcode::VCVTTSS2USI, EVEXOperandCode::Gd_Ed_xmm_sae), (super::Opcode::VCVTTSS2USI, EVEXOperandCode::Gd_Ed_xmm_sae), (super::Opcode::VCVTTSS2USI, EVEXOperandCode::Gd_Ed_xmm_sae), (super::Opcode::VCVTTSS2USI, EVEXOperandCode::Gd_Ed_xmm_sae)]), + (0x79, [(super::Opcode::VCVTSS2USI, EVEXOperandCode::Gd_Ed_xmm_sae), (super::Opcode::VCVTSS2USI, EVEXOperandCode::Gd_Ed_xmm_sae), (super::Opcode::VCVTSS2USI, EVEXOperandCode::Gd_Ed_xmm_sae), (super::Opcode::VCVTSS2USI, EVEXOperandCode::Gd_Ed_xmm_sae)]), + (0x7a, [(super::Opcode::VCVTUDQ2PD, EVEXOperandCode::VCVTUDQ2PD), (super::Opcode::VCVTUDQ2PD, EVEXOperandCode::VCVTUDQ2PD), (super::Opcode::VCVTUDQ2PD, EVEXOperandCode::VCVTUDQ2PD), (super::Opcode::VCVTUDQ2PD, EVEXOperandCode::VCVTUDQ2PD)]), + (0x7b, [(super::Opcode::VCVTUSI2SS, EVEXOperandCode::G_V_xmm_Edq_sae), (super::Opcode::VCVTUSI2SS, EVEXOperandCode::G_V_xmm_Edq_sae), (super::Opcode::VCVTUSI2SS, EVEXOperandCode::G_V_xmm_Edq_sae), (super::Opcode::VCVTUSI2SS, EVEXOperandCode::G_V_xmm_Edq_sae)]), + (0x7e, [(super::Opcode::VMOVQ, EVEXOperandCode::VMOVQ_7e), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x7f, [(super::Opcode::VMOVDQU32, EVEXOperandCode::Em_G_LL), (super::Opcode::VMOVDQU32, EVEXOperandCode::Em_G_LL), (super::Opcode::VMOVDQU32, EVEXOperandCode::Em_G_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xc2, [(super::Opcode::VCMPSS, EVEXOperandCode::Maskm_V_Ed_xmm_imm8_sae_W0), (super::Opcode::VCMPSS, EVEXOperandCode::Maskm_V_Ed_xmm_imm8_sae_W0), (super::Opcode::VCMPSS, EVEXOperandCode::Maskm_V_Ed_xmm_imm8_sae_W0), (super::Opcode::VCMPSS, EVEXOperandCode::Maskm_V_Ed_xmm_imm8_sae_W0)]), + (0xe6, [(super::Opcode::VCVTDQ2PD, EVEXOperandCode::VCVTUDQ2PD), (super::Opcode::VCVTDQ2PD, EVEXOperandCode::VCVTUDQ2PD), (super::Opcode::VCVTDQ2PD, EVEXOperandCode::VCVTUDQ2PD), (super::Opcode::VCVTDQ2PD, EVEXOperandCode::VCVTUDQ2PD)]), +]; + +const EVEX_f2_0f38: [(u8, [(super::Opcode, EVEXOperandCode); 4]); 28] = [ + (0x10, [(super::Opcode::VPMOVUSWB, EVEXOperandCode::Eqm_xmm_G_xmm_W0), (super::Opcode::VPMOVUSWB, EVEXOperandCode::Em_xmm_G_ymm_W0), (super::Opcode::VPMOVUSWB, EVEXOperandCode::Em_ymm_G_zmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x11, [(super::Opcode::VPMOVUSDB, EVEXOperandCode::Edm_xmm_G_xmm_W0), (super::Opcode::VPMOVUSDB, EVEXOperandCode::Eqm_xmm_G_ymm_W0), (super::Opcode::VPMOVUSDB, EVEXOperandCode::Em_xmm_G_zmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x12, [(super::Opcode::VPMOVUSQB, EVEXOperandCode::Ewm_xmm_G_xmm_W0), (super::Opcode::VPMOVUSQB, EVEXOperandCode::Edm_xmm_G_ymm_W0), (super::Opcode::VPMOVUSQB, EVEXOperandCode::Eqm_xmm_G_zmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x13, [(super::Opcode::VPMOVUSDW, EVEXOperandCode::Eqm_xmm_G_xmm_W0), (super::Opcode::VPMOVUSDW, EVEXOperandCode::Em_xmm_G_ymm_W0), (super::Opcode::VPMOVUSDW, EVEXOperandCode::Em_ymm_G_zmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x14, [(super::Opcode::VPMOVUSQW, EVEXOperandCode::Edm_xmm_G_xmm_W0), (super::Opcode::VPMOVUSQW, EVEXOperandCode::Eqm_xmm_G_ymm_W0), (super::Opcode::VPMOVUSQW, EVEXOperandCode::Em_xmm_G_zmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x15, [(super::Opcode::VPMOVUSQD, EVEXOperandCode::Eqm_xmm_G_xmm_W0), (super::Opcode::VPMOVUSQD, EVEXOperandCode::Em_xmm_G_ymm_W0), (super::Opcode::VPMOVUSQD, EVEXOperandCode::Em_ymm_G_zmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x20, [(super::Opcode::VPMOVSWB, EVEXOperandCode::Eqm_xmm_G_xmm_W0), (super::Opcode::VPMOVSWB, EVEXOperandCode::Em_xmm_G_ymm_W0), (super::Opcode::VPMOVSWB, EVEXOperandCode::Em_ymm_G_zmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x21, [(super::Opcode::VPMOVSDB, EVEXOperandCode::Edm_xmm_G_xmm_W0), (super::Opcode::VPMOVSDB, EVEXOperandCode::Eqm_xmm_G_ymm_W0), (super::Opcode::VPMOVSDB, EVEXOperandCode::Em_xmm_G_zmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x22, [(super::Opcode::VPMOVSQB, EVEXOperandCode::Ewm_xmm_G_xmm_W0), (super::Opcode::VPMOVSQB, EVEXOperandCode::Edm_xmm_G_ymm_W0), (super::Opcode::VPMOVSQB, EVEXOperandCode::Eqm_xmm_G_zmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x23, [(super::Opcode::VPMOVSDW, EVEXOperandCode::Eqm_xmm_G_xmm_W0), (super::Opcode::VPMOVSDW, EVEXOperandCode::Em_xmm_G_ymm_W0), (super::Opcode::VPMOVSDW, EVEXOperandCode::Em_ymm_G_zmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x24, [(super::Opcode::VPMOVSQW, EVEXOperandCode::Edm_xmm_G_xmm_W0), (super::Opcode::VPMOVSQW, EVEXOperandCode::Eqm_xmm_G_ymm_W0), (super::Opcode::VPMOVSQW, EVEXOperandCode::Em_xmm_G_zmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x25, [(super::Opcode::VPMOVSQD, EVEXOperandCode::Eqm_xmm_G_xmm_W0), (super::Opcode::VPMOVSQD, EVEXOperandCode::Em_xmm_G_ymm_W0), (super::Opcode::VPMOVSQD, EVEXOperandCode::Em_ymm_G_zmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x26, [(super::Opcode::VPTESTNMB, EVEXOperandCode::Mask_V_E_LL), (super::Opcode::VPTESTNMB, EVEXOperandCode::Mask_V_E_LL), (super::Opcode::VPTESTNMB, EVEXOperandCode::Mask_V_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x27, [(super::Opcode::VPTESTNMD, EVEXOperandCode::Mask_V_E_LL_bcast), (super::Opcode::VPTESTNMD, EVEXOperandCode::Mask_V_E_LL_bcast), (super::Opcode::VPTESTNMD, EVEXOperandCode::Mask_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x28, [(super::Opcode::VPMOVM2B, EVEXOperandCode::G_LL_Mask), (super::Opcode::VPMOVM2B, EVEXOperandCode::G_LL_Mask), (super::Opcode::VPMOVM2B, EVEXOperandCode::G_LL_Mask), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x29, [(super::Opcode::VPMOVB2M, EVEXOperandCode::Mask_U_LL), (super::Opcode::VPMOVB2M, EVEXOperandCode::Mask_U_LL), (super::Opcode::VPMOVB2M, EVEXOperandCode::Mask_U_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x2a, [(super::Opcode::VPBROADCASTMB2Q, EVEXOperandCode::G_LL_Mask_W1), (super::Opcode::VPBROADCASTMB2Q, EVEXOperandCode::G_LL_Mask_W1), (super::Opcode::VPBROADCASTMB2Q, EVEXOperandCode::G_LL_Mask_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x30, [(super::Opcode::VPMOVWB, EVEXOperandCode::Eqm_xmm_G_xmm_W0), (super::Opcode::VPMOVWB, EVEXOperandCode::Em_xmm_G_ymm_W0), (super::Opcode::VPMOVWB, EVEXOperandCode::Em_ymm_G_zmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x31, [(super::Opcode::VPMOVDB, EVEXOperandCode::Edm_xmm_G_xmm_W0), (super::Opcode::VPMOVDB, EVEXOperandCode::Eqm_xmm_G_ymm_W0), (super::Opcode::VPMOVDB, EVEXOperandCode::Em_xmm_G_zmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x32, [(super::Opcode::VPMOVQB, EVEXOperandCode::Ewm_xmm_G_xmm_W0), (super::Opcode::VPMOVQB, EVEXOperandCode::Edm_xmm_G_ymm_W0), (super::Opcode::VPMOVQB, EVEXOperandCode::Eqm_xmm_G_zmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x33, [(super::Opcode::VPMOVDW, EVEXOperandCode::Eqm_xmm_G_xmm_W0), (super::Opcode::VPMOVDW, EVEXOperandCode::Em_xmm_G_ymm_W0), (super::Opcode::VPMOVDW, EVEXOperandCode::Em_ymm_G_zmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x34, [(super::Opcode::VPMOVQW, EVEXOperandCode::Edm_xmm_G_xmm_W0), (super::Opcode::VPMOVQW, EVEXOperandCode::Eqm_xmm_G_ymm_W0), (super::Opcode::VPMOVQW, EVEXOperandCode::Em_xmm_G_zmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x35, [(super::Opcode::VPMOVQD, EVEXOperandCode::Eqm_xmm_G_xmm_W0), (super::Opcode::VPMOVQD, EVEXOperandCode::Em_xmm_G_ymm_W0), (super::Opcode::VPMOVQD, EVEXOperandCode::Em_ymm_G_zmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x38, [(super::Opcode::VPMOVM2D, EVEXOperandCode::G_LL_Mask), (super::Opcode::VPMOVM2D, EVEXOperandCode::G_LL_Mask), (super::Opcode::VPMOVM2D, EVEXOperandCode::G_LL_Mask), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x39, [(super::Opcode::VPMOVD2M, EVEXOperandCode::Mask_U_LL), (super::Opcode::VPMOVD2M, EVEXOperandCode::Mask_U_LL), (super::Opcode::VPMOVD2M, EVEXOperandCode::Mask_U_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x3a, [(super::Opcode::VPBROADCASTMW2D, EVEXOperandCode::G_LL_Mask_W0), (super::Opcode::VPBROADCASTMW2D, EVEXOperandCode::G_LL_Mask_W0), (super::Opcode::VPBROADCASTMW2D, EVEXOperandCode::G_LL_Mask_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x52, [(super::Opcode::VDPBF16PS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VDPBF16PS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VDPBF16PS, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x72, [(super::Opcode::VCVTNEPS2BF16, EVEXOperandCode::Operands_72_W0), (super::Opcode::VCVTNEPS2BF16, EVEXOperandCode::Operands_72_W0), (super::Opcode::VCVTNEPS2BF16, EVEXOperandCode::Operands_72_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), +]; + +const EVEX_f3_0f: [(u8, [(super::Opcode, EVEXOperandCode); 4]); 24] = [ + (0x10, [(super::Opcode::VMOVSD, EVEXOperandCode::VMOVSD_10), (super::Opcode::VMOVSD, EVEXOperandCode::VMOVSD_10), (super::Opcode::VMOVSD, EVEXOperandCode::VMOVSD_10), (super::Opcode::VMOVSD, EVEXOperandCode::VMOVSD_10)]),// W1 + (0x11, [(super::Opcode::VMOVSD, EVEXOperandCode::VMOVSD_11), (super::Opcode::VMOVSD, EVEXOperandCode::VMOVSD_11), (super::Opcode::VMOVSD, EVEXOperandCode::VMOVSD_11), (super::Opcode::VMOVSD, EVEXOperandCode::VMOVSD_11)]),// W1 + (0x12, [(super::Opcode::VMOVDDUP, EVEXOperandCode::Gm_E_LL_W1), (super::Opcode::VMOVDDUP, EVEXOperandCode::Gm_E_LL_W1), (super::Opcode::VMOVDDUP, EVEXOperandCode::Gm_E_LL_W1), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x2a, [(super::Opcode::VCVTSI2SD, EVEXOperandCode::VCVTSI2SS), (super::Opcode::VCVTSI2SD, EVEXOperandCode::VCVTSI2SS), (super::Opcode::VCVTSI2SD, EVEXOperandCode::VCVTSI2SS), (super::Opcode::VCVTSI2SD, EVEXOperandCode::VCVTSI2SS)]), + (0x2c, [(super::Opcode::VCVTTSD2SI, EVEXOperandCode::Gd_Ed_xmm_sae), (super::Opcode::VCVTTSD2SI, EVEXOperandCode::Gd_Ed_xmm_sae), (super::Opcode::VCVTTSD2SI, EVEXOperandCode::Gd_Ed_xmm_sae), (super::Opcode::VCVTTSD2SI, EVEXOperandCode::Gd_Ed_xmm_sae)]), + (0x2d, [(super::Opcode::VCVTSD2SI, EVEXOperandCode::Gd_Ed_xmm_sae), (super::Opcode::VCVTSD2SI, EVEXOperandCode::Gd_Ed_xmm_sae), (super::Opcode::VCVTSD2SI, EVEXOperandCode::Gd_Ed_xmm_sae), (super::Opcode::VCVTSD2SI, EVEXOperandCode::Gd_Ed_xmm_sae)]), + (0x51, [(super::Opcode::VSQRTSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1), (super::Opcode::VSQRTSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1), (super::Opcode::VSQRTSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1), (super::Opcode::VSQRTSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1)]), + (0x58, [(super::Opcode::VADDSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1), (super::Opcode::VADDSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1), (super::Opcode::VADDSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1), (super::Opcode::VADDSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1)]), + (0x59, [(super::Opcode::VMULSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1), (super::Opcode::VMULSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1), (super::Opcode::VMULSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1), (super::Opcode::VMULSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1)]), + (0x5a, [(super::Opcode::VCVTSD2SS, EVEXOperandCode::Gm_V_Eq_xmm_sae_W1), (super::Opcode::VCVTSD2SS, EVEXOperandCode::Gm_V_Eq_xmm_sae_W1), (super::Opcode::VCVTSD2SS, EVEXOperandCode::Gm_V_Eq_xmm_sae_W1), (super::Opcode::VCVTSD2SS, EVEXOperandCode::Gm_V_Eq_xmm_sae_W1)]), + (0x5c, [(super::Opcode::VSUBSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1), (super::Opcode::VSUBSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1), (super::Opcode::VSUBSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1), (super::Opcode::VSUBSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1)]), + (0x5d, [(super::Opcode::VMINSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1), (super::Opcode::VMINSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1), (super::Opcode::VMINSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1), (super::Opcode::VMINSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1)]),// W1 + (0x5e, [(super::Opcode::VDIVSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1), (super::Opcode::VDIVSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1), (super::Opcode::VDIVSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1), (super::Opcode::VDIVSD, EVEXOperandCode::Gm_V_E_xmm_sae_W1)]), + (0x5f, [(super::Opcode::VMAXSD, EVEXOperandCode::Gm_V_E_xmm_sae), (super::Opcode::VMAXSD, EVEXOperandCode::Gm_V_E_xmm_sae), (super::Opcode::VMAXSD, EVEXOperandCode::Gm_V_E_xmm_sae), (super::Opcode::VMAXSD, EVEXOperandCode::Gm_V_E_xmm_sae)]),// W1 + (0x6f, [(super::Opcode::VMOVDQU8, EVEXOperandCode::Gm_E_LL), (super::Opcode::VMOVDQU8, EVEXOperandCode::Gm_E_LL), (super::Opcode::VMOVDQU8, EVEXOperandCode::Gm_E_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x70, [(super::Opcode::VPSHUFLW, EVEXOperandCode::Gm_E_LL_imm8), (super::Opcode::VPSHUFLW, EVEXOperandCode::Gm_E_LL_imm8), (super::Opcode::VPSHUFLW, EVEXOperandCode::Gm_E_LL_imm8), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x78, [(super::Opcode::VCVTTSD2USI, EVEXOperandCode::Gd_Ed_xmm_sae), (super::Opcode::VCVTTSD2USI, EVEXOperandCode::Gd_Ed_xmm_sae), (super::Opcode::VCVTTSD2USI, EVEXOperandCode::Gd_Ed_xmm_sae), (super::Opcode::VCVTTSD2USI, EVEXOperandCode::Gd_Ed_xmm_sae)]), + (0x79, [(super::Opcode::VCVTSD2USI, EVEXOperandCode::Gd_Ed_xmm_sae), (super::Opcode::VCVTSD2USI, EVEXOperandCode::Gd_Ed_xmm_sae), (super::Opcode::VCVTSD2USI, EVEXOperandCode::Gd_Ed_xmm_sae), (super::Opcode::VCVTSD2USI, EVEXOperandCode::Gd_Ed_xmm_sae)]), + (0x7a, [(super::Opcode::VCVTUDQ2PS, EVEXOperandCode::VCVTDQ2PS), (super::Opcode::VCVTUDQ2PS, EVEXOperandCode::VCVTDQ2PS), (super::Opcode::VCVTUDQ2PS, EVEXOperandCode::VCVTDQ2PS), (super::Opcode::VCVTUDQ2PS, EVEXOperandCode::VCVTDQ2PS)]), + (0x7b, [(super::Opcode::VCVTUSI2SD, EVEXOperandCode::VCVTUSI2SD), (super::Opcode::VCVTUSI2SD, EVEXOperandCode::VCVTUSI2SD), (super::Opcode::VCVTUSI2SD, EVEXOperandCode::VCVTUSI2SD), (super::Opcode::VCVTUSI2SD, EVEXOperandCode::VCVTUSI2SD)]), + (0x7e, [(super::Opcode::VMOVQ, EVEXOperandCode::VMOVQ_G_Ed_xmm), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x7f, [(super::Opcode::VMOVDQU8, EVEXOperandCode::Em_G_LL), (super::Opcode::VMOVDQU8, EVEXOperandCode::Em_G_LL), (super::Opcode::VMOVDQU8, EVEXOperandCode::Em_G_LL), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xc2, [(super::Opcode::VCMPSD, EVEXOperandCode::Maskm_V_Eq_xmm_imm8_sae_W1), (super::Opcode::VCMPSD, EVEXOperandCode::Maskm_V_Eq_xmm_imm8_sae_W1), (super::Opcode::VCMPSD, EVEXOperandCode::Maskm_V_Eq_xmm_imm8_sae_W1), (super::Opcode::VCMPSD, EVEXOperandCode::Maskm_V_Eq_xmm_imm8_sae_W1)]), + (0xe6, [(super::Opcode::VCVTPD2DQ, EVEXOperandCode::VCVTTPD2DQ), (super::Opcode::VCVTPD2DQ, EVEXOperandCode::VCVTTPD2DQ), (super::Opcode::VCVTPD2DQ, EVEXOperandCode::VCVTTPD2DQ), (super::Opcode::VCVTPD2DQ, EVEXOperandCode::VCVTTPD2DQ)]), +]; + +const EVEX_f3_0f38: [(u8, [(super::Opcode, EVEXOperandCode); 4]); 8] = [ + (0x52, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VP4DPWSSD, EVEXOperandCode::Gm_V_zmm_M_xmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x53, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::VP4DPWSSDS, EVEXOperandCode::Gm_V_zmm_M_xmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x68, [(super::Opcode::VP2INTERSECTD, EVEXOperandCode::Mask_V_E_LL_bcast), (super::Opcode::VP2INTERSECTD, EVEXOperandCode::Mask_V_E_LL_bcast), (super::Opcode::VP2INTERSECTD, EVEXOperandCode::Mask_V_E_LL_bcast), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x72, [(super::Opcode::VCVTNE2PS2BF16, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VCVTNE2PS2BF16, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::VCVTNE2PS2BF16, EVEXOperandCode::Gm_V_E_LL_bcast_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x9a, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::V4FMADDPS, EVEXOperandCode::Gm_V_zmm_M_xmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0x9b, [(super::Opcode::V4FMADDSS, EVEXOperandCode::Gm_V_M_xmm), (super::Opcode::V4FMADDSS, EVEXOperandCode::Gm_V_M_xmm), (super::Opcode::V4FMADDSS, EVEXOperandCode::Gm_V_M_xmm), (super::Opcode::V4FMADDSS, EVEXOperandCode::Gm_V_M_xmm)]),// W0 + (0xaa, [(super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::Invalid, EVEXOperandCode::Nothing), (super::Opcode::V4FNMADDPS, EVEXOperandCode::Gm_V_zmm_M_xmm_W0), (super::Opcode::Invalid, EVEXOperandCode::Nothing)]), + (0xab, [(super::Opcode::V4FNMADDSS, EVEXOperandCode::Gm_V_M_xmm), (super::Opcode::V4FNMADDSS, EVEXOperandCode::Gm_V_M_xmm), (super::Opcode::V4FNMADDSS, EVEXOperandCode::Gm_V_M_xmm), (super::Opcode::V4FNMADDSS, EVEXOperandCode::Gm_V_M_xmm)]),// W0 +]; +} -- cgit v1.1