OpCode GetLoadEntityOpCode(IType type)
{
if (IsByAddress(type))
return OpCodes.Ldelema;
if (!type.IsValueType)
{
return type is IGenericParameter
? OpCodes.Ldelem
: OpCodes.Ldelem_Ref;
}
if (type.IsEnum)
{
type = TypeSystemServices.Map(GetEnumUnderlyingType(type));
}
if (TypeSystemServices.IntType == type)
{
return OpCodes.Ldelem_I4;
}
if (TypeSystemServices.UIntType == type)
{
return OpCodes.Ldelem_U4;
}
if (IsLong(type))
{
return OpCodes.Ldelem_I8;
}
if (TypeSystemServices.SByteType == type)
{
return OpCodes.Ldelem_I1;
}
if (TypeSystemServices.ByteType == type)
{
return OpCodes.Ldelem_U1;
}
if (TypeSystemServices.ShortType == type ||
TypeSystemServices.CharType == type)
{
return OpCodes.Ldelem_I2;
}
if (TypeSystemServices.UShortType == type)
{
return OpCodes.Ldelem_U2;
}
if (TypeSystemServices.SingleType == type)
{
return OpCodes.Ldelem_R4;
}
if (TypeSystemServices.DoubleType == type)
{
return OpCodes.Ldelem_R8;
}
//NotImplemented("LoadEntityOpCode(" + tag + ")");
return OpCodes.Ldelema;
}