diff --git a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeILGenerator.cs b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeILGenerator.cs index 6cf211e713e383..7bb7ee6beca98f 100644 --- a/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeILGenerator.cs +++ b/src/coreclr/System.Private.CoreLib/src/System/Reflection/Emit/RuntimeILGenerator.cs @@ -128,7 +128,7 @@ internal void InternalEmit(OpCode opcode) m_ILStream[m_length++] = (byte)opcodeValue; } - UpdateStackSize(opcode, opcode.StackChange()); + UpdateStackSize(opcode, opcode.EvaluationStackDelta); } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/src/libraries/System.Private.CoreLib/src/System/Reflection/Emit/Opcode.cs b/src/libraries/System.Private.CoreLib/src/System/Reflection/Emit/Opcode.cs index e9fdc1ec38c9ad..3f29e6e0e35167 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Reflection/Emit/Opcode.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Reflection/Emit/Opcode.cs @@ -45,7 +45,18 @@ internal OpCode(OpCodeValues value, int flags) internal bool EndsUncondJmpBlk() => (m_flags & EndsUncondJmpBlkFlag) != 0; - internal int StackChange() => + /// + /// The value of how the IL instruction changes the evaluation stack. + /// + /// + /// The difference between how many elements are popped from the stack and how many are pushed onto the stack as a result of the IL instruction. + /// For some IL instructions like stack change is not fixed and depends on the called reference signature. + /// For such the returns 0. In this case you should not rely on + /// for calculating stack size and/or max stack, instead need to evaluate the reference signature. + /// For example, in case the instruction is calling a method reference, need to evaluate the method signature, + /// the push count depends on the returning value, the pop count depends on how many parameters passed. + /// + public int EvaluationStackDelta => m_flags >> StackChangeShift; public OperandType OperandType => (OperandType)(m_flags & OperandTypeMask); diff --git a/src/libraries/System.Reflection.Emit/src/System/Reflection/Emit/ILGeneratorImpl.cs b/src/libraries/System.Reflection.Emit/src/System/Reflection/Emit/ILGeneratorImpl.cs index 7b61112ec8bf7a..9e7b43844c1041 100644 --- a/src/libraries/System.Reflection.Emit/src/System/Reflection/Emit/ILGeneratorImpl.cs +++ b/src/libraries/System.Reflection.Emit/src/System/Reflection/Emit/ILGeneratorImpl.cs @@ -1,10 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Buffers.Binary; using System.Reflection.Metadata; using System.Reflection.Metadata.Ecma335; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace System.Reflection.Emit @@ -17,6 +15,7 @@ internal sealed class ILGeneratorImpl : ILGenerator private readonly InstructionEncoder _il; private bool _hasDynamicStackAllocation; private int _maxStackSize; + private int _currentStack; internal ILGeneratorImpl(MethodBuilder methodBuilder, int size) { @@ -42,40 +41,46 @@ internal ILGeneratorImpl(MethodBuilder methodBuilder, int size) public override LocalBuilder DeclareLocal(Type localType, bool pinned) => throw new NotImplementedException(); public override Label DefineLabel() => throw new NotImplementedException(); - public override void Emit(OpCode opcode) + private void UpdateStackSize(OpCode opCode) + { + _currentStack += opCode.EvaluationStackDelta; + _maxStackSize = Math.Max(_maxStackSize, _currentStack); + } + + public void EmitOpcode(OpCode opcode) { if (opcode == OpCodes.Localloc) { _hasDynamicStackAllocation = true; } - _il.OpCode((ILOpCode)opcode.Value); - // TODO: for now only count the Opcodes emitted, in order to calculate it correctly we might need to make internal Opcode APIs public - // https://github.com/dotnet/runtime/blob/main/src/libraries/System.Private.CoreLib/src/System/Reflection/Emit/Opcode.cs#L48 - _maxStackSize++; + _il.OpCode((ILOpCode)opcode.Value); + UpdateStackSize(opcode); } + public override void Emit(OpCode opcode) => EmitOpcode(opcode); + public override void Emit(OpCode opcode, byte arg) { - _il.OpCode((ILOpCode)opcode.Value); + EmitOpcode(opcode); _builder.WriteByte(arg); } public override void Emit(OpCode opcode, double arg) { - _il.OpCode((ILOpCode)opcode.Value); + EmitOpcode(opcode); _builder.WriteDouble(arg); } public override void Emit(OpCode opcode, float arg) { - _il.OpCode((ILOpCode)opcode.Value); + EmitOpcode(opcode); _builder.WriteSingle(arg); } public override void Emit(OpCode opcode, short arg) { - _il.OpCode((ILOpCode)opcode.Value); + EmitOpcode(opcode); _builder.WriteInt16(arg); } @@ -86,26 +91,25 @@ public override void Emit(OpCode opcode, int arg) { if (arg >= -1 && arg <= 8) { - _il.OpCode(arg switch + EmitOpcode(arg switch { - -1 => ILOpCode.Ldc_i4_m1, - 0 => ILOpCode.Ldc_i4_0, - 1 => ILOpCode.Ldc_i4_1, - 2 => ILOpCode.Ldc_i4_2, - 3 => ILOpCode.Ldc_i4_3, - 4 => ILOpCode.Ldc_i4_4, - 5 => ILOpCode.Ldc_i4_5, - 6 => ILOpCode.Ldc_i4_6, - 7 => ILOpCode.Ldc_i4_7, - _ => ILOpCode.Ldc_i4_8, + -1 => OpCodes.Ldc_I4_M1, + 0 => OpCodes.Ldc_I4_0, + 1 => OpCodes.Ldc_I4_1, + 2 => OpCodes.Ldc_I4_2, + 3 => OpCodes.Ldc_I4_3, + 4 => OpCodes.Ldc_I4_4, + 5 => OpCodes.Ldc_I4_5, + 6 => OpCodes.Ldc_I4_6, + 7 => OpCodes.Ldc_I4_7, + _ => OpCodes.Ldc_I4_8 }); return; } if (arg >= -128 && arg <= 127) { - _il.OpCode(ILOpCode.Ldc_i4_s); - _builder.WriteSByte((sbyte)arg) ; + Emit(OpCodes.Ldc_I4_S, (sbyte)arg); return; } } @@ -113,27 +117,25 @@ public override void Emit(OpCode opcode, int arg) { if ((uint)arg <= 3) { - _il.OpCode(arg switch + EmitOpcode(arg switch { - 0 => ILOpCode.Ldarg_0, - 1 => ILOpCode.Ldarg_1, - 2 => ILOpCode.Ldarg_2, - _ => ILOpCode.Ldarg_3, + 0 => OpCodes.Ldarg_0, + 1 => OpCodes.Ldarg_1, + 2 => OpCodes.Ldarg_2, + _ => OpCodes.Ldarg_3, }); return; } if ((uint)arg <= byte.MaxValue) { - _il.OpCode(ILOpCode.Ldarg_s); - _builder.WriteByte((byte)arg); + Emit(OpCodes.Ldarg_S, (byte)arg); return; } if ((uint)arg <= ushort.MaxValue) // this will be true except on misuse of the opcode { - _il.OpCode(ILOpCode.Ldarg); - _builder.WriteInt16((short)arg); + Emit(OpCodes.Ldarg, (short)arg); return; } } @@ -141,15 +143,13 @@ public override void Emit(OpCode opcode, int arg) { if ((uint)arg <= byte.MaxValue) { - _il.OpCode(ILOpCode.Ldarga_s); - _builder.WriteByte((byte)arg); + Emit(OpCodes.Ldarga_S, (byte)arg); return; } if ((uint)arg <= ushort.MaxValue) // this will be true except on misuse of the opcode { - _il.OpCode(ILOpCode.Ldarga); - _builder.WriteInt16((short)arg); + Emit(OpCodes.Ldarga, (short)arg); return; } } @@ -157,27 +157,25 @@ public override void Emit(OpCode opcode, int arg) { if ((uint)arg <= byte.MaxValue) { - _il.OpCode(ILOpCode.Starg_s); - _builder.WriteByte((byte)arg); + Emit(OpCodes.Starg_S, (byte)arg); return; } if ((uint)arg <= ushort.MaxValue) // this will be true except on misuse of the opcode { - _il.OpCode(ILOpCode.Starg); - _builder.WriteInt16((short)arg); + Emit(OpCodes.Starg, (short)arg); return; } } // For everything else, put the opcode followed by the arg onto the stream of instructions. - _il.OpCode((ILOpCode)opcode.Value); + EmitOpcode(opcode); _builder.WriteInt32(arg); } public override void Emit(OpCode opcode, long arg) { - _il.OpCode((ILOpCode)opcode.Value); + EmitOpcode(opcode); _il.CodeBuilder.WriteInt64(arg); } @@ -187,7 +185,7 @@ public override void Emit(OpCode opcode, string str) // represented by str. ModuleBuilder modBuilder = (ModuleBuilder)_methodBuilder.Module; int tempVal = modBuilder.GetStringMetadataToken(str); - _il.OpCode((ILOpCode)opcode.Value); + EmitOpcode(opcode); _il.Token(tempVal); } diff --git a/src/libraries/System.Reflection.Emit/tests/OpCodesTests.cs b/src/libraries/System.Reflection.Emit/tests/OpCodesTests.cs index 064a572207ef19..ebea2df47ba6a8 100644 --- a/src/libraries/System.Reflection.Emit/tests/OpCodesTests.cs +++ b/src/libraries/System.Reflection.Emit/tests/OpCodesTests.cs @@ -11,237 +11,237 @@ public class OpCodesTests { public static IEnumerable TestData() { - yield return new object[] { OpCodes.Add, "add", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x58, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Add_Ovf, "add.ovf", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xd6, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Add_Ovf_Un, "add.ovf.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xd7, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.And, "and", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x5f, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Arglist, "arglist", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe00, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Beq, "beq", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x3b, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Beq_S, "beq.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x2e, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Bge, "bge", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x3c, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Bge_S, "bge.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x2f, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Bge_Un, "bge.un", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x41, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Bge_Un_S, "bge.un.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x34, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Bgt, "bgt", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x3d, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Bgt_S, "bgt.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x30, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Bgt_Un, "bgt.un", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x42, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Bgt_Un_S, "bgt.un.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x35, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Ble, "ble", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x3e, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Ble_S, "ble.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x31, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Ble_Un, "ble.un", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x43, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Ble_Un_S, "ble.un.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x36, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Blt, "blt", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x3f, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Blt_S, "blt.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x32, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Blt_Un, "blt.un", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x44, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Blt_Un_S, "blt.un.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x37, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Bne_Un, "bne.un", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x40, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Bne_Un_S, "bne.un.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x33, StackBehaviour.Pop1_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Box, "box", OpCodeType.Primitive, OperandType.InlineType, 1, 0x8c, StackBehaviour.Pop1, StackBehaviour.Pushref }; - yield return new object[] { OpCodes.Br, "br", OpCodeType.Primitive, OperandType.InlineBrTarget, 1, 0x38, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Br_S, "br.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x2b, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Break, "break", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x1, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Brfalse, "brfalse", OpCodeType.Primitive, OperandType.InlineBrTarget, 1, 0x39, StackBehaviour.Popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Brfalse_S, "brfalse.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x2c, StackBehaviour.Popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Brtrue, "brtrue", OpCodeType.Primitive, OperandType.InlineBrTarget, 1, 0x3a, StackBehaviour.Popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Brtrue_S, "brtrue.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x2d, StackBehaviour.Popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Call, "call", OpCodeType.Primitive, OperandType.InlineMethod, 1, 0x28, StackBehaviour.Varpop, StackBehaviour.Varpush }; - yield return new object[] { OpCodes.Calli, "calli", OpCodeType.Primitive, OperandType.InlineSig, 1, 0x29, StackBehaviour.Varpop, StackBehaviour.Varpush }; - yield return new object[] { OpCodes.Callvirt, "callvirt", OpCodeType.Objmodel, OperandType.InlineMethod, 1, 0x6f, StackBehaviour.Varpop, StackBehaviour.Varpush }; - yield return new object[] { OpCodes.Castclass, "castclass", OpCodeType.Objmodel, OperandType.InlineType, 1, 0x74, StackBehaviour.Popref, StackBehaviour.Pushref }; - yield return new object[] { OpCodes.Ceq, "ceq", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe01, StackBehaviour.Pop1_pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Cgt, "cgt", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe02, StackBehaviour.Pop1_pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Cgt_Un, "cgt.un", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe03, StackBehaviour.Pop1_pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ckfinite, "ckfinite", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xc3, StackBehaviour.Pop1, StackBehaviour.Pushr8 }; - yield return new object[] { OpCodes.Clt, "clt", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe04, StackBehaviour.Pop1_pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Clt_Un, "clt.un", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe05, StackBehaviour.Pop1_pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Constrained, "constrained.", OpCodeType.Prefix, OperandType.InlineType, 2, 0xfe16, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Conv_I, "conv.i", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xd3, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_I1, "conv.i1", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x67, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_I2, "conv.i2", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x68, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_I4, "conv.i4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x69, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_I8, "conv.i8", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x6a, StackBehaviour.Pop1, StackBehaviour.Pushi8 }; - yield return new object[] { OpCodes.Conv_Ovf_I, "conv.ovf.i", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xd4, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_Ovf_I_Un, "conv.ovf.i.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x8a, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_Ovf_I1, "conv.ovf.i1", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xb3, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_Ovf_I1_Un, "conv.ovf.i1.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x82, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_Ovf_I2, "conv.ovf.i2", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xb5, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_Ovf_I2_Un, "conv.ovf.i2.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x83, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_Ovf_I4, "conv.ovf.i4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xb7, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_Ovf_I4_Un, "conv.ovf.i4.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x84, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_Ovf_I8, "conv.ovf.i8", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xb9, StackBehaviour.Pop1, StackBehaviour.Pushi8 }; - yield return new object[] { OpCodes.Conv_Ovf_I8_Un, "conv.ovf.i8.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x85, StackBehaviour.Pop1, StackBehaviour.Pushi8 }; - yield return new object[] { OpCodes.Conv_Ovf_U, "conv.ovf.u", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xd5, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_Ovf_U_Un, "conv.ovf.u.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x8b, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_Ovf_U1, "conv.ovf.u1", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xb4, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_Ovf_U1_Un, "conv.ovf.u1.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x86, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_Ovf_U2, "conv.ovf.u2", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xb6, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_Ovf_U2_Un, "conv.ovf.u2.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x87, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_Ovf_U4, "conv.ovf.u4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xb8, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_Ovf_U4_Un, "conv.ovf.u4.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x88, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_Ovf_U8, "conv.ovf.u8", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xba, StackBehaviour.Pop1, StackBehaviour.Pushi8 }; - yield return new object[] { OpCodes.Conv_Ovf_U8_Un, "conv.ovf.u8.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x89, StackBehaviour.Pop1, StackBehaviour.Pushi8 }; - yield return new object[] { OpCodes.Conv_R_Un, "conv.r.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x76, StackBehaviour.Pop1, StackBehaviour.Pushr8 }; - yield return new object[] { OpCodes.Conv_R4, "conv.r4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x6b, StackBehaviour.Pop1, StackBehaviour.Pushr4 }; - yield return new object[] { OpCodes.Conv_R8, "conv.r8", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x6c, StackBehaviour.Pop1, StackBehaviour.Pushr8 }; - yield return new object[] { OpCodes.Conv_U, "conv.u", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xe0, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_U1, "conv.u1", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xd2, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_U2, "conv.u2", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xd1, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_U4, "conv.u4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x6d, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Conv_U8, "conv.u8", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x6e, StackBehaviour.Pop1, StackBehaviour.Pushi8 }; - yield return new object[] { OpCodes.Cpblk, "cpblk", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe17, StackBehaviour.Popi_popi_popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Cpobj, "cpobj", OpCodeType.Objmodel, OperandType.InlineType, 1, 0x70, StackBehaviour.Popi_popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Div, "div", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x5b, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Div_Un, "div.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x5c, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Dup, "dup", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x25, StackBehaviour.Pop1, StackBehaviour.Push1_push1 }; - yield return new object[] { OpCodes.Endfilter, "endfilter", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe11, StackBehaviour.Popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Endfinally, "endfinally", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xdc, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Initblk, "initblk", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe18, StackBehaviour.Popi_popi_popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Initobj, "initobj", OpCodeType.Objmodel, OperandType.InlineType, 2, 0xfe15, StackBehaviour.Popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Isinst, "isinst", OpCodeType.Objmodel, OperandType.InlineType, 1, 0x75, StackBehaviour.Popref, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Jmp, "jmp", OpCodeType.Primitive, OperandType.InlineMethod, 1, 0x27, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Ldarg, "ldarg", OpCodeType.Primitive, OperandType.InlineVar, 2, 0xfe09, StackBehaviour.Pop0, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Ldarg_0, "ldarg.0", OpCodeType.Macro, OperandType.InlineNone, 1, 0x2, StackBehaviour.Pop0, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Ldarg_1, "ldarg.1", OpCodeType.Macro, OperandType.InlineNone, 1, 0x3, StackBehaviour.Pop0, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Ldarg_2, "ldarg.2", OpCodeType.Macro, OperandType.InlineNone, 1, 0x4, StackBehaviour.Pop0, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Ldarg_3, "ldarg.3", OpCodeType.Macro, OperandType.InlineNone, 1, 0x5, StackBehaviour.Pop0, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Ldarg_S, "ldarg.s", OpCodeType.Macro, OperandType.ShortInlineVar, 1, 0xe, StackBehaviour.Pop0, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Ldarga, "ldarga", OpCodeType.Primitive, OperandType.InlineVar, 2, 0xfe0a, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldarga_S, "ldarga.s", OpCodeType.Macro, OperandType.ShortInlineVar, 1, 0xf, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldc_I4, "ldc.i4", OpCodeType.Primitive, OperandType.InlineI, 1, 0x20, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldc_I4_0, "ldc.i4.0", OpCodeType.Macro, OperandType.InlineNone, 1, 0x16, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldc_I4_1, "ldc.i4.1", OpCodeType.Macro, OperandType.InlineNone, 1, 0x17, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldc_I4_2, "ldc.i4.2", OpCodeType.Macro, OperandType.InlineNone, 1, 0x18, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldc_I4_3, "ldc.i4.3", OpCodeType.Macro, OperandType.InlineNone, 1, 0x19, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldc_I4_4, "ldc.i4.4", OpCodeType.Macro, OperandType.InlineNone, 1, 0x1a, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldc_I4_5, "ldc.i4.5", OpCodeType.Macro, OperandType.InlineNone, 1, 0x1b, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldc_I4_6, "ldc.i4.6", OpCodeType.Macro, OperandType.InlineNone, 1, 0x1c, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldc_I4_7, "ldc.i4.7", OpCodeType.Macro, OperandType.InlineNone, 1, 0x1d, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldc_I4_8, "ldc.i4.8", OpCodeType.Macro, OperandType.InlineNone, 1, 0x1e, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldc_I4_M1, "ldc.i4.m1", OpCodeType.Macro, OperandType.InlineNone, 1, 0x15, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldc_I4_S, "ldc.i4.s", OpCodeType.Macro, OperandType.ShortInlineI, 1, 0x1f, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldc_I8, "ldc.i8", OpCodeType.Primitive, OperandType.InlineI8, 1, 0x21, StackBehaviour.Pop0, StackBehaviour.Pushi8 }; - yield return new object[] { OpCodes.Ldc_R4, "ldc.r4", OpCodeType.Primitive, OperandType.ShortInlineR, 1, 0x22, StackBehaviour.Pop0, StackBehaviour.Pushr4 }; - yield return new object[] { OpCodes.Ldc_R8, "ldc.r8", OpCodeType.Primitive, OperandType.InlineR, 1, 0x23, StackBehaviour.Pop0, StackBehaviour.Pushr8 }; - yield return new object[] { OpCodes.Ldelem, "ldelem", OpCodeType.Objmodel, OperandType.InlineType, 1, 0xa3, StackBehaviour.Popref_popi, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Ldelem_I, "ldelem.i", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x97, StackBehaviour.Popref_popi, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldelem_I1, "ldelem.i1", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x90, StackBehaviour.Popref_popi, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldelem_I2, "ldelem.i2", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x92, StackBehaviour.Popref_popi, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldelem_I4, "ldelem.i4", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x94, StackBehaviour.Popref_popi, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldelem_I8, "ldelem.i8", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x96, StackBehaviour.Popref_popi, StackBehaviour.Pushi8 }; - yield return new object[] { OpCodes.Ldelem_R4, "ldelem.r4", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x98, StackBehaviour.Popref_popi, StackBehaviour.Pushr4 }; - yield return new object[] { OpCodes.Ldelem_R8, "ldelem.r8", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x99, StackBehaviour.Popref_popi, StackBehaviour.Pushr8 }; - yield return new object[] { OpCodes.Ldelem_Ref, "ldelem.ref", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x9a, StackBehaviour.Popref_popi, StackBehaviour.Pushref }; - yield return new object[] { OpCodes.Ldelem_U1, "ldelem.u1", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x91, StackBehaviour.Popref_popi, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldelem_U2, "ldelem.u2", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x93, StackBehaviour.Popref_popi, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldelem_U4, "ldelem.u4", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x95, StackBehaviour.Popref_popi, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldelema, "ldelema", OpCodeType.Objmodel, OperandType.InlineType, 1, 0x8f, StackBehaviour.Popref_popi, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldfld, "ldfld", OpCodeType.Objmodel, OperandType.InlineField, 1, 0x7b, StackBehaviour.Popref, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Ldflda, "ldflda", OpCodeType.Objmodel, OperandType.InlineField, 1, 0x7c, StackBehaviour.Popref, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldftn, "ldftn", OpCodeType.Primitive, OperandType.InlineMethod, 2, 0xfe06, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldind_I, "ldind.i", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x4d, StackBehaviour.Popi, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldind_I1, "ldind.i1", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x46, StackBehaviour.Popi, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldind_I2, "ldind.i2", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x48, StackBehaviour.Popi, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldind_I4, "ldind.i4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x4a, StackBehaviour.Popi, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldind_I8, "ldind.i8", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x4c, StackBehaviour.Popi, StackBehaviour.Pushi8 }; - yield return new object[] { OpCodes.Ldind_R4, "ldind.r4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x4e, StackBehaviour.Popi, StackBehaviour.Pushr4 }; - yield return new object[] { OpCodes.Ldind_R8, "ldind.r8", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x4f, StackBehaviour.Popi, StackBehaviour.Pushr8 }; - yield return new object[] { OpCodes.Ldind_Ref, "ldind.ref", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x50, StackBehaviour.Popi, StackBehaviour.Pushref }; - yield return new object[] { OpCodes.Ldind_U1, "ldind.u1", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x47, StackBehaviour.Popi, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldind_U2, "ldind.u2", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x49, StackBehaviour.Popi, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldind_U4, "ldind.u4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x4b, StackBehaviour.Popi, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldlen, "ldlen", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x8e, StackBehaviour.Popref, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldloc, "ldloc", OpCodeType.Primitive, OperandType.InlineVar, 2, 0xfe0c, StackBehaviour.Pop0, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Ldloc_0, "ldloc.0", OpCodeType.Macro, OperandType.InlineNone, 1, 0x6, StackBehaviour.Pop0, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Ldloc_1, "ldloc.1", OpCodeType.Macro, OperandType.InlineNone, 1, 0x7, StackBehaviour.Pop0, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Ldloc_2, "ldloc.2", OpCodeType.Macro, OperandType.InlineNone, 1, 0x8, StackBehaviour.Pop0, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Ldloc_3, "ldloc.3", OpCodeType.Macro, OperandType.InlineNone, 1, 0x9, StackBehaviour.Pop0, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Ldloc_S, "ldloc.s", OpCodeType.Macro, OperandType.ShortInlineVar, 1, 0x11, StackBehaviour.Pop0, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Ldloca, "ldloca", OpCodeType.Primitive, OperandType.InlineVar, 2, 0xfe0d, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldloca_S, "ldloca.s", OpCodeType.Macro, OperandType.ShortInlineVar, 1, 0x12, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldnull, "ldnull", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x14, StackBehaviour.Pop0, StackBehaviour.Pushref }; - yield return new object[] { OpCodes.Ldobj, "ldobj", OpCodeType.Objmodel, OperandType.InlineType, 1, 0x71, StackBehaviour.Popi, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Ldsfld, "ldsfld", OpCodeType.Objmodel, OperandType.InlineField, 1, 0x7e, StackBehaviour.Pop0, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Ldsflda, "ldsflda", OpCodeType.Objmodel, OperandType.InlineField, 1, 0x7f, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldstr, "ldstr", OpCodeType.Objmodel, OperandType.InlineString, 1, 0x72, StackBehaviour.Pop0, StackBehaviour.Pushref }; - yield return new object[] { OpCodes.Ldtoken, "ldtoken", OpCodeType.Primitive, OperandType.InlineTok, 1, 0xd0, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Ldvirtftn, "ldvirtftn", OpCodeType.Primitive, OperandType.InlineMethod, 2, 0xfe07, StackBehaviour.Popref, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Leave, "leave", OpCodeType.Primitive, OperandType.InlineBrTarget, 1, 0xdd, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Leave_S, "leave.s", OpCodeType.Primitive, OperandType.ShortInlineBrTarget, 1, 0xde, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Localloc, "localloc", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe0f, StackBehaviour.Popi, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Mkrefany, "mkrefany", OpCodeType.Primitive, OperandType.InlineType, 1, 0xc6, StackBehaviour.Popi, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Mul, "mul", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x5a, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Mul_Ovf, "mul.ovf", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xd8, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Mul_Ovf_Un, "mul.ovf.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xd9, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Neg, "neg", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x65, StackBehaviour.Pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Newarr, "newarr", OpCodeType.Objmodel, OperandType.InlineType, 1, 0x8d, StackBehaviour.Popi, StackBehaviour.Pushref }; - yield return new object[] { OpCodes.Newobj, "newobj", OpCodeType.Objmodel, OperandType.InlineMethod, 1, 0x73, StackBehaviour.Varpop, StackBehaviour.Pushref }; - yield return new object[] { OpCodes.Nop, "nop", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x0, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Not, "not", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x66, StackBehaviour.Pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Or, "or", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x60, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Pop, "pop", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x26, StackBehaviour.Pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Prefix1, "prefix1", OpCodeType.Nternal, OperandType.InlineNone, 1, 0xfe, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Prefix2, "prefix2", OpCodeType.Nternal, OperandType.InlineNone, 1, 0xfd, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Prefix3, "prefix3", OpCodeType.Nternal, OperandType.InlineNone, 1, 0xfc, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Prefix4, "prefix4", OpCodeType.Nternal, OperandType.InlineNone, 1, 0xfb, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Prefix5, "prefix5", OpCodeType.Nternal, OperandType.InlineNone, 1, 0xfa, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Prefix6, "prefix6", OpCodeType.Nternal, OperandType.InlineNone, 1, 0xf9, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Prefix7, "prefix7", OpCodeType.Nternal, OperandType.InlineNone, 1, 0xf8, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Prefixref, "prefixref", OpCodeType.Nternal, OperandType.InlineNone, 1, 0xff, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Readonly, "readonly.", OpCodeType.Prefix, OperandType.InlineNone, 2, 0xfe1e, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Refanytype, "refanytype", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe1d, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Refanyval, "refanyval", OpCodeType.Primitive, OperandType.InlineType, 1, 0xc2, StackBehaviour.Pop1, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Rem, "rem", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x5d, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Rem_Un, "rem.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x5e, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Ret, "ret", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x2a, StackBehaviour.Varpop, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Rethrow, "rethrow", OpCodeType.Objmodel, OperandType.InlineNone, 2, 0xfe1a, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Shl, "shl", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x62, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Shr, "shr", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x63, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Shr_Un, "shr.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x64, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Sizeof, "sizeof", OpCodeType.Primitive, OperandType.InlineType, 2, 0xfe1c, StackBehaviour.Pop0, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Starg, "starg", OpCodeType.Primitive, OperandType.InlineVar, 2, 0xfe0b, StackBehaviour.Pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Starg_S, "starg.s", OpCodeType.Macro, OperandType.ShortInlineVar, 1, 0x10, StackBehaviour.Pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stelem, "stelem", OpCodeType.Objmodel, OperandType.InlineType, 1, 0xa4, StackBehaviour.Popref_popi_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stelem_I, "stelem.i", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x9b, StackBehaviour.Popref_popi_popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stelem_I1, "stelem.i1", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x9c, StackBehaviour.Popref_popi_popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stelem_I2, "stelem.i2", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x9d, StackBehaviour.Popref_popi_popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stelem_I4, "stelem.i4", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x9e, StackBehaviour.Popref_popi_popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stelem_I8, "stelem.i8", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x9f, StackBehaviour.Popref_popi_popi8, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stelem_R4, "stelem.r4", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0xa0, StackBehaviour.Popref_popi_popr4, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stelem_R8, "stelem.r8", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0xa1, StackBehaviour.Popref_popi_popr8, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stelem_Ref, "stelem.ref", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0xa2, StackBehaviour.Popref_popi_popref, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stfld, "stfld", OpCodeType.Objmodel, OperandType.InlineField, 1, 0x7d, StackBehaviour.Popref_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stind_I, "stind.i", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xdf, StackBehaviour.Popi_popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stind_I1, "stind.i1", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x52, StackBehaviour.Popi_popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stind_I2, "stind.i2", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x53, StackBehaviour.Popi_popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stind_I4, "stind.i4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x54, StackBehaviour.Popi_popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stind_I8, "stind.i8", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x55, StackBehaviour.Popi_popi8, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stind_R4, "stind.r4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x56, StackBehaviour.Popi_popr4, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stind_R8, "stind.r8", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x57, StackBehaviour.Popi_popr8, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stind_Ref, "stind.ref", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x51, StackBehaviour.Popi_popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stloc, "stloc", OpCodeType.Primitive, OperandType.InlineVar, 2, 0xfe0e, StackBehaviour.Pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stloc_0, "stloc.0", OpCodeType.Macro, OperandType.InlineNone, 1, 0xa, StackBehaviour.Pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stloc_1, "stloc.1", OpCodeType.Macro, OperandType.InlineNone, 1, 0xb, StackBehaviour.Pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stloc_2, "stloc.2", OpCodeType.Macro, OperandType.InlineNone, 1, 0xc, StackBehaviour.Pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stloc_3, "stloc.3", OpCodeType.Macro, OperandType.InlineNone, 1, 0xd, StackBehaviour.Pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stloc_S, "stloc.s", OpCodeType.Macro, OperandType.ShortInlineVar, 1, 0x13, StackBehaviour.Pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stobj, "stobj", OpCodeType.Primitive, OperandType.InlineType, 1, 0x81, StackBehaviour.Popi_pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Stsfld, "stsfld", OpCodeType.Objmodel, OperandType.InlineField, 1, 0x80, StackBehaviour.Pop1, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Sub, "sub", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x59, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Sub_Ovf, "sub.ovf", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xda, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Sub_Ovf_Un, "sub.ovf.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xdb, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Switch, "switch", OpCodeType.Primitive, OperandType.InlineSwitch, 1, 0x45, StackBehaviour.Popi, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Tailcall, "tail.", OpCodeType.Prefix, OperandType.InlineNone, 2, 0xfe14, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Throw, "throw", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x7a, StackBehaviour.Popref, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Unaligned, "unaligned.", OpCodeType.Prefix, OperandType.ShortInlineI, 2, 0xfe12, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Unbox, "unbox", OpCodeType.Primitive, OperandType.InlineType, 1, 0x79, StackBehaviour.Popref, StackBehaviour.Pushi }; - yield return new object[] { OpCodes.Unbox_Any, "unbox.any", OpCodeType.Objmodel, OperandType.InlineType, 1, 0xa5, StackBehaviour.Popref, StackBehaviour.Push1 }; - yield return new object[] { OpCodes.Volatile, "volatile.", OpCodeType.Prefix, OperandType.InlineNone, 2, 0xfe13, StackBehaviour.Pop0, StackBehaviour.Push0 }; - yield return new object[] { OpCodes.Xor, "xor", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x61, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 }; + yield return new object[] { OpCodes.Add, "add", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x58, StackBehaviour.Pop1_pop1, StackBehaviour.Push1, -1}; + yield return new object[] { OpCodes.Add_Ovf, "add.ovf", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xd6, StackBehaviour.Pop1_pop1, StackBehaviour.Push1, -1 }; + yield return new object[] { OpCodes.Add_Ovf_Un, "add.ovf.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xd7, StackBehaviour.Pop1_pop1, StackBehaviour.Push1, -1 }; + yield return new object[] { OpCodes.And, "and", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x5f, StackBehaviour.Pop1_pop1, StackBehaviour.Push1 , -1 }; + yield return new object[] { OpCodes.Arglist, "arglist", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe00, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Beq, "beq", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x3b, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Beq_S, "beq.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x2e, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Bge, "bge", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x3c, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Bge_S, "bge.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x2f, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Bge_Un, "bge.un", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x41, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Bge_Un_S, "bge.un.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x34, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Bgt, "bgt", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x3d, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Bgt_S, "bgt.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x30, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Bgt_Un, "bgt.un", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x42, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Bgt_Un_S, "bgt.un.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x35, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Ble, "ble", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x3e, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Ble_S, "ble.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x31, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Ble_Un, "ble.un", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x43, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Ble_Un_S, "ble.un.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x36, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Blt, "blt", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x3f, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Blt_S, "blt.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x32, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Blt_Un, "blt.un", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x44, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Blt_Un_S, "blt.un.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x37, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Bne_Un, "bne.un", OpCodeType.Macro, OperandType.InlineBrTarget, 1, 0x40, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Bne_Un_S, "bne.un.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x33, StackBehaviour.Pop1_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Box, "box", OpCodeType.Primitive, OperandType.InlineType, 1, 0x8c, StackBehaviour.Pop1, StackBehaviour.Pushref, 0 }; + yield return new object[] { OpCodes.Br, "br", OpCodeType.Primitive, OperandType.InlineBrTarget, 1, 0x38, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Br_S, "br.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x2b, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Break, "break", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x1, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Brfalse, "brfalse", OpCodeType.Primitive, OperandType.InlineBrTarget, 1, 0x39, StackBehaviour.Popi, StackBehaviour.Push0, -1 }; + yield return new object[] { OpCodes.Brfalse_S, "brfalse.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x2c, StackBehaviour.Popi, StackBehaviour.Push0, -1 }; + yield return new object[] { OpCodes.Brtrue, "brtrue", OpCodeType.Primitive, OperandType.InlineBrTarget, 1, 0x3a, StackBehaviour.Popi, StackBehaviour.Push0, -1 }; + yield return new object[] { OpCodes.Brtrue_S, "brtrue.s", OpCodeType.Macro, OperandType.ShortInlineBrTarget, 1, 0x2d, StackBehaviour.Popi, StackBehaviour.Push0, -1 }; + yield return new object[] { OpCodes.Call, "call", OpCodeType.Primitive, OperandType.InlineMethod, 1, 0x28, StackBehaviour.Varpop, StackBehaviour.Varpush, 0 }; + yield return new object[] { OpCodes.Calli, "calli", OpCodeType.Primitive, OperandType.InlineSig, 1, 0x29, StackBehaviour.Varpop, StackBehaviour.Varpush, 0 }; + yield return new object[] { OpCodes.Callvirt, "callvirt", OpCodeType.Objmodel, OperandType.InlineMethod, 1, 0x6f, StackBehaviour.Varpop, StackBehaviour.Varpush, 0 }; + yield return new object[] { OpCodes.Castclass, "castclass", OpCodeType.Objmodel, OperandType.InlineType, 1, 0x74, StackBehaviour.Popref, StackBehaviour.Pushref, 0 }; + yield return new object[] { OpCodes.Ceq, "ceq", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe01, StackBehaviour.Pop1_pop1, StackBehaviour.Pushi, -1 }; + yield return new object[] { OpCodes.Cgt, "cgt", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe02, StackBehaviour.Pop1_pop1, StackBehaviour.Pushi, -1 }; + yield return new object[] { OpCodes.Cgt_Un, "cgt.un", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe03, StackBehaviour.Pop1_pop1, StackBehaviour.Pushi, -1 }; + yield return new object[] { OpCodes.Ckfinite, "ckfinite", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xc3, StackBehaviour.Pop1, StackBehaviour.Pushr8, 0 }; + yield return new object[] { OpCodes.Clt, "clt", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe04, StackBehaviour.Pop1_pop1, StackBehaviour.Pushi, -1 }; + yield return new object[] { OpCodes.Clt_Un, "clt.un", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe05, StackBehaviour.Pop1_pop1, StackBehaviour.Pushi, -1 }; + yield return new object[] { OpCodes.Constrained, "constrained.", OpCodeType.Prefix, OperandType.InlineType, 2, 0xfe16, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Conv_I, "conv.i", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xd3, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_I1, "conv.i1", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x67, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_I2, "conv.i2", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x68, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_I4, "conv.i4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x69, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_I8, "conv.i8", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x6a, StackBehaviour.Pop1, StackBehaviour.Pushi8, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_I, "conv.ovf.i", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xd4, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_I_Un, "conv.ovf.i.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x8a, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_I1, "conv.ovf.i1", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xb3, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_I1_Un, "conv.ovf.i1.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x82, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_I2, "conv.ovf.i2", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xb5, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_I2_Un, "conv.ovf.i2.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x83, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_I4, "conv.ovf.i4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xb7, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_I4_Un, "conv.ovf.i4.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x84, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_I8, "conv.ovf.i8", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xb9, StackBehaviour.Pop1, StackBehaviour.Pushi8, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_I8_Un, "conv.ovf.i8.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x85, StackBehaviour.Pop1, StackBehaviour.Pushi8, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_U, "conv.ovf.u", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xd5, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_U_Un, "conv.ovf.u.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x8b, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_U1, "conv.ovf.u1", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xb4, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_U1_Un, "conv.ovf.u1.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x86, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_U2, "conv.ovf.u2", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xb6, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_U2_Un, "conv.ovf.u2.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x87, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_U4, "conv.ovf.u4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xb8, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_U4_Un, "conv.ovf.u4.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x88, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_U8, "conv.ovf.u8", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xba, StackBehaviour.Pop1, StackBehaviour.Pushi8, 0 }; + yield return new object[] { OpCodes.Conv_Ovf_U8_Un, "conv.ovf.u8.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x89, StackBehaviour.Pop1, StackBehaviour.Pushi8, 0 }; + yield return new object[] { OpCodes.Conv_R_Un, "conv.r.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x76, StackBehaviour.Pop1, StackBehaviour.Pushr8, 0 }; + yield return new object[] { OpCodes.Conv_R4, "conv.r4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x6b, StackBehaviour.Pop1, StackBehaviour.Pushr4, 0 }; + yield return new object[] { OpCodes.Conv_R8, "conv.r8", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x6c, StackBehaviour.Pop1, StackBehaviour.Pushr8, 0 }; + yield return new object[] { OpCodes.Conv_U, "conv.u", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xe0, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_U1, "conv.u1", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xd2, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_U2, "conv.u2", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xd1, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_U4, "conv.u4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x6d, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Conv_U8, "conv.u8", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x6e, StackBehaviour.Pop1, StackBehaviour.Pushi8, 0 }; + yield return new object[] { OpCodes.Cpblk, "cpblk", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe17, StackBehaviour.Popi_popi_popi, StackBehaviour.Push0, -3 }; + yield return new object[] { OpCodes.Cpobj, "cpobj", OpCodeType.Objmodel, OperandType.InlineType, 1, 0x70, StackBehaviour.Popi_popi, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Div, "div", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x5b, StackBehaviour.Pop1_pop1, StackBehaviour.Push1, -1 }; + yield return new object[] { OpCodes.Div_Un, "div.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x5c, StackBehaviour.Pop1_pop1, StackBehaviour.Push1, -1 }; + yield return new object[] { OpCodes.Dup, "dup", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x25, StackBehaviour.Pop1, StackBehaviour.Push1_push1, 1 }; + yield return new object[] { OpCodes.Endfilter, "endfilter", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe11, StackBehaviour.Popi, StackBehaviour.Push0, -1 }; + yield return new object[] { OpCodes.Endfinally, "endfinally", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xdc, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Initblk, "initblk", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe18, StackBehaviour.Popi_popi_popi, StackBehaviour.Push0, -3 }; + yield return new object[] { OpCodes.Initobj, "initobj", OpCodeType.Objmodel, OperandType.InlineType, 2, 0xfe15, StackBehaviour.Popi, StackBehaviour.Push0, -1 }; + yield return new object[] { OpCodes.Isinst, "isinst", OpCodeType.Objmodel, OperandType.InlineType, 1, 0x75, StackBehaviour.Popref, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Jmp, "jmp", OpCodeType.Primitive, OperandType.InlineMethod, 1, 0x27, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Ldarg, "ldarg", OpCodeType.Primitive, OperandType.InlineVar, 2, 0xfe09, StackBehaviour.Pop0, StackBehaviour.Push1, 1 }; + yield return new object[] { OpCodes.Ldarg_0, "ldarg.0", OpCodeType.Macro, OperandType.InlineNone, 1, 0x2, StackBehaviour.Pop0, StackBehaviour.Push1, 1 }; + yield return new object[] { OpCodes.Ldarg_1, "ldarg.1", OpCodeType.Macro, OperandType.InlineNone, 1, 0x3, StackBehaviour.Pop0, StackBehaviour.Push1, 1 }; + yield return new object[] { OpCodes.Ldarg_2, "ldarg.2", OpCodeType.Macro, OperandType.InlineNone, 1, 0x4, StackBehaviour.Pop0, StackBehaviour.Push1, 1 }; + yield return new object[] { OpCodes.Ldarg_3, "ldarg.3", OpCodeType.Macro, OperandType.InlineNone, 1, 0x5, StackBehaviour.Pop0, StackBehaviour.Push1, 1 }; + yield return new object[] { OpCodes.Ldarg_S, "ldarg.s", OpCodeType.Macro, OperandType.ShortInlineVar, 1, 0xe, StackBehaviour.Pop0, StackBehaviour.Push1, 1 }; + yield return new object[] { OpCodes.Ldarga, "ldarga", OpCodeType.Primitive, OperandType.InlineVar, 2, 0xfe0a, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldarga_S, "ldarga.s", OpCodeType.Macro, OperandType.ShortInlineVar, 1, 0xf, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldc_I4, "ldc.i4", OpCodeType.Primitive, OperandType.InlineI, 1, 0x20, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldc_I4_0, "ldc.i4.0", OpCodeType.Macro, OperandType.InlineNone, 1, 0x16, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldc_I4_1, "ldc.i4.1", OpCodeType.Macro, OperandType.InlineNone, 1, 0x17, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldc_I4_2, "ldc.i4.2", OpCodeType.Macro, OperandType.InlineNone, 1, 0x18, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldc_I4_3, "ldc.i4.3", OpCodeType.Macro, OperandType.InlineNone, 1, 0x19, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldc_I4_4, "ldc.i4.4", OpCodeType.Macro, OperandType.InlineNone, 1, 0x1a, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldc_I4_5, "ldc.i4.5", OpCodeType.Macro, OperandType.InlineNone, 1, 0x1b, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldc_I4_6, "ldc.i4.6", OpCodeType.Macro, OperandType.InlineNone, 1, 0x1c, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldc_I4_7, "ldc.i4.7", OpCodeType.Macro, OperandType.InlineNone, 1, 0x1d, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldc_I4_8, "ldc.i4.8", OpCodeType.Macro, OperandType.InlineNone, 1, 0x1e, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldc_I4_M1, "ldc.i4.m1", OpCodeType.Macro, OperandType.InlineNone, 1, 0x15, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldc_I4_S, "ldc.i4.s", OpCodeType.Macro, OperandType.ShortInlineI, 1, 0x1f, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldc_I8, "ldc.i8", OpCodeType.Primitive, OperandType.InlineI8, 1, 0x21, StackBehaviour.Pop0, StackBehaviour.Pushi8, 1 }; + yield return new object[] { OpCodes.Ldc_R4, "ldc.r4", OpCodeType.Primitive, OperandType.ShortInlineR, 1, 0x22, StackBehaviour.Pop0, StackBehaviour.Pushr4, 1 }; + yield return new object[] { OpCodes.Ldc_R8, "ldc.r8", OpCodeType.Primitive, OperandType.InlineR, 1, 0x23, StackBehaviour.Pop0, StackBehaviour.Pushr8, 1 }; + yield return new object[] { OpCodes.Ldelem, "ldelem", OpCodeType.Objmodel, OperandType.InlineType, 1, 0xa3, StackBehaviour.Popref_popi, StackBehaviour.Push1, -1 }; + yield return new object[] { OpCodes.Ldelem_I, "ldelem.i", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x97, StackBehaviour.Popref_popi, StackBehaviour.Pushi, -1 }; + yield return new object[] { OpCodes.Ldelem_I1, "ldelem.i1", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x90, StackBehaviour.Popref_popi, StackBehaviour.Pushi, -1 }; + yield return new object[] { OpCodes.Ldelem_I2, "ldelem.i2", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x92, StackBehaviour.Popref_popi, StackBehaviour.Pushi, -1 }; + yield return new object[] { OpCodes.Ldelem_I4, "ldelem.i4", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x94, StackBehaviour.Popref_popi, StackBehaviour.Pushi, -1 }; + yield return new object[] { OpCodes.Ldelem_I8, "ldelem.i8", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x96, StackBehaviour.Popref_popi, StackBehaviour.Pushi8, -1 }; + yield return new object[] { OpCodes.Ldelem_R4, "ldelem.r4", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x98, StackBehaviour.Popref_popi, StackBehaviour.Pushr4, -1 }; + yield return new object[] { OpCodes.Ldelem_R8, "ldelem.r8", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x99, StackBehaviour.Popref_popi, StackBehaviour.Pushr8, -1 }; + yield return new object[] { OpCodes.Ldelem_Ref, "ldelem.ref", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x9a, StackBehaviour.Popref_popi, StackBehaviour.Pushref, -1 }; + yield return new object[] { OpCodes.Ldelem_U1, "ldelem.u1", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x91, StackBehaviour.Popref_popi, StackBehaviour.Pushi, -1 }; + yield return new object[] { OpCodes.Ldelem_U2, "ldelem.u2", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x93, StackBehaviour.Popref_popi, StackBehaviour.Pushi, -1 }; + yield return new object[] { OpCodes.Ldelem_U4, "ldelem.u4", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x95, StackBehaviour.Popref_popi, StackBehaviour.Pushi, -1 }; + yield return new object[] { OpCodes.Ldelema, "ldelema", OpCodeType.Objmodel, OperandType.InlineType, 1, 0x8f, StackBehaviour.Popref_popi, StackBehaviour.Pushi, -1 }; + yield return new object[] { OpCodes.Ldfld, "ldfld", OpCodeType.Objmodel, OperandType.InlineField, 1, 0x7b, StackBehaviour.Popref, StackBehaviour.Push1, 0 }; + yield return new object[] { OpCodes.Ldflda, "ldflda", OpCodeType.Objmodel, OperandType.InlineField, 1, 0x7c, StackBehaviour.Popref, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Ldftn, "ldftn", OpCodeType.Primitive, OperandType.InlineMethod, 2, 0xfe06, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldind_I, "ldind.i", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x4d, StackBehaviour.Popi, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Ldind_I1, "ldind.i1", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x46, StackBehaviour.Popi, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Ldind_I2, "ldind.i2", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x48, StackBehaviour.Popi, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Ldind_I4, "ldind.i4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x4a, StackBehaviour.Popi, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Ldind_I8, "ldind.i8", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x4c, StackBehaviour.Popi, StackBehaviour.Pushi8, 0 }; + yield return new object[] { OpCodes.Ldind_R4, "ldind.r4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x4e, StackBehaviour.Popi, StackBehaviour.Pushr4, 0 }; + yield return new object[] { OpCodes.Ldind_R8, "ldind.r8", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x4f, StackBehaviour.Popi, StackBehaviour.Pushr8, 0 }; + yield return new object[] { OpCodes.Ldind_Ref, "ldind.ref", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x50, StackBehaviour.Popi, StackBehaviour.Pushref, 0 }; + yield return new object[] { OpCodes.Ldind_U1, "ldind.u1", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x47, StackBehaviour.Popi, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Ldind_U2, "ldind.u2", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x49, StackBehaviour.Popi, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Ldind_U4, "ldind.u4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x4b, StackBehaviour.Popi, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Ldlen, "ldlen", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x8e, StackBehaviour.Popref, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Ldloc, "ldloc", OpCodeType.Primitive, OperandType.InlineVar, 2, 0xfe0c, StackBehaviour.Pop0, StackBehaviour.Push1, 1 }; + yield return new object[] { OpCodes.Ldloc_0, "ldloc.0", OpCodeType.Macro, OperandType.InlineNone, 1, 0x6, StackBehaviour.Pop0, StackBehaviour.Push1, 1 }; + yield return new object[] { OpCodes.Ldloc_1, "ldloc.1", OpCodeType.Macro, OperandType.InlineNone, 1, 0x7, StackBehaviour.Pop0, StackBehaviour.Push1, 1 }; + yield return new object[] { OpCodes.Ldloc_2, "ldloc.2", OpCodeType.Macro, OperandType.InlineNone, 1, 0x8, StackBehaviour.Pop0, StackBehaviour.Push1, 1 }; + yield return new object[] { OpCodes.Ldloc_3, "ldloc.3", OpCodeType.Macro, OperandType.InlineNone, 1, 0x9, StackBehaviour.Pop0, StackBehaviour.Push1, 1 }; + yield return new object[] { OpCodes.Ldloc_S, "ldloc.s", OpCodeType.Macro, OperandType.ShortInlineVar, 1, 0x11, StackBehaviour.Pop0, StackBehaviour.Push1, 1 }; + yield return new object[] { OpCodes.Ldloca, "ldloca", OpCodeType.Primitive, OperandType.InlineVar, 2, 0xfe0d, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldloca_S, "ldloca.s", OpCodeType.Macro, OperandType.ShortInlineVar, 1, 0x12, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldnull, "ldnull", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x14, StackBehaviour.Pop0, StackBehaviour.Pushref, 1 }; + yield return new object[] { OpCodes.Ldobj, "ldobj", OpCodeType.Objmodel, OperandType.InlineType, 1, 0x71, StackBehaviour.Popi, StackBehaviour.Push1, 0 }; + yield return new object[] { OpCodes.Ldsfld, "ldsfld", OpCodeType.Objmodel, OperandType.InlineField, 1, 0x7e, StackBehaviour.Pop0, StackBehaviour.Push1, 1 }; + yield return new object[] { OpCodes.Ldsflda, "ldsflda", OpCodeType.Objmodel, OperandType.InlineField, 1, 0x7f, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldstr, "ldstr", OpCodeType.Objmodel, OperandType.InlineString, 1, 0x72, StackBehaviour.Pop0, StackBehaviour.Pushref, 1 }; + yield return new object[] { OpCodes.Ldtoken, "ldtoken", OpCodeType.Primitive, OperandType.InlineTok, 1, 0xd0, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Ldvirtftn, "ldvirtftn", OpCodeType.Primitive, OperandType.InlineMethod, 2, 0xfe07, StackBehaviour.Popref, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Leave, "leave", OpCodeType.Primitive, OperandType.InlineBrTarget, 1, 0xdd, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Leave_S, "leave.s", OpCodeType.Primitive, OperandType.ShortInlineBrTarget, 1, 0xde, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Localloc, "localloc", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe0f, StackBehaviour.Popi, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Mkrefany, "mkrefany", OpCodeType.Primitive, OperandType.InlineType, 1, 0xc6, StackBehaviour.Popi, StackBehaviour.Push1, 0 }; + yield return new object[] { OpCodes.Mul, "mul", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x5a, StackBehaviour.Pop1_pop1, StackBehaviour.Push1, -1 }; + yield return new object[] { OpCodes.Mul_Ovf, "mul.ovf", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xd8, StackBehaviour.Pop1_pop1, StackBehaviour.Push1, -1 }; + yield return new object[] { OpCodes.Mul_Ovf_Un, "mul.ovf.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xd9, StackBehaviour.Pop1_pop1, StackBehaviour.Push1, -1 }; + yield return new object[] { OpCodes.Neg, "neg", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x65, StackBehaviour.Pop1, StackBehaviour.Push1, 0 }; + yield return new object[] { OpCodes.Newarr, "newarr", OpCodeType.Objmodel, OperandType.InlineType, 1, 0x8d, StackBehaviour.Popi, StackBehaviour.Pushref, 0 }; + yield return new object[] { OpCodes.Newobj, "newobj", OpCodeType.Objmodel, OperandType.InlineMethod, 1, 0x73, StackBehaviour.Varpop, StackBehaviour.Pushref, 1 }; + yield return new object[] { OpCodes.Nop, "nop", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x0, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Not, "not", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x66, StackBehaviour.Pop1, StackBehaviour.Push1, 0 }; + yield return new object[] { OpCodes.Or, "or", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x60, StackBehaviour.Pop1_pop1, StackBehaviour.Push1, -1 }; + yield return new object[] { OpCodes.Pop, "pop", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x26, StackBehaviour.Pop1, StackBehaviour.Push0, -1 }; + yield return new object[] { OpCodes.Prefix1, "prefix1", OpCodeType.Nternal, OperandType.InlineNone, 1, 0xfe, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Prefix2, "prefix2", OpCodeType.Nternal, OperandType.InlineNone, 1, 0xfd, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Prefix3, "prefix3", OpCodeType.Nternal, OperandType.InlineNone, 1, 0xfc, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Prefix4, "prefix4", OpCodeType.Nternal, OperandType.InlineNone, 1, 0xfb, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Prefix5, "prefix5", OpCodeType.Nternal, OperandType.InlineNone, 1, 0xfa, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Prefix6, "prefix6", OpCodeType.Nternal, OperandType.InlineNone, 1, 0xf9, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Prefix7, "prefix7", OpCodeType.Nternal, OperandType.InlineNone, 1, 0xf8, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Prefixref, "prefixref", OpCodeType.Nternal, OperandType.InlineNone, 1, 0xff, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Readonly, "readonly.", OpCodeType.Prefix, OperandType.InlineNone, 2, 0xfe1e, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Refanytype, "refanytype", OpCodeType.Primitive, OperandType.InlineNone, 2, 0xfe1d, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Refanyval, "refanyval", OpCodeType.Primitive, OperandType.InlineType, 1, 0xc2, StackBehaviour.Pop1, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Rem, "rem", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x5d, StackBehaviour.Pop1_pop1, StackBehaviour.Push1, -1 }; + yield return new object[] { OpCodes.Rem_Un, "rem.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x5e, StackBehaviour.Pop1_pop1, StackBehaviour.Push1, -1 }; + yield return new object[] { OpCodes.Ret, "ret", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x2a, StackBehaviour.Varpop, StackBehaviour.Push0, 0 }; // it depends if the method returns a value + yield return new object[] { OpCodes.Rethrow, "rethrow", OpCodeType.Objmodel, OperandType.InlineNone, 2, 0xfe1a, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Shl, "shl", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x62, StackBehaviour.Pop1_pop1, StackBehaviour.Push1, -1 }; + yield return new object[] { OpCodes.Shr, "shr", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x63, StackBehaviour.Pop1_pop1, StackBehaviour.Push1, -1 }; + yield return new object[] { OpCodes.Shr_Un, "shr.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x64, StackBehaviour.Pop1_pop1, StackBehaviour.Push1, -1 }; + yield return new object[] { OpCodes.Sizeof, "sizeof", OpCodeType.Primitive, OperandType.InlineType, 2, 0xfe1c, StackBehaviour.Pop0, StackBehaviour.Pushi, 1 }; + yield return new object[] { OpCodes.Starg, "starg", OpCodeType.Primitive, OperandType.InlineVar, 2, 0xfe0b, StackBehaviour.Pop1, StackBehaviour.Push0, -1 }; + yield return new object[] { OpCodes.Starg_S, "starg.s", OpCodeType.Macro, OperandType.ShortInlineVar, 1, 0x10, StackBehaviour.Pop1, StackBehaviour.Push0, -1 }; + yield return new object[] { OpCodes.Stelem, "stelem", OpCodeType.Objmodel, OperandType.InlineType, 1, 0xa4, StackBehaviour.Popref_popi_pop1, StackBehaviour.Push0, -3 }; + yield return new object[] { OpCodes.Stelem_I, "stelem.i", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x9b, StackBehaviour.Popref_popi_popi, StackBehaviour.Push0, -3 }; + yield return new object[] { OpCodes.Stelem_I1, "stelem.i1", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x9c, StackBehaviour.Popref_popi_popi, StackBehaviour.Push0, -3 }; + yield return new object[] { OpCodes.Stelem_I2, "stelem.i2", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x9d, StackBehaviour.Popref_popi_popi, StackBehaviour.Push0, -3 }; + yield return new object[] { OpCodes.Stelem_I4, "stelem.i4", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x9e, StackBehaviour.Popref_popi_popi, StackBehaviour.Push0, -3 }; + yield return new object[] { OpCodes.Stelem_I8, "stelem.i8", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x9f, StackBehaviour.Popref_popi_popi8, StackBehaviour.Push0, -3 }; + yield return new object[] { OpCodes.Stelem_R4, "stelem.r4", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0xa0, StackBehaviour.Popref_popi_popr4, StackBehaviour.Push0, -3 }; + yield return new object[] { OpCodes.Stelem_R8, "stelem.r8", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0xa1, StackBehaviour.Popref_popi_popr8, StackBehaviour.Push0, -3 }; + yield return new object[] { OpCodes.Stelem_Ref, "stelem.ref", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0xa2, StackBehaviour.Popref_popi_popref, StackBehaviour.Push0, -3 }; + yield return new object[] { OpCodes.Stfld, "stfld", OpCodeType.Objmodel, OperandType.InlineField, 1, 0x7d, StackBehaviour.Popref_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Stind_I, "stind.i", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xdf, StackBehaviour.Popi_popi, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Stind_I1, "stind.i1", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x52, StackBehaviour.Popi_popi, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Stind_I2, "stind.i2", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x53, StackBehaviour.Popi_popi, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Stind_I4, "stind.i4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x54, StackBehaviour.Popi_popi, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Stind_I8, "stind.i8", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x55, StackBehaviour.Popi_popi8, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Stind_R4, "stind.r4", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x56, StackBehaviour.Popi_popr4, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Stind_R8, "stind.r8", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x57, StackBehaviour.Popi_popr8, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Stind_Ref, "stind.ref", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x51, StackBehaviour.Popi_popi, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Stloc, "stloc", OpCodeType.Primitive, OperandType.InlineVar, 2, 0xfe0e, StackBehaviour.Pop1, StackBehaviour.Push0, -1 }; + yield return new object[] { OpCodes.Stloc_0, "stloc.0", OpCodeType.Macro, OperandType.InlineNone, 1, 0xa, StackBehaviour.Pop1, StackBehaviour.Push0, -1 }; + yield return new object[] { OpCodes.Stloc_1, "stloc.1", OpCodeType.Macro, OperandType.InlineNone, 1, 0xb, StackBehaviour.Pop1, StackBehaviour.Push0, -1 }; + yield return new object[] { OpCodes.Stloc_2, "stloc.2", OpCodeType.Macro, OperandType.InlineNone, 1, 0xc, StackBehaviour.Pop1, StackBehaviour.Push0, -1 }; + yield return new object[] { OpCodes.Stloc_3, "stloc.3", OpCodeType.Macro, OperandType.InlineNone, 1, 0xd, StackBehaviour.Pop1, StackBehaviour.Push0, -1 }; + yield return new object[] { OpCodes.Stloc_S, "stloc.s", OpCodeType.Macro, OperandType.ShortInlineVar, 1, 0x13, StackBehaviour.Pop1, StackBehaviour.Push0, -1 }; + yield return new object[] { OpCodes.Stobj, "stobj", OpCodeType.Primitive, OperandType.InlineType, 1, 0x81, StackBehaviour.Popi_pop1, StackBehaviour.Push0, -2 }; + yield return new object[] { OpCodes.Stsfld, "stsfld", OpCodeType.Objmodel, OperandType.InlineField, 1, 0x80, StackBehaviour.Pop1, StackBehaviour.Push0, -1 }; + yield return new object[] { OpCodes.Sub, "sub", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x59, StackBehaviour.Pop1_pop1, StackBehaviour.Push1, -1 }; + yield return new object[] { OpCodes.Sub_Ovf, "sub.ovf", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xda, StackBehaviour.Pop1_pop1, StackBehaviour.Push1, -1 }; + yield return new object[] { OpCodes.Sub_Ovf_Un, "sub.ovf.un", OpCodeType.Primitive, OperandType.InlineNone, 1, 0xdb, StackBehaviour.Pop1_pop1, StackBehaviour.Push1, -1 }; + yield return new object[] { OpCodes.Switch, "switch", OpCodeType.Primitive, OperandType.InlineSwitch, 1, 0x45, StackBehaviour.Popi, StackBehaviour.Push0, -1 }; + yield return new object[] { OpCodes.Tailcall, "tail.", OpCodeType.Prefix, OperandType.InlineNone, 2, 0xfe14, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Throw, "throw", OpCodeType.Objmodel, OperandType.InlineNone, 1, 0x7a, StackBehaviour.Popref, StackBehaviour.Push0, -1 }; + yield return new object[] { OpCodes.Unaligned, "unaligned.", OpCodeType.Prefix, OperandType.ShortInlineI, 2, 0xfe12, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Unbox, "unbox", OpCodeType.Primitive, OperandType.InlineType, 1, 0x79, StackBehaviour.Popref, StackBehaviour.Pushi, 0 }; + yield return new object[] { OpCodes.Unbox_Any, "unbox.any", OpCodeType.Objmodel, OperandType.InlineType, 1, 0xa5, StackBehaviour.Popref, StackBehaviour.Push1, 0 }; + yield return new object[] { OpCodes.Volatile, "volatile.", OpCodeType.Prefix, OperandType.InlineNone, 2, 0xfe13, StackBehaviour.Pop0, StackBehaviour.Push0, 0 }; + yield return new object[] { OpCodes.Xor, "xor", OpCodeType.Primitive, OperandType.InlineNone, 1, 0x61, StackBehaviour.Pop1_pop1, StackBehaviour.Push1, -1 }; } [Theory] [MemberData(nameof(TestData))] - public void VerifyOpCode(OpCode opCode, string name, OpCodeType opCodeType, OperandType operandType, int size, int value, StackBehaviour stackBehaviourPop, StackBehaviour stackBehaviourPush) + public void VerifyOpCode(OpCode opCode, string name, OpCodeType opCodeType, OperandType operandType, int size, int value, StackBehaviour stackBehaviourPop, StackBehaviour stackBehaviourPush, int evaluationStackDelta) { Assert.Equal(name, opCode.Name); Assert.Equal(opCodeType, opCode.OpCodeType); @@ -250,6 +250,7 @@ public void VerifyOpCode(OpCode opCode, string name, OpCodeType opCodeType, Oper Assert.Equal((short)value, opCode.Value); Assert.Equal(stackBehaviourPop, opCode.StackBehaviourPop); Assert.Equal(stackBehaviourPush, opCode.StackBehaviourPush); + Assert.Equal(evaluationStackDelta, opCode.EvaluationStackDelta); Assert.Equal(name, opCode.ToString()); Assert.Equal(opCode.GetHashCode(), opCode.GetHashCode()); diff --git a/src/libraries/System.Reflection.Emit/tests/PersistableAssemblyBuilder/AssemblySaveILGeneratorTests.cs b/src/libraries/System.Reflection.Emit/tests/PersistableAssemblyBuilder/AssemblySaveILGeneratorTests.cs index 2f4dde63b79fb8..97ec018b0e7f4d 100644 --- a/src/libraries/System.Reflection.Emit/tests/PersistableAssemblyBuilder/AssemblySaveILGeneratorTests.cs +++ b/src/libraries/System.Reflection.Emit/tests/PersistableAssemblyBuilder/AssemblySaveILGeneratorTests.cs @@ -168,5 +168,81 @@ public void MultipleTypesWithMultipleMethods() Assert.Equal(OpCodes.Ldc_I8.Value, longBody[0]); } } + + [Fact] + public void ILOffset_Test() + { + AssemblyBuilder ab = AssemblySaveTools.PopulateAssemblyBuilderTypeBuilderAndSaveMethod(out TypeBuilder type, out MethodInfo saveMethod); + MethodBuilder method = type.DefineMethod("Method1", MethodAttributes.Public | MethodAttributes.Static, typeof(Type), new Type[0]); + ILGenerator ilGenerator = method.GetILGenerator(); + + Assert.Equal(0, ilGenerator.ILOffset); + ilGenerator.Emit(OpCodes.Ret); + Assert.Equal(1, ilGenerator.ILOffset); + } + + [Fact] + public void ILMaxStack_Test() + { + using (TempFile file = TempFile.Create()) + { + AssemblyBuilder ab = AssemblySaveTools.PopulateAssemblyBuilderTypeBuilderAndSaveMethod(out TypeBuilder type, out MethodInfo saveMethod); + MethodBuilder method1 = type.DefineMethod("Method1", MethodAttributes.Public, typeof(long), new Type[] { typeof(int), typeof(long), typeof(short), typeof(byte) }); + ILGenerator il1 = method1.GetILGenerator(); + + // public int Method1(int x, int y, short z, byte r) => + // x + (z + 2 * (r + (8 * y + 3 * (y - (5 + x)))) + il1.Emit(OpCodes.Ldarg_1); // push 1 MaxStack 1 + il1.Emit(OpCodes.Ldarg_3); // push 1 MaxStack 2 + il1.Emit(OpCodes.Ldc_I4_2); // push 1 MaxStack 3 + il1.Emit(OpCodes.Ldarg_S, 4); // push 1 MaxStack 4 + il1.Emit(OpCodes.Ldc_I4_8); // push 1 MaxStack 5 + il1.Emit(OpCodes.Ldarg_2); // push 1 MaxStack 6 + il1.Emit(OpCodes.Mul); // pop 2 push 1 MaxStack 5 + il1.Emit(OpCodes.Ldc_I4_3); // push 1 MaxStack 6 + il1.Emit(OpCodes.Ldarg_2); // push 1 MaxStack 7 + il1.Emit(OpCodes.Ldc_I4_5); // push 1 MaxStack 8 + il1.Emit(OpCodes.Ldarg_1); // push 1 MaxStack 9 + il1.Emit(OpCodes.Add); // pop 2 push 1 stack size 8 + il1.Emit(OpCodes.Sub); // pop 2 push 1 stack size 7 + il1.Emit(OpCodes.Mul); // pop 2 push 1 stack size 6 + il1.Emit(OpCodes.Add); // pop 2 push 1 stack size 5 + il1.Emit(OpCodes.Add); // pop 2 push 1 stack size 4 + il1.Emit(OpCodes.Mul); // pop 2 push 1 stack size 3 + il1.Emit(OpCodes.Add); // pop 2 push 1 stack size 2 + il1.Emit(OpCodes.Add); // pop 2 push 1 stack size 1 + il1.Emit(OpCodes.Ret); // pop 1 stack size 0 + + MethodBuilder method2 = type.DefineMethod("Method2", MethodAttributes.Public, typeof(int), new Type[] { typeof(int), typeof(byte) }); + ILGenerator il2 = method2.GetILGenerator(); + + // int Method2(int x, int y) => x + (y + 18); + il2.Emit(OpCodes.Ldarg_1); // push 1 MaxStack 1 + il2.Emit(OpCodes.Ldarg_2); // push 1 MaxStack 2 + il2.Emit(OpCodes.Ldc_I4_S, 8); // push 1 MaxStack 3 + il2.Emit(OpCodes.Add); // pop 2 push 1 stack size 2 + il2.Emit(OpCodes.Add); // pop 2 push 1 stack size 1 + il2.Emit(OpCodes.Ret); // pop 1 stack size 0 + + saveMethod.Invoke(ab, new object[] { file.Path }); + + MethodInfo getMaxStackSizeMethod = LoadILGenerator_GetMaxStackSizeMethod(); + Assert.Equal(9, getMaxStackSizeMethod.Invoke(il1, new object[0])); + Assert.Equal(3, getMaxStackSizeMethod.Invoke(il2, new object[0])); + + Assembly assemblyFromDisk = AssemblySaveTools.LoadAssemblyFromPath(file.Path); + Type typeFromDisk = assemblyFromDisk.Modules.First().GetType("MyType"); + MethodBody body1 = typeFromDisk.GetMethod("Method1").GetMethodBody(); + MethodBody body2 = typeFromDisk.GetMethod("Method2").GetMethodBody(); + Assert.Equal(9, body1.MaxStackSize); + Assert.Equal(8, body2.MaxStackSize); // apparently doesn't write lower than 8 + } + } + + private MethodInfo LoadILGenerator_GetMaxStackSizeMethod() + { + Type ilgType = Type.GetType("System.Reflection.Emit.ILGeneratorImpl, System.Reflection.Emit", throwOnError: true)!; + return ilgType.GetMethod("GetMaxStackSize", BindingFlags.NonPublic | BindingFlags.Instance, Type.EmptyTypes); + } } } diff --git a/src/libraries/System.Reflection.Primitives/ref/System.Reflection.Primitives.cs b/src/libraries/System.Reflection.Primitives/ref/System.Reflection.Primitives.cs index 2bd85772fef7bf..c5d2beb82b6ba8 100644 --- a/src/libraries/System.Reflection.Primitives/ref/System.Reflection.Primitives.cs +++ b/src/libraries/System.Reflection.Primitives/ref/System.Reflection.Primitives.cs @@ -22,6 +22,7 @@ public enum FlowControl public readonly partial struct OpCode : System.IEquatable { private readonly int _dummyPrimitive; + public int EvaluationStackDelta { get { throw null; } } public System.Reflection.Emit.FlowControl FlowControl { get { throw null; } } public string? Name { get { throw null; } } public System.Reflection.Emit.OpCodeType OpCodeType { get { throw null; } }