@@ -63,7 +63,8 @@ static mlir::Value tryUseTestFPKind(CIRGenFunction &CGF, unsigned BuiltinID,
6363}
6464
6565template <class Operation >
66- static RValue emitUnaryFPBuiltin (CIRGenFunction &CGF, const CallExpr &E) {
66+ static RValue emitUnaryMaybeConstrainedFPBuiltin (CIRGenFunction &CGF,
67+ const CallExpr &E) {
6768 auto Arg = CGF.emitScalarExpr (E.getArg (0 ));
6869
6970 CIRGenFunction::CIRGenFPOptionsRAII FPOptsRAII (CGF, &E);
@@ -75,6 +76,14 @@ static RValue emitUnaryFPBuiltin(CIRGenFunction &CGF, const CallExpr &E) {
7576 return RValue::get (Call->getResult (0 ));
7677}
7778
79+ template <class Operation >
80+ static RValue emitUnaryFPBuiltin (CIRGenFunction &CGF, const CallExpr &E) {
81+ auto Arg = CGF.emitScalarExpr (E.getArg (0 ));
82+ auto Call =
83+ CGF.getBuilder ().create <Operation>(Arg.getLoc (), Arg.getType (), Arg);
84+ return RValue::get (Call->getResult (0 ));
85+ }
86+
7887template <typename Op>
7988static RValue emitUnaryMaybeConstrainedFPToIntBuiltin (CIRGenFunction &CGF,
8089 const CallExpr &E) {
@@ -600,7 +609,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
600609 case Builtin::BI__builtin_ceilf16:
601610 case Builtin::BI__builtin_ceill:
602611 case Builtin::BI__builtin_ceilf128:
603- return emitUnaryFPBuiltin <cir::CeilOp>(*this , *E);
612+ return emitUnaryMaybeConstrainedFPBuiltin <cir::CeilOp>(*this , *E);
604613
605614 case Builtin::BIcopysign:
606615 case Builtin::BIcopysignf:
@@ -623,7 +632,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
623632 case Builtin::BI__builtin_cosl:
624633 case Builtin::BI__builtin_cosf128:
625634 assert (!cir::MissingFeatures::fastMathFlags ());
626- return emitUnaryFPBuiltin <cir::CosOp>(*this , *E);
635+ return emitUnaryMaybeConstrainedFPBuiltin <cir::CosOp>(*this , *E);
627636
628637 case Builtin::BIcosh:
629638 case Builtin::BIcoshf:
@@ -644,7 +653,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
644653 case Builtin::BI__builtin_expl:
645654 case Builtin::BI__builtin_expf128:
646655 assert (!cir::MissingFeatures::fastMathFlags ());
647- return emitUnaryFPBuiltin <cir::ExpOp>(*this , *E);
656+ return emitUnaryMaybeConstrainedFPBuiltin <cir::ExpOp>(*this , *E);
648657
649658 case Builtin::BIexp2:
650659 case Builtin::BIexp2f:
@@ -655,7 +664,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
655664 case Builtin::BI__builtin_exp2l:
656665 case Builtin::BI__builtin_exp2f128:
657666 assert (!cir::MissingFeatures::fastMathFlags ());
658- return emitUnaryFPBuiltin <cir::Exp2Op>(*this , *E);
667+ return emitUnaryMaybeConstrainedFPBuiltin <cir::Exp2Op>(*this , *E);
659668
660669 case Builtin::BI__builtin_exp10:
661670 case Builtin::BI__builtin_exp10f:
@@ -672,7 +681,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
672681 case Builtin::BI__builtin_fabsf16:
673682 case Builtin::BI__builtin_fabsl:
674683 case Builtin::BI__builtin_fabsf128:
675- return emitUnaryFPBuiltin <cir::FAbsOp>(*this , *E);
684+ return emitUnaryMaybeConstrainedFPBuiltin <cir::FAbsOp>(*this , *E);
676685
677686 case Builtin::BIfloor:
678687 case Builtin::BIfloorf:
@@ -682,7 +691,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
682691 case Builtin::BI__builtin_floorf16:
683692 case Builtin::BI__builtin_floorl:
684693 case Builtin::BI__builtin_floorf128:
685- return emitUnaryFPBuiltin <cir::FloorOp>(*this , *E);
694+ return emitUnaryMaybeConstrainedFPBuiltin <cir::FloorOp>(*this , *E);
686695
687696 case Builtin::BIfma:
688697 case Builtin::BIfmaf:
@@ -745,7 +754,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
745754 case Builtin::BI__builtin_logl:
746755 case Builtin::BI__builtin_logf128:
747756 assert (!cir::MissingFeatures::fastMathFlags ());
748- return emitUnaryFPBuiltin <cir::LogOp>(*this , *E);
757+ return emitUnaryMaybeConstrainedFPBuiltin <cir::LogOp>(*this , *E);
749758
750759 case Builtin::BIlog10:
751760 case Builtin::BIlog10f:
@@ -756,7 +765,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
756765 case Builtin::BI__builtin_log10l:
757766 case Builtin::BI__builtin_log10f128:
758767 assert (!cir::MissingFeatures::fastMathFlags ());
759- return emitUnaryFPBuiltin <cir::Log10Op>(*this , *E);
768+ return emitUnaryMaybeConstrainedFPBuiltin <cir::Log10Op>(*this , *E);
760769
761770 case Builtin::BIlog2:
762771 case Builtin::BIlog2f:
@@ -767,7 +776,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
767776 case Builtin::BI__builtin_log2l:
768777 case Builtin::BI__builtin_log2f128:
769778 assert (!cir::MissingFeatures::fastMathFlags ());
770- return emitUnaryFPBuiltin <cir::Log2Op>(*this , *E);
779+ return emitUnaryMaybeConstrainedFPBuiltin <cir::Log2Op>(*this , *E);
771780
772781 case Builtin::BInearbyint:
773782 case Builtin::BInearbyintf:
@@ -776,7 +785,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
776785 case Builtin::BI__builtin_nearbyintf:
777786 case Builtin::BI__builtin_nearbyintl:
778787 case Builtin::BI__builtin_nearbyintf128:
779- return emitUnaryFPBuiltin <cir::NearbyintOp>(*this , *E);
788+ return emitUnaryMaybeConstrainedFPBuiltin <cir::NearbyintOp>(*this , *E);
780789
781790 case Builtin::BIpow:
782791 case Builtin::BIpowf:
@@ -800,7 +809,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
800809 case Builtin::BI__builtin_rintf16:
801810 case Builtin::BI__builtin_rintl:
802811 case Builtin::BI__builtin_rintf128:
803- return emitUnaryFPBuiltin <cir::RintOp>(*this , *E);
812+ return emitUnaryMaybeConstrainedFPBuiltin <cir::RintOp>(*this , *E);
804813
805814 case Builtin::BIround:
806815 case Builtin::BIroundf:
@@ -810,7 +819,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
810819 case Builtin::BI__builtin_roundf16:
811820 case Builtin::BI__builtin_roundl:
812821 case Builtin::BI__builtin_roundf128:
813- return emitUnaryFPBuiltin <cir::RoundOp>(*this , *E);
822+ return emitUnaryMaybeConstrainedFPBuiltin <cir::RoundOp>(*this , *E);
814823
815824 case Builtin::BIroundeven:
816825 case Builtin::BIroundevenf:
@@ -831,7 +840,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
831840 case Builtin::BI__builtin_sinl:
832841 case Builtin::BI__builtin_sinf128:
833842 assert (!cir::MissingFeatures::fastMathFlags ());
834- return emitUnaryFPBuiltin <cir::SinOp>(*this , *E);
843+ return emitUnaryMaybeConstrainedFPBuiltin <cir::SinOp>(*this , *E);
835844
836845 case Builtin::BIsqrt:
837846 case Builtin::BIsqrtf:
@@ -842,7 +851,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
842851 case Builtin::BI__builtin_sqrtl:
843852 case Builtin::BI__builtin_sqrtf128:
844853 assert (!cir::MissingFeatures::fastMathFlags ());
845- return emitUnaryFPBuiltin <cir::SqrtOp>(*this , *E);
854+ return emitUnaryMaybeConstrainedFPBuiltin <cir::SqrtOp>(*this , *E);
846855
847856 case Builtin::BI__builtin_elementwise_sqrt:
848857 llvm_unreachable (" BI__builtin_elementwise_sqrt NYI" );
@@ -875,7 +884,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
875884 case Builtin::BI__builtin_truncf16:
876885 case Builtin::BI__builtin_truncl:
877886 case Builtin::BI__builtin_truncf128:
878- return emitUnaryFPBuiltin <cir::TruncOp>(*this , *E);
887+ return emitUnaryMaybeConstrainedFPBuiltin <cir::TruncOp>(*this , *E);
879888
880889 case Builtin::BIlround:
881890 case Builtin::BIlroundf:
@@ -1344,7 +1353,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
13441353 if (mlir::isa<cir::VectorType>(cirTy))
13451354 eltTy = mlir::cast<cir::VectorType>(cirTy).getEltType ();
13461355 if (mlir::isa<cir::SingleType, cir::DoubleType>(eltTy)) {
1347- return emitUnaryFPBuiltin <cir::FAbsOp>(*this , *E);
1356+ return emitUnaryMaybeConstrainedFPBuiltin <cir::FAbsOp>(*this , *E);
13481357 }
13491358 llvm_unreachable (" unsupported type for BI__builtin_elementwise_abs" );
13501359 }
@@ -1365,8 +1374,9 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
13651374 llvm_unreachable (" BI__builtin_elementwise_atan2 NYI" );
13661375 case Builtin::BI__builtin_elementwise_ceil:
13671376 llvm_unreachable (" BI__builtin_elementwise_ceil NYI" );
1368- case Builtin::BI__builtin_elementwise_exp:
1369- llvm_unreachable (" BI__builtin_elementwise_exp NYI" );
1377+ case Builtin::BI__builtin_elementwise_exp: {
1378+ return emitUnaryFPBuiltin<cir::ExpOp>(*this , *E);
1379+ }
13701380 case Builtin::BI__builtin_elementwise_exp2:
13711381 llvm_unreachable (" BI__builtin_elementwise_exp2 NYI" );
13721382 case Builtin::BI__builtin_elementwise_log:
0 commit comments