public static InstructionDefinition TryMerge(InstructionDefinition first, InstructionDefinition second) { Contract.Requires(first != null); Contract.Requires(second != null); if (first.Mnemonic != second.Mnemonic || first.Opcode != second.Opcode || first.AffectedFlags != second.AffectedFlags) return null; // TODO: Make sure operands fuzzily match foreach (var merge in merges) { if (merge.AppliesTo(first.Encoding, second.Encoding)) { var data = new Data { AffectedFlags = first.AffectedFlags, Encoding = merge.Result, Mnemonic = first.Mnemonic, Opcode = first.Opcode, RequiredFeatureFlags = first.RequiredFeatureFlags }; return new InstructionDefinition(ref data, first.Operands); } } return null; }
public void Add(InstructionDefinition instruction) { Contract.Requires(instruction != null); byMnemonic.Add(instruction.Mnemonic, instruction); byOpcodeKey.Add(instruction.Opcode & Opcode.LookupKey_Mask, instruction); }