1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
5
6;
7; PR6455 'Clear Upper Bits' Patterns
8;
9
10define <2 x i64> @_clearupper2xi64a(<2 x i64>) nounwind {
11; SSE-LABEL: _clearupper2xi64a:
12; SSE:       # BB#0:
13; SSE-NEXT:    andps {{.*}}(%rip), %xmm0
14; SSE-NEXT:    retq
15;
16; AVX1-LABEL: _clearupper2xi64a:
17; AVX1:       # BB#0:
18; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
19; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
20; AVX1-NEXT:    retq
21;
22; AVX2-LABEL: _clearupper2xi64a:
23; AVX2:       # BB#0:
24; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
25; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
26; AVX2-NEXT:    retq
27  %x0 = extractelement <2 x i64> %0, i32 0
28  %x1 = extractelement <2 x i64> %0, i32 1
29  %trunc0 = trunc i64 %x0 to i32
30  %trunc1 = trunc i64 %x1 to i32
31  %ext0 = zext i32 %trunc0 to i64
32  %ext1 = zext i32 %trunc1 to i64
33  %v0 = insertelement <2 x i64> undef, i64 %ext0, i32 0
34  %v1 = insertelement <2 x i64> %v0,   i64 %ext1, i32 1
35  ret <2 x i64> %v1
36}
37
38define <4 x i64> @_clearupper4xi64a(<4 x i64>) nounwind {
39; SSE-LABEL: _clearupper4xi64a:
40; SSE:       # BB#0:
41; SSE-NEXT:    movaps {{.*#+}} xmm2 = [4294967295,4294967295]
42; SSE-NEXT:    andps %xmm2, %xmm0
43; SSE-NEXT:    andps %xmm2, %xmm1
44; SSE-NEXT:    retq
45;
46; AVX1-LABEL: _clearupper4xi64a:
47; AVX1:       # BB#0:
48; AVX1-NEXT:    vxorps %ymm1, %ymm1, %ymm1
49; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
50; AVX1-NEXT:    retq
51;
52; AVX2-LABEL: _clearupper4xi64a:
53; AVX2:       # BB#0:
54; AVX2-NEXT:    vpxor %ymm1, %ymm1, %ymm1
55; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
56; AVX2-NEXT:    retq
57  %x0 = extractelement <4 x i64> %0, i32 0
58  %x1 = extractelement <4 x i64> %0, i32 1
59  %x2 = extractelement <4 x i64> %0, i32 2
60  %x3 = extractelement <4 x i64> %0, i32 3
61  %trunc0 = trunc i64 %x0 to i32
62  %trunc1 = trunc i64 %x1 to i32
63  %trunc2 = trunc i64 %x2 to i32
64  %trunc3 = trunc i64 %x3 to i32
65  %ext0 = zext i32 %trunc0 to i64
66  %ext1 = zext i32 %trunc1 to i64
67  %ext2 = zext i32 %trunc2 to i64
68  %ext3 = zext i32 %trunc3 to i64
69  %v0 = insertelement <4 x i64> undef, i64 %ext0, i32 0
70  %v1 = insertelement <4 x i64> %v0,   i64 %ext1, i32 1
71  %v2 = insertelement <4 x i64> %v1,   i64 %ext2, i32 2
72  %v3 = insertelement <4 x i64> %v2,   i64 %ext3, i32 3
73  ret <4 x i64> %v3
74}
75
76define <4 x i32> @_clearupper4xi32a(<4 x i32>) nounwind {
77; SSE-LABEL: _clearupper4xi32a:
78; SSE:       # BB#0:
79; SSE-NEXT:    andps {{.*}}(%rip), %xmm0
80; SSE-NEXT:    retq
81;
82; AVX-LABEL: _clearupper4xi32a:
83; AVX:       # BB#0:
84; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
85; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
86; AVX-NEXT:    retq
87  %x0 = extractelement <4 x i32> %0, i32 0
88  %x1 = extractelement <4 x i32> %0, i32 1
89  %x2 = extractelement <4 x i32> %0, i32 2
90  %x3 = extractelement <4 x i32> %0, i32 3
91  %trunc0 = trunc i32 %x0 to i16
92  %trunc1 = trunc i32 %x1 to i16
93  %trunc2 = trunc i32 %x2 to i16
94  %trunc3 = trunc i32 %x3 to i16
95  %ext0 = zext i16 %trunc0 to i32
96  %ext1 = zext i16 %trunc1 to i32
97  %ext2 = zext i16 %trunc2 to i32
98  %ext3 = zext i16 %trunc3 to i32
99  %v0 = insertelement <4 x i32> undef, i32 %ext0, i32 0
100  %v1 = insertelement <4 x i32> %v0,   i32 %ext1, i32 1
101  %v2 = insertelement <4 x i32> %v1,   i32 %ext2, i32 2
102  %v3 = insertelement <4 x i32> %v2,   i32 %ext3, i32 3
103  ret <4 x i32> %v3
104}
105
106; FIXME: Missed vpblendw on AVX2 target
107define <8 x i32> @_clearupper8xi32a(<8 x i32>) nounwind {
108; SSE-LABEL: _clearupper8xi32a:
109; SSE:       # BB#0:
110; SSE-NEXT:    movaps {{.*#+}} xmm2 = [65535,65535,65535,65535]
111; SSE-NEXT:    andps %xmm2, %xmm0
112; SSE-NEXT:    andps %xmm2, %xmm1
113; SSE-NEXT:    retq
114;
115; AVX1-LABEL: _clearupper8xi32a:
116; AVX1:       # BB#0:
117; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
118; AVX1-NEXT:    retq
119;
120; AVX2-LABEL: _clearupper8xi32a:
121; AVX2:       # BB#0:
122; AVX2-NEXT:    vbroadcastss {{.*}}(%rip), %ymm1
123; AVX2-NEXT:    vandps %ymm1, %ymm0, %ymm0
124; AVX2-NEXT:    retq
125  %x0 = extractelement <8 x i32> %0, i32 0
126  %x1 = extractelement <8 x i32> %0, i32 1
127  %x2 = extractelement <8 x i32> %0, i32 2
128  %x3 = extractelement <8 x i32> %0, i32 3
129  %x4 = extractelement <8 x i32> %0, i32 4
130  %x5 = extractelement <8 x i32> %0, i32 5
131  %x6 = extractelement <8 x i32> %0, i32 6
132  %x7 = extractelement <8 x i32> %0, i32 7
133  %trunc0 = trunc i32 %x0 to i16
134  %trunc1 = trunc i32 %x1 to i16
135  %trunc2 = trunc i32 %x2 to i16
136  %trunc3 = trunc i32 %x3 to i16
137  %trunc4 = trunc i32 %x4 to i16
138  %trunc5 = trunc i32 %x5 to i16
139  %trunc6 = trunc i32 %x6 to i16
140  %trunc7 = trunc i32 %x7 to i16
141  %ext0 = zext i16 %trunc0 to i32
142  %ext1 = zext i16 %trunc1 to i32
143  %ext2 = zext i16 %trunc2 to i32
144  %ext3 = zext i16 %trunc3 to i32
145  %ext4 = zext i16 %trunc4 to i32
146  %ext5 = zext i16 %trunc5 to i32
147  %ext6 = zext i16 %trunc6 to i32
148  %ext7 = zext i16 %trunc7 to i32
149  %v0 = insertelement <8 x i32> undef, i32 %ext0, i32 0
150  %v1 = insertelement <8 x i32> %v0,   i32 %ext1, i32 1
151  %v2 = insertelement <8 x i32> %v1,   i32 %ext2, i32 2
152  %v3 = insertelement <8 x i32> %v2,   i32 %ext3, i32 3
153  %v4 = insertelement <8 x i32> %v3,   i32 %ext4, i32 4
154  %v5 = insertelement <8 x i32> %v4,   i32 %ext5, i32 5
155  %v6 = insertelement <8 x i32> %v5,   i32 %ext6, i32 6
156  %v7 = insertelement <8 x i32> %v6,   i32 %ext7, i32 7
157  ret <8 x i32> %v7
158}
159
160define <8 x i16> @_clearupper8xi16a(<8 x i16>) nounwind {
161; SSE-LABEL: _clearupper8xi16a:
162; SSE:       # BB#0:
163; SSE-NEXT:    pextrw $1, %xmm0, %eax
164; SSE-NEXT:    pextrw $2, %xmm0, %r9d
165; SSE-NEXT:    pextrw $3, %xmm0, %edx
166; SSE-NEXT:    pextrw $4, %xmm0, %r8d
167; SSE-NEXT:    pextrw $5, %xmm0, %edi
168; SSE-NEXT:    pextrw $6, %xmm0, %esi
169; SSE-NEXT:    pextrw $7, %xmm0, %ecx
170; SSE-NEXT:    movd %ecx, %xmm1
171; SSE-NEXT:    movd %edx, %xmm2
172; SSE-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
173; SSE-NEXT:    movd %edi, %xmm1
174; SSE-NEXT:    movd %eax, %xmm3
175; SSE-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3]
176; SSE-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
177; SSE-NEXT:    movd %esi, %xmm1
178; SSE-NEXT:    movd %r9d, %xmm2
179; SSE-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
180; SSE-NEXT:    movd %r8d, %xmm1
181; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
182; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
183; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
184; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
185; SSE-NEXT:    retq
186;
187; AVX-LABEL: _clearupper8xi16a:
188; AVX:       # BB#0:
189; AVX-NEXT:    vandps {{.*}}(%rip), %xmm0, %xmm0
190; AVX-NEXT:    retq
191  %x0 = extractelement <8 x i16> %0, i32 0
192  %x1 = extractelement <8 x i16> %0, i32 1
193  %x2 = extractelement <8 x i16> %0, i32 2
194  %x3 = extractelement <8 x i16> %0, i32 3
195  %x4 = extractelement <8 x i16> %0, i32 4
196  %x5 = extractelement <8 x i16> %0, i32 5
197  %x6 = extractelement <8 x i16> %0, i32 6
198  %x7 = extractelement <8 x i16> %0, i32 7
199  %trunc0 = trunc i16 %x0 to i8
200  %trunc1 = trunc i16 %x1 to i8
201  %trunc2 = trunc i16 %x2 to i8
202  %trunc3 = trunc i16 %x3 to i8
203  %trunc4 = trunc i16 %x4 to i8
204  %trunc5 = trunc i16 %x5 to i8
205  %trunc6 = trunc i16 %x6 to i8
206  %trunc7 = trunc i16 %x7 to i8
207  %ext0 = zext i8 %trunc0 to i16
208  %ext1 = zext i8 %trunc1 to i16
209  %ext2 = zext i8 %trunc2 to i16
210  %ext3 = zext i8 %trunc3 to i16
211  %ext4 = zext i8 %trunc4 to i16
212  %ext5 = zext i8 %trunc5 to i16
213  %ext6 = zext i8 %trunc6 to i16
214  %ext7 = zext i8 %trunc7 to i16
215  %v0 = insertelement <8 x i16> undef, i16 %ext0, i32 0
216  %v1 = insertelement <8 x i16> %v0,   i16 %ext1, i32 1
217  %v2 = insertelement <8 x i16> %v1,   i16 %ext2, i32 2
218  %v3 = insertelement <8 x i16> %v2,   i16 %ext3, i32 3
219  %v4 = insertelement <8 x i16> %v3,   i16 %ext4, i32 4
220  %v5 = insertelement <8 x i16> %v4,   i16 %ext5, i32 5
221  %v6 = insertelement <8 x i16> %v5,   i16 %ext6, i32 6
222  %v7 = insertelement <8 x i16> %v6,   i16 %ext7, i32 7
223  ret <8 x i16> %v7
224}
225
226define <16 x i16> @_clearupper16xi16a(<16 x i16>) nounwind {
227; SSE-LABEL: _clearupper16xi16a:
228; SSE:       # BB#0:
229; SSE-NEXT:    pushq %rbp
230; SSE-NEXT:    pushq %r15
231; SSE-NEXT:    pushq %r14
232; SSE-NEXT:    pushq %r12
233; SSE-NEXT:    pushq %rbx
234; SSE-NEXT:    pextrw $1, %xmm0, %edi
235; SSE-NEXT:    pextrw $2, %xmm0, %eax
236; SSE-NEXT:    pextrw $3, %xmm0, %ecx
237; SSE-NEXT:    pextrw $4, %xmm0, %edx
238; SSE-NEXT:    pextrw $5, %xmm0, %esi
239; SSE-NEXT:    pextrw $6, %xmm0, %ebx
240; SSE-NEXT:    pextrw $7, %xmm0, %ebp
241; SSE-NEXT:    pextrw $1, %xmm1, %r10d
242; SSE-NEXT:    pextrw $2, %xmm1, %r9d
243; SSE-NEXT:    pextrw $3, %xmm1, %r14d
244; SSE-NEXT:    pextrw $4, %xmm1, %r8d
245; SSE-NEXT:    pextrw $5, %xmm1, %r15d
246; SSE-NEXT:    pextrw $6, %xmm1, %r11d
247; SSE-NEXT:    pextrw $7, %xmm1, %r12d
248; SSE-NEXT:    movd %ebp, %xmm2
249; SSE-NEXT:    movd %ecx, %xmm3
250; SSE-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
251; SSE-NEXT:    movd %esi, %xmm2
252; SSE-NEXT:    movd %edi, %xmm4
253; SSE-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3]
254; SSE-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
255; SSE-NEXT:    movd %ebx, %xmm2
256; SSE-NEXT:    movd %eax, %xmm3
257; SSE-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
258; SSE-NEXT:    movd %edx, %xmm2
259; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
260; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
261; SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]
262; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
263; SSE-NEXT:    pand %xmm2, %xmm0
264; SSE-NEXT:    movd %r12d, %xmm3
265; SSE-NEXT:    movd %r14d, %xmm4
266; SSE-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
267; SSE-NEXT:    movd %r15d, %xmm3
268; SSE-NEXT:    movd %r10d, %xmm5
269; SSE-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1],xmm5[2],xmm3[2],xmm5[3],xmm3[3]
270; SSE-NEXT:    punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3]
271; SSE-NEXT:    movd %r11d, %xmm3
272; SSE-NEXT:    movd %r9d, %xmm4
273; SSE-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
274; SSE-NEXT:    movd %r8d, %xmm3
275; SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]
276; SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3]
277; SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm5[0],xmm1[1],xmm5[1],xmm1[2],xmm5[2],xmm1[3],xmm5[3]
278; SSE-NEXT:    pand %xmm2, %xmm1
279; SSE-NEXT:    popq %rbx
280; SSE-NEXT:    popq %r12
281; SSE-NEXT:    popq %r14
282; SSE-NEXT:    popq %r15
283; SSE-NEXT:    popq %rbp
284; SSE-NEXT:    retq
285;
286; AVX-LABEL: _clearupper16xi16a:
287; AVX:       # BB#0:
288; AVX-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
289; AVX-NEXT:    retq
290  %x0  = extractelement <16 x i16> %0, i32 0
291  %x1  = extractelement <16 x i16> %0, i32 1
292  %x2  = extractelement <16 x i16> %0, i32 2
293  %x3  = extractelement <16 x i16> %0, i32 3
294  %x4  = extractelement <16 x i16> %0, i32 4
295  %x5  = extractelement <16 x i16> %0, i32 5
296  %x6  = extractelement <16 x i16> %0, i32 6
297  %x7  = extractelement <16 x i16> %0, i32 7
298  %x8  = extractelement <16 x i16> %0, i32 8
299  %x9  = extractelement <16 x i16> %0, i32 9
300  %x10 = extractelement <16 x i16> %0, i32 10
301  %x11 = extractelement <16 x i16> %0, i32 11
302  %x12 = extractelement <16 x i16> %0, i32 12
303  %x13 = extractelement <16 x i16> %0, i32 13
304  %x14 = extractelement <16 x i16> %0, i32 14
305  %x15 = extractelement <16 x i16> %0, i32 15
306  %trunc0  = trunc i16 %x0  to i8
307  %trunc1  = trunc i16 %x1  to i8
308  %trunc2  = trunc i16 %x2  to i8
309  %trunc3  = trunc i16 %x3  to i8
310  %trunc4  = trunc i16 %x4  to i8
311  %trunc5  = trunc i16 %x5  to i8
312  %trunc6  = trunc i16 %x6  to i8
313  %trunc7  = trunc i16 %x7  to i8
314  %trunc8  = trunc i16 %x8  to i8
315  %trunc9  = trunc i16 %x9  to i8
316  %trunc10 = trunc i16 %x10 to i8
317  %trunc11 = trunc i16 %x11 to i8
318  %trunc12 = trunc i16 %x12 to i8
319  %trunc13 = trunc i16 %x13 to i8
320  %trunc14 = trunc i16 %x14 to i8
321  %trunc15 = trunc i16 %x15 to i8
322  %ext0  = zext i8 %trunc0  to i16
323  %ext1  = zext i8 %trunc1  to i16
324  %ext2  = zext i8 %trunc2  to i16
325  %ext3  = zext i8 %trunc3  to i16
326  %ext4  = zext i8 %trunc4  to i16
327  %ext5  = zext i8 %trunc5  to i16
328  %ext6  = zext i8 %trunc6  to i16
329  %ext7  = zext i8 %trunc7  to i16
330  %ext8  = zext i8 %trunc8  to i16
331  %ext9  = zext i8 %trunc9  to i16
332  %ext10 = zext i8 %trunc10 to i16
333  %ext11 = zext i8 %trunc11 to i16
334  %ext12 = zext i8 %trunc12 to i16
335  %ext13 = zext i8 %trunc13 to i16
336  %ext14 = zext i8 %trunc14 to i16
337  %ext15 = zext i8 %trunc15 to i16
338  %v0  = insertelement <16 x i16> undef, i16 %ext0,  i32 0
339  %v1  = insertelement <16 x i16> %v0,   i16 %ext1,  i32 1
340  %v2  = insertelement <16 x i16> %v1,   i16 %ext2,  i32 2
341  %v3  = insertelement <16 x i16> %v2,   i16 %ext3,  i32 3
342  %v4  = insertelement <16 x i16> %v3,   i16 %ext4,  i32 4
343  %v5  = insertelement <16 x i16> %v4,   i16 %ext5,  i32 5
344  %v6  = insertelement <16 x i16> %v5,   i16 %ext6,  i32 6
345  %v7  = insertelement <16 x i16> %v6,   i16 %ext7,  i32 7
346  %v8  = insertelement <16 x i16> %v7,   i16 %ext8,  i32 8
347  %v9  = insertelement <16 x i16> %v8,   i16 %ext9,  i32 9
348  %v10 = insertelement <16 x i16> %v9,   i16 %ext10, i32 10
349  %v11 = insertelement <16 x i16> %v10,  i16 %ext11, i32 11
350  %v12 = insertelement <16 x i16> %v11,  i16 %ext12, i32 12
351  %v13 = insertelement <16 x i16> %v12,  i16 %ext13, i32 13
352  %v14 = insertelement <16 x i16> %v13,  i16 %ext14, i32 14
353  %v15 = insertelement <16 x i16> %v14,  i16 %ext15, i32 15
354  ret <16 x i16> %v15
355}
356
357define <16 x i8> @_clearupper16xi8a(<16 x i8>) nounwind {
358; SSE-LABEL: _clearupper16xi8a:
359; SSE:       # BB#0:
360; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
361; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
362; SSE-NEXT:    movd %eax, %xmm0
363; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
364; SSE-NEXT:    movd %eax, %xmm1
365; SSE-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]
366; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
367; SSE-NEXT:    movd %eax, %xmm0
368; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
369; SSE-NEXT:    movd %eax, %xmm2
370; SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
371; SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
372; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
373; SSE-NEXT:    movd %eax, %xmm0
374; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
375; SSE-NEXT:    movd %eax, %xmm3
376; SSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
377; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
378; SSE-NEXT:    movd %eax, %xmm0
379; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
380; SSE-NEXT:    movd %eax, %xmm1
381; SSE-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]
382; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
383; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
384; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
385; SSE-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
386; SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
387; SSE-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
388; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
389; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
390; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
391; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
392; SSE-NEXT:    movd %eax, %xmm2
393; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
394; SSE-NEXT:    movd %eax, %xmm3
395; SSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
396; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
397; SSE-NEXT:    movd %eax, %xmm2
398; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
399; SSE-NEXT:    movd %eax, %xmm4
400; SSE-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
401; SSE-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
402; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
403; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
404; SSE-NEXT:    pand {{.*}}(%rip), %xmm0
405; SSE-NEXT:    retq
406;
407; AVX-LABEL: _clearupper16xi8a:
408; AVX:       # BB#0:
409; AVX-NEXT:    vpextrb $0, %xmm0, %eax
410; AVX-NEXT:    vpextrb $1, %xmm0, %ecx
411; AVX-NEXT:    vmovd %eax, %xmm1
412; AVX-NEXT:    vpinsrb $1, %ecx, %xmm1, %xmm1
413; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3,4,5,6,7]
414; AVX-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
415; AVX-NEXT:    retq
416  %x0  = extractelement <16 x i8> %0, i32 0
417  %x1  = extractelement <16 x i8> %0, i32 1
418  %x2  = extractelement <16 x i8> %0, i32 2
419  %x3  = extractelement <16 x i8> %0, i32 3
420  %x4  = extractelement <16 x i8> %0, i32 4
421  %x5  = extractelement <16 x i8> %0, i32 5
422  %x6  = extractelement <16 x i8> %0, i32 6
423  %x7  = extractelement <16 x i8> %0, i32 7
424  %x8  = extractelement <16 x i8> %0, i32 8
425  %x9  = extractelement <16 x i8> %0, i32 9
426  %x10 = extractelement <16 x i8> %0, i32 10
427  %x11 = extractelement <16 x i8> %0, i32 11
428  %x12 = extractelement <16 x i8> %0, i32 12
429  %x13 = extractelement <16 x i8> %0, i32 13
430  %x14 = extractelement <16 x i8> %0, i32 14
431  %x15 = extractelement <16 x i8> %0, i32 15
432  %trunc0  = trunc i8 %x0  to i4
433  %trunc1  = trunc i8 %x1  to i4
434  %trunc2  = trunc i8 %x2  to i4
435  %trunc3  = trunc i8 %x3  to i4
436  %trunc4  = trunc i8 %x4  to i4
437  %trunc5  = trunc i8 %x5  to i4
438  %trunc6  = trunc i8 %x6  to i4
439  %trunc7  = trunc i8 %x7  to i4
440  %trunc8  = trunc i8 %x8  to i4
441  %trunc9  = trunc i8 %x9  to i4
442  %trunc10 = trunc i8 %x10 to i4
443  %trunc11 = trunc i8 %x11 to i4
444  %trunc12 = trunc i8 %x12 to i4
445  %trunc13 = trunc i8 %x13 to i4
446  %trunc14 = trunc i8 %x14 to i4
447  %trunc15 = trunc i8 %x15 to i4
448  %ext0  = zext i4 %trunc0  to i8
449  %ext1  = zext i4 %trunc1  to i8
450  %ext2  = zext i4 %trunc2  to i8
451  %ext3  = zext i4 %trunc3  to i8
452  %ext4  = zext i4 %trunc4  to i8
453  %ext5  = zext i4 %trunc5  to i8
454  %ext6  = zext i4 %trunc6  to i8
455  %ext7  = zext i4 %trunc7  to i8
456  %ext8  = zext i4 %trunc8  to i8
457  %ext9  = zext i4 %trunc9  to i8
458  %ext10 = zext i4 %trunc10 to i8
459  %ext11 = zext i4 %trunc11 to i8
460  %ext12 = zext i4 %trunc12 to i8
461  %ext13 = zext i4 %trunc13 to i8
462  %ext14 = zext i4 %trunc14 to i8
463  %ext15 = zext i4 %trunc15 to i8
464  %v0  = insertelement <16 x i8> undef, i8 %ext0,  i32 0
465  %v1  = insertelement <16 x i8> %v0,   i8 %ext1,  i32 1
466  %v2  = insertelement <16 x i8> %v1,   i8 %ext2,  i32 2
467  %v3  = insertelement <16 x i8> %v2,   i8 %ext3,  i32 3
468  %v4  = insertelement <16 x i8> %v3,   i8 %ext4,  i32 4
469  %v5  = insertelement <16 x i8> %v4,   i8 %ext5,  i32 5
470  %v6  = insertelement <16 x i8> %v5,   i8 %ext6,  i32 6
471  %v7  = insertelement <16 x i8> %v6,   i8 %ext7,  i32 7
472  %v8  = insertelement <16 x i8> %v7,   i8 %ext8,  i32 8
473  %v9  = insertelement <16 x i8> %v8,   i8 %ext9,  i32 9
474  %v10 = insertelement <16 x i8> %v9,   i8 %ext10, i32 10
475  %v11 = insertelement <16 x i8> %v10,  i8 %ext11, i32 11
476  %v12 = insertelement <16 x i8> %v11,  i8 %ext12, i32 12
477  %v13 = insertelement <16 x i8> %v12,  i8 %ext13, i32 13
478  %v14 = insertelement <16 x i8> %v13,  i8 %ext14, i32 14
479  %v15 = insertelement <16 x i8> %v14,  i8 %ext15, i32 15
480  ret <16 x i8> %v15
481}
482
483define <32 x i8> @_clearupper32xi8a(<32 x i8>) nounwind {
484; SSE-LABEL: _clearupper32xi8a:
485; SSE:       # BB#0:
486; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
487; SSE-NEXT:    movaps %xmm1, -{{[0-9]+}}(%rsp)
488; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
489; SSE-NEXT:    movd %eax, %xmm0
490; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
491; SSE-NEXT:    movd %eax, %xmm1
492; SSE-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]
493; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
494; SSE-NEXT:    movd %eax, %xmm0
495; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
496; SSE-NEXT:    movd %eax, %xmm2
497; SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
498; SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
499; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
500; SSE-NEXT:    movd %eax, %xmm0
501; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
502; SSE-NEXT:    movd %eax, %xmm3
503; SSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3],xmm3[4],xmm0[4],xmm3[5],xmm0[5],xmm3[6],xmm0[6],xmm3[7],xmm0[7]
504; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
505; SSE-NEXT:    movd %eax, %xmm0
506; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
507; SSE-NEXT:    movd %eax, %xmm1
508; SSE-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]
509; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
510; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3],xmm1[4],xmm2[4],xmm1[5],xmm2[5],xmm1[6],xmm2[6],xmm1[7],xmm2[7]
511; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
512; SSE-NEXT:    movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
513; SSE-NEXT:    punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]
514; SSE-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
515; SSE-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
516; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
517; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3],xmm0[4],xmm2[4],xmm0[5],xmm2[5],xmm0[6],xmm2[6],xmm0[7],xmm2[7]
518; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
519; SSE-NEXT:    movd %eax, %xmm2
520; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
521; SSE-NEXT:    movd %eax, %xmm3
522; SSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3],xmm3[4],xmm2[4],xmm3[5],xmm2[5],xmm3[6],xmm2[6],xmm3[7],xmm2[7]
523; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
524; SSE-NEXT:    movd %eax, %xmm2
525; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
526; SSE-NEXT:    movd %eax, %xmm4
527; SSE-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1],xmm4[2],xmm2[2],xmm4[3],xmm2[3],xmm4[4],xmm2[4],xmm4[5],xmm2[5],xmm4[6],xmm2[6],xmm4[7],xmm2[7]
528; SSE-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
529; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3],xmm0[4],xmm4[4],xmm0[5],xmm4[5],xmm0[6],xmm4[6],xmm0[7],xmm4[7]
530; SSE-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
531; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
532; SSE-NEXT:    pand %xmm2, %xmm0
533; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
534; SSE-NEXT:    movd %eax, %xmm1
535; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
536; SSE-NEXT:    movd %eax, %xmm3
537; SSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
538; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
539; SSE-NEXT:    movd %eax, %xmm1
540; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
541; SSE-NEXT:    movd %eax, %xmm4
542; SSE-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3],xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7]
543; SSE-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3],xmm4[4],xmm3[4],xmm4[5],xmm3[5],xmm4[6],xmm3[6],xmm4[7],xmm3[7]
544; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
545; SSE-NEXT:    movd %eax, %xmm1
546; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
547; SSE-NEXT:    movd %eax, %xmm5
548; SSE-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm1[0],xmm5[1],xmm1[1],xmm5[2],xmm1[2],xmm5[3],xmm1[3],xmm5[4],xmm1[4],xmm5[5],xmm1[5],xmm5[6],xmm1[6],xmm5[7],xmm1[7]
549; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
550; SSE-NEXT:    movd %eax, %xmm1
551; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
552; SSE-NEXT:    movd %eax, %xmm3
553; SSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
554; SSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm5[0],xmm3[1],xmm5[1],xmm3[2],xmm5[2],xmm3[3],xmm5[3],xmm3[4],xmm5[4],xmm3[5],xmm5[5],xmm3[6],xmm5[6],xmm3[7],xmm5[7]
555; SSE-NEXT:    punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1],xmm3[2],xmm4[2],xmm3[3],xmm4[3],xmm3[4],xmm4[4],xmm3[5],xmm4[5],xmm3[6],xmm4[6],xmm3[7],xmm4[7]
556; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
557; SSE-NEXT:    movd {{.*#+}} xmm4 = mem[0],zero,zero,zero
558; SSE-NEXT:    punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3],xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7]
559; SSE-NEXT:    movd {{.*#+}} xmm5 = mem[0],zero,zero,zero
560; SSE-NEXT:    movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
561; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm5[0],xmm1[1],xmm5[1],xmm1[2],xmm5[2],xmm1[3],xmm5[3],xmm1[4],xmm5[4],xmm1[5],xmm5[5],xmm1[6],xmm5[6],xmm1[7],xmm5[7]
562; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3],xmm1[4],xmm4[4],xmm1[5],xmm4[5],xmm1[6],xmm4[6],xmm1[7],xmm4[7]
563; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
564; SSE-NEXT:    movd %eax, %xmm4
565; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
566; SSE-NEXT:    movd %eax, %xmm5
567; SSE-NEXT:    punpcklbw {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3],xmm5[4],xmm4[4],xmm5[5],xmm4[5],xmm5[6],xmm4[6],xmm5[7],xmm4[7]
568; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
569; SSE-NEXT:    movd %eax, %xmm4
570; SSE-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
571; SSE-NEXT:    movd %eax, %xmm6
572; SSE-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm4[0],xmm6[1],xmm4[1],xmm6[2],xmm4[2],xmm6[3],xmm4[3],xmm6[4],xmm4[4],xmm6[5],xmm4[5],xmm6[6],xmm4[6],xmm6[7],xmm4[7]
573; SSE-NEXT:    punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm5[0],xmm6[1],xmm5[1],xmm6[2],xmm5[2],xmm6[3],xmm5[3],xmm6[4],xmm5[4],xmm6[5],xmm5[5],xmm6[6],xmm5[6],xmm6[7],xmm5[7]
574; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm6[0],xmm1[1],xmm6[1],xmm1[2],xmm6[2],xmm1[3],xmm6[3],xmm1[4],xmm6[4],xmm1[5],xmm6[5],xmm1[6],xmm6[6],xmm1[7],xmm6[7]
575; SSE-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3],xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
576; SSE-NEXT:    pand %xmm2, %xmm1
577; SSE-NEXT:    retq
578;
579; AVX1-LABEL: _clearupper32xi8a:
580; AVX1:       # BB#0:
581; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
582; AVX1-NEXT:    vpextrb $1, %xmm0, %ecx
583; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
584; AVX1-NEXT:    vpextrb $0, %xmm1, %edx
585; AVX1-NEXT:    vpextrb $1, %xmm1, %esi
586; AVX1-NEXT:    vmovd %edx, %xmm2
587; AVX1-NEXT:    vpinsrb $1, %esi, %xmm2, %xmm2
588; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3,4,5,6,7]
589; AVX1-NEXT:    vmovd %eax, %xmm2
590; AVX1-NEXT:    vpinsrb $1, %ecx, %xmm2, %xmm2
591; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3,4,5,6,7]
592; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
593; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
594; AVX1-NEXT:    retq
595;
596; AVX2-LABEL: _clearupper32xi8a:
597; AVX2:       # BB#0:
598; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
599; AVX2-NEXT:    vpextrb $1, %xmm0, %ecx
600; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
601; AVX2-NEXT:    vpextrb $0, %xmm1, %edx
602; AVX2-NEXT:    vpextrb $1, %xmm1, %esi
603; AVX2-NEXT:    vmovd %edx, %xmm2
604; AVX2-NEXT:    vpinsrb $1, %esi, %xmm2, %xmm2
605; AVX2-NEXT:    vpblendw {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3,4,5,6,7]
606; AVX2-NEXT:    vmovd %eax, %xmm2
607; AVX2-NEXT:    vpinsrb $1, %ecx, %xmm2, %xmm2
608; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3,4,5,6,7]
609; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
610; AVX2-NEXT:    vpand {{.*}}(%rip), %ymm0, %ymm0
611; AVX2-NEXT:    retq
612  %x0  = extractelement <32 x i8> %0, i32 0
613  %x1  = extractelement <32 x i8> %0, i32 1
614  %x2  = extractelement <32 x i8> %0, i32 2
615  %x3  = extractelement <32 x i8> %0, i32 3
616  %x4  = extractelement <32 x i8> %0, i32 4
617  %x5  = extractelement <32 x i8> %0, i32 5
618  %x6  = extractelement <32 x i8> %0, i32 6
619  %x7  = extractelement <32 x i8> %0, i32 7
620  %x8  = extractelement <32 x i8> %0, i32 8
621  %x9  = extractelement <32 x i8> %0, i32 9
622  %x10 = extractelement <32 x i8> %0, i32 10
623  %x11 = extractelement <32 x i8> %0, i32 11
624  %x12 = extractelement <32 x i8> %0, i32 12
625  %x13 = extractelement <32 x i8> %0, i32 13
626  %x14 = extractelement <32 x i8> %0, i32 14
627  %x15 = extractelement <32 x i8> %0, i32 15
628  %x16 = extractelement <32 x i8> %0, i32 16
629  %x17 = extractelement <32 x i8> %0, i32 17
630  %x18 = extractelement <32 x i8> %0, i32 18
631  %x19 = extractelement <32 x i8> %0, i32 19
632  %x20 = extractelement <32 x i8> %0, i32 20
633  %x21 = extractelement <32 x i8> %0, i32 21
634  %x22 = extractelement <32 x i8> %0, i32 22
635  %x23 = extractelement <32 x i8> %0, i32 23
636  %x24 = extractelement <32 x i8> %0, i32 24
637  %x25 = extractelement <32 x i8> %0, i32 25
638  %x26 = extractelement <32 x i8> %0, i32 26
639  %x27 = extractelement <32 x i8> %0, i32 27
640  %x28 = extractelement <32 x i8> %0, i32 28
641  %x29 = extractelement <32 x i8> %0, i32 29
642  %x30 = extractelement <32 x i8> %0, i32 30
643  %x31 = extractelement <32 x i8> %0, i32 31
644  %trunc0  = trunc i8 %x0  to i4
645  %trunc1  = trunc i8 %x1  to i4
646  %trunc2  = trunc i8 %x2  to i4
647  %trunc3  = trunc i8 %x3  to i4
648  %trunc4  = trunc i8 %x4  to i4
649  %trunc5  = trunc i8 %x5  to i4
650  %trunc6  = trunc i8 %x6  to i4
651  %trunc7  = trunc i8 %x7  to i4
652  %trunc8  = trunc i8 %x8  to i4
653  %trunc9  = trunc i8 %x9  to i4
654  %trunc10 = trunc i8 %x10 to i4
655  %trunc11 = trunc i8 %x11 to i4
656  %trunc12 = trunc i8 %x12 to i4
657  %trunc13 = trunc i8 %x13 to i4
658  %trunc14 = trunc i8 %x14 to i4
659  %trunc15 = trunc i8 %x15 to i4
660  %trunc16 = trunc i8 %x16 to i4
661  %trunc17 = trunc i8 %x17 to i4
662  %trunc18 = trunc i8 %x18 to i4
663  %trunc19 = trunc i8 %x19 to i4
664  %trunc20 = trunc i8 %x20 to i4
665  %trunc21 = trunc i8 %x21 to i4
666  %trunc22 = trunc i8 %x22 to i4
667  %trunc23 = trunc i8 %x23 to i4
668  %trunc24 = trunc i8 %x24 to i4
669  %trunc25 = trunc i8 %x25 to i4
670  %trunc26 = trunc i8 %x26 to i4
671  %trunc27 = trunc i8 %x27 to i4
672  %trunc28 = trunc i8 %x28 to i4
673  %trunc29 = trunc i8 %x29 to i4
674  %trunc30 = trunc i8 %x30 to i4
675  %trunc31 = trunc i8 %x31 to i4
676  %ext0  = zext i4 %trunc0  to i8
677  %ext1  = zext i4 %trunc1  to i8
678  %ext2  = zext i4 %trunc2  to i8
679  %ext3  = zext i4 %trunc3  to i8
680  %ext4  = zext i4 %trunc4  to i8
681  %ext5  = zext i4 %trunc5  to i8
682  %ext6  = zext i4 %trunc6  to i8
683  %ext7  = zext i4 %trunc7  to i8
684  %ext8  = zext i4 %trunc8  to i8
685  %ext9  = zext i4 %trunc9  to i8
686  %ext10 = zext i4 %trunc10 to i8
687  %ext11 = zext i4 %trunc11 to i8
688  %ext12 = zext i4 %trunc12 to i8
689  %ext13 = zext i4 %trunc13 to i8
690  %ext14 = zext i4 %trunc14 to i8
691  %ext15 = zext i4 %trunc15 to i8
692  %ext16 = zext i4 %trunc16 to i8
693  %ext17 = zext i4 %trunc17 to i8
694  %ext18 = zext i4 %trunc18 to i8
695  %ext19 = zext i4 %trunc19 to i8
696  %ext20 = zext i4 %trunc20 to i8
697  %ext21 = zext i4 %trunc21 to i8
698  %ext22 = zext i4 %trunc22 to i8
699  %ext23 = zext i4 %trunc23 to i8
700  %ext24 = zext i4 %trunc24 to i8
701  %ext25 = zext i4 %trunc25 to i8
702  %ext26 = zext i4 %trunc26 to i8
703  %ext27 = zext i4 %trunc27 to i8
704  %ext28 = zext i4 %trunc28 to i8
705  %ext29 = zext i4 %trunc29 to i8
706  %ext30 = zext i4 %trunc30 to i8
707  %ext31 = zext i4 %trunc31 to i8
708  %v0  = insertelement <32 x i8> undef, i8 %ext0,  i32 0
709  %v1  = insertelement <32 x i8> %v0,   i8 %ext1,  i32 1
710  %v2  = insertelement <32 x i8> %v1,   i8 %ext2,  i32 2
711  %v3  = insertelement <32 x i8> %v2,   i8 %ext3,  i32 3
712  %v4  = insertelement <32 x i8> %v3,   i8 %ext4,  i32 4
713  %v5  = insertelement <32 x i8> %v4,   i8 %ext5,  i32 5
714  %v6  = insertelement <32 x i8> %v5,   i8 %ext6,  i32 6
715  %v7  = insertelement <32 x i8> %v6,   i8 %ext7,  i32 7
716  %v8  = insertelement <32 x i8> %v7,   i8 %ext8,  i32 8
717  %v9  = insertelement <32 x i8> %v8,   i8 %ext9,  i32 9
718  %v10 = insertelement <32 x i8> %v9,   i8 %ext10, i32 10
719  %v11 = insertelement <32 x i8> %v10,  i8 %ext11, i32 11
720  %v12 = insertelement <32 x i8> %v11,  i8 %ext12, i32 12
721  %v13 = insertelement <32 x i8> %v12,  i8 %ext13, i32 13
722  %v14 = insertelement <32 x i8> %v13,  i8 %ext14, i32 14
723  %v15 = insertelement <32 x i8> %v14,  i8 %ext15, i32 15
724  %v16 = insertelement <32 x i8> %v15,  i8 %ext16, i32 16
725  %v17 = insertelement <32 x i8> %v16,  i8 %ext17, i32 17
726  %v18 = insertelement <32 x i8> %v17,  i8 %ext18, i32 18
727  %v19 = insertelement <32 x i8> %v18,  i8 %ext19, i32 19
728  %v20 = insertelement <32 x i8> %v19,  i8 %ext20, i32 20
729  %v21 = insertelement <32 x i8> %v20,  i8 %ext21, i32 21
730  %v22 = insertelement <32 x i8> %v21,  i8 %ext22, i32 22
731  %v23 = insertelement <32 x i8> %v22,  i8 %ext23, i32 23
732  %v24 = insertelement <32 x i8> %v23,  i8 %ext24, i32 24
733  %v25 = insertelement <32 x i8> %v24,  i8 %ext25, i32 25
734  %v26 = insertelement <32 x i8> %v25,  i8 %ext26, i32 26
735  %v27 = insertelement <32 x i8> %v26,  i8 %ext27, i32 27
736  %v28 = insertelement <32 x i8> %v27,  i8 %ext28, i32 28
737  %v29 = insertelement <32 x i8> %v28,  i8 %ext29, i32 29
738  %v30 = insertelement <32 x i8> %v29,  i8 %ext30, i32 30
739  %v31 = insertelement <32 x i8> %v30,  i8 %ext31, i32 31
740  ret <32 x i8> %v31
741}
742
743define <2 x i64> @_clearupper2xi64b(<2 x i64>) nounwind {
744; SSE-LABEL: _clearupper2xi64b:
745; SSE:       # BB#0:
746; SSE-NEXT:    andps {{.*}}(%rip), %xmm0
747; SSE-NEXT:    retq
748;
749; AVX1-LABEL: _clearupper2xi64b:
750; AVX1:       # BB#0:
751; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
752; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
753; AVX1-NEXT:    retq
754;
755; AVX2-LABEL: _clearupper2xi64b:
756; AVX2:       # BB#0:
757; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
758; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
759; AVX2-NEXT:    retq
760  %x32 = bitcast <2 x i64> %0 to <4 x i32>
761  %r0 = insertelement <4 x i32> %x32, i32 zeroinitializer, i32 1
762  %r1 = insertelement <4 x i32> %r0,  i32 zeroinitializer, i32 3
763  %r = bitcast <4 x i32> %r1 to <2 x i64>
764  ret <2 x i64> %r
765}
766
767define <4 x i64> @_clearupper4xi64b(<4 x i64>) nounwind {
768; SSE-LABEL: _clearupper4xi64b:
769; SSE:       # BB#0:
770; SSE-NEXT:    movaps {{.*#+}} xmm2 = [4294967295,0,4294967295,0]
771; SSE-NEXT:    andps %xmm2, %xmm0
772; SSE-NEXT:    andps %xmm2, %xmm1
773; SSE-NEXT:    retq
774;
775; AVX1-LABEL: _clearupper4xi64b:
776; AVX1:       # BB#0:
777; AVX1-NEXT:    vxorps %ymm1, %ymm1, %ymm1
778; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
779; AVX1-NEXT:    retq
780;
781; AVX2-LABEL: _clearupper4xi64b:
782; AVX2:       # BB#0:
783; AVX2-NEXT:    vpxor %ymm1, %ymm1, %ymm1
784; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
785; AVX2-NEXT:    retq
786  %x32 = bitcast <4 x i64> %0 to <8 x i32>
787  %r0 = insertelement <8 x i32> %x32, i32 zeroinitializer, i32 1
788  %r1 = insertelement <8 x i32> %r0,  i32 zeroinitializer, i32 3
789  %r2 = insertelement <8 x i32> %r1,  i32 zeroinitializer, i32 5
790  %r3 = insertelement <8 x i32> %r2,  i32 zeroinitializer, i32 7
791  %r = bitcast <8 x i32> %r3 to <4 x i64>
792  ret <4 x i64> %r
793}
794
795define <4 x i32> @_clearupper4xi32b(<4 x i32>) nounwind {
796; SSE-LABEL: _clearupper4xi32b:
797; SSE:       # BB#0:
798; SSE-NEXT:    andps {{.*}}(%rip), %xmm0
799; SSE-NEXT:    retq
800;
801; AVX-LABEL: _clearupper4xi32b:
802; AVX:       # BB#0:
803; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
804; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
805; AVX-NEXT:    retq
806  %x16 = bitcast <4 x i32> %0 to <8 x i16>
807  %r0 = insertelement <8 x i16> %x16, i16 zeroinitializer, i32 1
808  %r1 = insertelement <8 x i16> %r0,  i16 zeroinitializer, i32 3
809  %r2 = insertelement <8 x i16> %r1,  i16 zeroinitializer, i32 5
810  %r3 = insertelement <8 x i16> %r2,  i16 zeroinitializer, i32 7
811  %r = bitcast <8 x i16> %r3 to <4 x i32>
812  ret <4 x i32> %r
813}
814
815define <8 x i32> @_clearupper8xi32b(<8 x i32>) nounwind {
816; SSE-LABEL: _clearupper8xi32b:
817; SSE:       # BB#0:
818; SSE-NEXT:    movaps {{.*#+}} xmm2 = [65535,0,65535,0,65535,0,65535,0]
819; SSE-NEXT:    andps %xmm2, %xmm0
820; SSE-NEXT:    andps %xmm2, %xmm1
821; SSE-NEXT:    retq
822;
823; AVX1-LABEL: _clearupper8xi32b:
824; AVX1:       # BB#0:
825; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
826; AVX1-NEXT:    vpblendw {{.*#+}} xmm2 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
827; AVX1-NEXT:    vblendps {{.*#+}} ymm2 = ymm2[0,1,2,3],ymm0[4,5,6,7]
828; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
829; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
830; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
831; AVX1-NEXT:    retq
832;
833; AVX2-LABEL: _clearupper8xi32b:
834; AVX2:       # BB#0:
835; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
836; AVX2-NEXT:    vpblendw {{.*#+}} xmm2 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
837; AVX2-NEXT:    vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3],ymm0[4,5,6,7]
838; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
839; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
840; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm2, %ymm0
841; AVX2-NEXT:    retq
842  %x16 = bitcast <8 x i32> %0 to <16 x i16>
843  %r0 = insertelement <16 x i16> %x16, i16 zeroinitializer, i32 1
844  %r1 = insertelement <16 x i16> %r0,  i16 zeroinitializer, i32 3
845  %r2 = insertelement <16 x i16> %r1,  i16 zeroinitializer, i32 5
846  %r3 = insertelement <16 x i16> %r2,  i16 zeroinitializer, i32 7
847  %r4 = insertelement <16 x i16> %r3,  i16 zeroinitializer, i32 9
848  %r5 = insertelement <16 x i16> %r4,  i16 zeroinitializer, i32 11
849  %r6 = insertelement <16 x i16> %r5,  i16 zeroinitializer, i32 13
850  %r7 = insertelement <16 x i16> %r6,  i16 zeroinitializer, i32 15
851  %r = bitcast <16 x i16> %r7 to <8 x i32>
852  ret <8 x i32> %r
853}
854
855define <8 x i16> @_clearupper8xi16b(<8 x i16>) nounwind {
856; SSE-LABEL: _clearupper8xi16b:
857; SSE:       # BB#0:
858; SSE-NEXT:    andps {{.*}}(%rip), %xmm0
859; SSE-NEXT:    retq
860;
861; AVX-LABEL: _clearupper8xi16b:
862; AVX:       # BB#0:
863; AVX-NEXT:    vandps {{.*}}(%rip), %xmm0, %xmm0
864; AVX-NEXT:    retq
865  %x8 = bitcast <8 x i16> %0 to <16 x i8>
866  %r0 = insertelement <16 x i8> %x8, i8 zeroinitializer, i32 1
867  %r1 = insertelement <16 x i8> %r0, i8 zeroinitializer, i32 3
868  %r2 = insertelement <16 x i8> %r1, i8 zeroinitializer, i32 5
869  %r3 = insertelement <16 x i8> %r2, i8 zeroinitializer, i32 7
870  %r4 = insertelement <16 x i8> %r3, i8 zeroinitializer, i32 9
871  %r5 = insertelement <16 x i8> %r4, i8 zeroinitializer, i32 11
872  %r6 = insertelement <16 x i8> %r5, i8 zeroinitializer, i32 13
873  %r7 = insertelement <16 x i8> %r6, i8 zeroinitializer, i32 15
874  %r = bitcast <16 x i8> %r7 to <8 x i16>
875  ret <8 x i16> %r
876}
877
878define <16 x i16> @_clearupper16xi16b(<16 x i16>) nounwind {
879; SSE-LABEL: _clearupper16xi16b:
880; SSE:       # BB#0:
881; SSE-NEXT:    movaps {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
882; SSE-NEXT:    andps %xmm2, %xmm0
883; SSE-NEXT:    andps %xmm2, %xmm1
884; SSE-NEXT:    retq
885;
886; AVX1-LABEL: _clearupper16xi16b:
887; AVX1:       # BB#0:
888; AVX1-NEXT:    vmovaps {{.*#+}} xmm1 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
889; AVX1-NEXT:    vandps %xmm1, %xmm0, %xmm2
890; AVX1-NEXT:    vblendps {{.*#+}} ymm2 = ymm2[0,1,2,3],ymm0[4,5,6,7]
891; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
892; AVX1-NEXT:    vandps %xmm1, %xmm0, %xmm0
893; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
894; AVX1-NEXT:    retq
895;
896; AVX2-LABEL: _clearupper16xi16b:
897; AVX2:       # BB#0:
898; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
899; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm2
900; AVX2-NEXT:    vpblendd {{.*#+}} ymm2 = ymm2[0,1,2,3],ymm0[4,5,6,7]
901; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
902; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm0
903; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm2, %ymm0
904; AVX2-NEXT:    retq
905  %x8 = bitcast <16 x i16> %0 to <32 x i8>
906  %r0  = insertelement <32 x i8> %x8,  i8 zeroinitializer, i32 1
907  %r1  = insertelement <32 x i8> %r0,  i8 zeroinitializer, i32 3
908  %r2  = insertelement <32 x i8> %r1,  i8 zeroinitializer, i32 5
909  %r3  = insertelement <32 x i8> %r2,  i8 zeroinitializer, i32 7
910  %r4  = insertelement <32 x i8> %r3,  i8 zeroinitializer, i32 9
911  %r5  = insertelement <32 x i8> %r4,  i8 zeroinitializer, i32 11
912  %r6  = insertelement <32 x i8> %r5,  i8 zeroinitializer, i32 13
913  %r7  = insertelement <32 x i8> %r6,  i8 zeroinitializer, i32 15
914  %r8  = insertelement <32 x i8> %r7,  i8 zeroinitializer, i32 17
915  %r9  = insertelement <32 x i8> %r8,  i8 zeroinitializer, i32 19
916  %r10 = insertelement <32 x i8> %r9,  i8 zeroinitializer, i32 21
917  %r11 = insertelement <32 x i8> %r10, i8 zeroinitializer, i32 23
918  %r12 = insertelement <32 x i8> %r11, i8 zeroinitializer, i32 25
919  %r13 = insertelement <32 x i8> %r12, i8 zeroinitializer, i32 27
920  %r14 = insertelement <32 x i8> %r13, i8 zeroinitializer, i32 29
921  %r15 = insertelement <32 x i8> %r14, i8 zeroinitializer, i32 31
922  %r = bitcast <32 x i8> %r15 to <16 x i16>
923  ret <16 x i16> %r
924}
925
926define <16 x i8> @_clearupper16xi8b(<16 x i8>) nounwind {
927; SSE-LABEL: _clearupper16xi8b:
928; SSE:       # BB#0:
929; SSE-NEXT:    pushq %r14
930; SSE-NEXT:    pushq %rbx
931; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
932; SSE-NEXT:    movd %xmm0, %rcx
933; SSE-NEXT:    movq %rcx, %r8
934; SSE-NEXT:    movq %rcx, %r9
935; SSE-NEXT:    movq %rcx, %r10
936; SSE-NEXT:    movq %rcx, %rax
937; SSE-NEXT:    movq %rcx, %rdx
938; SSE-NEXT:    movq %rcx, %rsi
939; SSE-NEXT:    movq %rcx, %rdi
940; SSE-NEXT:    andb $15, %cl
941; SSE-NEXT:    movb %cl, -{{[0-9]+}}(%rsp)
942; SSE-NEXT:    movd %xmm1, %rcx
943; SSE-NEXT:    shrq $56, %rdi
944; SSE-NEXT:    andb $15, %dil
945; SSE-NEXT:    movb %dil, -{{[0-9]+}}(%rsp)
946; SSE-NEXT:    movq %rcx, %r11
947; SSE-NEXT:    shrq $48, %rsi
948; SSE-NEXT:    andb $15, %sil
949; SSE-NEXT:    movb %sil, -{{[0-9]+}}(%rsp)
950; SSE-NEXT:    movq %rcx, %r14
951; SSE-NEXT:    shrq $40, %rdx
952; SSE-NEXT:    andb $15, %dl
953; SSE-NEXT:    movb %dl, -{{[0-9]+}}(%rsp)
954; SSE-NEXT:    movq %rcx, %rdx
955; SSE-NEXT:    shrq $32, %rax
956; SSE-NEXT:    andb $15, %al
957; SSE-NEXT:    movb %al, -{{[0-9]+}}(%rsp)
958; SSE-NEXT:    movq %rcx, %rax
959; SSE-NEXT:    shrq $24, %r10
960; SSE-NEXT:    andb $15, %r10b
961; SSE-NEXT:    movb %r10b, -{{[0-9]+}}(%rsp)
962; SSE-NEXT:    movq %rcx, %rdi
963; SSE-NEXT:    shrq $16, %r9
964; SSE-NEXT:    andb $15, %r9b
965; SSE-NEXT:    movb %r9b, -{{[0-9]+}}(%rsp)
966; SSE-NEXT:    movq %rcx, %rsi
967; SSE-NEXT:    shrq $8, %r8
968; SSE-NEXT:    andb $15, %r8b
969; SSE-NEXT:    movb %r8b, -{{[0-9]+}}(%rsp)
970; SSE-NEXT:    movq %rcx, %rbx
971; SSE-NEXT:    movb $0, -{{[0-9]+}}(%rsp)
972; SSE-NEXT:    andb $15, %cl
973; SSE-NEXT:    movb %cl, -{{[0-9]+}}(%rsp)
974; SSE-NEXT:    shrq $56, %rbx
975; SSE-NEXT:    andb $15, %bl
976; SSE-NEXT:    movb %bl, -{{[0-9]+}}(%rsp)
977; SSE-NEXT:    shrq $48, %rsi
978; SSE-NEXT:    andb $15, %sil
979; SSE-NEXT:    movb %sil, -{{[0-9]+}}(%rsp)
980; SSE-NEXT:    shrq $40, %rdi
981; SSE-NEXT:    andb $15, %dil
982; SSE-NEXT:    movb %dil, -{{[0-9]+}}(%rsp)
983; SSE-NEXT:    shrq $32, %rax
984; SSE-NEXT:    andb $15, %al
985; SSE-NEXT:    movb %al, -{{[0-9]+}}(%rsp)
986; SSE-NEXT:    shrq $24, %rdx
987; SSE-NEXT:    andb $15, %dl
988; SSE-NEXT:    movb %dl, -{{[0-9]+}}(%rsp)
989; SSE-NEXT:    shrq $16, %r14
990; SSE-NEXT:    andb $15, %r14b
991; SSE-NEXT:    movb %r14b, -{{[0-9]+}}(%rsp)
992; SSE-NEXT:    shrq $8, %r11
993; SSE-NEXT:    andb $15, %r11b
994; SSE-NEXT:    movb %r11b, -{{[0-9]+}}(%rsp)
995; SSE-NEXT:    movb $0, -{{[0-9]+}}(%rsp)
996; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
997; SSE-NEXT:    movq {{.*#+}} xmm1 = mem[0],zero
998; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
999; SSE-NEXT:    popq %rbx
1000; SSE-NEXT:    popq %r14
1001; SSE-NEXT:    retq
1002;
1003; AVX-LABEL: _clearupper16xi8b:
1004; AVX:       # BB#0:
1005; AVX-NEXT:    pushq %rbp
1006; AVX-NEXT:    pushq %r15
1007; AVX-NEXT:    pushq %r14
1008; AVX-NEXT:    pushq %r13
1009; AVX-NEXT:    pushq %r12
1010; AVX-NEXT:    pushq %rbx
1011; AVX-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)
1012; AVX-NEXT:    movq -{{[0-9]+}}(%rsp), %rcx
1013; AVX-NEXT:    movq -{{[0-9]+}}(%rsp), %rdx
1014; AVX-NEXT:    movq %rcx, %r8
1015; AVX-NEXT:    movq %rcx, %r9
1016; AVX-NEXT:    movq %rcx, %r10
1017; AVX-NEXT:    movq %rcx, %r11
1018; AVX-NEXT:    movq %rcx, %r14
1019; AVX-NEXT:    movq %rcx, %r15
1020; AVX-NEXT:    movq %rdx, %r12
1021; AVX-NEXT:    movq %rdx, %r13
1022; AVX-NEXT:    movq %rdx, %rdi
1023; AVX-NEXT:    movq %rdx, %rax
1024; AVX-NEXT:    movq %rdx, %rsi
1025; AVX-NEXT:    movq %rdx, %rbx
1026; AVX-NEXT:    movq %rdx, %rbp
1027; AVX-NEXT:    andb $15, %dl
1028; AVX-NEXT:    movb %dl, -{{[0-9]+}}(%rsp)
1029; AVX-NEXT:    movq %rcx, %rdx
1030; AVX-NEXT:    andb $15, %cl
1031; AVX-NEXT:    movb %cl, -{{[0-9]+}}(%rsp)
1032; AVX-NEXT:    shrq $56, %rbp
1033; AVX-NEXT:    andb $15, %bpl
1034; AVX-NEXT:    movb %bpl, -{{[0-9]+}}(%rsp)
1035; AVX-NEXT:    shrq $48, %rbx
1036; AVX-NEXT:    andb $15, %bl
1037; AVX-NEXT:    movb %bl, -{{[0-9]+}}(%rsp)
1038; AVX-NEXT:    shrq $40, %rsi
1039; AVX-NEXT:    andb $15, %sil
1040; AVX-NEXT:    movb %sil, -{{[0-9]+}}(%rsp)
1041; AVX-NEXT:    shrq $32, %rax
1042; AVX-NEXT:    andb $15, %al
1043; AVX-NEXT:    movb %al, -{{[0-9]+}}(%rsp)
1044; AVX-NEXT:    shrq $24, %rdi
1045; AVX-NEXT:    andb $15, %dil
1046; AVX-NEXT:    movb %dil, -{{[0-9]+}}(%rsp)
1047; AVX-NEXT:    shrq $16, %r13
1048; AVX-NEXT:    andb $15, %r13b
1049; AVX-NEXT:    movb %r13b, -{{[0-9]+}}(%rsp)
1050; AVX-NEXT:    shrq $8, %r12
1051; AVX-NEXT:    andb $15, %r12b
1052; AVX-NEXT:    movb %r12b, -{{[0-9]+}}(%rsp)
1053; AVX-NEXT:    shrq $56, %rdx
1054; AVX-NEXT:    andb $15, %dl
1055; AVX-NEXT:    movb %dl, -{{[0-9]+}}(%rsp)
1056; AVX-NEXT:    shrq $48, %r15
1057; AVX-NEXT:    andb $15, %r15b
1058; AVX-NEXT:    movb %r15b, -{{[0-9]+}}(%rsp)
1059; AVX-NEXT:    shrq $40, %r14
1060; AVX-NEXT:    andb $15, %r14b
1061; AVX-NEXT:    movb %r14b, -{{[0-9]+}}(%rsp)
1062; AVX-NEXT:    shrq $32, %r11
1063; AVX-NEXT:    andb $15, %r11b
1064; AVX-NEXT:    movb %r11b, -{{[0-9]+}}(%rsp)
1065; AVX-NEXT:    shrq $24, %r10
1066; AVX-NEXT:    andb $15, %r10b
1067; AVX-NEXT:    movb %r10b, -{{[0-9]+}}(%rsp)
1068; AVX-NEXT:    shrq $16, %r9
1069; AVX-NEXT:    andb $15, %r9b
1070; AVX-NEXT:    movb %r9b, -{{[0-9]+}}(%rsp)
1071; AVX-NEXT:    shrq $8, %r8
1072; AVX-NEXT:    andb $15, %r8b
1073; AVX-NEXT:    movb %r8b, -{{[0-9]+}}(%rsp)
1074; AVX-NEXT:    movb $0, -{{[0-9]+}}(%rsp)
1075; AVX-NEXT:    vmovaps -{{[0-9]+}}(%rsp), %xmm0
1076; AVX-NEXT:    popq %rbx
1077; AVX-NEXT:    popq %r12
1078; AVX-NEXT:    popq %r13
1079; AVX-NEXT:    popq %r14
1080; AVX-NEXT:    popq %r15
1081; AVX-NEXT:    popq %rbp
1082; AVX-NEXT:    retq
1083  %x4  = bitcast <16 x i8> %0 to <32 x i4>
1084  %r0  = insertelement <32 x i4> %x4,  i4 zeroinitializer, i32 1
1085  %r1  = insertelement <32 x i4> %r0,  i4 zeroinitializer, i32 3
1086  %r2  = insertelement <32 x i4> %r1,  i4 zeroinitializer, i32 5
1087  %r3  = insertelement <32 x i4> %r2,  i4 zeroinitializer, i32 7
1088  %r4  = insertelement <32 x i4> %r3,  i4 zeroinitializer, i32 9
1089  %r5  = insertelement <32 x i4> %r4,  i4 zeroinitializer, i32 11
1090  %r6  = insertelement <32 x i4> %r5,  i4 zeroinitializer, i32 13
1091  %r7  = insertelement <32 x i4> %r6,  i4 zeroinitializer, i32 15
1092  %r8  = insertelement <32 x i4> %r7,  i4 zeroinitializer, i32 17
1093  %r9  = insertelement <32 x i4> %r8,  i4 zeroinitializer, i32 19
1094  %r10 = insertelement <32 x i4> %r9,  i4 zeroinitializer, i32 21
1095  %r11 = insertelement <32 x i4> %r10, i4 zeroinitializer, i32 23
1096  %r12 = insertelement <32 x i4> %r11, i4 zeroinitializer, i32 25
1097  %r13 = insertelement <32 x i4> %r12, i4 zeroinitializer, i32 27
1098  %r14 = insertelement <32 x i4> %r13, i4 zeroinitializer, i32 29
1099  %r15 = insertelement <32 x i4> %r14, i4 zeroinitializer, i32 31
1100  %r = bitcast <32 x i4> %r15 to <16 x i8>
1101  ret <16 x i8> %r
1102}
1103
1104define <32 x i8> @_clearupper32xi8b(<32 x i8>) nounwind {
1105; SSE-LABEL: _clearupper32xi8b:
1106; SSE:       # BB#0:
1107; SSE-NEXT:    pushq %r14
1108; SSE-NEXT:    pushq %rbx
1109; SSE-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
1110; SSE-NEXT:    movd %xmm0, %rcx
1111; SSE-NEXT:    movq %rcx, %r8
1112; SSE-NEXT:    movq %rcx, %r9
1113; SSE-NEXT:    movq %rcx, %r10
1114; SSE-NEXT:    movq %rcx, %rax
1115; SSE-NEXT:    movq %rcx, %rdx
1116; SSE-NEXT:    movq %rcx, %rsi
1117; SSE-NEXT:    movq %rcx, %rdi
1118; SSE-NEXT:    andb $15, %cl
1119; SSE-NEXT:    movb %cl, -{{[0-9]+}}(%rsp)
1120; SSE-NEXT:    movd %xmm2, %rcx
1121; SSE-NEXT:    shrq $56, %rdi
1122; SSE-NEXT:    andb $15, %dil
1123; SSE-NEXT:    movb %dil, -{{[0-9]+}}(%rsp)
1124; SSE-NEXT:    movq %rcx, %r11
1125; SSE-NEXT:    shrq $48, %rsi
1126; SSE-NEXT:    andb $15, %sil
1127; SSE-NEXT:    movb %sil, -{{[0-9]+}}(%rsp)
1128; SSE-NEXT:    movq %rcx, %r14
1129; SSE-NEXT:    shrq $40, %rdx
1130; SSE-NEXT:    andb $15, %dl
1131; SSE-NEXT:    movb %dl, -{{[0-9]+}}(%rsp)
1132; SSE-NEXT:    movq %rcx, %rdx
1133; SSE-NEXT:    shrq $32, %rax
1134; SSE-NEXT:    andb $15, %al
1135; SSE-NEXT:    movb %al, -{{[0-9]+}}(%rsp)
1136; SSE-NEXT:    movq %rcx, %rax
1137; SSE-NEXT:    shrq $24, %r10
1138; SSE-NEXT:    andb $15, %r10b
1139; SSE-NEXT:    movb %r10b, -{{[0-9]+}}(%rsp)
1140; SSE-NEXT:    movq %rcx, %rdi
1141; SSE-NEXT:    shrq $16, %r9
1142; SSE-NEXT:    andb $15, %r9b
1143; SSE-NEXT:    movb %r9b, -{{[0-9]+}}(%rsp)
1144; SSE-NEXT:    movq %rcx, %rsi
1145; SSE-NEXT:    shrq $8, %r8
1146; SSE-NEXT:    andb $15, %r8b
1147; SSE-NEXT:    movb %r8b, -{{[0-9]+}}(%rsp)
1148; SSE-NEXT:    movq %rcx, %rbx
1149; SSE-NEXT:    movb $0, -{{[0-9]+}}(%rsp)
1150; SSE-NEXT:    andb $15, %cl
1151; SSE-NEXT:    movb %cl, -{{[0-9]+}}(%rsp)
1152; SSE-NEXT:    shrq $56, %rbx
1153; SSE-NEXT:    andb $15, %bl
1154; SSE-NEXT:    movb %bl, -{{[0-9]+}}(%rsp)
1155; SSE-NEXT:    shrq $48, %rsi
1156; SSE-NEXT:    andb $15, %sil
1157; SSE-NEXT:    movb %sil, -{{[0-9]+}}(%rsp)
1158; SSE-NEXT:    shrq $40, %rdi
1159; SSE-NEXT:    andb $15, %dil
1160; SSE-NEXT:    movb %dil, -{{[0-9]+}}(%rsp)
1161; SSE-NEXT:    shrq $32, %rax
1162; SSE-NEXT:    andb $15, %al
1163; SSE-NEXT:    movb %al, -{{[0-9]+}}(%rsp)
1164; SSE-NEXT:    shrq $24, %rdx
1165; SSE-NEXT:    andb $15, %dl
1166; SSE-NEXT:    movb %dl, -{{[0-9]+}}(%rsp)
1167; SSE-NEXT:    shrq $16, %r14
1168; SSE-NEXT:    andb $15, %r14b
1169; SSE-NEXT:    movb %r14b, -{{[0-9]+}}(%rsp)
1170; SSE-NEXT:    shrq $8, %r11
1171; SSE-NEXT:    andb $15, %r11b
1172; SSE-NEXT:    movb %r11b, -{{[0-9]+}}(%rsp)
1173; SSE-NEXT:    movb $0, -{{[0-9]+}}(%rsp)
1174; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1175; SSE-NEXT:    movq {{.*#+}} xmm2 = mem[0],zero
1176; SSE-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
1177; SSE-NEXT:    popq %rbx
1178; SSE-NEXT:    popq %r14
1179; SSE-NEXT:    retq
1180;
1181; AVX1-LABEL: _clearupper32xi8b:
1182; AVX1:       # BB#0:
1183; AVX1-NEXT:    pushq %r14
1184; AVX1-NEXT:    pushq %rbx
1185; AVX1-NEXT:    vpextrq $1, %xmm0, -{{[0-9]+}}(%rsp)
1186; AVX1-NEXT:    vmovq %xmm0, -{{[0-9]+}}(%rsp)
1187; AVX1-NEXT:    movq -{{[0-9]+}}(%rsp), %r14
1188; AVX1-NEXT:    vpextrq $1, %xmm0, %rdx
1189; AVX1-NEXT:    movq %rdx, %r8
1190; AVX1-NEXT:    movq %rdx, %r9
1191; AVX1-NEXT:    movq %rdx, %r11
1192; AVX1-NEXT:    movq %rdx, %rsi
1193; AVX1-NEXT:    movq %rdx, %rdi
1194; AVX1-NEXT:    movq %rdx, %rcx
1195; AVX1-NEXT:    movq %rdx, %rax
1196; AVX1-NEXT:    andb $15, %dl
1197; AVX1-NEXT:    movb %dl, -{{[0-9]+}}(%rsp)
1198; AVX1-NEXT:    shrq $56, %rax
1199; AVX1-NEXT:    andb $15, %al
1200; AVX1-NEXT:    movb %al, -{{[0-9]+}}(%rsp)
1201; AVX1-NEXT:    movq %r14, %r10
1202; AVX1-NEXT:    shrq $48, %rcx
1203; AVX1-NEXT:    andb $15, %cl
1204; AVX1-NEXT:    movb %cl, -{{[0-9]+}}(%rsp)
1205; AVX1-NEXT:    movq %r14, %rdx
1206; AVX1-NEXT:    shrq $40, %rdi
1207; AVX1-NEXT:    andb $15, %dil
1208; AVX1-NEXT:    movb %dil, -{{[0-9]+}}(%rsp)
1209; AVX1-NEXT:    movq %r14, %rax
1210; AVX1-NEXT:    shrq $32, %rsi
1211; AVX1-NEXT:    andb $15, %sil
1212; AVX1-NEXT:    movb %sil, -{{[0-9]+}}(%rsp)
1213; AVX1-NEXT:    movq %r14, %rcx
1214; AVX1-NEXT:    shrq $24, %r11
1215; AVX1-NEXT:    andb $15, %r11b
1216; AVX1-NEXT:    movb %r11b, -{{[0-9]+}}(%rsp)
1217; AVX1-NEXT:    movq %r14, %rsi
1218; AVX1-NEXT:    shrq $16, %r9
1219; AVX1-NEXT:    andb $15, %r9b
1220; AVX1-NEXT:    movb %r9b, -{{[0-9]+}}(%rsp)
1221; AVX1-NEXT:    movq %r14, %rdi
1222; AVX1-NEXT:    shrq $8, %r8
1223; AVX1-NEXT:    andb $15, %r8b
1224; AVX1-NEXT:    movb %r8b, -{{[0-9]+}}(%rsp)
1225; AVX1-NEXT:    movq %r14, %rbx
1226; AVX1-NEXT:    andb $15, %r14b
1227; AVX1-NEXT:    movb %r14b, -{{[0-9]+}}(%rsp)
1228; AVX1-NEXT:    shrq $8, %r10
1229; AVX1-NEXT:    shrq $16, %rdx
1230; AVX1-NEXT:    shrq $24, %rax
1231; AVX1-NEXT:    shrq $32, %rcx
1232; AVX1-NEXT:    shrq $40, %rsi
1233; AVX1-NEXT:    shrq $48, %rdi
1234; AVX1-NEXT:    shrq $56, %rbx
1235; AVX1-NEXT:    andb $15, %bl
1236; AVX1-NEXT:    movb %bl, -{{[0-9]+}}(%rsp)
1237; AVX1-NEXT:    andb $15, %dil
1238; AVX1-NEXT:    movb %dil, -{{[0-9]+}}(%rsp)
1239; AVX1-NEXT:    andb $15, %sil
1240; AVX1-NEXT:    movb %sil, -{{[0-9]+}}(%rsp)
1241; AVX1-NEXT:    andb $15, %cl
1242; AVX1-NEXT:    movb %cl, -{{[0-9]+}}(%rsp)
1243; AVX1-NEXT:    andb $15, %al
1244; AVX1-NEXT:    movb %al, -{{[0-9]+}}(%rsp)
1245; AVX1-NEXT:    andb $15, %dl
1246; AVX1-NEXT:    movb %dl, -{{[0-9]+}}(%rsp)
1247; AVX1-NEXT:    andb $15, %r10b
1248; AVX1-NEXT:    movb %r10b, -{{[0-9]+}}(%rsp)
1249; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
1250; AVX1-NEXT:    vmovq %xmm0, %rax
1251; AVX1-NEXT:    movq %rax, %r8
1252; AVX1-NEXT:    movq %rax, %rdx
1253; AVX1-NEXT:    movq %rax, %rsi
1254; AVX1-NEXT:    movq %rax, %rdi
1255; AVX1-NEXT:    movl %eax, %ebx
1256; AVX1-NEXT:    movl %eax, %ecx
1257; AVX1-NEXT:    vmovd %eax, %xmm1
1258; AVX1-NEXT:    shrl $8, %eax
1259; AVX1-NEXT:    vpinsrb $1, %eax, %xmm1, %xmm1
1260; AVX1-NEXT:    shrl $16, %ecx
1261; AVX1-NEXT:    vpinsrb $2, %ecx, %xmm1, %xmm1
1262; AVX1-NEXT:    shrl $24, %ebx
1263; AVX1-NEXT:    vpinsrb $3, %ebx, %xmm1, %xmm1
1264; AVX1-NEXT:    shrq $32, %rdi
1265; AVX1-NEXT:    vpinsrb $4, %edi, %xmm1, %xmm1
1266; AVX1-NEXT:    shrq $40, %rsi
1267; AVX1-NEXT:    vpinsrb $5, %esi, %xmm1, %xmm1
1268; AVX1-NEXT:    movb $0, -{{[0-9]+}}(%rsp)
1269; AVX1-NEXT:    vmovdqa -{{[0-9]+}}(%rsp), %xmm2
1270; AVX1-NEXT:    shrq $48, %rdx
1271; AVX1-NEXT:    vpinsrb $6, %edx, %xmm1, %xmm1
1272; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
1273; AVX1-NEXT:    shrq $56, %r8
1274; AVX1-NEXT:    vpinsrb $7, %r8d, %xmm1, %xmm0
1275; AVX1-NEXT:    movl %eax, %ecx
1276; AVX1-NEXT:    shrl $8, %ecx
1277; AVX1-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
1278; AVX1-NEXT:    vpinsrb $9, %ecx, %xmm0, %xmm0
1279; AVX1-NEXT:    movl %eax, %ecx
1280; AVX1-NEXT:    shrl $16, %ecx
1281; AVX1-NEXT:    vpinsrb $10, %ecx, %xmm0, %xmm0
1282; AVX1-NEXT:    movl %eax, %ecx
1283; AVX1-NEXT:    shrl $24, %ecx
1284; AVX1-NEXT:    vpinsrb $11, %ecx, %xmm0, %xmm0
1285; AVX1-NEXT:    movq %rax, %rcx
1286; AVX1-NEXT:    shrq $32, %rcx
1287; AVX1-NEXT:    vpinsrb $12, %ecx, %xmm0, %xmm0
1288; AVX1-NEXT:    movq %rax, %rcx
1289; AVX1-NEXT:    shrq $40, %rcx
1290; AVX1-NEXT:    vpinsrb $13, %ecx, %xmm0, %xmm0
1291; AVX1-NEXT:    movq %rax, %rcx
1292; AVX1-NEXT:    shrq $48, %rcx
1293; AVX1-NEXT:    vpinsrb $14, %ecx, %xmm0, %xmm0
1294; AVX1-NEXT:    vmovq %xmm2, %rcx
1295; AVX1-NEXT:    shrq $56, %rax
1296; AVX1-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
1297; AVX1-NEXT:    movl %ecx, %eax
1298; AVX1-NEXT:    shrl $8, %eax
1299; AVX1-NEXT:    vmovd %ecx, %xmm1
1300; AVX1-NEXT:    vpinsrb $1, %eax, %xmm1, %xmm1
1301; AVX1-NEXT:    movl %ecx, %eax
1302; AVX1-NEXT:    shrl $16, %eax
1303; AVX1-NEXT:    vpinsrb $2, %eax, %xmm1, %xmm1
1304; AVX1-NEXT:    movl %ecx, %eax
1305; AVX1-NEXT:    shrl $24, %eax
1306; AVX1-NEXT:    vpinsrb $3, %eax, %xmm1, %xmm1
1307; AVX1-NEXT:    movq %rcx, %rax
1308; AVX1-NEXT:    shrq $32, %rax
1309; AVX1-NEXT:    vpinsrb $4, %eax, %xmm1, %xmm1
1310; AVX1-NEXT:    movq %rcx, %rax
1311; AVX1-NEXT:    shrq $40, %rax
1312; AVX1-NEXT:    vpinsrb $5, %eax, %xmm1, %xmm1
1313; AVX1-NEXT:    movq %rcx, %rax
1314; AVX1-NEXT:    shrq $48, %rax
1315; AVX1-NEXT:    vpinsrb $6, %eax, %xmm1, %xmm1
1316; AVX1-NEXT:    vpextrq $1, %xmm2, %rax
1317; AVX1-NEXT:    shrq $56, %rcx
1318; AVX1-NEXT:    vpinsrb $7, %ecx, %xmm1, %xmm1
1319; AVX1-NEXT:    movl %eax, %ecx
1320; AVX1-NEXT:    shrl $8, %ecx
1321; AVX1-NEXT:    vpinsrb $8, %eax, %xmm1, %xmm1
1322; AVX1-NEXT:    vpinsrb $9, %ecx, %xmm1, %xmm1
1323; AVX1-NEXT:    movl %eax, %ecx
1324; AVX1-NEXT:    shrl $16, %ecx
1325; AVX1-NEXT:    vpinsrb $10, %ecx, %xmm1, %xmm1
1326; AVX1-NEXT:    movl %eax, %ecx
1327; AVX1-NEXT:    shrl $24, %ecx
1328; AVX1-NEXT:    vpinsrb $11, %ecx, %xmm1, %xmm1
1329; AVX1-NEXT:    movq %rax, %rcx
1330; AVX1-NEXT:    shrq $32, %rcx
1331; AVX1-NEXT:    vpinsrb $12, %ecx, %xmm1, %xmm1
1332; AVX1-NEXT:    movq %rax, %rcx
1333; AVX1-NEXT:    shrq $40, %rcx
1334; AVX1-NEXT:    vpinsrb $13, %ecx, %xmm1, %xmm1
1335; AVX1-NEXT:    movq %rax, %rcx
1336; AVX1-NEXT:    shrq $48, %rcx
1337; AVX1-NEXT:    vpinsrb $14, %ecx, %xmm1, %xmm1
1338; AVX1-NEXT:    shrq $56, %rax
1339; AVX1-NEXT:    vpinsrb $15, %eax, %xmm1, %xmm1
1340; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1341; AVX1-NEXT:    popq %rbx
1342; AVX1-NEXT:    popq %r14
1343; AVX1-NEXT:    retq
1344;
1345; AVX2-LABEL: _clearupper32xi8b:
1346; AVX2:       # BB#0:
1347; AVX2-NEXT:    pushq %r14
1348; AVX2-NEXT:    pushq %rbx
1349; AVX2-NEXT:    vpextrq $1, %xmm0, -{{[0-9]+}}(%rsp)
1350; AVX2-NEXT:    vmovq %xmm0, -{{[0-9]+}}(%rsp)
1351; AVX2-NEXT:    movq -{{[0-9]+}}(%rsp), %r14
1352; AVX2-NEXT:    vpextrq $1, %xmm0, %rdx
1353; AVX2-NEXT:    movq %rdx, %r8
1354; AVX2-NEXT:    movq %rdx, %r9
1355; AVX2-NEXT:    movq %rdx, %r11
1356; AVX2-NEXT:    movq %rdx, %rsi
1357; AVX2-NEXT:    movq %rdx, %rdi
1358; AVX2-NEXT:    movq %rdx, %rcx
1359; AVX2-NEXT:    movq %rdx, %rax
1360; AVX2-NEXT:    andb $15, %dl
1361; AVX2-NEXT:    movb %dl, -{{[0-9]+}}(%rsp)
1362; AVX2-NEXT:    shrq $56, %rax
1363; AVX2-NEXT:    andb $15, %al
1364; AVX2-NEXT:    movb %al, -{{[0-9]+}}(%rsp)
1365; AVX2-NEXT:    movq %r14, %r10
1366; AVX2-NEXT:    shrq $48, %rcx
1367; AVX2-NEXT:    andb $15, %cl
1368; AVX2-NEXT:    movb %cl, -{{[0-9]+}}(%rsp)
1369; AVX2-NEXT:    movq %r14, %rdx
1370; AVX2-NEXT:    shrq $40, %rdi
1371; AVX2-NEXT:    andb $15, %dil
1372; AVX2-NEXT:    movb %dil, -{{[0-9]+}}(%rsp)
1373; AVX2-NEXT:    movq %r14, %rax
1374; AVX2-NEXT:    shrq $32, %rsi
1375; AVX2-NEXT:    andb $15, %sil
1376; AVX2-NEXT:    movb %sil, -{{[0-9]+}}(%rsp)
1377; AVX2-NEXT:    movq %r14, %rcx
1378; AVX2-NEXT:    shrq $24, %r11
1379; AVX2-NEXT:    andb $15, %r11b
1380; AVX2-NEXT:    movb %r11b, -{{[0-9]+}}(%rsp)
1381; AVX2-NEXT:    movq %r14, %rsi
1382; AVX2-NEXT:    shrq $16, %r9
1383; AVX2-NEXT:    andb $15, %r9b
1384; AVX2-NEXT:    movb %r9b, -{{[0-9]+}}(%rsp)
1385; AVX2-NEXT:    movq %r14, %rdi
1386; AVX2-NEXT:    shrq $8, %r8
1387; AVX2-NEXT:    andb $15, %r8b
1388; AVX2-NEXT:    movb %r8b, -{{[0-9]+}}(%rsp)
1389; AVX2-NEXT:    movq %r14, %rbx
1390; AVX2-NEXT:    andb $15, %r14b
1391; AVX2-NEXT:    movb %r14b, -{{[0-9]+}}(%rsp)
1392; AVX2-NEXT:    shrq $8, %r10
1393; AVX2-NEXT:    shrq $16, %rdx
1394; AVX2-NEXT:    shrq $24, %rax
1395; AVX2-NEXT:    shrq $32, %rcx
1396; AVX2-NEXT:    shrq $40, %rsi
1397; AVX2-NEXT:    shrq $48, %rdi
1398; AVX2-NEXT:    shrq $56, %rbx
1399; AVX2-NEXT:    andb $15, %bl
1400; AVX2-NEXT:    movb %bl, -{{[0-9]+}}(%rsp)
1401; AVX2-NEXT:    andb $15, %dil
1402; AVX2-NEXT:    movb %dil, -{{[0-9]+}}(%rsp)
1403; AVX2-NEXT:    andb $15, %sil
1404; AVX2-NEXT:    movb %sil, -{{[0-9]+}}(%rsp)
1405; AVX2-NEXT:    andb $15, %cl
1406; AVX2-NEXT:    movb %cl, -{{[0-9]+}}(%rsp)
1407; AVX2-NEXT:    andb $15, %al
1408; AVX2-NEXT:    movb %al, -{{[0-9]+}}(%rsp)
1409; AVX2-NEXT:    andb $15, %dl
1410; AVX2-NEXT:    movb %dl, -{{[0-9]+}}(%rsp)
1411; AVX2-NEXT:    andb $15, %r10b
1412; AVX2-NEXT:    movb %r10b, -{{[0-9]+}}(%rsp)
1413; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
1414; AVX2-NEXT:    vmovq %xmm0, %rax
1415; AVX2-NEXT:    movq %rax, %r8
1416; AVX2-NEXT:    movq %rax, %rdx
1417; AVX2-NEXT:    movq %rax, %rsi
1418; AVX2-NEXT:    movq %rax, %rdi
1419; AVX2-NEXT:    movl %eax, %ebx
1420; AVX2-NEXT:    movl %eax, %ecx
1421; AVX2-NEXT:    vmovd %eax, %xmm1
1422; AVX2-NEXT:    shrl $8, %eax
1423; AVX2-NEXT:    vpinsrb $1, %eax, %xmm1, %xmm1
1424; AVX2-NEXT:    shrl $16, %ecx
1425; AVX2-NEXT:    vpinsrb $2, %ecx, %xmm1, %xmm1
1426; AVX2-NEXT:    shrl $24, %ebx
1427; AVX2-NEXT:    vpinsrb $3, %ebx, %xmm1, %xmm1
1428; AVX2-NEXT:    shrq $32, %rdi
1429; AVX2-NEXT:    vpinsrb $4, %edi, %xmm1, %xmm1
1430; AVX2-NEXT:    shrq $40, %rsi
1431; AVX2-NEXT:    vpinsrb $5, %esi, %xmm1, %xmm1
1432; AVX2-NEXT:    movb $0, -{{[0-9]+}}(%rsp)
1433; AVX2-NEXT:    vmovdqa -{{[0-9]+}}(%rsp), %xmm2
1434; AVX2-NEXT:    shrq $48, %rdx
1435; AVX2-NEXT:    vpinsrb $6, %edx, %xmm1, %xmm1
1436; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
1437; AVX2-NEXT:    shrq $56, %r8
1438; AVX2-NEXT:    vpinsrb $7, %r8d, %xmm1, %xmm0
1439; AVX2-NEXT:    movl %eax, %ecx
1440; AVX2-NEXT:    shrl $8, %ecx
1441; AVX2-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
1442; AVX2-NEXT:    vpinsrb $9, %ecx, %xmm0, %xmm0
1443; AVX2-NEXT:    movl %eax, %ecx
1444; AVX2-NEXT:    shrl $16, %ecx
1445; AVX2-NEXT:    vpinsrb $10, %ecx, %xmm0, %xmm0
1446; AVX2-NEXT:    movl %eax, %ecx
1447; AVX2-NEXT:    shrl $24, %ecx
1448; AVX2-NEXT:    vpinsrb $11, %ecx, %xmm0, %xmm0
1449; AVX2-NEXT:    movq %rax, %rcx
1450; AVX2-NEXT:    shrq $32, %rcx
1451; AVX2-NEXT:    vpinsrb $12, %ecx, %xmm0, %xmm0
1452; AVX2-NEXT:    movq %rax, %rcx
1453; AVX2-NEXT:    shrq $40, %rcx
1454; AVX2-NEXT:    vpinsrb $13, %ecx, %xmm0, %xmm0
1455; AVX2-NEXT:    movq %rax, %rcx
1456; AVX2-NEXT:    shrq $48, %rcx
1457; AVX2-NEXT:    vpinsrb $14, %ecx, %xmm0, %xmm0
1458; AVX2-NEXT:    vmovq %xmm2, %rcx
1459; AVX2-NEXT:    shrq $56, %rax
1460; AVX2-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
1461; AVX2-NEXT:    movl %ecx, %eax
1462; AVX2-NEXT:    shrl $8, %eax
1463; AVX2-NEXT:    vmovd %ecx, %xmm1
1464; AVX2-NEXT:    vpinsrb $1, %eax, %xmm1, %xmm1
1465; AVX2-NEXT:    movl %ecx, %eax
1466; AVX2-NEXT:    shrl $16, %eax
1467; AVX2-NEXT:    vpinsrb $2, %eax, %xmm1, %xmm1
1468; AVX2-NEXT:    movl %ecx, %eax
1469; AVX2-NEXT:    shrl $24, %eax
1470; AVX2-NEXT:    vpinsrb $3, %eax, %xmm1, %xmm1
1471; AVX2-NEXT:    movq %rcx, %rax
1472; AVX2-NEXT:    shrq $32, %rax
1473; AVX2-NEXT:    vpinsrb $4, %eax, %xmm1, %xmm1
1474; AVX2-NEXT:    movq %rcx, %rax
1475; AVX2-NEXT:    shrq $40, %rax
1476; AVX2-NEXT:    vpinsrb $5, %eax, %xmm1, %xmm1
1477; AVX2-NEXT:    movq %rcx, %rax
1478; AVX2-NEXT:    shrq $48, %rax
1479; AVX2-NEXT:    vpinsrb $6, %eax, %xmm1, %xmm1
1480; AVX2-NEXT:    vpextrq $1, %xmm2, %rax
1481; AVX2-NEXT:    shrq $56, %rcx
1482; AVX2-NEXT:    vpinsrb $7, %ecx, %xmm1, %xmm1
1483; AVX2-NEXT:    movl %eax, %ecx
1484; AVX2-NEXT:    shrl $8, %ecx
1485; AVX2-NEXT:    vpinsrb $8, %eax, %xmm1, %xmm1
1486; AVX2-NEXT:    vpinsrb $9, %ecx, %xmm1, %xmm1
1487; AVX2-NEXT:    movl %eax, %ecx
1488; AVX2-NEXT:    shrl $16, %ecx
1489; AVX2-NEXT:    vpinsrb $10, %ecx, %xmm1, %xmm1
1490; AVX2-NEXT:    movl %eax, %ecx
1491; AVX2-NEXT:    shrl $24, %ecx
1492; AVX2-NEXT:    vpinsrb $11, %ecx, %xmm1, %xmm1
1493; AVX2-NEXT:    movq %rax, %rcx
1494; AVX2-NEXT:    shrq $32, %rcx
1495; AVX2-NEXT:    vpinsrb $12, %ecx, %xmm1, %xmm1
1496; AVX2-NEXT:    movq %rax, %rcx
1497; AVX2-NEXT:    shrq $40, %rcx
1498; AVX2-NEXT:    vpinsrb $13, %ecx, %xmm1, %xmm1
1499; AVX2-NEXT:    movq %rax, %rcx
1500; AVX2-NEXT:    shrq $48, %rcx
1501; AVX2-NEXT:    vpinsrb $14, %ecx, %xmm1, %xmm1
1502; AVX2-NEXT:    shrq $56, %rax
1503; AVX2-NEXT:    vpinsrb $15, %eax, %xmm1, %xmm1
1504; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
1505; AVX2-NEXT:    popq %rbx
1506; AVX2-NEXT:    popq %r14
1507; AVX2-NEXT:    retq
1508  %x4  = bitcast <32 x i8> %0 to <64 x i4>
1509  %r0  = insertelement <64 x i4> %x4,  i4 zeroinitializer, i32 1
1510  %r1  = insertelement <64 x i4> %r0,  i4 zeroinitializer, i32 3
1511  %r2  = insertelement <64 x i4> %r1,  i4 zeroinitializer, i32 5
1512  %r3  = insertelement <64 x i4> %r2,  i4 zeroinitializer, i32 7
1513  %r4  = insertelement <64 x i4> %r3,  i4 zeroinitializer, i32 9
1514  %r5  = insertelement <64 x i4> %r4,  i4 zeroinitializer, i32 11
1515  %r6  = insertelement <64 x i4> %r5,  i4 zeroinitializer, i32 13
1516  %r7  = insertelement <64 x i4> %r6,  i4 zeroinitializer, i32 15
1517  %r8  = insertelement <64 x i4> %r7,  i4 zeroinitializer, i32 17
1518  %r9  = insertelement <64 x i4> %r8,  i4 zeroinitializer, i32 19
1519  %r10 = insertelement <64 x i4> %r9,  i4 zeroinitializer, i32 21
1520  %r11 = insertelement <64 x i4> %r10, i4 zeroinitializer, i32 23
1521  %r12 = insertelement <64 x i4> %r11, i4 zeroinitializer, i32 25
1522  %r13 = insertelement <64 x i4> %r12, i4 zeroinitializer, i32 27
1523  %r14 = insertelement <64 x i4> %r13, i4 zeroinitializer, i32 29
1524  %r15 = insertelement <64 x i4> %r14, i4 zeroinitializer, i32 31
1525  %r16 = insertelement <64 x i4> %r15, i4 zeroinitializer, i32 33
1526  %r17 = insertelement <64 x i4> %r16, i4 zeroinitializer, i32 35
1527  %r18 = insertelement <64 x i4> %r17, i4 zeroinitializer, i32 37
1528  %r19 = insertelement <64 x i4> %r18, i4 zeroinitializer, i32 39
1529  %r20 = insertelement <64 x i4> %r19, i4 zeroinitializer, i32 41
1530  %r21 = insertelement <64 x i4> %r20, i4 zeroinitializer, i32 43
1531  %r22 = insertelement <64 x i4> %r21, i4 zeroinitializer, i32 45
1532  %r23 = insertelement <64 x i4> %r22, i4 zeroinitializer, i32 47
1533  %r24 = insertelement <64 x i4> %r23, i4 zeroinitializer, i32 49
1534  %r25 = insertelement <64 x i4> %r24, i4 zeroinitializer, i32 51
1535  %r26 = insertelement <64 x i4> %r25, i4 zeroinitializer, i32 53
1536  %r27 = insertelement <64 x i4> %r26, i4 zeroinitializer, i32 55
1537  %r28 = insertelement <64 x i4> %r27, i4 zeroinitializer, i32 57
1538  %r29 = insertelement <64 x i4> %r28, i4 zeroinitializer, i32 59
1539  %r30 = insertelement <64 x i4> %r29, i4 zeroinitializer, i32 61
1540  %r31 = insertelement <64 x i4> %r30, i4 zeroinitializer, i32 63
1541  %r = bitcast <64 x i4> %r15 to <32 x i8>
1542  ret <32 x i8> %r
1543}
1544
1545define <2 x i64> @_clearupper2xi64c(<2 x i64>) nounwind {
1546; SSE-LABEL: _clearupper2xi64c:
1547; SSE:       # BB#0:
1548; SSE-NEXT:    andps {{.*}}(%rip), %xmm0
1549; SSE-NEXT:    retq
1550;
1551; AVX1-LABEL: _clearupper2xi64c:
1552; AVX1:       # BB#0:
1553; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1554; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
1555; AVX1-NEXT:    retq
1556;
1557; AVX2-LABEL: _clearupper2xi64c:
1558; AVX2:       # BB#0:
1559; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1560; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
1561; AVX2-NEXT:    retq
1562  %r = and <2 x i64> <i64 4294967295, i64 4294967295>, %0
1563  ret <2 x i64> %r
1564}
1565
1566define <4 x i64> @_clearupper4xi64c(<4 x i64>) nounwind {
1567; SSE-LABEL: _clearupper4xi64c:
1568; SSE:       # BB#0:
1569; SSE-NEXT:    movaps {{.*#+}} xmm2 = [4294967295,0,4294967295,0]
1570; SSE-NEXT:    andps %xmm2, %xmm0
1571; SSE-NEXT:    andps %xmm2, %xmm1
1572; SSE-NEXT:    retq
1573;
1574; AVX1-LABEL: _clearupper4xi64c:
1575; AVX1:       # BB#0:
1576; AVX1-NEXT:    vxorps %ymm1, %ymm1, %ymm1
1577; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
1578; AVX1-NEXT:    retq
1579;
1580; AVX2-LABEL: _clearupper4xi64c:
1581; AVX2:       # BB#0:
1582; AVX2-NEXT:    vpxor %ymm1, %ymm1, %ymm1
1583; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7]
1584; AVX2-NEXT:    retq
1585  %r = and <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>, %0
1586  ret <4 x i64> %r
1587}
1588
1589define <4 x i32> @_clearupper4xi32c(<4 x i32>) nounwind {
1590; SSE-LABEL: _clearupper4xi32c:
1591; SSE:       # BB#0:
1592; SSE-NEXT:    andps {{.*}}(%rip), %xmm0
1593; SSE-NEXT:    retq
1594;
1595; AVX-LABEL: _clearupper4xi32c:
1596; AVX:       # BB#0:
1597; AVX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1598; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3],xmm0[4],xmm1[5],xmm0[6],xmm1[7]
1599; AVX-NEXT:    retq
1600  %r = and <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>, %0
1601  ret <4 x i32> %r
1602}
1603
1604define <8 x i32> @_clearupper8xi32c(<8 x i32>) nounwind {
1605; SSE-LABEL: _clearupper8xi32c:
1606; SSE:       # BB#0:
1607; SSE-NEXT:    movaps {{.*#+}} xmm2 = [65535,0,65535,0,65535,0,65535,0]
1608; SSE-NEXT:    andps %xmm2, %xmm0
1609; SSE-NEXT:    andps %xmm2, %xmm1
1610; SSE-NEXT:    retq
1611;
1612; AVX1-LABEL: _clearupper8xi32c:
1613; AVX1:       # BB#0:
1614; AVX1-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
1615; AVX1-NEXT:    retq
1616;
1617; AVX2-LABEL: _clearupper8xi32c:
1618; AVX2:       # BB#0:
1619; AVX2-NEXT:    vpxor %ymm1, %ymm1, %ymm1
1620; AVX2-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7],ymm0[8],ymm1[9],ymm0[10],ymm1[11],ymm0[12],ymm1[13],ymm0[14],ymm1[15]
1621; AVX2-NEXT:    retq
1622  %r = and <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>, %0
1623  ret <8 x i32> %r
1624}
1625
1626define <8 x i16> @_clearupper8xi16c(<8 x i16>) nounwind {
1627; SSE-LABEL: _clearupper8xi16c:
1628; SSE:       # BB#0:
1629; SSE-NEXT:    andps {{.*}}(%rip), %xmm0
1630; SSE-NEXT:    retq
1631;
1632; AVX-LABEL: _clearupper8xi16c:
1633; AVX:       # BB#0:
1634; AVX-NEXT:    vandps {{.*}}(%rip), %xmm0, %xmm0
1635; AVX-NEXT:    retq
1636  %r = and <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>, %0
1637  ret <8 x i16> %r
1638}
1639
1640define <16 x i16> @_clearupper16xi16c(<16 x i16>) nounwind {
1641; SSE-LABEL: _clearupper16xi16c:
1642; SSE:       # BB#0:
1643; SSE-NEXT:    movaps {{.*#+}} xmm2 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
1644; SSE-NEXT:    andps %xmm2, %xmm0
1645; SSE-NEXT:    andps %xmm2, %xmm1
1646; SSE-NEXT:    retq
1647;
1648; AVX-LABEL: _clearupper16xi16c:
1649; AVX:       # BB#0:
1650; AVX-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
1651; AVX-NEXT:    retq
1652  %r = and <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>, %0
1653  ret <16 x i16> %r
1654}
1655
1656define <16 x i8> @_clearupper16xi8c(<16 x i8>) nounwind {
1657; SSE-LABEL: _clearupper16xi8c:
1658; SSE:       # BB#0:
1659; SSE-NEXT:    andps {{.*}}(%rip), %xmm0
1660; SSE-NEXT:    retq
1661;
1662; AVX-LABEL: _clearupper16xi8c:
1663; AVX:       # BB#0:
1664; AVX-NEXT:    vandps {{.*}}(%rip), %xmm0, %xmm0
1665; AVX-NEXT:    retq
1666  %r = and <16 x i8> <i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15>, %0
1667  ret <16 x i8> %r
1668}
1669
1670define <32 x i8> @_clearupper32xi8c(<32 x i8>) nounwind {
1671; SSE-LABEL: _clearupper32xi8c:
1672; SSE:       # BB#0:
1673; SSE-NEXT:    movaps {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
1674; SSE-NEXT:    andps %xmm2, %xmm0
1675; SSE-NEXT:    andps %xmm2, %xmm1
1676; SSE-NEXT:    retq
1677;
1678; AVX-LABEL: _clearupper32xi8c:
1679; AVX:       # BB#0:
1680; AVX-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
1681; AVX-NEXT:    retq
1682  %r = and <32 x i8> <i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15, i8 15>, %0
1683  ret <32 x i8> %r
1684}
1685