@@ -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) {
@@ -98,7 +111,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
98
111
case Builtin::BI__builtin_ceilf16:
99
112
case Builtin::BI__builtin_ceill:
100
113
case Builtin::BI__builtin_ceilf128:
101
- llvm_unreachable ( " NYI " );
114
+ return buildUnaryFPBuiltin<mlir::cir::CeilOp>(* this , *E );
102
115
103
116
case Builtin::BIcopysign:
104
117
case Builtin::BIcopysignf:
@@ -118,7 +131,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
118
131
case Builtin::BI__builtin_cosf16:
119
132
case Builtin::BI__builtin_cosl:
120
133
case Builtin::BI__builtin_cosf128:
121
- llvm_unreachable ( " NYI " );
134
+ return buildUnaryFPBuiltin<mlir::cir::CosOp>(* this , *E );
122
135
123
136
case Builtin::BIexp:
124
137
case Builtin::BIexpf:
@@ -128,7 +141,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
128
141
case Builtin::BI__builtin_expf16:
129
142
case Builtin::BI__builtin_expl:
130
143
case Builtin::BI__builtin_expf128:
131
- llvm_unreachable ( " NYI " );
144
+ return buildUnaryFPBuiltin<mlir::cir::ExpOp>(* this , *E );
132
145
133
146
case Builtin::BIexp2:
134
147
case Builtin::BIexp2f:
@@ -138,7 +151,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
138
151
case Builtin::BI__builtin_exp2f16:
139
152
case Builtin::BI__builtin_exp2l:
140
153
case Builtin::BI__builtin_exp2f128:
141
- llvm_unreachable ( " NYI " );
154
+ return buildUnaryFPBuiltin<mlir::cir::Exp2Op>(* this , *E );
142
155
143
156
case Builtin::BIfabs:
144
157
case Builtin::BIfabsf:
@@ -147,13 +160,8 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
147
160
case Builtin::BI__builtin_fabsf:
148
161
case Builtin::BI__builtin_fabsf16:
149
162
case Builtin::BI__builtin_fabsl:
150
- case Builtin::BI__builtin_fabsf128: {
151
- mlir::Value Src0 = buildScalarExpr (E->getArg (0 ));
152
- auto SrcType = Src0.getType ();
153
- auto Call =
154
- builder.create <mlir::cir::FAbsOp>(Src0.getLoc (), SrcType, Src0);
155
- return RValue::get (Call->getResult (0 ));
156
- }
163
+ case Builtin::BI__builtin_fabsf128:
164
+ return buildUnaryFPBuiltin<mlir::cir::FAbsOp>(*this , *E);
157
165
158
166
case Builtin::BIfloor:
159
167
case Builtin::BIfloorf:
@@ -163,7 +171,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
163
171
case Builtin::BI__builtin_floorf16:
164
172
case Builtin::BI__builtin_floorl:
165
173
case Builtin::BI__builtin_floorf128:
166
- llvm_unreachable ( " NYI " );
174
+ return buildUnaryFPBuiltin<mlir::cir::FloorOp>(* this , *E );
167
175
168
176
case Builtin::BIfma:
169
177
case Builtin::BIfmaf:
@@ -216,7 +224,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
216
224
case Builtin::BI__builtin_logf16:
217
225
case Builtin::BI__builtin_logl:
218
226
case Builtin::BI__builtin_logf128:
219
- llvm_unreachable ( " NYI " );
227
+ return buildUnaryFPBuiltin<mlir::cir::LogOp>(* this , *E );
220
228
221
229
case Builtin::BIlog10:
222
230
case Builtin::BIlog10f:
@@ -226,7 +234,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
226
234
case Builtin::BI__builtin_log10f16:
227
235
case Builtin::BI__builtin_log10l:
228
236
case Builtin::BI__builtin_log10f128:
229
- llvm_unreachable ( " NYI " );
237
+ return buildUnaryFPBuiltin<mlir::cir::Log10Op>(* this , *E );
230
238
231
239
case Builtin::BIlog2:
232
240
case Builtin::BIlog2f:
@@ -236,7 +244,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
236
244
case Builtin::BI__builtin_log2f16:
237
245
case Builtin::BI__builtin_log2l:
238
246
case Builtin::BI__builtin_log2f128:
239
- llvm_unreachable ( " NYI " );
247
+ return buildUnaryFPBuiltin<mlir::cir::Log2Op>(* this , *E );
240
248
241
249
case Builtin::BInearbyint:
242
250
case Builtin::BInearbyintf:
@@ -245,7 +253,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
245
253
case Builtin::BI__builtin_nearbyintf:
246
254
case Builtin::BI__builtin_nearbyintl:
247
255
case Builtin::BI__builtin_nearbyintf128:
248
- llvm_unreachable ( " NYI " );
256
+ return buildUnaryFPBuiltin<mlir::cir::NearbyintOp>(* this , *E );
249
257
250
258
case Builtin::BIpow:
251
259
case Builtin::BIpowf:
@@ -265,7 +273,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
265
273
case Builtin::BI__builtin_rintf16:
266
274
case Builtin::BI__builtin_rintl:
267
275
case Builtin::BI__builtin_rintf128:
268
- llvm_unreachable ( " NYI " );
276
+ return buildUnaryFPBuiltin<mlir::cir::RintOp>(* this , *E );
269
277
270
278
case Builtin::BIround:
271
279
case Builtin::BIroundf:
@@ -275,7 +283,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
275
283
case Builtin::BI__builtin_roundf16:
276
284
case Builtin::BI__builtin_roundl:
277
285
case Builtin::BI__builtin_roundf128:
278
- llvm_unreachable ( " NYI " );
286
+ return buildUnaryFPBuiltin<mlir::cir::RoundOp>(* this , *E );
279
287
280
288
case Builtin::BIsin:
281
289
case Builtin::BIsinf:
@@ -285,7 +293,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
285
293
case Builtin::BI__builtin_sinf16:
286
294
case Builtin::BI__builtin_sinl:
287
295
case Builtin::BI__builtin_sinf128:
288
- llvm_unreachable ( " NYI " );
296
+ return buildUnaryFPBuiltin<mlir::cir::SinOp>(* this , *E );
289
297
290
298
case Builtin::BIsqrt:
291
299
case Builtin::BIsqrtf:
@@ -295,7 +303,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
295
303
case Builtin::BI__builtin_sqrtf16:
296
304
case Builtin::BI__builtin_sqrtl:
297
305
case Builtin::BI__builtin_sqrtf128:
298
- llvm_unreachable ( " NYI " );
306
+ return buildUnaryFPBuiltin<mlir::cir::SqrtOp>(* this , *E );
299
307
300
308
case Builtin::BItrunc:
301
309
case Builtin::BItruncf:
@@ -305,7 +313,7 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
305
313
case Builtin::BI__builtin_truncf16:
306
314
case Builtin::BI__builtin_truncl:
307
315
case Builtin::BI__builtin_truncf128:
308
- llvm_unreachable ( " NYI " );
316
+ return buildUnaryFPBuiltin<mlir::cir::TruncOp>(* this , *E );
309
317
310
318
case Builtin::BIlround:
311
319
case Builtin::BIlroundf:
0 commit comments