@@ -172,7 +172,8 @@ bool CheckDivRem(InterpState &S, CodePtr OpPC, const T &LHS, const T &RHS) {
172
172
173
173
// / Checks if the result of a floating-point operation is valid
174
174
// / in the current context.
175
- bool CheckFloatResult (InterpState &S, CodePtr OpPC, APFloat::opStatus Status);
175
+ bool CheckFloatResult (InterpState &S, CodePtr OpPC, const Floating &Result,
176
+ APFloat::opStatus Status);
176
177
177
178
// / Interpreter entry point.
178
179
bool Interpret (InterpState &S, APValue &Result);
@@ -304,7 +305,7 @@ inline bool Addf(InterpState &S, CodePtr OpPC, llvm::RoundingMode RM) {
304
305
Floating Result;
305
306
auto Status = Floating::add (LHS, RHS, RM, &Result);
306
307
S.Stk .push <Floating>(Result);
307
- return CheckFloatResult (S, OpPC, Status);
308
+ return CheckFloatResult (S, OpPC, Result, Status);
308
309
}
309
310
310
311
template <PrimType Name, class T = typename PrimConv<Name>::T>
@@ -322,7 +323,7 @@ inline bool Subf(InterpState &S, CodePtr OpPC, llvm::RoundingMode RM) {
322
323
Floating Result;
323
324
auto Status = Floating::sub (LHS, RHS, RM, &Result);
324
325
S.Stk .push <Floating>(Result);
325
- return CheckFloatResult (S, OpPC, Status);
326
+ return CheckFloatResult (S, OpPC, Result, Status);
326
327
}
327
328
328
329
template <PrimType Name, class T = typename PrimConv<Name>::T>
@@ -340,7 +341,7 @@ inline bool Mulf(InterpState &S, CodePtr OpPC, llvm::RoundingMode RM) {
340
341
Floating Result;
341
342
auto Status = Floating::mul (LHS, RHS, RM, &Result);
342
343
S.Stk .push <Floating>(Result);
343
- return CheckFloatResult (S, OpPC, Status);
344
+ return CheckFloatResult (S, OpPC, Result, Status);
344
345
}
345
346
// / 1) Pops the RHS from the stack.
346
347
// / 2) Pops the LHS from the stack.
@@ -443,7 +444,7 @@ inline bool Divf(InterpState &S, CodePtr OpPC, llvm::RoundingMode RM) {
443
444
Floating Result;
444
445
auto Status = Floating::div (LHS, RHS, RM, &Result);
445
446
S.Stk .push <Floating>(Result);
446
- return CheckFloatResult (S, OpPC, Status);
447
+ return CheckFloatResult (S, OpPC, Result, Status);
447
448
}
448
449
449
450
// ===----------------------------------------------------------------------===//
@@ -622,7 +623,7 @@ bool IncDecFloatHelper(InterpState &S, CodePtr OpPC, const Pointer &Ptr,
622
623
623
624
Ptr .deref <Floating>() = Result;
624
625
625
- return CheckFloatResult (S, OpPC, Status);
626
+ return CheckFloatResult (S, OpPC, Result, Status);
626
627
}
627
628
628
629
inline bool Incf (InterpState &S, CodePtr OpPC, llvm::RoundingMode RM) {
@@ -1525,7 +1526,7 @@ bool CastIntegralFloating(InterpState &S, CodePtr OpPC,
1525
1526
auto Status = Floating::fromIntegral (FromAP, *Sem, RM, Result);
1526
1527
S.Stk .push <Floating>(Result);
1527
1528
1528
- return CheckFloatResult (S, OpPC, Status);
1529
+ return CheckFloatResult (S, OpPC, Result, Status);
1529
1530
}
1530
1531
1531
1532
template <PrimType Name, class T = typename PrimConv<Name>::T>
@@ -1550,7 +1551,7 @@ bool CastFloatingIntegral(InterpState &S, CodePtr OpPC) {
1550
1551
}
1551
1552
1552
1553
S.Stk .push <T>(T (Result));
1553
- return CheckFloatResult (S, OpPC, Status);
1554
+ return CheckFloatResult (S, OpPC, F, Status);
1554
1555
}
1555
1556
}
1556
1557
0 commit comments