@@ -835,6 +835,8 @@ private Status TryScanMethod(MethodIL methodIL, Value[] parameters, Stack<Method
835
835
case ILOpcode . conv_u2 :
836
836
case ILOpcode . conv_u4 :
837
837
case ILOpcode . conv_u8 :
838
+ case ILOpcode . conv_r4 :
839
+ case ILOpcode . conv_r8 :
838
840
{
839
841
StackEntry popped = stack . Pop ( ) ;
840
842
if ( popped . ValueKind . WithNormalizedNativeInt ( context ) == StackValueKind . Int32 )
@@ -874,6 +876,12 @@ private Status TryScanMethod(MethodIL methodIL, Value[] parameters, Stack<Method
874
876
case ILOpcode . conv_u8 :
875
877
stack . Push ( StackValueKind . Int64 , ValueTypeValue . FromInt64 ( ( uint ) val ) ) ;
876
878
break ;
879
+ case ILOpcode . conv_r4 :
880
+ stack . Push ( StackValueKind . Float , ValueTypeValue . FromDouble ( ( float ) val ) ) ;
881
+ break ;
882
+ case ILOpcode . conv_r8 :
883
+ stack . Push ( StackValueKind . Float , ValueTypeValue . FromDouble ( ( double ) val ) ) ;
884
+ break ;
877
885
default :
878
886
return Status . Fail ( methodIL . OwningMethod , opcode ) ;
879
887
}
@@ -912,6 +920,12 @@ private Status TryScanMethod(MethodIL methodIL, Value[] parameters, Stack<Method
912
920
case ILOpcode . conv_u8 :
913
921
stack . Push ( StackValueKind . Int64 , ValueTypeValue . FromInt64 ( val ) ) ;
914
922
break ;
923
+ case ILOpcode . conv_r4 :
924
+ stack . Push ( StackValueKind . Float , ValueTypeValue . FromDouble ( ( float ) val ) ) ;
925
+ break ;
926
+ case ILOpcode . conv_r8 :
927
+ stack . Push ( StackValueKind . Float , ValueTypeValue . FromDouble ( ( double ) val ) ) ;
928
+ break ;
915
929
default :
916
930
return Status . Fail ( methodIL . OwningMethod , opcode ) ;
917
931
}
@@ -921,9 +935,44 @@ private Status TryScanMethod(MethodIL methodIL, Value[] parameters, Stack<Method
921
935
double val = popped . Value . AsDouble ( ) ;
922
936
switch ( opcode )
923
937
{
938
+ case ILOpcode . conv_i :
939
+ stack . Push ( StackValueKind . NativeInt ,
940
+ context . Target . PointerSize == 8 ? ValueTypeValue . FromInt64 ( ( long ) val ) : ValueTypeValue . FromInt32 ( ( int ) val ) ) ;
941
+ break ;
942
+ case ILOpcode . conv_u :
943
+ stack . Push ( StackValueKind . NativeInt ,
944
+ context . Target . PointerSize == 8 ? ValueTypeValue . FromInt64 ( ( long ) ( ulong ) val ) : ValueTypeValue . FromInt32 ( ( int ) ( uint ) val ) ) ;
945
+ break ;
946
+ case ILOpcode . conv_i1 :
947
+ stack . Push ( StackValueKind . Int32 , ValueTypeValue . FromInt32 ( ( sbyte ) val ) ) ;
948
+ break ;
949
+ case ILOpcode . conv_i2 :
950
+ stack . Push ( StackValueKind . Int32 , ValueTypeValue . FromInt32 ( ( short ) val ) ) ;
951
+ break ;
952
+ case ILOpcode . conv_i4 :
953
+ stack . Push ( StackValueKind . Int32 , ValueTypeValue . FromInt32 ( ( int ) val ) ) ;
954
+ break ;
924
955
case ILOpcode . conv_i8 :
925
956
stack . Push ( StackValueKind . Int64 , ValueTypeValue . FromInt64 ( ( long ) val ) ) ;
926
957
break ;
958
+ case ILOpcode . conv_u1 :
959
+ stack . Push ( StackValueKind . Int32 , ValueTypeValue . FromInt32 ( ( byte ) val ) ) ;
960
+ break ;
961
+ case ILOpcode . conv_u2 :
962
+ stack . Push ( StackValueKind . Int32 , ValueTypeValue . FromInt32 ( ( ushort ) val ) ) ;
963
+ break ;
964
+ case ILOpcode . conv_u4 :
965
+ stack . Push ( StackValueKind . Int32 , ValueTypeValue . FromInt32 ( ( int ) ( uint ) val ) ) ;
966
+ break ;
967
+ case ILOpcode . conv_u8 :
968
+ stack . Push ( StackValueKind . Int64 , ValueTypeValue . FromInt64 ( ( long ) ( ulong ) val ) ) ;
969
+ break ;
970
+ case ILOpcode . conv_r4 :
971
+ stack . Push ( StackValueKind . Float , ValueTypeValue . FromDouble ( ( float ) val ) ) ;
972
+ break ;
973
+ case ILOpcode . conv_r8 :
974
+ stack . Push ( StackValueKind . Float , ValueTypeValue . FromDouble ( val ) ) ;
975
+ break ;
927
976
default :
928
977
return Status . Fail ( methodIL . OwningMethod , opcode ) ;
929
978
}
@@ -1388,8 +1437,12 @@ private Status TryScanMethod(MethodIL methodIL, Value[] parameters, Stack<Method
1388
1437
case ILOpcode . neg :
1389
1438
{
1390
1439
StackEntry value = stack . Pop ( ) ;
1391
- if ( value . ValueKind == StackValueKind . Int32 )
1392
- stack . Push ( StackValueKind . Int32 , ValueTypeValue . FromInt32 ( - value . Value . AsInt32 ( ) ) ) ;
1440
+ if ( value . ValueKind . WithNormalizedNativeInt ( context ) == StackValueKind . Int32 )
1441
+ stack . Push ( value . ValueKind , ValueTypeValue . FromInt32 ( - value . Value . AsInt32 ( ) ) ) ;
1442
+ else if ( value . ValueKind . WithNormalizedNativeInt ( context ) == StackValueKind . Int64 )
1443
+ stack . Push ( value . ValueKind , ValueTypeValue . FromInt64 ( - value . Value . AsInt64 ( ) ) ) ;
1444
+ else if ( value . ValueKind == StackValueKind . Float )
1445
+ stack . Push ( value . ValueKind , ValueTypeValue . FromDouble ( - value . Value . AsDouble ( ) ) ) ;
1393
1446
else
1394
1447
return Status . Fail ( methodIL . OwningMethod , opcode ) ;
1395
1448
}
0 commit comments