@@ -96,10 +96,21 @@ static void pushInteger(InterpState &S, T Val, QualType QT) {
96
96
QT);
97
97
}
98
98
99
- static void assignInteger (const Pointer &Dest, PrimType ValueT,
99
+ static void assignInteger (InterpState &S, const Pointer &Dest, PrimType ValueT,
100
100
const APSInt &Value) {
101
- INT_TYPE_SWITCH_NO_BOOL (
102
- ValueT, { Dest.deref <T>() = T::from (static_cast <T>(Value)); });
101
+
102
+ if (ValueT == PT_IntAPS) {
103
+ Dest.deref <IntegralAP<true >>() =
104
+ S.allocAP <IntegralAP<true >>(Value.getBitWidth ());
105
+ Dest.deref <IntegralAP<true >>().copy (Value);
106
+ } else if (ValueT == PT_IntAP) {
107
+ Dest.deref <IntegralAP<false >>() =
108
+ S.allocAP <IntegralAP<false >>(Value.getBitWidth ());
109
+ Dest.deref <IntegralAP<false >>().copy (Value);
110
+ } else {
111
+ INT_TYPE_SWITCH_NO_BOOL (
112
+ ValueT, { Dest.deref <T>() = T::from (static_cast <T>(Value)); });
113
+ }
103
114
}
104
115
105
116
static QualType getElemType (const Pointer &P) {
@@ -849,7 +860,7 @@ static bool interp__builtin_overflowop(InterpState &S, CodePtr OpPC,
849
860
}
850
861
851
862
// Write Result to ResultPtr and put Overflow on the stack.
852
- assignInteger (ResultPtr, ResultT, Result);
863
+ assignInteger (S, ResultPtr, ResultT, Result);
853
864
ResultPtr.initialize ();
854
865
assert (Call->getDirectCallee ()->getReturnType ()->isBooleanType ());
855
866
S.Stk .push <Boolean>(Overflow);
@@ -902,7 +913,7 @@ static bool interp__builtin_carryop(InterpState &S, CodePtr OpPC,
902
913
903
914
QualType CarryOutType = Call->getArg (3 )->getType ()->getPointeeType ();
904
915
PrimType CarryOutT = *S.getContext ().classify (CarryOutType);
905
- assignInteger (CarryOutPtr, CarryOutT, CarryOut);
916
+ assignInteger (S, CarryOutPtr, CarryOutT, CarryOut);
906
917
CarryOutPtr.initialize ();
907
918
908
919
assert (Call->getType () == Call->getArg (0 )->getType ());
@@ -1414,7 +1425,7 @@ static bool interp__builtin_ia32_addcarry_subborrow(InterpState &S,
1414
1425
1415
1426
QualType CarryOutType = Call->getArg (3 )->getType ()->getPointeeType ();
1416
1427
PrimType CarryOutT = *S.getContext ().classify (CarryOutType);
1417
- assignInteger (CarryOutPtr, CarryOutT, APSInt (Result, true ));
1428
+ assignInteger (S, CarryOutPtr, CarryOutT, APSInt (Result, true ));
1418
1429
1419
1430
pushInteger (S, CarryOut, Call->getType ());
1420
1431
0 commit comments