1 ; Test population-count instruction
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 | FileCheck %s
5 declare i32 @llvm.ctpop.i32(i32 %a)
6 declare i64 @llvm.ctpop.i64(i64 %a)
8 define i32 @f1(i32 %a) {
10 ; CHECK: popcnt %r0, %r2
11 ; CHECK: sllk %r1, %r0, 16
13 ; CHECK: sllk %r1, %r0, 8
15 ; CHECK: srlk %r2, %r0, 24
18 %popcnt = call i32 @llvm.ctpop.i32(i32 %a)
22 define i32 @f2(i32 %a) {
24 ; CHECK: llhr %r0, %r2
25 ; CHECK: popcnt %r0, %r0
26 ; CHECK: risblg %r1, %r0, 16, 151, 8
28 ; CHECK: srlk %r2, %r0, 8
30 %and = and i32 %a, 65535
31 %popcnt = call i32 @llvm.ctpop.i32(i32 %and)
35 define i32 @f3(i32 %a) {
37 ; CHECK: llcr %r0, %r2
38 ; CHECK: popcnt %r2, %r0
40 %and = and i32 %a, 255
41 %popcnt = call i32 @llvm.ctpop.i32(i32 %and)
45 define i64 @f4(i64 %a) {
47 ; CHECK: popcnt %r0, %r2
48 ; CHECK: sllg %r1, %r0, 32
50 ; CHECK: sllg %r1, %r0, 16
52 ; CHECK: sllg %r1, %r0, 8
54 ; CHECK: srlg %r2, %r0, 56
56 %popcnt = call i64 @llvm.ctpop.i64(i64 %a)
60 define i64 @f5(i64 %a) {
62 ; CHECK: llgfr %r0, %r2
63 ; CHECK: popcnt %r0, %r0
64 ; CHECK: sllg %r1, %r0, 16
65 ; CHECK: algfr %r0, %r1
66 ; CHECK: sllg %r1, %r0, 8
67 ; CHECK: algfr %r0, %r1
68 ; CHECK: srlg %r2, %r0, 24
69 %and = and i64 %a, 4294967295
70 %popcnt = call i64 @llvm.ctpop.i64(i64 %and)
74 define i64 @f6(i64 %a) {
76 ; CHECK: llghr %r0, %r2
77 ; CHECK: popcnt %r0, %r0
78 ; CHECK: risbg %r1, %r0, 48, 183, 8
80 ; CHECK: srlg %r2, %r0, 8
82 %and = and i64 %a, 65535
83 %popcnt = call i64 @llvm.ctpop.i64(i64 %and)
87 define i64 @f7(i64 %a) {
89 ; CHECK: llgcr %r0, %r2
90 ; CHECK: popcnt %r2, %r0
92 %and = and i64 %a, 255
93 %popcnt = call i64 @llvm.ctpop.i64(i64 %and)