object IInstructionDecoderLookup.TryLookup( CodeContext mode, ImmutableLegacyPrefixList legacyPrefixes, Xex xex, byte opcode, out bool hasModRM, out int immediateSizeInBytes) { var operandSize = mode.GetEffectiveOperandSize(legacyPrefixes, xex); var addressSize = mode.GetEffectiveAddressSize(legacyPrefixes); InstructionDefinition bestMatch = null; int bestOperandSizeMatchLevel = -1; var lookupKey = OpcodeEnum.MakeLookupKey(legacyPrefixes.GetSimdPrefix(xex.OpcodeMap), xex.OpcodeMap, opcode); foreach (var instruction in byOpcodeKey[lookupKey]) { var encoding = instruction.Encoding; // Ensure we match the RexW requirements if ((encoding & InstructionEncoding.RexW_Mask) == InstructionEncoding.RexW_Fixed && xex.OperandSize64 != ((instruction.Opcode & Opcode.RexW) != 0)) { continue; } // Ensure we match the opcode if ((opcode & encoding.GetOpcodeMainByteFixedMask()) != instruction.Opcode.GetMainByte()) continue; // Record the candidate, favoring more specific operand size matches var operandSizeMatchLevel = GetOperandSizeMatchLevel(encoding, operandSize); if (operandSizeMatchLevel > bestOperandSizeMatchLevel) { bestMatch = instruction; bestOperandSizeMatchLevel = operandSizeMatchLevel; } } if (bestMatch == null) { hasModRM = false; immediateSizeInBytes = 0; return null; } hasModRM = bestMatch.Encoding.HasModRM(); immediateSizeInBytes = bestMatch.Encoding.GetImmediatesSizeInBytes(operandSize, addressSize); return bestMatch; }