Skip to content

Commit 5f1f57c

Browse files

File tree

2 files changed

+50
-19
lines changed

2 files changed

+50
-19
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ static mlir::Value tryUseTestFPKind(CIRGenFunction &CGF, unsigned BuiltinID,
6363
}
6464

6565
template <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+
7887
template <typename Op>
7988
static 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:

clang/test/CIR/CodeGen/builtins-elementwise.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,24 @@ void test_builtin_elementwise_acos(float f, double d, vfloat4 vf4,
5757
// LLVM: {{%.*}} = call <4 x double> @llvm.acos.v4f64(<4 x double> {{%.*}})
5858
vd4 = __builtin_elementwise_acos(vd4);
5959
}
60+
61+
void test_builtin_elementwise_exp(float f, double d, vfloat4 vf4,
62+
vdouble4 vd4) {
63+
// CIR-LABEL: test_builtin_elementwise_exp
64+
// LLVM-LABEL: test_builtin_elementwise_exp
65+
// CIR: {{%.*}} = cir.exp {{%.*}} : !cir.float
66+
// LLVM: {{%.*}} = call float @llvm.exp.f32(float {{%.*}})
67+
f = __builtin_elementwise_exp(f);
68+
69+
// CIR: {{%.*}} = cir.exp {{%.*}} : !cir.double
70+
// LLVM: {{%.*}} = call double @llvm.exp.f64(double {{%.*}})
71+
d = __builtin_elementwise_exp(d);
72+
73+
// CIR: {{%.*}} = cir.exp {{%.*}} : !cir.vector<!cir.float x 4>
74+
// LLVM: {{%.*}} = call <4 x float> @llvm.exp.v4f32(<4 x float> {{%.*}})
75+
vf4 = __builtin_elementwise_exp(vf4);
76+
77+
// CIR: {{%.*}} = cir.exp {{%.*}} : !cir.vector<!cir.double x 4>
78+
// LLVM: {{%.*}} = call <4 x double> @llvm.exp.v4f64(<4 x double> {{%.*}})
79+
vd4 = __builtin_elementwise_exp(vd4);
80+
}

0 commit comments

Comments
 (0)