private static void AppendImmediate(StringBuilder str, ImmediateSize size)
		{
			switch (size)
			{
				case ImmediateSize.Zero: break;
				case ImmediateSize.Fixed8: str.Append(" ib"); break;
				case ImmediateSize.Fixed16: str.Append(" iw"); break;
				case ImmediateSize.Fixed32: str.Append(" id"); break;
				case ImmediateSize.Fixed64: str.Append(" iq"); break;
				case ImmediateSize.Operand16Or32: str.Append(" iwd"); break;
				case ImmediateSize.Operand16Or32Or64: str.Append(" iwdq"); break;
				case ImmediateSize.Address16Or32: str.Append(" rel"); break;
				default: throw new ArgumentException(nameof(size));
			}
		}
		public static InstructionEncoding WithSecondImmediateSize(this InstructionEncoding encoding, ImmediateSize size)
		{
			return (encoding & ~InstructionEncoding.SecondImmediateSize_Mask)
				| (InstructionEncoding)((uint)size << (int)InstructionEncoding.SecondImmediateSize_Shift);
		}
		public static InstructionEncoding WithImmediateSizes(this InstructionEncoding encoding,
			ImmediateSize firstSize, ImmediateSize secondSize = ImmediateSize.Zero)
		{
			return (encoding & ~InstructionEncoding.ImmediateSizes_Mask)
				| (InstructionEncoding)((uint)firstSize << (int)InstructionEncoding.FirstImmediateSize_Shift)
				| (InstructionEncoding)((uint)secondSize << (int)InstructionEncoding.SecondImmediateSize_Shift);
		}
			private void AddImmediate(ImmediateSize size)
			{
				Contract.Requires(state >= State.PostOpcode);

				int immediateCount = encoding.GetImmediateCount();
				Contract.Requires(immediateCount < 2);
				encoding = (immediateCount == 0)
					? encoding.WithFirstImmediateSize(size)
					: encoding.WithSecondImmediateSize(size);

				AdvanceTo(State.Immediates);
			}