[SystemZ] Add vector intrinsics
[oota-llvm.git] / test / CodeGen / SystemZ / ctpop-01.ll
1 ; Test population-count instruction
2 ;
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 | FileCheck %s
4
5 declare i32 @llvm.ctpop.i32(i32 %a)
6 declare i64 @llvm.ctpop.i64(i64 %a)
7
8 define i32 @f1(i32 %a) {
9 ; CHECK-LABEL: f1:
10 ; CHECK: popcnt  %r0, %r2
11 ; CHECK: sllk    %r1, %r0, 16
12 ; CHECK: ar      %r1, %r0
13 ; CHECK: sllk    %r2, %r1, 8
14 ; CHECK: ar      %r2, %r1
15 ; CHECK: srl     %r2, 24
16 ; CHECK: br      %r14
17
18   %popcnt = call i32 @llvm.ctpop.i32(i32 %a)
19   ret i32 %popcnt
20 }
21
22 define i32 @f2(i32 %a) {
23 ; CHECK-LABEL: f2:
24 ; CHECK: llhr    %r0, %r2
25 ; CHECK: popcnt  %r0, %r0
26 ; CHECK: risblg  %r2, %r0, 16, 151, 8
27 ; CHECK: ar      %r2, %r0
28 ; CHECK: srl     %r2, 8
29 ; CHECK: br      %r14
30   %and = and i32 %a, 65535
31   %popcnt = call i32 @llvm.ctpop.i32(i32 %and)
32   ret i32 %popcnt
33 }
34
35 define i32 @f3(i32 %a) {
36 ; CHECK-LABEL: f3:
37 ; CHECK: llcr    %r0, %r2
38 ; CHECK: popcnt  %r2, %r0
39 ; CHECK: br      %r14
40   %and = and i32 %a, 255
41   %popcnt = call i32 @llvm.ctpop.i32(i32 %and)
42   ret i32 %popcnt
43 }
44
45 define i64 @f4(i64 %a) {
46 ; CHECK-LABEL: f4:
47 ; CHECK: popcnt  %r0, %r2
48 ; CHECK: sllg    %r1, %r0, 32
49 ; CHECK: agr     %r1, %r0
50 ; CHECK: sllg    %r0, %r1, 16
51 ; CHECK: agr     %r0, %r1
52 ; CHECK: sllg    %r1, %r0, 8
53 ; CHECK: agr     %r1, %r0
54 ; CHECK: srlg    %r2, %r1, 56
55 ; CHECK: br      %r14
56   %popcnt = call i64 @llvm.ctpop.i64(i64 %a)
57   ret i64 %popcnt
58 }
59
60 define i64 @f5(i64 %a) {
61 ; CHECK-LABEL: f5:
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)
71   ret i64 %popcnt
72 }
73
74 define i64 @f6(i64 %a) {
75 ; CHECK-LABEL: f6:
76 ; CHECK: llghr   %r0, %r2
77 ; CHECK: popcnt  %r0, %r0
78 ; CHECK: risbg   %r1, %r0, 48, 183, 8
79 ; CHECK: agr     %r1, %r0
80 ; CHECK: srlg    %r2, %r1, 8
81 ; CHECK: br      %r14
82   %and = and i64 %a, 65535
83   %popcnt = call i64 @llvm.ctpop.i64(i64 %and)
84   ret i64 %popcnt
85 }
86
87 define i64 @f7(i64 %a) {
88 ; CHECK-LABEL: f7:
89 ; CHECK: llgcr   %r0, %r2
90 ; CHECK: popcnt  %r2, %r0
91 ; CHECK: br      %r14
92   %and = and i64 %a, 255
93   %popcnt = call i64 @llvm.ctpop.i64(i64 %and)
94   ret i64 %popcnt
95 }
96