[clang] f44ec21 - [clang][bytecode][NFC] Move float->ap cast ops to the source file (#207592)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Jul 5 23:44:34 PDT 2026
Author: Timm Baeder
Date: 2026-07-06T08:44:30+02:00
New Revision: f44ec21260a193a197727962326f07d4a3150af9
URL: https://github.com/llvm/llvm-project/commit/f44ec21260a193a197727962326f07d4a3150af9
DIFF: https://github.com/llvm/llvm-project/commit/f44ec21260a193a197727962326f07d4a3150af9.diff
LOG: [clang][bytecode][NFC] Move float->ap cast ops to the source file (#207592)
And deduplicate the code.
Added:
Modified:
clang/lib/AST/ByteCode/Interp.cpp
clang/lib/AST/ByteCode/Interp.h
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/Interp.cpp b/clang/lib/AST/ByteCode/Interp.cpp
index 7884aa5b5b745..63364287cc859 100644
--- a/clang/lib/AST/ByteCode/Interp.cpp
+++ b/clang/lib/AST/ByteCode/Interp.cpp
@@ -3088,6 +3088,39 @@ bool CopyMemberPtrPath(InterpState &S, const RecordDecl *Entry,
return true;
}
+template <bool Signed>
+static bool floatAPCast(InterpState &S, CodePtr OpPC, const Floating &F,
+ uint32_t BitWidth, uint32_t FPOI) {
+ APSInt Result(BitWidth, /*IsUnsigned=*/!Signed);
+ auto Status = F.convertToInteger(Result);
+
+ // Float-to-Integral overflow check.
+ if ((Status & APFloat::opStatus::opInvalidOp) && F.isFinite() &&
+ !handleOverflow(S, OpPC, F.getAPFloat()))
+ return false;
+
+ FPOptions FPO = FPOptions::getFromOpaqueInt(FPOI);
+
+ auto ResultAP = S.allocAP<IntegralAP<Signed>>(BitWidth);
+ ResultAP.copy(Result);
+
+ S.Stk.push<IntegralAP<Signed>>(ResultAP);
+
+ return CheckFloatResult(S, OpPC, F, Status, FPO);
+}
+
+bool CastFloatingIntegralAP(InterpState &S, CodePtr OpPC, uint32_t BitWidth,
+ uint32_t FPOI) {
+ Floating F = S.Stk.pop<Floating>();
+ return floatAPCast<false>(S, OpPC, F, BitWidth, FPOI);
+}
+
+bool CastFloatingIntegralAPS(InterpState &S, CodePtr OpPC, uint32_t BitWidth,
+ uint32_t FPOI) {
+ Floating F = S.Stk.pop<Floating>();
+ return floatAPCast<true>(S, OpPC, F, BitWidth, FPOI);
+}
+
// FIXME: Would be nice to generate this instead of hardcoding it here.
constexpr bool OpReturns(Opcode Op) {
return Op == OP_RetVoid || Op == OP_RetValue || Op == OP_NoRet ||
diff --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h
index 13e7798fcf365..4b8fc93909697 100644
--- a/clang/lib/AST/ByteCode/Interp.h
+++ b/clang/lib/AST/ByteCode/Interp.h
@@ -146,6 +146,10 @@ bool isConstexprUnknown(const Pointer &P);
bool isConstexprUnknown(const Block *B);
bool DynamicCast(InterpState &S, CodePtr OpPC, const Type *DestType,
bool IsReferenceCast);
+bool CastFloatingIntegralAP(InterpState &S, CodePtr OpPC, uint32_t BitWidth,
+ uint32_t FPOI);
+bool CastFloatingIntegralAPS(InterpState &S, CodePtr OpPC, uint32_t BitWidth,
+ uint32_t FPOI);
enum class ShiftDir { Left, Right };
@@ -2947,50 +2951,6 @@ bool CastFloatingIntegral(InterpState &S, CodePtr OpPC, uint32_t FPOI) {
}
}
-static inline bool CastFloatingIntegralAP(InterpState &S, CodePtr OpPC,
- uint32_t BitWidth, uint32_t FPOI) {
- const Floating &F = S.Stk.pop<Floating>();
-
- APSInt Result(BitWidth, /*IsUnsigned=*/true);
- auto Status = F.convertToInteger(Result);
-
- // Float-to-Integral overflow check.
- if ((Status & APFloat::opStatus::opInvalidOp) && F.isFinite() &&
- !handleOverflow(S, OpPC, F.getAPFloat()))
- return false;
-
- FPOptions FPO = FPOptions::getFromOpaqueInt(FPOI);
-
- auto ResultAP = S.allocAP<IntegralAP<false>>(BitWidth);
- ResultAP.copy(Result);
-
- S.Stk.push<IntegralAP<false>>(ResultAP);
-
- return CheckFloatResult(S, OpPC, F, Status, FPO);
-}
-
-static inline bool CastFloatingIntegralAPS(InterpState &S, CodePtr OpPC,
- uint32_t BitWidth, uint32_t FPOI) {
- const Floating &F = S.Stk.pop<Floating>();
-
- APSInt Result(BitWidth, /*IsUnsigned=*/false);
- auto Status = F.convertToInteger(Result);
-
- // Float-to-Integral overflow check.
- if ((Status & APFloat::opStatus::opInvalidOp) && F.isFinite() &&
- !handleOverflow(S, OpPC, F.getAPFloat()))
- return false;
-
- FPOptions FPO = FPOptions::getFromOpaqueInt(FPOI);
-
- auto ResultAP = S.allocAP<IntegralAP<true>>(BitWidth);
- ResultAP.copy(Result);
-
- S.Stk.push<IntegralAP<true>>(ResultAP);
-
- return CheckFloatResult(S, OpPC, F, Status, FPO);
-}
-
bool CheckPointerToIntegralCast(InterpState &S, CodePtr OpPC,
const Pointer &Ptr, unsigned BitWidth);
bool CheckIntegralAddressCast(InterpState &S, CodePtr OpPC, unsigned BitWidth);
More information about the cfe-commits
mailing list