@@ -15,7 +15,7 @@ define i32 @cnt32_advsimd(i32 %x) nounwind readnone {
1515; CHECK-NONEON-LABEL: cnt32_advsimd:
1616; CHECK-NONEON: // %bb.0:
1717; CHECK-NONEON-NEXT: lsr w9, w0, #1
18- ; CHECK-NONEON-NEXT: mov w8, #16843009
18+ ; CHECK-NONEON-NEXT: mov w8, #16843009 // =0x1010101
1919; CHECK-NONEON-NEXT: and w9, w9, #0x55555555
2020; CHECK-NONEON-NEXT: sub w9, w0, w9
2121; CHECK-NONEON-NEXT: lsr w10, w9, #2
@@ -50,7 +50,7 @@ define i32 @cnt32_advsimd_2(<2 x i32> %x) {
5050; CHECK-NONEON-LABEL: cnt32_advsimd_2:
5151; CHECK-NONEON: // %bb.0:
5252; CHECK-NONEON-NEXT: lsr w9, w0, #1
53- ; CHECK-NONEON-NEXT: mov w8, #16843009
53+ ; CHECK-NONEON-NEXT: mov w8, #16843009 // =0x1010101
5454; CHECK-NONEON-NEXT: and w9, w9, #0x55555555
5555; CHECK-NONEON-NEXT: sub w9, w0, w9
5656; CHECK-NONEON-NEXT: lsr w10, w9, #2
@@ -86,7 +86,7 @@ define i64 @cnt64_advsimd(i64 %x) nounwind readnone {
8686; CHECK-NONEON-LABEL: cnt64_advsimd:
8787; CHECK-NONEON: // %bb.0:
8888; CHECK-NONEON-NEXT: lsr x9, x0, #1
89- ; CHECK-NONEON-NEXT: mov x8, #72340172838076673
89+ ; CHECK-NONEON-NEXT: mov x8, #72340172838076673 // =0x101010101010101
9090; CHECK-NONEON-NEXT: and x9, x9, #0x5555555555555555
9191; CHECK-NONEON-NEXT: sub x9, x0, x9
9292; CHECK-NONEON-NEXT: lsr x10, x9, #2
@@ -114,7 +114,7 @@ define i32 @cnt32(i32 %x) nounwind readnone noimplicitfloat {
114114; CHECK-LABEL: cnt32:
115115; CHECK: // %bb.0:
116116; CHECK-NEXT: lsr w9, w0, #1
117- ; CHECK-NEXT: mov w8, #16843009
117+ ; CHECK-NEXT: mov w8, #16843009 // =0x1010101
118118; CHECK-NEXT: and w9, w9, #0x55555555
119119; CHECK-NEXT: sub w9, w0, w9
120120; CHECK-NEXT: lsr w10, w9, #2
@@ -130,7 +130,7 @@ define i32 @cnt32(i32 %x) nounwind readnone noimplicitfloat {
130130; CHECK-NONEON-LABEL: cnt32:
131131; CHECK-NONEON: // %bb.0:
132132; CHECK-NONEON-NEXT: lsr w9, w0, #1
133- ; CHECK-NONEON-NEXT: mov w8, #16843009
133+ ; CHECK-NONEON-NEXT: mov w8, #16843009 // =0x1010101
134134; CHECK-NONEON-NEXT: and w9, w9, #0x55555555
135135; CHECK-NONEON-NEXT: sub w9, w0, w9
136136; CHECK-NONEON-NEXT: lsr w10, w9, #2
@@ -155,7 +155,7 @@ define i64 @cnt64(i64 %x) nounwind readnone noimplicitfloat {
155155; CHECK-LABEL: cnt64:
156156; CHECK: // %bb.0:
157157; CHECK-NEXT: lsr x9, x0, #1
158- ; CHECK-NEXT: mov x8, #72340172838076673
158+ ; CHECK-NEXT: mov x8, #72340172838076673 // =0x101010101010101
159159; CHECK-NEXT: and x9, x9, #0x5555555555555555
160160; CHECK-NEXT: sub x9, x0, x9
161161; CHECK-NEXT: lsr x10, x9, #2
@@ -171,7 +171,7 @@ define i64 @cnt64(i64 %x) nounwind readnone noimplicitfloat {
171171; CHECK-NONEON-LABEL: cnt64:
172172; CHECK-NONEON: // %bb.0:
173173; CHECK-NONEON-NEXT: lsr x9, x0, #1
174- ; CHECK-NONEON-NEXT: mov x8, #72340172838076673
174+ ; CHECK-NONEON-NEXT: mov x8, #72340172838076673 // =0x101010101010101
175175; CHECK-NONEON-NEXT: and x9, x9, #0x5555555555555555
176176; CHECK-NONEON-NEXT: sub x9, x0, x9
177177; CHECK-NONEON-NEXT: lsr x10, x9, #2
@@ -278,5 +278,59 @@ define i1 @ctpop32_ne_one(i32 %x) nounwind readnone {
278278 ret i1 %cmp
279279}
280280
281+ define i1 @ctpop32_eq_one_nonzero (i32 %x ) {
282+ ; CHECK-LABEL: ctpop32_eq_one_nonzero:
283+ ; CHECK: // %bb.0: // %entry
284+ ; CHECK-NEXT: sub w8, w0, #1
285+ ; CHECK-NEXT: tst w0, w8
286+ ; CHECK-NEXT: cset w0, eq
287+ ; CHECK-NEXT: ret
288+ ;
289+ ; CHECK-NONEON-LABEL: ctpop32_eq_one_nonzero:
290+ ; CHECK-NONEON: // %bb.0: // %entry
291+ ; CHECK-NONEON-NEXT: sub w8, w0, #1
292+ ; CHECK-NONEON-NEXT: tst w0, w8
293+ ; CHECK-NONEON-NEXT: cset w0, eq
294+ ; CHECK-NONEON-NEXT: ret
295+ ;
296+ ; CHECK-CSSC-LABEL: ctpop32_eq_one_nonzero:
297+ ; CHECK-CSSC: // %bb.0: // %entry
298+ ; CHECK-CSSC-NEXT: sub w8, w0, #1
299+ ; CHECK-CSSC-NEXT: tst w0, w8
300+ ; CHECK-CSSC-NEXT: cset w0, eq
301+ ; CHECK-CSSC-NEXT: ret
302+ entry:
303+ %popcnt = call range(i32 1 , 33 ) i32 @llvm.ctpop.i32 (i32 %x )
304+ %cmp = icmp eq i32 %popcnt , 1
305+ ret i1 %cmp
306+ }
307+
308+ define i1 @ctpop32_ne_one_nonzero (i32 %x ) {
309+ ; CHECK-LABEL: ctpop32_ne_one_nonzero:
310+ ; CHECK: // %bb.0: // %entry
311+ ; CHECK-NEXT: sub w8, w0, #1
312+ ; CHECK-NEXT: tst w0, w8
313+ ; CHECK-NEXT: cset w0, ne
314+ ; CHECK-NEXT: ret
315+ ;
316+ ; CHECK-NONEON-LABEL: ctpop32_ne_one_nonzero:
317+ ; CHECK-NONEON: // %bb.0: // %entry
318+ ; CHECK-NONEON-NEXT: sub w8, w0, #1
319+ ; CHECK-NONEON-NEXT: tst w0, w8
320+ ; CHECK-NONEON-NEXT: cset w0, ne
321+ ; CHECK-NONEON-NEXT: ret
322+ ;
323+ ; CHECK-CSSC-LABEL: ctpop32_ne_one_nonzero:
324+ ; CHECK-CSSC: // %bb.0: // %entry
325+ ; CHECK-CSSC-NEXT: sub w8, w0, #1
326+ ; CHECK-CSSC-NEXT: tst w0, w8
327+ ; CHECK-CSSC-NEXT: cset w0, ne
328+ ; CHECK-CSSC-NEXT: ret
329+ entry:
330+ %popcnt = tail call range(i32 1 , 33 ) i32 @llvm.ctpop.i32 (i32 %x )
331+ %cmp = icmp ne i32 %popcnt , 1
332+ ret i1 %cmp
333+ }
334+
281335declare i32 @llvm.ctpop.i32 (i32 ) nounwind readnone
282336declare i64 @llvm.ctpop.i64 (i64 ) nounwind readnone
0 commit comments