/// <summary> /// Subtracts a constant from a copy of this value and returns the result. Returns null if it's not supported. /// </summary> /// <param name="kind">Opcode kind</param> /// <param name="value">Value to subtract</param> /// <param name="pointerSize">Size of a pointer in bytes</param> /// <returns></returns> public override ILValue?Sub(SubOpCodeKind kind, long value, int pointerSize) { if (value == 0) { return(this); } switch (kind) { case SubOpCodeKind.Sub: if (pointerSize == 4) { return(new NativeMemoryILValue(data, Offset32 - (int)value)); } return(new NativeMemoryILValue(data, Offset64 - value)); case SubOpCodeKind.Sub_Ovf: if (pointerSize == 4) { int value2 = (int)value; return(new NativeMemoryILValue(data, checked (Offset32 - value2))); } return(new NativeMemoryILValue(data, checked (Offset64 - value))); case SubOpCodeKind.Sub_Ovf_Un: if (pointerSize == 4) { uint value2 = (uint)value; return(new NativeMemoryILValue(data, (int)checked (UnsignedOffset32 - value2))); } else { ulong value2 = (ulong)value; return(new NativeMemoryILValue(data, (long)checked (UnsignedOffset64 - value2))); } default: throw new InvalidOperationException(); } }
/// <summary> /// Subtracts <paramref name="value"/> from a copy of this value and returns the result. Returns null if it's not supported. /// </summary> /// <param name="kind">Opcode kind</param> /// <param name="value">Value to subtract</param> /// <param name="pointerSize">Size of a pointer in bytes</param> /// <returns></returns> public virtual ILValue?Sub(SubOpCodeKind kind, ILValue value, int pointerSize) => null;
/// <summary> /// Subtracts a constant from a copy of this value and returns the result. Returns null if it's not supported. /// </summary> /// <param name="kind">Opcode kind</param> /// <param name="value">Value to subtract</param> /// <param name="pointerSize">Size of a pointer in bytes</param> /// <returns></returns> public virtual ILValue Sub(SubOpCodeKind kind, long value, int pointerSize) => null;