@@ -24,16 +24,9 @@ define <2 x i64> @testv2i64(<2 x i64> %in) {
24
24
; SSE2-NEXT: psrlq $4, %xmm1
25
25
; SSE2-NEXT: paddq %xmm0, %xmm1
26
26
; SSE2-NEXT: pand {{.*}}(%rip), %xmm1
27
+ ; SSE2-NEXT: pxor %xmm0, %xmm0
28
+ ; SSE2-NEXT: psadbw %xmm0, %xmm1
27
29
; SSE2-NEXT: movdqa %xmm1, %xmm0
28
- ; SSE2-NEXT: psllq $32, %xmm0
29
- ; SSE2-NEXT: paddb %xmm1, %xmm0
30
- ; SSE2-NEXT: movdqa %xmm0, %xmm1
31
- ; SSE2-NEXT: psllq $16, %xmm1
32
- ; SSE2-NEXT: paddb %xmm0, %xmm1
33
- ; SSE2-NEXT: movdqa %xmm1, %xmm0
34
- ; SSE2-NEXT: psllq $8, %xmm0
35
- ; SSE2-NEXT: paddb %xmm1, %xmm0
36
- ; SSE2-NEXT: psrlq $56, %xmm0
37
30
; SSE2-NEXT: retq
38
31
;
39
32
; SSE3-LABEL: testv2i64:
@@ -52,16 +45,9 @@ define <2 x i64> @testv2i64(<2 x i64> %in) {
52
45
; SSE3-NEXT: psrlq $4, %xmm1
53
46
; SSE3-NEXT: paddq %xmm0, %xmm1
54
47
; SSE3-NEXT: pand {{.*}}(%rip), %xmm1
48
+ ; SSE3-NEXT: pxor %xmm0, %xmm0
49
+ ; SSE3-NEXT: psadbw %xmm0, %xmm1
55
50
; SSE3-NEXT: movdqa %xmm1, %xmm0
56
- ; SSE3-NEXT: psllq $32, %xmm0
57
- ; SSE3-NEXT: paddb %xmm1, %xmm0
58
- ; SSE3-NEXT: movdqa %xmm0, %xmm1
59
- ; SSE3-NEXT: psllq $16, %xmm1
60
- ; SSE3-NEXT: paddb %xmm0, %xmm1
61
- ; SSE3-NEXT: movdqa %xmm1, %xmm0
62
- ; SSE3-NEXT: psllq $8, %xmm0
63
- ; SSE3-NEXT: paddb %xmm1, %xmm0
64
- ; SSE3-NEXT: psrlq $56, %xmm0
65
51
; SSE3-NEXT: retq
66
52
;
67
53
; SSSE3-LABEL: testv2i64:
@@ -130,13 +116,14 @@ define <4 x i32> @testv4i32(<4 x i32> %in) {
130
116
; SSE2-NEXT: psrld $4, %xmm1
131
117
; SSE2-NEXT: paddd %xmm0, %xmm1
132
118
; SSE2-NEXT: pand {{.*}}(%rip), %xmm1
119
+ ; SSE2-NEXT: pxor %xmm0, %xmm0
133
120
; SSE2-NEXT: movdqa %xmm1, %xmm2
134
- ; SSE2-NEXT: psllq $16, % xmm2
135
- ; SSE2-NEXT: paddb %xmm1 , %xmm2
136
- ; SSE2-NEXT: movdqa %xmm2, % xmm0
137
- ; SSE2-NEXT: psllq $8 , %xmm0
138
- ; SSE2-NEXT: paddb %xmm2, %xmm0
139
- ; SSE2-NEXT: psrld $24 , %xmm0
121
+ ; SSE2-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm0[2],xmm2[3],xmm0[3]
122
+ ; SSE2-NEXT: psadbw %xmm0 , %xmm2
123
+ ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0], xmm0[0],xmm1[1],xmm0[1]
124
+ ; SSE2-NEXT: psadbw %xmm0 , %xmm1
125
+ ; SSE2-NEXT: packuswb %xmm2, %xmm1
126
+ ; SSE2-NEXT: movdqa %xmm1 , %xmm0
140
127
; SSE2-NEXT: retq
141
128
;
142
129
; SSE3-LABEL: testv4i32:
@@ -155,13 +142,14 @@ define <4 x i32> @testv4i32(<4 x i32> %in) {
155
142
; SSE3-NEXT: psrld $4, %xmm1
156
143
; SSE3-NEXT: paddd %xmm0, %xmm1
157
144
; SSE3-NEXT: pand {{.*}}(%rip), %xmm1
145
+ ; SSE3-NEXT: pxor %xmm0, %xmm0
158
146
; SSE3-NEXT: movdqa %xmm1, %xmm2
159
- ; SSE3-NEXT: psllq $16, % xmm2
160
- ; SSE3-NEXT: paddb %xmm1 , %xmm2
161
- ; SSE3-NEXT: movdqa %xmm2, % xmm0
162
- ; SSE3-NEXT: psllq $8 , %xmm0
163
- ; SSE3-NEXT: paddb %xmm2, %xmm0
164
- ; SSE3-NEXT: psrld $24 , %xmm0
147
+ ; SSE3-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm0[2],xmm2[3],xmm0[3]
148
+ ; SSE3-NEXT: psadbw %xmm0 , %xmm2
149
+ ; SSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0], xmm0[0],xmm1[1],xmm0[1]
150
+ ; SSE3-NEXT: psadbw %xmm0 , %xmm1
151
+ ; SSE3-NEXT: packuswb %xmm2, %xmm1
152
+ ; SSE3-NEXT: movdqa %xmm1 , %xmm0
165
153
; SSE3-NEXT: retq
166
154
;
167
155
; SSSE3-LABEL: testv4i32:
@@ -247,7 +235,7 @@ define <8 x i16> @testv8i16(<8 x i16> %in) {
247
235
; SSE2-NEXT: paddw %xmm0, %xmm1
248
236
; SSE2-NEXT: pand {{.*}}(%rip), %xmm1
249
237
; SSE2-NEXT: movdqa %xmm1, %xmm0
250
- ; SSE2-NEXT: psllq $8, %xmm0
238
+ ; SSE2-NEXT: psllw $8, %xmm0
251
239
; SSE2-NEXT: paddb %xmm1, %xmm0
252
240
; SSE2-NEXT: psrlw $8, %xmm0
253
241
; SSE2-NEXT: retq
@@ -269,30 +257,27 @@ define <8 x i16> @testv8i16(<8 x i16> %in) {
269
257
; SSE3-NEXT: paddw %xmm0, %xmm1
270
258
; SSE3-NEXT: pand {{.*}}(%rip), %xmm1
271
259
; SSE3-NEXT: movdqa %xmm1, %xmm0
272
- ; SSE3-NEXT: psllq $8, %xmm0
260
+ ; SSE3-NEXT: psllw $8, %xmm0
273
261
; SSE3-NEXT: paddb %xmm1, %xmm0
274
262
; SSE3-NEXT: psrlw $8, %xmm0
275
263
; SSE3-NEXT: retq
276
264
;
277
265
; SSSE3-LABEL: testv8i16:
278
266
; SSSE3: # BB#0:
279
- ; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
280
- ; SSSE3-NEXT: movdqa %xmm0, %xmm3
281
- ; SSSE3-NEXT: pand %xmm2 , %xmm3
282
- ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
283
- ; SSSE3-NEXT: movdqa %xmm1 , %xmm4
284
- ; SSSE3-NEXT: pshufb %xmm3 , %xmm4
267
+ ; SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
268
+ ; SSSE3-NEXT: movdqa %xmm0, %xmm2
269
+ ; SSSE3-NEXT: pand %xmm1 , %xmm2
270
+ ; SSSE3-NEXT: movdqa {{.*#+}} xmm3 = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
271
+ ; SSSE3-NEXT: movdqa %xmm3 , %xmm4
272
+ ; SSSE3-NEXT: pshufb %xmm2 , %xmm4
285
273
; SSSE3-NEXT: psrlw $4, %xmm0
286
- ; SSSE3-NEXT: pand %xmm2, %xmm0
287
- ; SSSE3-NEXT: pshufb %xmm0, %xmm1
288
- ; SSSE3-NEXT: paddb %xmm4, %xmm1
289
- ; SSSE3-NEXT: movdqa %xmm1, %xmm0
290
- ; SSSE3-NEXT: pshufb {{.*#+}} xmm0 = xmm0[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
291
- ; SSSE3-NEXT: pshufb {{.*#+}} xmm1 = xmm1[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
292
- ; SSSE3-NEXT: paddb %xmm0, %xmm1
293
- ; SSSE3-NEXT: pxor %xmm0, %xmm0
294
- ; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]
295
- ; SSSE3-NEXT: movdqa %xmm1, %xmm0
274
+ ; SSSE3-NEXT: pand %xmm1, %xmm0
275
+ ; SSSE3-NEXT: pshufb %xmm0, %xmm3
276
+ ; SSSE3-NEXT: paddb %xmm4, %xmm3
277
+ ; SSSE3-NEXT: movdqa %xmm3, %xmm0
278
+ ; SSSE3-NEXT: psllw $8, %xmm0
279
+ ; SSSE3-NEXT: paddb %xmm3, %xmm0
280
+ ; SSSE3-NEXT: psrlw $8, %xmm0
296
281
; SSSE3-NEXT: retq
297
282
;
298
283
; SSE41-LABEL: testv8i16:
@@ -308,10 +293,9 @@ define <8 x i16> @testv8i16(<8 x i16> %in) {
308
293
; SSE41-NEXT: pshufb %xmm0, %xmm3
309
294
; SSE41-NEXT: paddb %xmm4, %xmm3
310
295
; SSE41-NEXT: movdqa %xmm3, %xmm0
311
- ; SSE41-NEXT: pshufb {{.*#+}} xmm0 = xmm0[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
312
- ; SSE41-NEXT: pshufb {{.*#+}} xmm3 = xmm3[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
313
- ; SSE41-NEXT: paddb %xmm0, %xmm3
314
- ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero
296
+ ; SSE41-NEXT: psllw $8, %xmm0
297
+ ; SSE41-NEXT: paddb %xmm3, %xmm0
298
+ ; SSE41-NEXT: psrlw $8, %xmm0
315
299
; SSE41-NEXT: retq
316
300
;
317
301
; AVX-LABEL: testv8i16:
@@ -324,10 +308,9 @@ define <8 x i16> @testv8i16(<8 x i16> %in) {
324
308
; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0
325
309
; AVX-NEXT: vpshufb %xmm0, %xmm3, %xmm0
326
310
; AVX-NEXT: vpaddb %xmm2, %xmm0, %xmm0
327
- ; AVX-NEXT: vpshufb {{.*#+}} xmm1 = xmm0[1,3,5,7,9,11,13,15,u,u,u,u,u,u,u,u]
328
- ; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u]
329
- ; AVX-NEXT: vpaddb %xmm1, %xmm0, %xmm0
330
- ; AVX-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
311
+ ; AVX-NEXT: vpsllw $8, %xmm0, %xmm1
312
+ ; AVX-NEXT: vpaddb %xmm0, %xmm1, %xmm0
313
+ ; AVX-NEXT: vpsrlw $8, %xmm0, %xmm0
331
314
; AVX-NEXT: retq
332
315
%out = call <8 x i16 > @llvm.ctpop.v8i16 (<8 x i16 > %in )
333
316
ret <8 x i16 > %out
0 commit comments