@@ -748,7 +748,8 @@ bool Compiler<Emitter>::VisitFloatingLiteral(const FloatingLiteral *E) {
748748 if (DiscardResult)
749749 return true ;
750750
751- return this ->emitConstFloat (E->getValue (), E);
751+ APFloat F = E->getValue ();
752+ return this ->emitFloat (F, E);
752753}
753754
754755template <class Emitter >
@@ -4185,13 +4186,14 @@ bool Compiler<Emitter>::visitZeroInitializer(PrimType T, QualType QT,
41854186 nullptr , E);
41864187 case PT_MemberPtr:
41874188 return this ->emitNullMemberPtr (0 , nullptr , E);
4188- case PT_Float:
4189- return this ->emitConstFloat (APFloat::getZero (Ctx.getFloatSemantics (QT)), E);
4189+ case PT_Float: {
4190+ APFloat F = APFloat::getZero (Ctx.getFloatSemantics (QT));
4191+ return this ->emitFloat (F, E);
4192+ }
41904193 case PT_FixedPoint: {
41914194 auto Sem = Ctx.getASTContext ().getFixedPointSemantics (E->getType ());
41924195 return this ->emitConstFixedPoint (FixedPoint::zero (Sem), E);
41934196 }
4194- llvm_unreachable (" Implement" );
41954197 }
41964198 llvm_unreachable (" unknown primitive type" );
41974199}
@@ -4674,10 +4676,7 @@ VarCreationState Compiler<Emitter>::visitVarDecl(const VarDecl *VD,
46744676 if (!visitInitializer (Init))
46754677 return false ;
46764678
4677- if (!this ->emitFinishInit (Init))
4678- return false ;
4679-
4680- return this ->emitPopPtr (Init);
4679+ return this ->emitFinishInitGlobal (Init);
46814680 };
46824681
46834682 DeclScope<Emitter> LocalScope (this , VD);
@@ -4698,51 +4697,45 @@ VarCreationState Compiler<Emitter>::visitVarDecl(const VarDecl *VD,
46984697 return false ;
46994698
47004699 return !Init || (checkDecl () && initGlobal (*GlobalIndex));
4701- } else {
4702- InitLinkScope<Emitter> ILS (this , InitLink::Decl (VD));
4703-
4704- if (VarT) {
4705- unsigned Offset = this ->allocateLocalPrimitive (
4706- VD, *VarT, VD->getType ().isConstQualified (), nullptr ,
4707- ScopeKind::Block, IsConstexprUnknown);
4708- if (Init) {
4709- // If this is a toplevel declaration, create a scope for the
4710- // initializer.
4711- if (Toplevel) {
4712- LocalScope<Emitter> Scope (this );
4713- if (!this ->visit (Init))
4714- return false ;
4715- return this ->emitSetLocal (*VarT, Offset, VD) && Scope.destroyLocals ();
4716- } else {
4717- if (!this ->visit (Init))
4718- return false ;
4719- return this ->emitSetLocal (*VarT, Offset, VD);
4720- }
4721- }
4722- } else {
4723- if (std::optional<unsigned > Offset =
4724- this ->allocateLocal (VD, VD->getType (), nullptr , ScopeKind::Block,
4725- IsConstexprUnknown)) {
4726- if (!Init)
4727- return true ;
4700+ }
4701+ // Local variables.
4702+ InitLinkScope<Emitter> ILS (this , InitLink::Decl (VD));
47284703
4729- if (!this ->emitGetPtrLocal (*Offset, Init))
4704+ if (VarT) {
4705+ unsigned Offset = this ->allocateLocalPrimitive (
4706+ VD, *VarT, VD->getType ().isConstQualified (), nullptr , ScopeKind::Block,
4707+ IsConstexprUnknown);
4708+ if (Init) {
4709+ // If this is a toplevel declaration, create a scope for the
4710+ // initializer.
4711+ if (Toplevel) {
4712+ LocalScope<Emitter> Scope (this );
4713+ if (!this ->visit (Init))
47304714 return false ;
4731-
4732- if (!visitInitializer (Init))
4715+ return this ->emitSetLocal (*VarT, Offset, VD) && Scope.destroyLocals ();
4716+ } else {
4717+ if (!this ->visit (Init))
47334718 return false ;
4719+ return this ->emitSetLocal (*VarT, Offset, VD);
4720+ }
4721+ }
4722+ } else {
4723+ if (std::optional<unsigned > Offset = this ->allocateLocal (
4724+ VD, VD->getType (), nullptr , ScopeKind::Block, IsConstexprUnknown)) {
4725+ if (!Init)
4726+ return true ;
47344727
4735- if (!this ->emitFinishInit ( Init))
4736- return false ;
4728+ if (!this ->emitGetPtrLocal (*Offset, Init))
4729+ return false ;
47374730
4738- return this ->emitPopPtr (Init);
4739- }
4740- return false ;
4731+ if (!visitInitializer (Init))
4732+ return false ;
4733+
4734+ return this ->emitFinishInitPop (Init);
47414735 }
4742- return true ;
4736+ return false ;
47434737 }
4744-
4745- return false ;
4738+ return true ;
47464739}
47474740
47484741template <class Emitter >
@@ -4751,8 +4744,10 @@ bool Compiler<Emitter>::visitAPValue(const APValue &Val, PrimType ValType,
47514744 assert (!DiscardResult);
47524745 if (Val.isInt ())
47534746 return this ->emitConst (Val.getInt (), ValType, E);
4754- else if (Val.isFloat ())
4755- return this ->emitConstFloat (Val.getFloat (), E);
4747+ else if (Val.isFloat ()) {
4748+ APFloat F = Val.getFloat ();
4749+ return this ->emitFloat (F, E);
4750+ }
47564751
47574752 if (Val.isLValue ()) {
47584753 if (Val.isNullPointer ())
@@ -6133,8 +6128,10 @@ bool Compiler<Emitter>::VisitUnaryOperator(const UnaryOperator *E) {
61336128 const auto &TargetSemantics = Ctx.getFloatSemantics (E->getType ());
61346129 if (!this ->emitLoadFloat (E))
61356130 return false ;
6136- if (!this ->emitConstFloat (llvm::APFloat (TargetSemantics, 1 ), E))
6131+ APFloat F (TargetSemantics, 1 );
6132+ if (!this ->emitFloat (F, E))
61376133 return false ;
6134+
61386135 if (!this ->emitAddf (getFPOptions (E), E))
61396136 return false ;
61406137 if (!this ->emitStoreFloat (E))
@@ -6176,8 +6173,10 @@ bool Compiler<Emitter>::VisitUnaryOperator(const UnaryOperator *E) {
61766173 const auto &TargetSemantics = Ctx.getFloatSemantics (E->getType ());
61776174 if (!this ->emitLoadFloat (E))
61786175 return false ;
6179- if (!this ->emitConstFloat (llvm::APFloat (TargetSemantics, 1 ), E))
6176+ APFloat F (TargetSemantics, 1 );
6177+ if (!this ->emitFloat (F, E))
61806178 return false ;
6179+
61816180 if (!this ->emitSubf (getFPOptions (E), E))
61826181 return false ;
61836182 if (!this ->emitStoreFloat (E))
@@ -6953,6 +6952,20 @@ bool Compiler<Emitter>::emitDummyPtr(const DeclTy &D, const Expr *E) {
69536952 return true ;
69546953}
69556954
6955+ template <class Emitter >
6956+ bool Compiler<Emitter>::emitFloat(const APFloat &F, const Expr *E) {
6957+ assert (!DiscardResult && " Should've been checked before" );
6958+
6959+ if (Floating::singleWord (F.getSemantics ()))
6960+ return this ->emitConstFloat (Floating (F), E);
6961+
6962+ APInt I = F.bitcastToAPInt ();
6963+ return this ->emitConstFloat (
6964+ Floating (const_cast <uint64_t *>(I.getRawData ()),
6965+ llvm::APFloatBase::SemanticsToEnum (F.getSemantics ())),
6966+ E);
6967+ }
6968+
69566969// This function is constexpr if and only if To, From, and the types of
69576970// all subobjects of To and From are types T such that...
69586971// (3.1) - is_union_v<T> is false;
0 commit comments