@@ -216,6 +216,78 @@ int test_builtin_clzg(unsigned x) {
216
216
// OGCG-LABEL: _Z17test_builtin_clzgj
217
217
// OGCG: %{{.+}} = call i32 @llvm.ctlz.i32(i32 %{{.+}}, i1 true)
218
218
219
+ int test_builtin_ffs (int x) {
220
+ return __builtin_ffs (x);
221
+ }
222
+
223
+ // CIR-LABEL: _Z16test_builtin_ffsi
224
+ // CIR: %{{.+}} = cir.ffs %{{.+}} : !s32i
225
+ // CIR: }
226
+
227
+ // LLVM-LABEL: _Z16test_builtin_ffsi
228
+ // LLVM: %[[INPUT:.+]] = load i32, ptr %{{.+}}, align 4
229
+ // LLVM-NEXT: %[[CTZ:.+]] = call i32 @llvm.cttz.i32(i32 %[[INPUT]], i1 true)
230
+ // LLVM-NEXT: %[[R1:.+]] = add i32 %[[CTZ]], 1
231
+ // LLVM-NEXT: %[[IS_ZERO:.+]] = icmp eq i32 %[[INPUT]], 0
232
+ // LLVM-NEXT: %{{.+}} = select i1 %[[IS_ZERO]], i32 0, i32 %[[R1]]
233
+ // LLVM: }
234
+
235
+ // OGCG-LABEL: _Z16test_builtin_ffsi
236
+ // OGCG: %[[INPUT:.+]] = load i32, ptr %{{.+}}, align 4
237
+ // OGCG-NEXT: %[[CTZ:.+]] = call i32 @llvm.cttz.i32(i32 %[[INPUT]], i1 true)
238
+ // OGCG-NEXT: %[[R1:.+]] = add i32 %[[CTZ]], 1
239
+ // OGCG-NEXT: %[[IS_ZERO:.+]] = icmp eq i32 %[[INPUT]], 0
240
+ // OGCG-NEXT: %{{.+}} = select i1 %[[IS_ZERO]], i32 0, i32 %[[R1]]
241
+ // OGCG: }
242
+
243
+ int test_builtin_ffsl (long x) {
244
+ return __builtin_ffsl (x);
245
+ }
246
+
247
+ // CIR-LABEL: _Z17test_builtin_ffsll
248
+ // CIR: %{{.+}} = cir.ffs %{{.+}} : !s64i
249
+ // CIR: }
250
+
251
+ // LLVM-LABEL: _Z17test_builtin_ffsll
252
+ // LLVM: %[[INPUT:.+]] = load i64, ptr %{{.+}}, align 8
253
+ // LLVM-NEXT: %[[CTZ:.+]] = call i64 @llvm.cttz.i64(i64 %[[INPUT]], i1 true)
254
+ // LLVM-NEXT: %[[R1:.+]] = add i64 %[[CTZ]], 1
255
+ // LLVM-NEXT: %[[IS_ZERO:.+]] = icmp eq i64 %[[INPUT]], 0
256
+ // LLVM-NEXT: %{{.+}} = select i1 %[[IS_ZERO]], i64 0, i64 %[[R1]]
257
+ // LLVM: }
258
+
259
+ // OGCG-LABEL: _Z17test_builtin_ffsll
260
+ // OGCG: %[[INPUT:.+]] = load i64, ptr %{{.+}}, align 8
261
+ // OGCG-NEXT: %[[CTZ:.+]] = call i64 @llvm.cttz.i64(i64 %[[INPUT]], i1 true)
262
+ // OGCG-NEXT: %[[R1:.+]] = add i64 %[[CTZ]], 1
263
+ // OGCG-NEXT: %[[IS_ZERO:.+]] = icmp eq i64 %[[INPUT]], 0
264
+ // OGCG-NEXT: %{{.+}} = select i1 %[[IS_ZERO]], i64 0, i64 %[[R1]]
265
+ // OGCG: }
266
+
267
+ int test_builtin_ffsll (long long x) {
268
+ return __builtin_ffsll (x);
269
+ }
270
+
271
+ // CIR-LABEL: _Z18test_builtin_ffsllx
272
+ // CIR: %{{.+}} = cir.ffs %{{.+}} : !s64i
273
+ // CIR: }
274
+
275
+ // LLVM-LABEL: _Z18test_builtin_ffsllx
276
+ // LLVM: %[[INPUT:.+]] = load i64, ptr %{{.+}}, align 8
277
+ // LLVM-NEXT: %[[CTZ:.+]] = call i64 @llvm.cttz.i64(i64 %[[INPUT]], i1 true)
278
+ // LLVM-NEXT: %[[R1:.+]] = add i64 %[[CTZ]], 1
279
+ // LLVM-NEXT: %[[IS_ZERO:.+]] = icmp eq i64 %[[INPUT]], 0
280
+ // LLVM-NEXT: %{{.+}} = select i1 %[[IS_ZERO]], i64 0, i64 %[[R1]]
281
+ // LLVM: }
282
+
283
+ // OGCG-LABEL: _Z18test_builtin_ffsllx
284
+ // OGCG: %[[INPUT:.+]] = load i64, ptr %{{.+}}, align 8
285
+ // OGCG-NEXT: %[[CTZ:.+]] = call i64 @llvm.cttz.i64(i64 %[[INPUT]], i1 true)
286
+ // OGCG-NEXT: %[[R1:.+]] = add i64 %[[CTZ]], 1
287
+ // OGCG-NEXT: %[[IS_ZERO:.+]] = icmp eq i64 %[[INPUT]], 0
288
+ // OGCG-NEXT: %{{.+}} = select i1 %[[IS_ZERO]], i64 0, i64 %[[R1]]
289
+ // OGCG: }
290
+
219
291
int test_builtin_parity (unsigned x) {
220
292
return __builtin_parity (x);
221
293
}
0 commit comments