@@ -216,6 +216,78 @@ int test_builtin_clzg(unsigned x) {
216216// OGCG-LABEL: _Z17test_builtin_clzgj
217217// OGCG: %{{.+}} = call i32 @llvm.ctlz.i32(i32 %{{.+}}, i1 true)
218218
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+
219291int test_builtin_parity (unsigned x) {
220292 return __builtin_parity (x);
221293}
0 commit comments