@@ -197,52 +197,58 @@ define void @cttz_zeroundef_i64() {
197197}
198198
199199define void @ctpop_i32 () {
200- ; CHECK-LABEL: ctpop_i32:
201- ; CHECK: // %bb.0:
202- ; CHECK-NEXT: adrp x8, :got:var32
203- ; CHECK-NEXT: ldr x8, [x8, :got_lo12:var32]
204- ; CHECK-NEXT: ldr w9, [x8]
205- ; CHECK-NEXT: fmov d0, x9
206- ; CHECK-NEXT: cnt v0.8b, v0.8b
207- ; CHECK-NEXT: uaddlv h0, v0.8b
208- ; CHECK-NEXT: str s0, [x8]
209- ; CHECK-NEXT: ret
200+ ; CHECK-SDAG-LABEL: ctpop_i32:
201+ ; CHECK-SDAG: // %bb.0:
202+ ; CHECK-SDAG-NEXT: adrp x8, :got:var32
203+ ; CHECK-SDAG-NEXT: ldr x8, [x8, :got_lo12:var32]
204+ ; CHECK-SDAG-NEXT: ldr w9, [x8]
205+ ; CHECK-SDAG-NEXT: fmov d0, x9
206+ ; CHECK-SDAG-NEXT: cnt v0.8b, v0.8b
207+ ; CHECK-SDAG-NEXT: addv b0, v0.8b
208+ ; CHECK-SDAG-NEXT: fmov w9, s0
209+ ; CHECK-SDAG-NEXT: str w9, [x8]
210+ ; CHECK-SDAG-NEXT: ret
211+ ;
212+ ; CHECK-GISEL-LABEL: ctpop_i32:
213+ ; CHECK-GISEL: // %bb.0:
214+ ; CHECK-GISEL-NEXT: adrp x8, :got:var32
215+ ; CHECK-GISEL-NEXT: ldr x8, [x8, :got_lo12:var32]
216+ ; CHECK-GISEL-NEXT: ldr w9, [x8]
217+ ; CHECK-GISEL-NEXT: fmov d0, x9
218+ ; CHECK-GISEL-NEXT: cnt v0.8b, v0.8b
219+ ; CHECK-GISEL-NEXT: uaddlv h0, v0.8b
220+ ; CHECK-GISEL-NEXT: str s0, [x8]
221+ ; CHECK-GISEL-NEXT: ret
210222 %val0_tmp = load i32 , ptr @var32
211223 %val4_tmp = call i32 @llvm.ctpop.i32 (i32 %val0_tmp )
212224 store volatile i32 %val4_tmp , ptr @var32
213225 ret void
214226}
215227
216- define void @ctpop_i64 ( ) {
217- ; CHECK-SDAG-LABEL: ctpop_i64 :
228+ define i64 @popcnt ( i64 %a , ptr %p ) {
229+ ; CHECK-SDAG-LABEL: popcnt :
218230; CHECK-SDAG: // %bb.0:
219- ; CHECK-SDAG-NEXT: adrp x8, :got:var64
220- ; CHECK-SDAG-NEXT: ldr x8, [x8, :got_lo12:var64]
221- ; CHECK-SDAG-NEXT: ldr d0, [x8]
231+ ; CHECK-SDAG-NEXT: fmov d0, x0
232+ ; CHECK-SDAG-NEXT: mov x0, xzr
222233; CHECK-SDAG-NEXT: cnt v0.8b, v0.8b
223- ; CHECK-SDAG-NEXT: uaddlv h0, v0.8b
224- ; CHECK-SDAG-NEXT: fmov w9, s0
225- ; CHECK-SDAG-NEXT: str x9, [x8]
234+ ; CHECK-SDAG-NEXT: addv b0, v0.8b
235+ ; CHECK-SDAG-NEXT: str d0, [x1]
226236; CHECK-SDAG-NEXT: ret
227237;
228- ; CHECK-GISEL-LABEL: ctpop_i64 :
238+ ; CHECK-GISEL-LABEL: popcnt :
229239; CHECK-GISEL: // %bb.0:
230- ; CHECK-GISEL-NEXT: adrp x8, :got:var64
231- ; CHECK-GISEL-NEXT: ldr x8, [x8, :got_lo12:var64]
232- ; CHECK-GISEL-NEXT: ldr x9, [x8]
233- ; CHECK-GISEL-NEXT: fmov d0, x9
240+ ; CHECK-GISEL-NEXT: fmov d0, x0
241+ ; CHECK-GISEL-NEXT: mov x0, xzr
234242; CHECK-GISEL-NEXT: cnt v0.8b, v0.8b
235243; CHECK-GISEL-NEXT: uaddlv h0, v0.8b
236- ; CHECK-GISEL-NEXT: mov w9 , v0.s[0]
237- ; CHECK-GISEL-NEXT: str x9 , [x8 ]
244+ ; CHECK-GISEL-NEXT: mov w8 , v0.s[0]
245+ ; CHECK-GISEL-NEXT: str x8 , [x1 ]
238246; CHECK-GISEL-NEXT: ret
239- %val0_tmp = load i64 , ptr @var64
240- %val4_tmp = call i64 @llvm.ctpop.i64 (i64 %val0_tmp )
241- store volatile i64 %val4_tmp , ptr @var64
242- ret void
247+ %2 = call i64 @llvm.ctpop (i64 %a )
248+ store i64 %2 , ptr %p
249+ ret i64 0
243250}
244251
245-
246252declare i32 @llvm.bswap.i32 (i32 )
247253declare i64 @llvm.bswap.i64 (i64 )
248254declare i32 @llvm.ctlz.i32 (i32 , i1 )
0 commit comments