Cosmos/source2/IL2CPU/Cosmos.IL2CPU/ILOpCodes/OpNone.cs
2014-07-14 16:41:57 +00:00

533 lines
15 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Cosmos.IL2CPU.ILOpCodes {
public class OpNone : ILOpCode {
public OpNone(Code aOpCode, int aPos, int aNextPos, System.Reflection.ExceptionHandlingClause aCurrentExceptionHandler)
: base(aOpCode, aPos, aNextPos, aCurrentExceptionHandler)
{
}
public override int NumberOfStackPops
{
get
{
switch (OpCode)
{
case Code.Pop:
return 1;
case Code.Nop:
return 0;
case Code.Ret:
return 1;
case Code.Conv_I:
case Code.Conv_I1:
case Code.Conv_I2:
case Code.Conv_I4:
case Code.Conv_I8:
case Code.Conv_U:
case Code.Conv_U1:
case Code.Conv_U2:
case Code.Conv_U4:
case Code.Conv_U8:
case Code.Conv_R4:
case Code.Conv_R8:
case Code.Conv_R_Un:
case Code.Conv_Ovf_I:
case Code.Conv_Ovf_I1:
case Code.Conv_Ovf_I1_Un:
case Code.Conv_Ovf_I2:
case Code.Conv_Ovf_I2_Un:
case Code.Conv_Ovf_I4:
case Code.Conv_Ovf_I4_Un:
case Code.Conv_Ovf_I8:
case Code.Conv_Ovf_I8_Un:
case Code.Conv_Ovf_I_Un:
case Code.Conv_Ovf_U:
case Code.Conv_Ovf_U1:
case Code.Conv_Ovf_U1_Un:
case Code.Conv_Ovf_U2:
case Code.Conv_Ovf_U2_Un:
case Code.Conv_Ovf_U4:
case Code.Conv_Ovf_U4_Un:
case Code.Conv_Ovf_U8:
case Code.Conv_Ovf_U8_Un:
case Code.Conv_Ovf_U_Un:
return 1;
case Code.Add:
case Code.Mul:
case Code.Div:
case Code.Div_Un:
case Code.Sub:
case Code.Rem:
case Code.Rem_Un:
case Code.Xor:
return 2;
case Code.Ldind_I:
case Code.Ldind_I1:
case Code.Ldind_I2:
case Code.Ldind_I4:
case Code.Ldind_I8:
case Code.Ldind_U1:
case Code.Ldind_U2:
case Code.Ldind_U4:
case Code.Ldind_R4:
case Code.Ldind_R8:
case Code.Ldind_Ref:
return 1;
case Code.Stind_I:
case Code.Stind_I1:
case Code.Stind_I2:
case Code.Stind_I4:
case Code.Stind_I8:
case Code.Stind_Ref:
return 2;
case Code.Clt:
return 2;
case Code.Clt_Un:
return 2;
case Code.Cgt:
return 2;
case Code.Cgt_Un:
return 2;
case Code.Ceq:
return 2;
case Code.Throw:
return 1;
case Code.Or:
case Code.And:
return 2;
case Code.Stelem_Ref:
case Code.Stelem_I:
case Code.Stelem_I1:
case Code.Stelem_I2:
case Code.Stelem_I4:
case Code.Stelem_I8:
return 3;
case Code.Shr:
case Code.Shr_Un:
case Code.Shl:
return 2;
case Code.Neg:
return 1;
case Code.Ldlen:
return 1;
case Code.Ldelem:
case Code.Ldelem_Ref:
case Code.Ldelem_I:
case Code.Ldelem_I1:
case Code.Ldelem_I2:
case Code.Ldelem_I4:
case Code.Ldelem_I8:
case Code.Ldelem_U1:
case Code.Ldelem_U2:
case Code.Ldelem_U4:
return 2;
case Code.Ldnull:
return 0;
case Code.Dup:
return 1;
case Code.Volatile:
return 1;
case Code.Endfinally:
return 0;
default:
throw new NotImplementedException("OpCode '" + OpCode + "' not implemented!");
}
}
}
public override int NumberOfStackPushes
{
get
{
switch (OpCode)
{
case Code.Pop:
return 0;
case Code.Ret:
return 0;
case Code.Nop:
return 0;
case Code.Conv_I:
case Code.Conv_I1:
case Code.Conv_I2:
case Code.Conv_I4:
case Code.Conv_I8:
case Code.Conv_U:
case Code.Conv_U1:
case Code.Conv_U2:
case Code.Conv_U4:
case Code.Conv_U8:
case Code.Conv_R4:
case Code.Conv_R8:
case Code.Conv_R_Un:
case Code.Conv_Ovf_I:
case Code.Conv_Ovf_I1:
case Code.Conv_Ovf_I1_Un:
case Code.Conv_Ovf_I2:
case Code.Conv_Ovf_I2_Un:
case Code.Conv_Ovf_I4:
case Code.Conv_Ovf_I4_Un:
case Code.Conv_Ovf_I8:
case Code.Conv_Ovf_I8_Un:
case Code.Conv_Ovf_I_Un:
case Code.Conv_Ovf_U:
case Code.Conv_Ovf_U1:
case Code.Conv_Ovf_U1_Un:
case Code.Conv_Ovf_U2:
case Code.Conv_Ovf_U2_Un:
case Code.Conv_Ovf_U4:
case Code.Conv_Ovf_U4_Un:
case Code.Conv_Ovf_U8:
case Code.Conv_Ovf_U8_Un:
case Code.Conv_Ovf_U_Un:
return 1;
case Code.Add:
case Code.Mul:
case Code.Div:
case Code.Div_Un:
case Code.Sub:
case Code.Rem:
case Code.Rem_Un:
case Code.Xor:
return 1;
case Code.Ldind_I:
case Code.Ldind_I1:
case Code.Ldind_I2:
case Code.Ldind_I4:
case Code.Ldind_I8:
case Code.Ldind_U1:
case Code.Ldind_U2:
case Code.Ldind_U4:
case Code.Ldind_R4:
case Code.Ldind_R8:
case Code.Ldind_Ref:
return 1;
case Code.Stind_I:
case Code.Stind_I1:
case Code.Stind_I2:
case Code.Stind_I4:
case Code.Stind_I8:
case Code.Stind_Ref:
return 0;
case Code.Clt:
return 1;
case Code.Clt_Un:
return 1;
case Code.Cgt:
return 1;
case Code.Cgt_Un:
return 1;
case Code.Ceq:
return 1;
case Code.Throw:
return 0;
case Code.Or:
case Code.And:
return 1;
case Code.Stelem_I:
case Code.Stelem_I1:
case Code.Stelem_I2:
case Code.Stelem_I4:
case Code.Stelem_I8:
case Code.Stelem_Ref:
return 0;
case Code.Shr:
case Code.Shr_Un:
case Code.Shl:
return 1;
case Code.Neg:
return 1;
case Code.Ldlen:
return 1;
case Code.Ldelem:
case Code.Ldelem_Ref:
case Code.Ldelem_I:
case Code.Ldelem_I1:
case Code.Ldelem_I2:
case Code.Ldelem_I4:
case Code.Ldelem_I8:
case Code.Ldelem_U1:
case Code.Ldelem_U2:
case Code.Ldelem_U4:
return 2;
case Code.Ldnull:
return 1;
case Code.Dup:
return 2;
case Code.Volatile:
return 1;
case Code.Endfinally:
return 0;
default:
throw new NotImplementedException("OpCode '" + OpCode + "' not implemented!");
}
}
}
protected override void DoInitStackAnalysis()
{
base.DoInitStackAnalysis();
switch (OpCode)
{
case Code.Stind_I:
StackPopTypes[0] = typeof (IntPtr);
StackPopTypes[1] = typeof (IntPtr);
return;
case Code.Stind_I1:
StackPopTypes[0] = typeof (sbyte);
StackPopTypes[1] = typeof (IntPtr);
return;
case Code.Stind_I2:
StackPopTypes[0] = typeof (short);
StackPopTypes[1] = typeof (IntPtr);
return;
case Code.Stind_I4:
StackPopTypes[0] = typeof (int);
StackPopTypes[1] = typeof (IntPtr);
return;
case Code.Stind_I8:
StackPopTypes[0] = typeof (long);
StackPopTypes[1] = typeof (IntPtr);
return;
case Code.Ldind_U1:
StackPushTypes[0] = typeof (byte);
StackPopTypes[0] = typeof (IntPtr);
return;
case Code.Ldind_U2:
StackPushTypes[0] = typeof (ushort);
StackPopTypes[0] = typeof (IntPtr);
return;
case Code.Ldind_U4:
StackPushTypes[0] = typeof (UInt32);
StackPopTypes[0] = typeof (IntPtr);
return;
case Code.Ldind_R4:
StackPushTypes[0] = typeof (Single);
StackPopTypes[0] = typeof (IntPtr);
return;
case Code.Ldind_R8:
StackPushTypes[0] = typeof (Double);
StackPopTypes[0] = typeof (IntPtr);
return;
case Code.Conv_I:
StackPushTypes[0] = typeof (IntPtr);
break;
case Code.Conv_I1:
StackPushTypes[0] = typeof (sbyte);
break;
case Code.Conv_I2:
StackPushTypes[0] = typeof (short);
break;
case Code.Conv_I4:
StackPushTypes[0] = typeof (int);
break;
case Code.Conv_I8:
StackPushTypes[0] = typeof (long);
break;
case Code.Conv_U:
StackPushTypes[0] = typeof (UIntPtr);
break;
case Code.Conv_U1:
StackPushTypes[0] = typeof (byte);
break;
case Code.Conv_U2:
StackPushTypes[0] = typeof (ushort);
break;
case Code.Conv_U4:
StackPushTypes[0] = typeof (uint);
break;
case Code.Conv_U8:
StackPushTypes[0] = typeof (ulong);
break;
case Code.Conv_R4:
StackPushTypes[0] = typeof(Single);
break;
case Code.Conv_R8:
StackPushTypes[0] = typeof(Double);
break;
case Code.Conv_Ovf_I:
StackPushTypes[0] = typeof(IntPtr);
break;
case Code.Conv_Ovf_I1:
StackPushTypes[0] = typeof(sbyte);
break;
case Code.Conv_Ovf_I1_Un:
StackPushTypes[0] = typeof(sbyte);
break;
case Code.Conv_Ovf_I2:
StackPushTypes[0] = typeof(short);
break;
case Code.Conv_Ovf_I2_Un:
StackPushTypes[0] = typeof(short);
break;
case Code.Conv_Ovf_I4:
StackPushTypes[0] = typeof(int);
break;
case Code.Conv_Ovf_I4_Un:
StackPushTypes[0] = typeof(int);
break;
case Code.Conv_Ovf_I8:
StackPushTypes[0] = typeof(long);
break;
case Code.Conv_Ovf_I8_Un:
StackPushTypes[0] = typeof(long);
break;
case Code.Conv_Ovf_I_Un:
StackPushTypes[0] = typeof(IntPtr);
break;
case Code.Conv_Ovf_U:
StackPushTypes[0] = typeof(UIntPtr);
break;
case Code.Conv_Ovf_U1:
StackPushTypes[0] = typeof(byte);
break;
case Code.Conv_Ovf_U1_Un:
StackPushTypes[0] = typeof(byte);
break;
case Code.Conv_Ovf_U2:
StackPushTypes[0] = typeof(ushort);
break;
case Code.Conv_Ovf_U2_Un:
StackPushTypes[0] = typeof(ushort);
break;
case Code.Conv_Ovf_U4:
StackPushTypes[0] = typeof(uint);
break;
case Code.Conv_Ovf_U4_Un:
StackPushTypes[0] = typeof(uint);
break;
case Code.Conv_Ovf_U8:
StackPushTypes[0] = typeof(ulong);
break;
case Code.Conv_Ovf_U8_Un:
StackPushTypes[0] = typeof(ulong);
break;
case Code.Conv_Ovf_U_Un:
StackPushTypes[0] = typeof(UIntPtr);
break;
case Code.Clt:
StackPushTypes[0] = typeof (int);
return;
case Code.Clt_Un:
StackPushTypes[0] = typeof (int);
return;
case Code.Cgt:
StackPushTypes[0] = typeof (int);
return;
case Code.Cgt_Un:
StackPushTypes[0] = typeof (int);
return;
case Code.Ceq:
StackPushTypes[0] = typeof (int);
return;
case Code.Throw:
StackPopTypes[0] = typeof (object);
return;
case Code.Ldlen:
StackPushTypes[0] = typeof (UIntPtr);
return;
case Code.Ldelem_I:
StackPushTypes[0] = typeof (IntPtr);
return;
case Code.Ldelem_I1:
StackPushTypes[0] = typeof (sbyte);
return;
case Code.Ldelem_I2:
StackPushTypes[0] = typeof (short);
return;
case Code.Ldelem_I4:
StackPushTypes[0] = typeof (int);
return;
case Code.Ldelem_I8:
StackPushTypes[0] = typeof (long);
return;
case Code.Ldelem_U1:
StackPushTypes[0] = typeof (byte);
return;
case Code.Ldelem_U2:
StackPushTypes[0] = typeof (ushort);
return;
case Code.Ldelem_U4:
StackPushTypes[0] = typeof (uint);
return;
case Code.Ldnull:
StackPushTypes[0] = typeof (NullRef);
return;
case Code.Ldind_I:
StackPushTypes[0] = typeof(IntPtr);
StackPopTypes[0] = typeof(IntPtr);
return;
case Code.Ldind_I1:
StackPushTypes[0] = typeof(sbyte);
StackPopTypes[0] = typeof(IntPtr);
return;
case Code.Ldind_I2:
StackPushTypes[0] = typeof(short);
StackPopTypes[0] = typeof(IntPtr);
return;
case Code.Ldind_I4:
StackPushTypes[0] = typeof(Int32);
StackPopTypes[0] = typeof(IntPtr);
return;
case Code.Ldind_I8:
StackPushTypes[0] = typeof(long);
StackPopTypes[0] = typeof(IntPtr);
return;
case Code.Stelem_I:
StackPopTypes[0] = typeof (IntPtr);
return;
case Code.Stelem_I1:
StackPopTypes[0] = typeof(sbyte);
return;
case Code.Stelem_I2:
StackPopTypes[0] = typeof(short);
return;
case Code.Stelem_I4:
StackPopTypes[0] = typeof(int);
return;
case Code.Stelem_I8:
StackPopTypes[0] = typeof(long);
return;
}
}
}
}