@@ -980,6 +980,50 @@ void InterpExecMethod(InterpreterFrame *pInterpreterFrame, InterpMethodContextFr
980980 LOCAL_VAR (ip[1 ], int64_t ) = LOCAL_VAR (ip[2 ], int64_t ) + ip[3 ];
981981 ip += 4 ;
982982 break ;
983+ case INTOP_ADD_OVF_I4:
984+ {
985+ int32_t i1 = LOCAL_VAR (ip[2 ], int32_t );
986+ int32_t i2 = LOCAL_VAR (ip[3 ], int32_t );
987+ int32_t i3;
988+ if (!ClrSafeInt<int32_t >::addition (i1, i2, i3))
989+ COMPlusThrow (kOverflowException );
990+ LOCAL_VAR (ip[1 ], int32_t ) = i3;
991+ ip += 4 ;
992+ break ;
993+ }
994+ case INTOP_ADD_OVF_I8:
995+ {
996+ int64_t i1 = LOCAL_VAR (ip[2 ], int64_t );
997+ int64_t i2 = LOCAL_VAR (ip[3 ], int64_t );
998+ int64_t i3;
999+ if (!ClrSafeInt<int64_t >::addition (i1, i2, i3))
1000+ COMPlusThrow (kOverflowException );
1001+ LOCAL_VAR (ip[1 ], int64_t ) = i3;
1002+ ip += 4 ;
1003+ break ;
1004+ }
1005+ case INTOP_ADD_OVF_UN_I4:
1006+ {
1007+ uint32_t i1 = LOCAL_VAR (ip[2 ], uint32_t );
1008+ uint32_t i2 = LOCAL_VAR (ip[3 ], uint32_t );
1009+ uint32_t i3;
1010+ if (!ClrSafeInt<uint32_t >::addition (i1, i2, i3))
1011+ COMPlusThrow (kOverflowException );
1012+ LOCAL_VAR (ip[1 ], uint32_t ) = i3;
1013+ ip += 4 ;
1014+ break ;
1015+ }
1016+ case INTOP_ADD_OVF_UN_I8:
1017+ {
1018+ uint64_t i1 = LOCAL_VAR (ip[2 ], uint64_t );
1019+ uint64_t i2 = LOCAL_VAR (ip[3 ], uint64_t );
1020+ uint64_t i3;
1021+ if (!ClrSafeInt<uint64_t >::addition (i1, i2, i3))
1022+ COMPlusThrow (kOverflowException );
1023+ LOCAL_VAR (ip[1 ], uint64_t ) = i3;
1024+ ip += 4 ;
1025+ break ;
1026+ }
9831027 case INTOP_SUB_I4:
9841028 LOCAL_VAR (ip[1 ], int32_t ) = LOCAL_VAR (ip[2 ], int32_t ) - LOCAL_VAR (ip[3 ], int32_t );
9851029 ip += 4 ;
@@ -997,6 +1041,51 @@ void InterpExecMethod(InterpreterFrame *pInterpreterFrame, InterpMethodContextFr
9971041 ip += 4 ;
9981042 break ;
9991043
1044+ case INTOP_SUB_OVF_I4:
1045+ {
1046+ int32_t i1 = LOCAL_VAR (ip[2 ], int32_t );
1047+ int32_t i2 = LOCAL_VAR (ip[3 ], int32_t );
1048+ int32_t i3;
1049+ if (!ClrSafeInt<int32_t >::subtraction (i1, i2, i3))
1050+ COMPlusThrow (kOverflowException );
1051+ LOCAL_VAR (ip[1 ], int32_t ) = i3;
1052+ ip += 4 ;
1053+ break ;
1054+ }
1055+ case INTOP_SUB_OVF_I8:
1056+ {
1057+ int64_t i1 = LOCAL_VAR (ip[2 ], int64_t );
1058+ int64_t i2 = LOCAL_VAR (ip[3 ], int64_t );
1059+ int64_t i3;
1060+ if (!ClrSafeInt<int64_t >::subtraction (i1, i2, i3))
1061+ COMPlusThrow (kOverflowException );
1062+ LOCAL_VAR (ip[1 ], int64_t ) = i3;
1063+ ip += 4 ;
1064+ break ;
1065+ }
1066+ case INTOP_SUB_OVF_UN_I4:
1067+ {
1068+ uint32_t i1 = LOCAL_VAR (ip[2 ], uint32_t );
1069+ uint32_t i2 = LOCAL_VAR (ip[3 ], uint32_t );
1070+ uint32_t i3;
1071+ if (!ClrSafeInt<uint32_t >::subtraction (i1, i2, i3))
1072+ COMPlusThrow (kOverflowException );
1073+ LOCAL_VAR (ip[1 ], uint32_t ) = i3;
1074+ ip += 4 ;
1075+ break ;
1076+ }
1077+ case INTOP_SUB_OVF_UN_I8:
1078+ {
1079+ uint64_t i1 = LOCAL_VAR (ip[2 ], uint64_t );
1080+ uint64_t i2 = LOCAL_VAR (ip[3 ], uint64_t );
1081+ uint64_t i3;
1082+ if (!ClrSafeInt<uint64_t >::subtraction (i1, i2, i3))
1083+ COMPlusThrow (kOverflowException );
1084+ LOCAL_VAR (ip[1 ], uint64_t ) = i3;
1085+ ip += 4 ;
1086+ break ;
1087+ }
1088+
10001089 case INTOP_MUL_I4:
10011090 LOCAL_VAR (ip[1 ], int32_t ) = LOCAL_VAR (ip[2 ], int32_t ) * LOCAL_VAR (ip[3 ], int32_t );
10021091 ip += 4 ;
0 commit comments