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);
		}