@@ -42,6 +42,19 @@ static RValue buildLibraryCall(CIRGenFunction &CGF, const FunctionDecl *FD,
42
42
return CGF.buildCall (E->getCallee ()->getType (), callee, E, ReturnValueSlot ());
43
43
}
44
44
45
+ template <class Operation >
46
+ static RValue buildUnaryFPBuiltin (CIRGenFunction &CGF, const CallExpr &E) {
47
+ auto Arg = CGF.buildScalarExpr (E.getArg (0 ));
48
+
49
+ CIRGenFunction::CIRGenFPOptionsRAII FPOptsRAII (CGF, &E);
50
+ if (CGF.getBuilder ().getIsFPConstrained ())
51
+ llvm_unreachable (" constraint FP operations are NYI" );
52
+
53
+ auto Call =
54
+ CGF.getBuilder ().create <Operation>(Arg.getLoc (), Arg.getType (), Arg);
55
+ return RValue::get (Call->getResult (0 ));
56
+ }
57
+
45
58
RValue CIRGenFunction::buildBuiltinExpr (const GlobalDecl GD, unsigned BuiltinID,
46
59
const CallExpr *E,
47
60
ReturnValueSlot ReturnValue) {
@@ -93,7 +106,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
93
106
case Builtin::BI__builtin_ceilf16:
94
107
case Builtin::BI__builtin_ceill:
95
108
case Builtin::BI__builtin_ceilf128:
96
- llvm_unreachable ( " NYI " );
109
+ return buildUnaryFPBuiltin<mlir::cir::CeilOp>(* this , *E );
97
110
98
111
case Builtin::BIcopysign:
99
112
case Builtin::BIcopysignf:
@@ -113,7 +126,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
113
126
case Builtin::BI__builtin_cosf16:
114
127
case Builtin::BI__builtin_cosl:
115
128
case Builtin::BI__builtin_cosf128:
116
- llvm_unreachable ( " NYI " );
129
+ return buildUnaryFPBuiltin<mlir::cir::CosOp>(* this , *E );
117
130
118
131
case Builtin::BIexp:
119
132
case Builtin::BIexpf:
@@ -123,7 +136,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
123
136
case Builtin::BI__builtin_expf16:
124
137
case Builtin::BI__builtin_expl:
125
138
case Builtin::BI__builtin_expf128:
126
- llvm_unreachable ( " NYI " );
139
+ return buildUnaryFPBuiltin<mlir::cir::ExpOp>(* this , *E );
127
140
128
141
case Builtin::BIexp2:
129
142
case Builtin::BIexp2f:
@@ -133,7 +146,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
133
146
case Builtin::BI__builtin_exp2f16:
134
147
case Builtin::BI__builtin_exp2l:
135
148
case Builtin::BI__builtin_exp2f128:
136
- llvm_unreachable ( " NYI " );
149
+ return buildUnaryFPBuiltin<mlir::cir::Exp2Op>(* this , *E );
137
150
138
151
case Builtin::BIfabs:
139
152
case Builtin::BIfabsf:
@@ -142,13 +155,8 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
142
155
case Builtin::BI__builtin_fabsf:
143
156
case Builtin::BI__builtin_fabsf16:
144
157
case Builtin::BI__builtin_fabsl:
145
- case Builtin::BI__builtin_fabsf128: {
146
- mlir::Value Src0 = buildScalarExpr (E->getArg (0 ));
147
- auto SrcType = Src0.getType ();
148
- auto Call =
149
- builder.create <mlir::cir::FAbsOp>(Src0.getLoc (), SrcType, Src0);
150
- return RValue::get (Call->getResult (0 ));
151
- }
158
+ case Builtin::BI__builtin_fabsf128:
159
+ return buildUnaryFPBuiltin<mlir::cir::FAbsOp>(*this , *E);
152
160
153
161
case Builtin::BIfloor:
154
162
case Builtin::BIfloorf:
@@ -158,7 +166,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
158
166
case Builtin::BI__builtin_floorf16:
159
167
case Builtin::BI__builtin_floorl:
160
168
case Builtin::BI__builtin_floorf128:
161
- llvm_unreachable ( " NYI " );
169
+ return buildUnaryFPBuiltin<mlir::cir::FloorOp>(* this , *E );
162
170
163
171
case Builtin::BIfma:
164
172
case Builtin::BIfmaf:
@@ -211,7 +219,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
211
219
case Builtin::BI__builtin_logf16:
212
220
case Builtin::BI__builtin_logl:
213
221
case Builtin::BI__builtin_logf128:
214
- llvm_unreachable ( " NYI " );
222
+ return buildUnaryFPBuiltin<mlir::cir::LogOp>(* this , *E );
215
223
216
224
case Builtin::BIlog10:
217
225
case Builtin::BIlog10f:
@@ -221,7 +229,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
221
229
case Builtin::BI__builtin_log10f16:
222
230
case Builtin::BI__builtin_log10l:
223
231
case Builtin::BI__builtin_log10f128:
224
- llvm_unreachable ( " NYI " );
232
+ return buildUnaryFPBuiltin<mlir::cir::Log10Op>(* this , *E );
225
233
226
234
case Builtin::BIlog2:
227
235
case Builtin::BIlog2f:
@@ -231,7 +239,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
231
239
case Builtin::BI__builtin_log2f16:
232
240
case Builtin::BI__builtin_log2l:
233
241
case Builtin::BI__builtin_log2f128:
234
- llvm_unreachable ( " NYI " );
242
+ return buildUnaryFPBuiltin<mlir::cir::Log2Op>(* this , *E );
235
243
236
244
case Builtin::BInearbyint:
237
245
case Builtin::BInearbyintf:
@@ -240,7 +248,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
240
248
case Builtin::BI__builtin_nearbyintf:
241
249
case Builtin::BI__builtin_nearbyintl:
242
250
case Builtin::BI__builtin_nearbyintf128:
243
- llvm_unreachable ( " NYI " );
251
+ return buildUnaryFPBuiltin<mlir::cir::NearbyintOp>(* this , *E );
244
252
245
253
case Builtin::BIpow:
246
254
case Builtin::BIpowf:
@@ -260,7 +268,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
260
268
case Builtin::BI__builtin_rintf16:
261
269
case Builtin::BI__builtin_rintl:
262
270
case Builtin::BI__builtin_rintf128:
263
- llvm_unreachable ( " NYI " );
271
+ return buildUnaryFPBuiltin<mlir::cir::RintOp>(* this , *E );
264
272
265
273
case Builtin::BIround:
266
274
case Builtin::BIroundf:
@@ -270,7 +278,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
270
278
case Builtin::BI__builtin_roundf16:
271
279
case Builtin::BI__builtin_roundl:
272
280
case Builtin::BI__builtin_roundf128:
273
- llvm_unreachable ( " NYI " );
281
+ return buildUnaryFPBuiltin<mlir::cir::RoundOp>(* this , *E );
274
282
275
283
case Builtin::BIsin:
276
284
case Builtin::BIsinf:
@@ -280,7 +288,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
280
288
case Builtin::BI__builtin_sinf16:
281
289
case Builtin::BI__builtin_sinl:
282
290
case Builtin::BI__builtin_sinf128:
283
- llvm_unreachable ( " NYI " );
291
+ return buildUnaryFPBuiltin<mlir::cir::SinOp>(* this , *E );
284
292
285
293
case Builtin::BIsqrt:
286
294
case Builtin::BIsqrtf:
@@ -290,7 +298,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
290
298
case Builtin::BI__builtin_sqrtf16:
291
299
case Builtin::BI__builtin_sqrtl:
292
300
case Builtin::BI__builtin_sqrtf128:
293
- llvm_unreachable ( " NYI " );
301
+ return buildUnaryFPBuiltin<mlir::cir::SqrtOp>(* this , *E );
294
302
295
303
case Builtin::BItrunc:
296
304
case Builtin::BItruncf:
@@ -300,7 +308,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
300
308
case Builtin::BI__builtin_truncf16:
301
309
case Builtin::BI__builtin_truncl:
302
310
case Builtin::BI__builtin_truncf128:
303
- llvm_unreachable ( " NYI " );
311
+ return buildUnaryFPBuiltin<mlir::cir::TruncOp>(* this , *E );
304
312
305
313
case Builtin::BIlround:
306
314
case Builtin::BIlroundf:
0 commit comments