[llvm] ea29842 - [ARM] Add ctpop codegen tests
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 1 03:42:33 PST 2024
Author: Simon Pilgrim
Date: 2024-02-01T11:42:18Z
New Revision: ea2984287d91b96f5e2cc0aa66d146d6dbd1d1bb
URL: https://github.com/llvm/llvm-project/commit/ea2984287d91b96f5e2cc0aa66d146d6dbd1d1bb
DIFF: https://github.com/llvm/llvm-project/commit/ea2984287d91b96f5e2cc0aa66d146d6dbd1d1bb.diff
LOG: [ARM] Add ctpop codegen tests
Added:
Modified:
llvm/test/CodeGen/ARM/popcnt.ll
Removed:
################################################################################
diff --git a/llvm/test/CodeGen/ARM/popcnt.ll b/llvm/test/CodeGen/ARM/popcnt.ll
index 0a96daaeb5710..edcae5e141e73 100644
--- a/llvm/test/CodeGen/ARM/popcnt.ll
+++ b/llvm/test/CodeGen/ARM/popcnt.ll
@@ -281,6 +281,121 @@ define <4 x i32> @vclsQs32(ptr %A) nounwind {
ret <4 x i32> %tmp2
}
+define i32 @ctpop8(i8 %x) nounwind readnone {
+; CHECK-LABEL: ctpop8:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: mov r1, #85
+; CHECK-NEXT: and r1, r1, r0, lsr #1
+; CHECK-NEXT: sub r0, r0, r1
+; CHECK-NEXT: mov r1, #51
+; CHECK-NEXT: and r1, r1, r0, lsr #2
+; CHECK-NEXT: and r0, r0, #51
+; CHECK-NEXT: add r0, r0, r1
+; CHECK-NEXT: add r0, r0, r0, lsr #4
+; CHECK-NEXT: and r0, r0, #15
+; CHECK-NEXT: mov pc, lr
+ %count = tail call i8 @llvm.ctpop.i8(i8 %x)
+ %conv = zext i8 %count to i32
+ ret i32 %conv
+}
+
+define i32 @ctpop16(i16 %x) nounwind readnone {
+; CHECK-LABEL: ctpop16:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: mov r1, #85
+; CHECK-NEXT: orr r1, r1, #21760
+; CHECK-NEXT: and r1, r1, r0, lsr #1
+; CHECK-NEXT: sub r0, r0, r1
+; CHECK-NEXT: mov r1, #51
+; CHECK-NEXT: orr r1, r1, #13056
+; CHECK-NEXT: and r2, r0, r1
+; CHECK-NEXT: and r0, r1, r0, lsr #2
+; CHECK-NEXT: add r0, r2, r0
+; CHECK-NEXT: add r0, r0, r0, lsr #4
+; CHECK-NEXT: and r1, r0, #3840
+; CHECK-NEXT: and r0, r0, #15
+; CHECK-NEXT: add r0, r0, r1, lsr #8
+; CHECK-NEXT: mov pc, lr
+ %count = tail call i16 @llvm.ctpop.i16(i16 %x)
+ %conv = zext i16 %count to i32
+ ret i32 %conv
+}
+
+define i32 @ctpop32(i32 %x) nounwind readnone {
+; CHECK-LABEL: ctpop32:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: ldr r1, .LCPI22_0
+; CHECK-NEXT: ldr r2, .LCPI22_3
+; CHECK-NEXT: and r1, r1, r0, lsr #1
+; CHECK-NEXT: ldr r12, .LCPI22_1
+; CHECK-NEXT: sub r0, r0, r1
+; CHECK-NEXT: ldr r3, .LCPI22_2
+; CHECK-NEXT: and r1, r0, r2
+; CHECK-NEXT: and r0, r2, r0, lsr #2
+; CHECK-NEXT: add r0, r1, r0
+; CHECK-NEXT: add r0, r0, r0, lsr #4
+; CHECK-NEXT: and r0, r0, r12
+; CHECK-NEXT: mul r1, r0, r3
+; CHECK-NEXT: lsr r0, r1, #24
+; CHECK-NEXT: mov pc, lr
+; CHECK-NEXT: .p2align 2
+; CHECK-NEXT: @ %bb.1:
+; CHECK-NEXT: .LCPI22_0:
+; CHECK-NEXT: .long 1431655765 @ 0x55555555
+; CHECK-NEXT: .LCPI22_1:
+; CHECK-NEXT: .long 252645135 @ 0xf0f0f0f
+; CHECK-NEXT: .LCPI22_2:
+; CHECK-NEXT: .long 16843009 @ 0x1010101
+; CHECK-NEXT: .LCPI22_3:
+; CHECK-NEXT: .long 858993459 @ 0x33333333
+ %count = tail call i32 @llvm.ctpop.i32(i32 %x)
+ ret i32 %count
+}
+
+define i32 @ctpop64(i64 %x) nounwind readnone {
+; CHECK-LABEL: ctpop64:
+; CHECK: @ %bb.0:
+; CHECK-NEXT: .save {r4, lr}
+; CHECK-NEXT: push {r4, lr}
+; CHECK-NEXT: ldr r2, .LCPI23_0
+; CHECK-NEXT: ldr r3, .LCPI23_3
+; CHECK-NEXT: and r4, r2, r0, lsr #1
+; CHECK-NEXT: and r2, r2, r1, lsr #1
+; CHECK-NEXT: sub r0, r0, r4
+; CHECK-NEXT: sub r1, r1, r2
+; CHECK-NEXT: and r4, r0, r3
+; CHECK-NEXT: and r2, r1, r3
+; CHECK-NEXT: and r0, r3, r0, lsr #2
+; CHECK-NEXT: and r1, r3, r1, lsr #2
+; CHECK-NEXT: add r0, r4, r0
+; CHECK-NEXT: ldr lr, .LCPI23_1
+; CHECK-NEXT: add r1, r2, r1
+; CHECK-NEXT: ldr r12, .LCPI23_2
+; CHECK-NEXT: add r0, r0, r0, lsr #4
+; CHECK-NEXT: and r0, r0, lr
+; CHECK-NEXT: add r1, r1, r1, lsr #4
+; CHECK-NEXT: mul r2, r0, r12
+; CHECK-NEXT: and r0, r1, lr
+; CHECK-NEXT: mul r1, r0, r12
+; CHECK-NEXT: lsr r0, r2, #24
+; CHECK-NEXT: add r0, r0, r1, lsr #24
+; CHECK-NEXT: pop {r4, lr}
+; CHECK-NEXT: mov pc, lr
+; CHECK-NEXT: .p2align 2
+; CHECK-NEXT: @ %bb.1:
+; CHECK-NEXT: .LCPI23_0:
+; CHECK-NEXT: .long 1431655765 @ 0x55555555
+; CHECK-NEXT: .LCPI23_1:
+; CHECK-NEXT: .long 252645135 @ 0xf0f0f0f
+; CHECK-NEXT: .LCPI23_2:
+; CHECK-NEXT: .long 16843009 @ 0x1010101
+; CHECK-NEXT: .LCPI23_3:
+; CHECK-NEXT: .long 858993459 @ 0x33333333
+ %count = tail call i64 @llvm.ctpop.i64(i64 %x)
+ %conv = trunc i64 %count to i32
+ ret i32 %conv
+}
+
define i32 @ctpop_eq_one(i64 %x) nounwind readnone {
; CHECK-LABEL: ctpop_eq_one:
; CHECK: @ %bb.0:
@@ -299,6 +414,9 @@ define i32 @ctpop_eq_one(i64 %x) nounwind readnone {
ret i32 %conv
}
+declare i8 @llvm.ctpop.i8(i8) nounwind readnone
+declare i16 @llvm.ctpop.i16(i16) nounwind readnone
+declare i32 @llvm.ctpop.i32(i32) nounwind readnone
declare i64 @llvm.ctpop.i64(i64) nounwind readnone
declare <8 x i8> @llvm.arm.neon.vcls.v8i8(<8 x i8>) nounwind readnone
More information about the llvm-commits
mailing list