[x86] Clean up a couple of test cases with the new update script. Split
[oota-llvm.git] / test / CodeGen / X86 / bswap-vector.ll
1 ; RUN: llc < %s -mcpu=x86-64 | FileCheck %s --check-prefix=CHECK-NOSSSE3
2 ; RUN: llc < %s -mcpu=core2 | FileCheck %s --check-prefix=CHECK-SSSE3
3 ; RUN: llc < %s -mcpu=core-avx2 | FileCheck %s --check-prefix=CHECK-AVX2
4 ; RUN: llc < %s -mcpu=core-avx2 -x86-experimental-vector-widening-legalization | FileCheck %s --check-prefix=CHECK-WIDE-AVX2
5
6 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
7 target triple = "x86_64-unknown-linux-gnu"
8
9 declare <8 x i16> @llvm.bswap.v8i16(<8 x i16>)
10 declare <4 x i32> @llvm.bswap.v4i32(<4 x i32>)
11 declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>)
12
13 define <8 x i16> @test1(<8 x i16> %v) {
14 ; CHECK-NOSSSE3-LABEL: test1:
15 ; CHECK-NOSSSE3:       # BB#0: # %entry
16 ; CHECK-NOSSSE3-NEXT:    pextrw $7, %xmm0, %eax
17 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
18 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm1
19 ; CHECK-NOSSSE3-NEXT:    pextrw $3, %xmm0, %eax
20 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
21 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm2
22 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3]
23 ; CHECK-NOSSSE3-NEXT:    pextrw $5, %xmm0, %eax
24 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
25 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm3
26 ; CHECK-NOSSSE3-NEXT:    pextrw $1, %xmm0, %eax
27 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
28 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm1
29 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]
30 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
31 ; CHECK-NOSSSE3-NEXT:    pextrw $6, %xmm0, %eax
32 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
33 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm2
34 ; CHECK-NOSSSE3-NEXT:    pextrw $2, %xmm0, %eax
35 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
36 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm3
37 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
38 ; CHECK-NOSSSE3-NEXT:    pextrw $4, %xmm0, %eax
39 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
40 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm2
41 ; CHECK-NOSSSE3-NEXT:    movd %xmm0, %eax
42 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
43 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm0
44 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
45 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
46 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
47 ; CHECK-NOSSSE3-NEXT:    retq
48 ;
49 ; CHECK-SSSE3-LABEL: test1:
50 ; CHECK-SSSE3:       # BB#0: # %entry
51 ; CHECK-SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
52 ; CHECK-SSSE3-NEXT:    retq
53 ;
54 ; CHECK-AVX2-LABEL: test1:
55 ; CHECK-AVX2:       # BB#0: # %entry
56 ; CHECK-AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
57 ; CHECK-AVX2-NEXT:    retq
58 ;
59 ; CHECK-WIDE-AVX2-LABEL: test1:
60 ; CHECK-WIDE-AVX2:       # BB#0: # %entry
61 ; CHECK-WIDE-AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
62 ; CHECK-WIDE-AVX2-NEXT:    retq
63 entry:
64   %r = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %v)
65   ret <8 x i16> %r
66 }
67
68 define <4 x i32> @test2(<4 x i32> %v) {
69 ; CHECK-NOSSSE3-LABEL: test2:
70 ; CHECK-NOSSSE3:       # BB#0: # %entry
71 ; CHECK-NOSSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3]
72 ; CHECK-NOSSSE3-NEXT:    movd %xmm1, %eax
73 ; CHECK-NOSSSE3-NEXT:    bswapl %eax
74 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm1
75 ; CHECK-NOSSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
76 ; CHECK-NOSSSE3-NEXT:    movd %xmm2, %eax
77 ; CHECK-NOSSSE3-NEXT:    bswapl %eax
78 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm2
79 ; CHECK-NOSSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
80 ; CHECK-NOSSSE3-NEXT:    movd %xmm0, %eax
81 ; CHECK-NOSSSE3-NEXT:    bswapl %eax
82 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm1
83 ; CHECK-NOSSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
84 ; CHECK-NOSSSE3-NEXT:    movd %xmm0, %eax
85 ; CHECK-NOSSSE3-NEXT:    bswapl %eax
86 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm0
87 ; CHECK-NOSSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
88 ; CHECK-NOSSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
89 ; CHECK-NOSSSE3-NEXT:    movdqa %xmm1, %xmm0
90 ; CHECK-NOSSSE3-NEXT:    retq
91 ;
92 ; CHECK-SSSE3-LABEL: test2:
93 ; CHECK-SSSE3:       # BB#0: # %entry
94 ; CHECK-SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
95 ; CHECK-SSSE3-NEXT:    retq
96 ;
97 ; CHECK-AVX2-LABEL: test2:
98 ; CHECK-AVX2:       # BB#0: # %entry
99 ; CHECK-AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
100 ; CHECK-AVX2-NEXT:    retq
101 ;
102 ; CHECK-WIDE-AVX2-LABEL: test2:
103 ; CHECK-WIDE-AVX2:       # BB#0: # %entry
104 ; CHECK-WIDE-AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
105 ; CHECK-WIDE-AVX2-NEXT:    retq
106 entry:
107   %r = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %v)
108   ret <4 x i32> %r
109 }
110
111 define <2 x i64> @test3(<2 x i64> %v) {
112 ; CHECK-NOSSSE3-LABEL: test3:
113 ; CHECK-NOSSSE3:       # BB#0: # %entry
114 ; CHECK-NOSSSE3-NEXT:    movd %xmm0, %rax
115 ; CHECK-NOSSSE3-NEXT:    bswapq %rax
116 ; CHECK-NOSSSE3-NEXT:    movd %rax, %xmm1
117 ; CHECK-NOSSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
118 ; CHECK-NOSSSE3-NEXT:    movd %xmm0, %rax
119 ; CHECK-NOSSSE3-NEXT:    bswapq %rax
120 ; CHECK-NOSSSE3-NEXT:    movd %rax, %xmm0
121 ; CHECK-NOSSSE3-NEXT:    punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
122 ; CHECK-NOSSSE3-NEXT:    movdqa %xmm1, %xmm0
123 ; CHECK-NOSSSE3-NEXT:    retq
124 ;
125 ; CHECK-SSSE3-LABEL: test3:
126 ; CHECK-SSSE3:       # BB#0: # %entry
127 ; CHECK-SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
128 ; CHECK-SSSE3-NEXT:    retq
129 ;
130 ; CHECK-AVX2-LABEL: test3:
131 ; CHECK-AVX2:       # BB#0: # %entry
132 ; CHECK-AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
133 ; CHECK-AVX2-NEXT:    retq
134 ;
135 ; CHECK-WIDE-AVX2-LABEL: test3:
136 ; CHECK-WIDE-AVX2:       # BB#0: # %entry
137 ; CHECK-WIDE-AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
138 ; CHECK-WIDE-AVX2-NEXT:    retq
139 entry:
140   %r = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> %v)
141   ret <2 x i64> %r
142 }
143
144 declare <16 x i16> @llvm.bswap.v16i16(<16 x i16>)
145 declare <8 x i32> @llvm.bswap.v8i32(<8 x i32>)
146 declare <4 x i64> @llvm.bswap.v4i64(<4 x i64>)
147
148 define <16 x i16> @test4(<16 x i16> %v) {
149 ; CHECK-NOSSSE3-LABEL: test4:
150 ; CHECK-NOSSSE3:       # BB#0: # %entry
151 ; CHECK-NOSSSE3-NEXT:    pextrw $7, %xmm0, %eax
152 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
153 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm2
154 ; CHECK-NOSSSE3-NEXT:    pextrw $3, %xmm0, %eax
155 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
156 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm3
157 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
158 ; CHECK-NOSSSE3-NEXT:    pextrw $5, %xmm0, %eax
159 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
160 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm4
161 ; CHECK-NOSSSE3-NEXT:    pextrw $1, %xmm0, %eax
162 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
163 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm2
164 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]
165 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]
166 ; CHECK-NOSSSE3-NEXT:    pextrw $6, %xmm0, %eax
167 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
168 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm3
169 ; CHECK-NOSSSE3-NEXT:    pextrw $2, %xmm0, %eax
170 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
171 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm4
172 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
173 ; CHECK-NOSSSE3-NEXT:    pextrw $4, %xmm0, %eax
174 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
175 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm3
176 ; CHECK-NOSSSE3-NEXT:    movd %xmm0, %eax
177 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
178 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm0
179 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
180 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1],xmm0[2],xmm4[2],xmm0[3],xmm4[3]
181 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3]
182 ; CHECK-NOSSSE3-NEXT:    pextrw $7, %xmm1, %eax
183 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
184 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm2
185 ; CHECK-NOSSSE3-NEXT:    pextrw $3, %xmm1, %eax
186 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
187 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm3
188 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
189 ; CHECK-NOSSSE3-NEXT:    pextrw $5, %xmm1, %eax
190 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
191 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm4
192 ; CHECK-NOSSSE3-NEXT:    pextrw $1, %xmm1, %eax
193 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
194 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm2
195 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1],xmm2[2],xmm4[2],xmm2[3],xmm4[3]
196 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]
197 ; CHECK-NOSSSE3-NEXT:    pextrw $6, %xmm1, %eax
198 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
199 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm3
200 ; CHECK-NOSSSE3-NEXT:    pextrw $2, %xmm1, %eax
201 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
202 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm4
203 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1],xmm4[2],xmm3[2],xmm4[3],xmm3[3]
204 ; CHECK-NOSSSE3-NEXT:    pextrw $4, %xmm1, %eax
205 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
206 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm3
207 ; CHECK-NOSSSE3-NEXT:    movd %xmm1, %eax
208 ; CHECK-NOSSSE3-NEXT:    rolw $8, %ax
209 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm1
210 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3]
211 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1],xmm1[2],xmm4[2],xmm1[3],xmm4[3]
212 ; CHECK-NOSSSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
213 ; CHECK-NOSSSE3-NEXT:    retq
214 ;
215 ; CHECK-SSSE3-LABEL: test4:
216 ; CHECK-SSSE3:       # BB#0: # %entry
217 ; CHECK-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
218 ; CHECK-SSSE3-NEXT:    pshufb %xmm2, %xmm0
219 ; CHECK-SSSE3-NEXT:    pshufb %xmm2, %xmm1
220 ; CHECK-SSSE3-NEXT:    retq
221 ;
222 ; CHECK-AVX2-LABEL: test4:
223 ; CHECK-AVX2:       # BB#0: # %entry
224 ; CHECK-AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30]
225 ; CHECK-AVX2-NEXT:    retq
226 ;
227 ; CHECK-WIDE-AVX2-LABEL: test4:
228 ; CHECK-WIDE-AVX2:       # BB#0: # %entry
229 ; CHECK-WIDE-AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14,17,16,19,18,21,20,23,22,25,24,27,26,29,28,31,30]
230 ; CHECK-WIDE-AVX2-NEXT:    retq
231 entry:
232   %r = call <16 x i16> @llvm.bswap.v16i16(<16 x i16> %v)
233   ret <16 x i16> %r
234 }
235
236 define <8 x i32> @test5(<8 x i32> %v) {
237 ; CHECK-NOSSSE3-LABEL: test5:
238 ; CHECK-NOSSSE3:       # BB#0: # %entry
239 ; CHECK-NOSSSE3-NEXT:    movdqa %xmm0, %xmm2
240 ; CHECK-NOSSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[3,1,2,3]
241 ; CHECK-NOSSSE3-NEXT:    movd %xmm0, %eax
242 ; CHECK-NOSSSE3-NEXT:    bswapl %eax
243 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm0
244 ; CHECK-NOSSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[1,1,2,3]
245 ; CHECK-NOSSSE3-NEXT:    movd %xmm3, %eax
246 ; CHECK-NOSSSE3-NEXT:    bswapl %eax
247 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm3
248 ; CHECK-NOSSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1]
249 ; CHECK-NOSSSE3-NEXT:    movd %xmm2, %eax
250 ; CHECK-NOSSSE3-NEXT:    bswapl %eax
251 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm0
252 ; CHECK-NOSSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[2,3,0,1]
253 ; CHECK-NOSSSE3-NEXT:    movd %xmm2, %eax
254 ; CHECK-NOSSSE3-NEXT:    bswapl %eax
255 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm2
256 ; CHECK-NOSSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
257 ; CHECK-NOSSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
258 ; CHECK-NOSSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[3,1,2,3]
259 ; CHECK-NOSSSE3-NEXT:    movd %xmm2, %eax
260 ; CHECK-NOSSSE3-NEXT:    bswapl %eax
261 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm2
262 ; CHECK-NOSSSE3-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[1,1,2,3]
263 ; CHECK-NOSSSE3-NEXT:    movd %xmm3, %eax
264 ; CHECK-NOSSSE3-NEXT:    bswapl %eax
265 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm3
266 ; CHECK-NOSSSE3-NEXT:    punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
267 ; CHECK-NOSSSE3-NEXT:    movd %xmm1, %eax
268 ; CHECK-NOSSSE3-NEXT:    bswapl %eax
269 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm2
270 ; CHECK-NOSSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
271 ; CHECK-NOSSSE3-NEXT:    movd %xmm1, %eax
272 ; CHECK-NOSSSE3-NEXT:    bswapl %eax
273 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm1
274 ; CHECK-NOSSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
275 ; CHECK-NOSSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
276 ; CHECK-NOSSSE3-NEXT:    movdqa %xmm2, %xmm1
277 ; CHECK-NOSSSE3-NEXT:    retq
278 ;
279 ; CHECK-SSSE3-LABEL: test5:
280 ; CHECK-SSSE3:       # BB#0: # %entry
281 ; CHECK-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
282 ; CHECK-SSSE3-NEXT:    pshufb %xmm2, %xmm0
283 ; CHECK-SSSE3-NEXT:    pshufb %xmm2, %xmm1
284 ; CHECK-SSSE3-NEXT:    retq
285 ;
286 ; CHECK-AVX2-LABEL: test5:
287 ; CHECK-AVX2:       # BB#0: # %entry
288 ; CHECK-AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,19,18,17,16,23,22,21,20,27,26,25,24,31,30,29,28]
289 ; CHECK-AVX2-NEXT:    retq
290 ;
291 ; CHECK-WIDE-AVX2-LABEL: test5:
292 ; CHECK-WIDE-AVX2:       # BB#0: # %entry
293 ; CHECK-WIDE-AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12,19,18,17,16,23,22,21,20,27,26,25,24,31,30,29,28]
294 ; CHECK-WIDE-AVX2-NEXT:    retq
295 entry:
296   %r = call <8 x i32> @llvm.bswap.v8i32(<8 x i32> %v)
297   ret <8 x i32> %r
298 }
299
300 define <4 x i64> @test6(<4 x i64> %v) {
301 ; CHECK-NOSSSE3-LABEL: test6:
302 ; CHECK-NOSSSE3:       # BB#0: # %entry
303 ; CHECK-NOSSSE3-NEXT:    movd %xmm0, %rax
304 ; CHECK-NOSSSE3-NEXT:    bswapq %rax
305 ; CHECK-NOSSSE3-NEXT:    movd %rax, %xmm2
306 ; CHECK-NOSSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
307 ; CHECK-NOSSSE3-NEXT:    movd %xmm0, %rax
308 ; CHECK-NOSSSE3-NEXT:    bswapq %rax
309 ; CHECK-NOSSSE3-NEXT:    movd %rax, %xmm0
310 ; CHECK-NOSSSE3-NEXT:    punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
311 ; CHECK-NOSSSE3-NEXT:    movd %xmm1, %rax
312 ; CHECK-NOSSSE3-NEXT:    bswapq %rax
313 ; CHECK-NOSSSE3-NEXT:    movd %rax, %xmm3
314 ; CHECK-NOSSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
315 ; CHECK-NOSSSE3-NEXT:    movd %xmm0, %rax
316 ; CHECK-NOSSSE3-NEXT:    bswapq %rax
317 ; CHECK-NOSSSE3-NEXT:    movd %rax, %xmm0
318 ; CHECK-NOSSSE3-NEXT:    punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0]
319 ; CHECK-NOSSSE3-NEXT:    movdqa %xmm2, %xmm0
320 ; CHECK-NOSSSE3-NEXT:    movdqa %xmm3, %xmm1
321 ; CHECK-NOSSSE3-NEXT:    retq
322 ;
323 ; CHECK-SSSE3-LABEL: test6:
324 ; CHECK-SSSE3:       # BB#0: # %entry
325 ; CHECK-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
326 ; CHECK-SSSE3-NEXT:    pshufb %xmm2, %xmm0
327 ; CHECK-SSSE3-NEXT:    pshufb %xmm2, %xmm1
328 ; CHECK-SSSE3-NEXT:    retq
329 ;
330 ; CHECK-AVX2-LABEL: test6:
331 ; CHECK-AVX2:       # BB#0: # %entry
332 ; CHECK-AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24]
333 ; CHECK-AVX2-NEXT:    retq
334 ;
335 ; CHECK-WIDE-AVX2-LABEL: test6:
336 ; CHECK-WIDE-AVX2:       # BB#0: # %entry
337 ; CHECK-WIDE-AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24]
338 ; CHECK-WIDE-AVX2-NEXT:    retq
339 entry:
340   %r = call <4 x i64> @llvm.bswap.v4i64(<4 x i64> %v)
341   ret <4 x i64> %r
342 }
343
344 declare <4 x i16> @llvm.bswap.v4i16(<4 x i16>)
345
346 define <4 x i16> @test7(<4 x i16> %v) {
347 ; CHECK-NOSSSE3-LABEL: test7:
348 ; CHECK-NOSSSE3:       # BB#0: # %entry
349 ; CHECK-NOSSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3]
350 ; CHECK-NOSSSE3-NEXT:    movd %xmm1, %eax
351 ; CHECK-NOSSSE3-NEXT:    bswapl %eax
352 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm1
353 ; CHECK-NOSSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,2,3]
354 ; CHECK-NOSSSE3-NEXT:    movd %xmm2, %eax
355 ; CHECK-NOSSSE3-NEXT:    bswapl %eax
356 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm2
357 ; CHECK-NOSSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
358 ; CHECK-NOSSSE3-NEXT:    movd %xmm0, %eax
359 ; CHECK-NOSSSE3-NEXT:    bswapl %eax
360 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm1
361 ; CHECK-NOSSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
362 ; CHECK-NOSSSE3-NEXT:    movd %xmm0, %eax
363 ; CHECK-NOSSSE3-NEXT:    bswapl %eax
364 ; CHECK-NOSSSE3-NEXT:    movd %eax, %xmm0
365 ; CHECK-NOSSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
366 ; CHECK-NOSSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
367 ; CHECK-NOSSSE3-NEXT:    psrld $16, %xmm1
368 ; CHECK-NOSSSE3-NEXT:    movdqa %xmm1, %xmm0
369 ; CHECK-NOSSSE3-NEXT:    retq
370 ;
371 ; CHECK-SSSE3-LABEL: test7:
372 ; CHECK-SSSE3:       # BB#0: # %entry
373 ; CHECK-SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
374 ; CHECK-SSSE3-NEXT:    psrld $16, %xmm0
375 ; CHECK-SSSE3-NEXT:    retq
376 ;
377 ; CHECK-AVX2-LABEL: test7:
378 ; CHECK-AVX2:       # BB#0: # %entry
379 ; CHECK-AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[3,2,1,0,7,6,5,4,11,10,9,8,15,14,13,12]
380 ; CHECK-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm0
381 ; CHECK-AVX2-NEXT:    retq
382 ;
383 ; CHECK-WIDE-AVX2-LABEL: test7:
384 ; CHECK-WIDE-AVX2:       # BB#0: # %entry
385 ; CHECK-WIDE-AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[1,0,3,2,5,4,7,6,9,8,11,10,13,12,15,14]
386 ; CHECK-WIDE-AVX2-NEXT:    retq
387 entry:
388   %r = call <4 x i16> @llvm.bswap.v4i16(<4 x i16> %v)
389   ret <4 x i16> %r
390 }