@@ -63,7 +63,8 @@ static mlir::Value tryUseTestFPKind(CIRGenFunction &CGF, unsigned BuiltinID,
63
63
}
64
64
65
65
template <class Operation >
66
- static RValue emitUnaryFPBuiltin (CIRGenFunction &CGF, const CallExpr &E) {
66
+ static RValue emitUnaryMaybeConstrainedFPBuiltin (CIRGenFunction &CGF,
67
+ const CallExpr &E) {
67
68
auto Arg = CGF.emitScalarExpr (E.getArg (0 ));
68
69
69
70
CIRGenFunction::CIRGenFPOptionsRAII FPOptsRAII (CGF, &E);
@@ -75,6 +76,14 @@ static RValue emitUnaryFPBuiltin(CIRGenFunction &CGF, const CallExpr &E) {
75
76
return RValue::get (Call->getResult (0 ));
76
77
}
77
78
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
+
78
87
template <typename Op>
79
88
static RValue emitUnaryMaybeConstrainedFPToIntBuiltin (CIRGenFunction &CGF,
80
89
const CallExpr &E) {
@@ -600,7 +609,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
600
609
case Builtin::BI__builtin_ceilf16:
601
610
case Builtin::BI__builtin_ceill:
602
611
case Builtin::BI__builtin_ceilf128:
603
- return emitUnaryFPBuiltin <cir::CeilOp>(*this , *E);
612
+ return emitUnaryMaybeConstrainedFPBuiltin <cir::CeilOp>(*this , *E);
604
613
605
614
case Builtin::BIcopysign:
606
615
case Builtin::BIcopysignf:
@@ -623,7 +632,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
623
632
case Builtin::BI__builtin_cosl:
624
633
case Builtin::BI__builtin_cosf128:
625
634
assert (!cir::MissingFeatures::fastMathFlags ());
626
- return emitUnaryFPBuiltin <cir::CosOp>(*this , *E);
635
+ return emitUnaryMaybeConstrainedFPBuiltin <cir::CosOp>(*this , *E);
627
636
628
637
case Builtin::BIcosh:
629
638
case Builtin::BIcoshf:
@@ -644,7 +653,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
644
653
case Builtin::BI__builtin_expl:
645
654
case Builtin::BI__builtin_expf128:
646
655
assert (!cir::MissingFeatures::fastMathFlags ());
647
- return emitUnaryFPBuiltin <cir::ExpOp>(*this , *E);
656
+ return emitUnaryMaybeConstrainedFPBuiltin <cir::ExpOp>(*this , *E);
648
657
649
658
case Builtin::BIexp2:
650
659
case Builtin::BIexp2f:
@@ -655,7 +664,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
655
664
case Builtin::BI__builtin_exp2l:
656
665
case Builtin::BI__builtin_exp2f128:
657
666
assert (!cir::MissingFeatures::fastMathFlags ());
658
- return emitUnaryFPBuiltin <cir::Exp2Op>(*this , *E);
667
+ return emitUnaryMaybeConstrainedFPBuiltin <cir::Exp2Op>(*this , *E);
659
668
660
669
case Builtin::BI__builtin_exp10:
661
670
case Builtin::BI__builtin_exp10f:
@@ -672,7 +681,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
672
681
case Builtin::BI__builtin_fabsf16:
673
682
case Builtin::BI__builtin_fabsl:
674
683
case Builtin::BI__builtin_fabsf128:
675
- return emitUnaryFPBuiltin <cir::FAbsOp>(*this , *E);
684
+ return emitUnaryMaybeConstrainedFPBuiltin <cir::FAbsOp>(*this , *E);
676
685
677
686
case Builtin::BIfloor:
678
687
case Builtin::BIfloorf:
@@ -682,7 +691,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
682
691
case Builtin::BI__builtin_floorf16:
683
692
case Builtin::BI__builtin_floorl:
684
693
case Builtin::BI__builtin_floorf128:
685
- return emitUnaryFPBuiltin <cir::FloorOp>(*this , *E);
694
+ return emitUnaryMaybeConstrainedFPBuiltin <cir::FloorOp>(*this , *E);
686
695
687
696
case Builtin::BIfma:
688
697
case Builtin::BIfmaf:
@@ -745,7 +754,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
745
754
case Builtin::BI__builtin_logl:
746
755
case Builtin::BI__builtin_logf128:
747
756
assert (!cir::MissingFeatures::fastMathFlags ());
748
- return emitUnaryFPBuiltin <cir::LogOp>(*this , *E);
757
+ return emitUnaryMaybeConstrainedFPBuiltin <cir::LogOp>(*this , *E);
749
758
750
759
case Builtin::BIlog10:
751
760
case Builtin::BIlog10f:
@@ -756,7 +765,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
756
765
case Builtin::BI__builtin_log10l:
757
766
case Builtin::BI__builtin_log10f128:
758
767
assert (!cir::MissingFeatures::fastMathFlags ());
759
- return emitUnaryFPBuiltin <cir::Log10Op>(*this , *E);
768
+ return emitUnaryMaybeConstrainedFPBuiltin <cir::Log10Op>(*this , *E);
760
769
761
770
case Builtin::BIlog2:
762
771
case Builtin::BIlog2f:
@@ -767,7 +776,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
767
776
case Builtin::BI__builtin_log2l:
768
777
case Builtin::BI__builtin_log2f128:
769
778
assert (!cir::MissingFeatures::fastMathFlags ());
770
- return emitUnaryFPBuiltin <cir::Log2Op>(*this , *E);
779
+ return emitUnaryMaybeConstrainedFPBuiltin <cir::Log2Op>(*this , *E);
771
780
772
781
case Builtin::BInearbyint:
773
782
case Builtin::BInearbyintf:
@@ -776,7 +785,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
776
785
case Builtin::BI__builtin_nearbyintf:
777
786
case Builtin::BI__builtin_nearbyintl:
778
787
case Builtin::BI__builtin_nearbyintf128:
779
- return emitUnaryFPBuiltin <cir::NearbyintOp>(*this , *E);
788
+ return emitUnaryMaybeConstrainedFPBuiltin <cir::NearbyintOp>(*this , *E);
780
789
781
790
case Builtin::BIpow:
782
791
case Builtin::BIpowf:
@@ -800,7 +809,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
800
809
case Builtin::BI__builtin_rintf16:
801
810
case Builtin::BI__builtin_rintl:
802
811
case Builtin::BI__builtin_rintf128:
803
- return emitUnaryFPBuiltin <cir::RintOp>(*this , *E);
812
+ return emitUnaryMaybeConstrainedFPBuiltin <cir::RintOp>(*this , *E);
804
813
805
814
case Builtin::BIround:
806
815
case Builtin::BIroundf:
@@ -810,7 +819,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
810
819
case Builtin::BI__builtin_roundf16:
811
820
case Builtin::BI__builtin_roundl:
812
821
case Builtin::BI__builtin_roundf128:
813
- return emitUnaryFPBuiltin <cir::RoundOp>(*this , *E);
822
+ return emitUnaryMaybeConstrainedFPBuiltin <cir::RoundOp>(*this , *E);
814
823
815
824
case Builtin::BIroundeven:
816
825
case Builtin::BIroundevenf:
@@ -831,7 +840,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
831
840
case Builtin::BI__builtin_sinl:
832
841
case Builtin::BI__builtin_sinf128:
833
842
assert (!cir::MissingFeatures::fastMathFlags ());
834
- return emitUnaryFPBuiltin <cir::SinOp>(*this , *E);
843
+ return emitUnaryMaybeConstrainedFPBuiltin <cir::SinOp>(*this , *E);
835
844
836
845
case Builtin::BIsqrt:
837
846
case Builtin::BIsqrtf:
@@ -842,7 +851,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
842
851
case Builtin::BI__builtin_sqrtl:
843
852
case Builtin::BI__builtin_sqrtf128:
844
853
assert (!cir::MissingFeatures::fastMathFlags ());
845
- return emitUnaryFPBuiltin <cir::SqrtOp>(*this , *E);
854
+ return emitUnaryMaybeConstrainedFPBuiltin <cir::SqrtOp>(*this , *E);
846
855
847
856
case Builtin::BI__builtin_elementwise_sqrt:
848
857
llvm_unreachable (" BI__builtin_elementwise_sqrt NYI" );
@@ -875,7 +884,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
875
884
case Builtin::BI__builtin_truncf16:
876
885
case Builtin::BI__builtin_truncl:
877
886
case Builtin::BI__builtin_truncf128:
878
- return emitUnaryFPBuiltin <cir::TruncOp>(*this , *E);
887
+ return emitUnaryMaybeConstrainedFPBuiltin <cir::TruncOp>(*this , *E);
879
888
880
889
case Builtin::BIlround:
881
890
case Builtin::BIlroundf:
@@ -1344,7 +1353,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
1344
1353
if (mlir::isa<cir::VectorType>(cirTy))
1345
1354
eltTy = mlir::cast<cir::VectorType>(cirTy).getEltType ();
1346
1355
if (mlir::isa<cir::SingleType, cir::DoubleType>(eltTy)) {
1347
- return emitUnaryFPBuiltin <cir::FAbsOp>(*this , *E);
1356
+ return emitUnaryMaybeConstrainedFPBuiltin <cir::FAbsOp>(*this , *E);
1348
1357
}
1349
1358
llvm_unreachable (" unsupported type for BI__builtin_elementwise_abs" );
1350
1359
}
@@ -1365,8 +1374,9 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
1365
1374
llvm_unreachable (" BI__builtin_elementwise_atan2 NYI" );
1366
1375
case Builtin::BI__builtin_elementwise_ceil:
1367
1376
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
+ }
1370
1380
case Builtin::BI__builtin_elementwise_exp2:
1371
1381
llvm_unreachable (" BI__builtin_elementwise_exp2 NYI" );
1372
1382
case Builtin::BI__builtin_elementwise_log:
0 commit comments