[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / vec_ctbits.ll
blob370f88d644b573414a60c695a21b690f810582e7
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s
4 declare <2 x i64> @llvm.cttz.v2i64(<2 x i64>, i1)
5 declare <2 x i64> @llvm.ctlz.v2i64(<2 x i64>, i1)
6 declare <2 x i64> @llvm.ctpop.v2i64(<2 x i64>)
8 define <2 x i64> @footz(<2 x i64> %a) nounwind {
9 ; CHECK-LABEL: footz:
10 ; CHECK:       # %bb.0:
11 ; CHECK-NEXT:    pcmpeqd %xmm1, %xmm1
12 ; CHECK-NEXT:    paddq %xmm0, %xmm1
13 ; CHECK-NEXT:    pandn %xmm1, %xmm0
14 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
15 ; CHECK-NEXT:    psrlw $1, %xmm1
16 ; CHECK-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
17 ; CHECK-NEXT:    psubb %xmm1, %xmm0
18 ; CHECK-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
19 ; CHECK-NEXT:    movdqa %xmm0, %xmm2
20 ; CHECK-NEXT:    pand %xmm1, %xmm2
21 ; CHECK-NEXT:    psrlw $2, %xmm0
22 ; CHECK-NEXT:    pand %xmm1, %xmm0
23 ; CHECK-NEXT:    paddb %xmm2, %xmm0
24 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
25 ; CHECK-NEXT:    psrlw $4, %xmm1
26 ; CHECK-NEXT:    paddb %xmm1, %xmm0
27 ; CHECK-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
28 ; CHECK-NEXT:    pxor %xmm1, %xmm1
29 ; CHECK-NEXT:    psadbw %xmm1, %xmm0
30 ; CHECK-NEXT:    retq
31   %c = call <2 x i64> @llvm.cttz.v2i64(<2 x i64> %a, i1 true)
32   ret <2 x i64> %c
35 define <2 x i64> @foolz(<2 x i64> %a) nounwind {
36 ; CHECK-LABEL: foolz:
37 ; CHECK:       # %bb.0:
38 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
39 ; CHECK-NEXT:    psrlq $1, %xmm1
40 ; CHECK-NEXT:    por %xmm1, %xmm0
41 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
42 ; CHECK-NEXT:    psrlq $2, %xmm1
43 ; CHECK-NEXT:    por %xmm1, %xmm0
44 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
45 ; CHECK-NEXT:    psrlq $4, %xmm1
46 ; CHECK-NEXT:    por %xmm1, %xmm0
47 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
48 ; CHECK-NEXT:    psrlq $8, %xmm1
49 ; CHECK-NEXT:    por %xmm1, %xmm0
50 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
51 ; CHECK-NEXT:    psrlq $16, %xmm1
52 ; CHECK-NEXT:    por %xmm1, %xmm0
53 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
54 ; CHECK-NEXT:    psrlq $32, %xmm1
55 ; CHECK-NEXT:    por %xmm1, %xmm0
56 ; CHECK-NEXT:    pcmpeqd %xmm1, %xmm1
57 ; CHECK-NEXT:    pxor %xmm1, %xmm0
58 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
59 ; CHECK-NEXT:    psrlw $1, %xmm1
60 ; CHECK-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
61 ; CHECK-NEXT:    psubb %xmm1, %xmm0
62 ; CHECK-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
63 ; CHECK-NEXT:    movdqa %xmm0, %xmm2
64 ; CHECK-NEXT:    pand %xmm1, %xmm2
65 ; CHECK-NEXT:    psrlw $2, %xmm0
66 ; CHECK-NEXT:    pand %xmm1, %xmm0
67 ; CHECK-NEXT:    paddb %xmm2, %xmm0
68 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
69 ; CHECK-NEXT:    psrlw $4, %xmm1
70 ; CHECK-NEXT:    paddb %xmm1, %xmm0
71 ; CHECK-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
72 ; CHECK-NEXT:    pxor %xmm1, %xmm1
73 ; CHECK-NEXT:    psadbw %xmm1, %xmm0
74 ; CHECK-NEXT:    retq
75   %c = call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %a, i1 true)
76   ret <2 x i64> %c
80 define <2 x i64> @foopop(<2 x i64> %a) nounwind {
81 ; CHECK-LABEL: foopop:
82 ; CHECK:       # %bb.0:
83 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
84 ; CHECK-NEXT:    psrlw $1, %xmm1
85 ; CHECK-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
86 ; CHECK-NEXT:    psubb %xmm1, %xmm0
87 ; CHECK-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
88 ; CHECK-NEXT:    movdqa %xmm0, %xmm2
89 ; CHECK-NEXT:    pand %xmm1, %xmm2
90 ; CHECK-NEXT:    psrlw $2, %xmm0
91 ; CHECK-NEXT:    pand %xmm1, %xmm0
92 ; CHECK-NEXT:    paddb %xmm2, %xmm0
93 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
94 ; CHECK-NEXT:    psrlw $4, %xmm1
95 ; CHECK-NEXT:    paddb %xmm1, %xmm0
96 ; CHECK-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
97 ; CHECK-NEXT:    pxor %xmm1, %xmm1
98 ; CHECK-NEXT:    psadbw %xmm1, %xmm0
99 ; CHECK-NEXT:    retq
100   %c = call <2 x i64> @llvm.ctpop.v2i64(<2 x i64> %a)
101   ret <2 x i64> %c
104 declare <2 x i32> @llvm.cttz.v2i32(<2 x i32>, i1)
105 declare <2 x i32> @llvm.ctlz.v2i32(<2 x i32>, i1)
106 declare <2 x i32> @llvm.ctpop.v2i32(<2 x i32>)
108 define <2 x i32> @promtz(<2 x i32> %a) nounwind {
109 ; CHECK-LABEL: promtz:
110 ; CHECK:       # %bb.0:
111 ; CHECK-NEXT:    pcmpeqd %xmm1, %xmm1
112 ; CHECK-NEXT:    paddd %xmm0, %xmm1
113 ; CHECK-NEXT:    pandn %xmm1, %xmm0
114 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
115 ; CHECK-NEXT:    psrlw $1, %xmm1
116 ; CHECK-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
117 ; CHECK-NEXT:    psubb %xmm1, %xmm0
118 ; CHECK-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
119 ; CHECK-NEXT:    movdqa %xmm0, %xmm2
120 ; CHECK-NEXT:    pand %xmm1, %xmm2
121 ; CHECK-NEXT:    psrlw $2, %xmm0
122 ; CHECK-NEXT:    pand %xmm1, %xmm0
123 ; CHECK-NEXT:    paddb %xmm2, %xmm0
124 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
125 ; CHECK-NEXT:    psrlw $4, %xmm1
126 ; CHECK-NEXT:    paddb %xmm1, %xmm0
127 ; CHECK-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
128 ; CHECK-NEXT:    pxor %xmm1, %xmm1
129 ; CHECK-NEXT:    movdqa %xmm0, %xmm2
130 ; CHECK-NEXT:    punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]
131 ; CHECK-NEXT:    psadbw %xmm1, %xmm2
132 ; CHECK-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
133 ; CHECK-NEXT:    psadbw %xmm1, %xmm0
134 ; CHECK-NEXT:    packuswb %xmm2, %xmm0
135 ; CHECK-NEXT:    retq
136   %c = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> %a, i1 false)
137   ret <2 x i32> %c
140 define <2 x i32> @promlz(<2 x i32> %a) nounwind {
141 ; CHECK-LABEL: promlz:
142 ; CHECK:       # %bb.0:
143 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
144 ; CHECK-NEXT:    psrld $1, %xmm1
145 ; CHECK-NEXT:    por %xmm1, %xmm0
146 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
147 ; CHECK-NEXT:    psrld $2, %xmm1
148 ; CHECK-NEXT:    por %xmm1, %xmm0
149 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
150 ; CHECK-NEXT:    psrld $4, %xmm1
151 ; CHECK-NEXT:    por %xmm1, %xmm0
152 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
153 ; CHECK-NEXT:    psrld $8, %xmm1
154 ; CHECK-NEXT:    por %xmm1, %xmm0
155 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
156 ; CHECK-NEXT:    psrld $16, %xmm1
157 ; CHECK-NEXT:    por %xmm1, %xmm0
158 ; CHECK-NEXT:    pcmpeqd %xmm1, %xmm1
159 ; CHECK-NEXT:    pxor %xmm1, %xmm0
160 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
161 ; CHECK-NEXT:    psrlw $1, %xmm1
162 ; CHECK-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
163 ; CHECK-NEXT:    psubb %xmm1, %xmm0
164 ; CHECK-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
165 ; CHECK-NEXT:    movdqa %xmm0, %xmm2
166 ; CHECK-NEXT:    pand %xmm1, %xmm2
167 ; CHECK-NEXT:    psrlw $2, %xmm0
168 ; CHECK-NEXT:    pand %xmm1, %xmm0
169 ; CHECK-NEXT:    paddb %xmm2, %xmm0
170 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
171 ; CHECK-NEXT:    psrlw $4, %xmm1
172 ; CHECK-NEXT:    paddb %xmm1, %xmm0
173 ; CHECK-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
174 ; CHECK-NEXT:    pxor %xmm1, %xmm1
175 ; CHECK-NEXT:    movdqa %xmm0, %xmm2
176 ; CHECK-NEXT:    punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]
177 ; CHECK-NEXT:    psadbw %xmm1, %xmm2
178 ; CHECK-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
179 ; CHECK-NEXT:    psadbw %xmm1, %xmm0
180 ; CHECK-NEXT:    packuswb %xmm2, %xmm0
181 ; CHECK-NEXT:    retq
182   %c = call <2 x i32> @llvm.ctlz.v2i32(<2 x i32> %a, i1 false)
183   ret <2 x i32> %c
187 define <2 x i32> @prompop(<2 x i32> %a) nounwind {
188 ; CHECK-LABEL: prompop:
189 ; CHECK:       # %bb.0:
190 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
191 ; CHECK-NEXT:    psrlw $1, %xmm1
192 ; CHECK-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
193 ; CHECK-NEXT:    psubb %xmm1, %xmm0
194 ; CHECK-NEXT:    movdqa {{.*#+}} xmm1 = [51,51,51,51,51,51,51,51,51,51,51,51,51,51,51,51]
195 ; CHECK-NEXT:    movdqa %xmm0, %xmm2
196 ; CHECK-NEXT:    pand %xmm1, %xmm2
197 ; CHECK-NEXT:    psrlw $2, %xmm0
198 ; CHECK-NEXT:    pand %xmm1, %xmm0
199 ; CHECK-NEXT:    paddb %xmm2, %xmm0
200 ; CHECK-NEXT:    movdqa %xmm0, %xmm1
201 ; CHECK-NEXT:    psrlw $4, %xmm1
202 ; CHECK-NEXT:    paddb %xmm1, %xmm0
203 ; CHECK-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
204 ; CHECK-NEXT:    pxor %xmm1, %xmm1
205 ; CHECK-NEXT:    movdqa %xmm0, %xmm2
206 ; CHECK-NEXT:    punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]
207 ; CHECK-NEXT:    psadbw %xmm1, %xmm2
208 ; CHECK-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
209 ; CHECK-NEXT:    psadbw %xmm1, %xmm0
210 ; CHECK-NEXT:    packuswb %xmm2, %xmm0
211 ; CHECK-NEXT:    retq
212   %c = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %a)
213   ret <2 x i32> %c