[X86] Updated vector popcnt tests. Added vec512 tests.
[oota-llvm.git] / test / CodeGen / X86 / vector-popcnt-512.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512cd | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512CD
2
3 define <8 x i64> @testv8i64(<8 x i64> %in) nounwind {
4 ; ALL-LABEL: testv8i64:
5 ; ALL:       ## BB#0:
6 ; ALL-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
7 ; ALL-NEXT:    vpextrq $1, %xmm1, %rax
8 ; ALL-NEXT:    popcntq %rax, %rax
9 ; ALL-NEXT:    vmovq %rax, %xmm2
10 ; ALL-NEXT:    vmovq %xmm1, %rax
11 ; ALL-NEXT:    popcntq %rax, %rax
12 ; ALL-NEXT:    vmovq %rax, %xmm1
13 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0]
14 ; ALL-NEXT:    vextracti32x4 $2, %zmm0, %xmm2
15 ; ALL-NEXT:    vpextrq $1, %xmm2, %rax
16 ; ALL-NEXT:    popcntq %rax, %rax
17 ; ALL-NEXT:    vmovq %rax, %xmm3
18 ; ALL-NEXT:    vmovq %xmm2, %rax
19 ; ALL-NEXT:    popcntq %rax, %rax
20 ; ALL-NEXT:    vmovq %rax, %xmm2
21 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
22 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm2, %ymm1
23 ; ALL-NEXT:    vextracti32x4 $1, %zmm0, %xmm2
24 ; ALL-NEXT:    vpextrq $1, %xmm2, %rax
25 ; ALL-NEXT:    popcntq %rax, %rax
26 ; ALL-NEXT:    vmovq %rax, %xmm3
27 ; ALL-NEXT:    vmovq %xmm2, %rax
28 ; ALL-NEXT:    popcntq %rax, %rax
29 ; ALL-NEXT:    vmovq %rax, %xmm2
30 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0]
31 ; ALL-NEXT:    vpextrq $1, %xmm0, %rax
32 ; ALL-NEXT:    popcntq %rax, %rax
33 ; ALL-NEXT:    vmovq %rax, %xmm3
34 ; ALL-NEXT:    vmovq %xmm0, %rax
35 ; ALL-NEXT:    popcntq %rax, %rax
36 ; ALL-NEXT:    vmovq %rax, %xmm0
37 ; ALL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
38 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
39 ; ALL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
40 ; ALL-NEXT:    retq
41   %out = call <8 x i64> @llvm.ctpop.v8i64(<8 x i64> %in)
42   ret <8 x i64> %out
43 }
44
45 define <16 x i32> @testv16i32(<16 x i32> %in) nounwind {
46 ; ALL-LABEL: testv16i32:
47 ; ALL:       ## BB#0:
48 ; ALL-NEXT:    vextracti32x4 $3, %zmm0, %xmm1
49 ; ALL-NEXT:    vpextrd $1, %xmm1, %eax
50 ; ALL-NEXT:    popcntl %eax, %eax
51 ; ALL-NEXT:    vmovd %xmm1, %ecx
52 ; ALL-NEXT:    popcntl %ecx, %ecx
53 ; ALL-NEXT:    vmovd %ecx, %xmm2
54 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
55 ; ALL-NEXT:    vpextrd $2, %xmm1, %eax
56 ; ALL-NEXT:    popcntl %eax, %eax
57 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
58 ; ALL-NEXT:    vpextrd $3, %xmm1, %eax
59 ; ALL-NEXT:    popcntl %eax, %eax
60 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm1
61 ; ALL-NEXT:    vextracti32x4 $2, %zmm0, %xmm2
62 ; ALL-NEXT:    vpextrd $1, %xmm2, %eax
63 ; ALL-NEXT:    popcntl %eax, %eax
64 ; ALL-NEXT:    vmovd %xmm2, %ecx
65 ; ALL-NEXT:    popcntl %ecx, %ecx
66 ; ALL-NEXT:    vmovd %ecx, %xmm3
67 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm3, %xmm3
68 ; ALL-NEXT:    vpextrd $2, %xmm2, %eax
69 ; ALL-NEXT:    popcntl %eax, %eax
70 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm3, %xmm3
71 ; ALL-NEXT:    vpextrd $3, %xmm2, %eax
72 ; ALL-NEXT:    popcntl %eax, %eax
73 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm3, %xmm2
74 ; ALL-NEXT:    vinserti128 $1, %xmm1, %ymm2, %ymm1
75 ; ALL-NEXT:    vextracti32x4 $1, %zmm0, %xmm2
76 ; ALL-NEXT:    vpextrd $1, %xmm2, %eax
77 ; ALL-NEXT:    popcntl %eax, %eax
78 ; ALL-NEXT:    vmovd %xmm2, %ecx
79 ; ALL-NEXT:    popcntl %ecx, %ecx
80 ; ALL-NEXT:    vmovd %ecx, %xmm3
81 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm3, %xmm3
82 ; ALL-NEXT:    vpextrd $2, %xmm2, %eax
83 ; ALL-NEXT:    popcntl %eax, %eax
84 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm3, %xmm3
85 ; ALL-NEXT:    vpextrd $3, %xmm2, %eax
86 ; ALL-NEXT:    popcntl %eax, %eax
87 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm3, %xmm2
88 ; ALL-NEXT:    vpextrd $1, %xmm0, %eax
89 ; ALL-NEXT:    popcntl %eax, %eax
90 ; ALL-NEXT:    vmovd %xmm0, %ecx
91 ; ALL-NEXT:    popcntl %ecx, %ecx
92 ; ALL-NEXT:    vmovd %ecx, %xmm3
93 ; ALL-NEXT:    vpinsrd $1, %eax, %xmm3, %xmm3
94 ; ALL-NEXT:    vpextrd $2, %xmm0, %eax
95 ; ALL-NEXT:    popcntl %eax, %eax
96 ; ALL-NEXT:    vpinsrd $2, %eax, %xmm3, %xmm3
97 ; ALL-NEXT:    vpextrd $3, %xmm0, %eax
98 ; ALL-NEXT:    popcntl %eax, %eax
99 ; ALL-NEXT:    vpinsrd $3, %eax, %xmm3, %xmm0
100 ; ALL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
101 ; ALL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
102 ; ALL-NEXT:    retq
103   %out = call <16 x i32> @llvm.ctpop.v16i32(<16 x i32> %in)
104   ret <16 x i32> %out
105 }
106
107 define <32 x i16> @testv32i16(<32 x i16> %in) nounwind {
108 ; ALL-LABEL: testv32i16:
109 ; ALL:       ## BB#0:
110 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
111 ; ALL-NEXT:    vpand %ymm2, %ymm0, %ymm3
112 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
113 ; ALL-NEXT:    vpshufb %ymm3, %ymm4, %ymm3
114 ; ALL-NEXT:    vpsrlw $4, %ymm0, %ymm0
115 ; ALL-NEXT:    vpand %ymm2, %ymm0, %ymm0
116 ; ALL-NEXT:    vpshufb %ymm0, %ymm4, %ymm0
117 ; ALL-NEXT:    vpaddb %ymm3, %ymm0, %ymm0
118 ; ALL-NEXT:    vpsllw $8, %ymm0, %ymm3
119 ; ALL-NEXT:    vpaddb %ymm0, %ymm3, %ymm0
120 ; ALL-NEXT:    vpsrlw $8, %ymm0, %ymm0
121 ; ALL-NEXT:    vpand %ymm2, %ymm1, %ymm3
122 ; ALL-NEXT:    vpshufb %ymm3, %ymm4, %ymm3
123 ; ALL-NEXT:    vpsrlw $4, %ymm1, %ymm1
124 ; ALL-NEXT:    vpand %ymm2, %ymm1, %ymm1
125 ; ALL-NEXT:    vpshufb %ymm1, %ymm4, %ymm1
126 ; ALL-NEXT:    vpaddb %ymm3, %ymm1, %ymm1
127 ; ALL-NEXT:    vpsllw $8, %ymm1, %ymm2
128 ; ALL-NEXT:    vpaddb %ymm1, %ymm2, %ymm1
129 ; ALL-NEXT:    vpsrlw $8, %ymm1, %ymm1
130 ; ALL-NEXT:    retq
131   %out = call <32 x i16> @llvm.ctpop.v32i16(<32 x i16> %in)
132   ret <32 x i16> %out
133 }
134
135 define <64 x i8> @testv64i8(<64 x i8> %in) nounwind {
136 ; ALL-LABEL: testv64i8:
137 ; ALL:       ## BB#0:
138 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
139 ; ALL-NEXT:    vpand %ymm2, %ymm0, %ymm3
140 ; ALL-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
141 ; ALL-NEXT:    vpshufb %ymm3, %ymm4, %ymm3
142 ; ALL-NEXT:    vpsrlw $4, %ymm0, %ymm0
143 ; ALL-NEXT:    vpand %ymm2, %ymm0, %ymm0
144 ; ALL-NEXT:    vpshufb %ymm0, %ymm4, %ymm0
145 ; ALL-NEXT:    vpaddb %ymm3, %ymm0, %ymm0
146 ; ALL-NEXT:    vpand %ymm2, %ymm1, %ymm3
147 ; ALL-NEXT:    vpshufb %ymm3, %ymm4, %ymm3
148 ; ALL-NEXT:    vpsrlw $4, %ymm1, %ymm1
149 ; ALL-NEXT:    vpand %ymm2, %ymm1, %ymm1
150 ; ALL-NEXT:    vpshufb %ymm1, %ymm4, %ymm1
151 ; ALL-NEXT:    vpaddb %ymm3, %ymm1, %ymm1
152 ; ALL-NEXT:    retq
153   %out = call <64 x i8> @llvm.ctpop.v64i8(<64 x i8> %in)
154   ret <64 x i8> %out
155 }
156
157 declare <8 x i64> @llvm.ctpop.v8i64(<8 x i64>)
158 declare <16 x i32> @llvm.ctpop.v16i32(<16 x i32>)
159 declare <32 x i16> @llvm.ctpop.v32i16(<32 x i16>)
160 declare <64 x i8> @llvm.ctpop.v64i8(<64 x i8>)