[X86] Remove special validation for INT immediate operand from AsmParser. Instead...
[oota-llvm.git] / test / CodeGen / X86 / vector-shuffle-sse4a.ll
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3,+sse4a | FileCheck %s --check-prefix=ALL --check-prefix=BTVER1
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+sse4a | FileCheck %s --check-prefix=ALL --check-prefix=BTVER2
3
4 ;
5 ; EXTRQI
6 ;
7
8 ; A length of zero is equivalent to a bit length of 64.
9 define <2 x i64> @extrqi_len0_idx0(<2 x i64> %a) {
10 ; ALL-LABEL: extrqi_len0_idx0:
11 ; ALL:       # BB#0:
12 ; ALL-NEXT:    extrq {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,6,7,u,u,u,u,u,u,u,u]
13 ; ALL-NEXT:    retq
14   %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> %a, i8 0, i8 0)
15   ret <2 x i64> %1
16 }
17
18 define <2 x i64> @extrqi_len8_idx16(<2 x i64> %a) {
19 ; ALL-LABEL: extrqi_len8_idx16:
20 ; ALL:       # BB#0:
21 ; ALL-NEXT:    extrq {{.*#+}} xmm0 = xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]
22 ; ALL-NEXT:    retq
23   %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> %a, i8 8, i8 16)
24   ret <2 x i64> %1
25 }
26
27 ; If the length + index exceeds the bottom 64 bits the result is undefined.
28 define <2 x i64> @extrqi_len32_idx48(<2 x i64> %a) {
29 ; ALL-LABEL: extrqi_len32_idx48:
30 ; ALL:       # BB#0:
31 ; ALL-NEXT:    extrq {{.*#+}} xmm0 = xmm0[u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
32 ; ALL-NEXT:    retq
33   %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> %a, i8 32, i8 48)
34   ret <2 x i64> %1
35 }
36
37 define <16 x i8> @shuf_0zzzuuuuuuuuuuuu(<16 x i8> %a0) {
38 ; BTVER1-LABEL: shuf_0zzzuuuuuuuuuuuu:
39 ; BTVER1:       # BB#0:
40 ; BTVER1-NEXT:    extrq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]
41 ; BTVER1-NEXT:    retq
42 ;
43 ; BTVER2-LABEL: shuf_0zzzuuuuuuuuuuuu:
44 ; BTVER2:       # BB#0:
45 ; BTVER2-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
46 ; BTVER2-NEXT:    retq
47   %s = shufflevector <16 x i8> %a0, <16 x i8> zeroinitializer, <16 x i32> <i32 0, i32 16, i32 16, i32 16, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
48   ret <16 x i8> %s
49 }
50
51 define <16 x i8> @shuf_0zzzzzzz1zzzzzzz(<16 x i8> %a0) {
52 ; BTVER1-LABEL: shuf_0zzzzzzz1zzzzzzz:
53 ; BTVER1:       # BB#0:
54 ; BTVER1-NEXT:    movaps %xmm0, %xmm1
55 ; BTVER1-NEXT:    extrq {{.*#+}} xmm1 = xmm1[1],zero,zero,zero,zero,zero,zero,zero,xmm1[u,u,u,u,u,u,u,u]
56 ; BTVER1-NEXT:    extrq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]
57 ; BTVER1-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
58 ; BTVER1-NEXT:    retq
59 ;
60 ; BTVER2-LABEL: shuf_0zzzzzzz1zzzzzzz:
61 ; BTVER2:       # BB#0:
62 ; BTVER2-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
63 ; BTVER2-NEXT:    retq
64   %s = shufflevector <16 x i8> %a0, <16 x i8> zeroinitializer, <16 x i32> <i32 0, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 1, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
65   ret <16 x i8> %s
66 }
67
68 define <16 x i8> @shuf_2zzzzzzz3zzzzzzz(<16 x i8> %a0) {
69 ; BTVER1-LABEL: shuf_2zzzzzzz3zzzzzzz:
70 ; BTVER1:       # BB#0:
71 ; BTVER1-NEXT:    movaps %xmm0, %xmm1
72 ; BTVER1-NEXT:    extrq {{.*#+}} xmm1 = xmm1[3],zero,zero,zero,zero,zero,zero,zero,xmm1[u,u,u,u,u,u,u,u]
73 ; BTVER1-NEXT:    extrq {{.*#+}} xmm0 = xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]
74 ; BTVER1-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
75 ; BTVER1-NEXT:    retq
76 ;
77 ; BTVER2-LABEL: shuf_2zzzzzzz3zzzzzzz:
78 ; BTVER2:       # BB#0:
79 ; BTVER2-NEXT:    vpsrld $16, %xmm0, %xmm0
80 ; BTVER2-NEXT:    vpmovzxbq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero
81 ; BTVER2-NEXT:    retq
82   %s = shufflevector <16 x i8> %a0, <16 x i8> zeroinitializer, <16 x i32> <i32 2, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 3, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
83   ret <16 x i8> %s
84 }
85
86 define <16 x i8> @shuf_01zzuuuuuuuuuuuu(<16 x i8> %a0) {
87 ; BTVER1-LABEL: shuf_01zzuuuuuuuuuuuu:
88 ; BTVER1:       # BB#0:
89 ; BTVER1-NEXT:    extrq {{.*#+}} xmm0 = xmm0[0,1],zero,zero,zero,zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]
90 ; BTVER1-NEXT:    retq
91 ;
92 ; BTVER2-LABEL: shuf_01zzuuuuuuuuuuuu:
93 ; BTVER2:       # BB#0:
94 ; BTVER2-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
95 ; BTVER2-NEXT:    retq
96   %s = shufflevector <16 x i8> %a0, <16 x i8> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 16, i32 16, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
97   ret <16 x i8> %s
98 }
99
100 define <16 x i8> @shuf_01zzzzzz23zzzzzz(<16 x i8> %a0) {
101 ; BTVER1-LABEL: shuf_01zzzzzz23zzzzzz:
102 ; BTVER1:       # BB#0:
103 ; BTVER1-NEXT:    movaps %xmm0, %xmm1
104 ; BTVER1-NEXT:    extrq {{.*#+}} xmm1 = xmm1[2,3],zero,zero,zero,zero,zero,zero,xmm1[u,u,u,u,u,u,u,u]
105 ; BTVER1-NEXT:    extrq {{.*#+}} xmm0 = xmm0[0,1],zero,zero,zero,zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]
106 ; BTVER1-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
107 ; BTVER1-NEXT:    retq
108 ;
109 ; BTVER2-LABEL: shuf_01zzzzzz23zzzzzz:
110 ; BTVER2:       # BB#0:
111 ; BTVER2-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
112 ; BTVER2-NEXT:    retq
113   %s = shufflevector <16 x i8> %a0, <16 x i8> zeroinitializer, <16 x i32> <i32 0, i32 1, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 2, i32 3, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
114   ret <16 x i8> %s
115 }
116
117 define <16 x i8> @shuf_1zzzuuuuuuuuuuuu(<16 x i8> %a0) {
118 ; ALL-LABEL: shuf_1zzzuuuuuuuuuuuu:
119 ; ALL:       # BB#0:
120 ; ALL-NEXT:    extrq {{.*#+}} xmm0 = xmm0[1],zero,zero,zero,zero,zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]
121 ; ALL-NEXT:    retq
122   %s = shufflevector <16 x i8> %a0, <16 x i8> zeroinitializer, <16 x i32> <i32 1, i32 16, i32 16, i32 16, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
123   ret <16 x i8> %s
124 }
125
126 define <8 x i16> @shuf_1zzzuuuu(<8 x i16> %a0) {
127 ; ALL-LABEL: shuf_1zzzuuuu:
128 ; ALL:       # BB#0:
129 ; ALL-NEXT:    extrq {{.*#+}} xmm0 = xmm0[2,3],zero,zero,zero,zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]
130 ; ALL-NEXT:    retq
131   %s = shufflevector <8 x i16> %a0, <8 x i16> zeroinitializer, <8 x i32> <i32 1, i32 8, i32 8, i32 8, i32 undef, i32 undef, i32 undef, i32 undef>
132   ret <8 x i16> %s
133 }
134
135 define <8 x i16> @shuf_12zzuuuu(<8 x i16> %a0) {
136 ; ALL-LABEL: shuf_12zzuuuu:
137 ; ALL:       # BB#0:
138 ; ALL-NEXT:    extrq {{.*#+}} xmm0 = xmm0[2,3,4,5],zero,zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]
139 ; ALL-NEXT:    retq
140   %s = shufflevector <8 x i16> %a0, <8 x i16> zeroinitializer, <8 x i32> <i32 1, i32 2, i32 8, i32 8, i32 undef, i32 undef, i32 undef, i32 undef>
141   ret <8 x i16> %s
142 }
143
144 define <8 x i16> @shuf_012zuuuu(<8 x i16> %a0) {
145 ; ALL-LABEL: shuf_012zuuuu:
146 ; ALL:       # BB#0:
147 ; ALL-NEXT:    extrq {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5],zero,zero,xmm0[u,u,u,u,u,u,u,u]
148 ; ALL-NEXT:    retq
149   %s = shufflevector <8 x i16> %a0, <8 x i16> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 8, i32 undef, i32 undef, i32 undef, i32 undef>
150   ret <8 x i16> %s
151 }
152
153 define <8 x i16> @shuf_0zzz1zzz(<8 x i16> %a0) {
154 ; BTVER1-LABEL: shuf_0zzz1zzz:
155 ; BTVER1:       # BB#0:
156 ; BTVER1-NEXT:    movaps %xmm0, %xmm1
157 ; BTVER1-NEXT:    extrq {{.*#+}} xmm1 = xmm1[2,3],zero,zero,zero,zero,zero,zero,xmm1[u,u,u,u,u,u,u,u]
158 ; BTVER1-NEXT:    extrq {{.*#+}} xmm0 = xmm0[0,1],zero,zero,zero,zero,zero,zero,xmm0[u,u,u,u,u,u,u,u]
159 ; BTVER1-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
160 ; BTVER1-NEXT:    retq
161 ;
162 ; BTVER2-LABEL: shuf_0zzz1zzz:
163 ; BTVER2:       # BB#0:
164 ; BTVER2-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
165 ; BTVER2-NEXT:    retq
166   %s = shufflevector <8 x i16> %a0, <8 x i16> zeroinitializer, <8 x i32> <i32 0, i32 8, i32 8, i32 8, i32 1, i32 8, i32 8, i32 8>
167   ret <8 x i16> %s
168 }
169
170 define <4 x i32> @shuf_0z1z(<4 x i32> %a0) {
171 ; BTVER1-LABEL: shuf_0z1z:
172 ; BTVER1:       # BB#0:
173 ; BTVER1-NEXT:    pxor %xmm1, %xmm1
174 ; BTVER1-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
175 ; BTVER1-NEXT:    retq
176 ;
177 ; BTVER2-LABEL: shuf_0z1z:
178 ; BTVER2:       # BB#0:
179 ; BTVER2-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
180 ; BTVER2-NEXT:    retq
181   %s = shufflevector <4 x i32> %a0, <4 x i32> zeroinitializer, <4 x i32> <i32 0, i32 4, i32 1, i32 4>
182   ret <4 x i32> %s
183 }
184
185 ;
186 ; INSERTQI
187 ;
188
189 ; A length of zero is equivalent to a bit length of 64.
190 define <2 x i64> @insertqi_len0_idx0(<2 x i64> %a, <2 x i64> %b) {
191 ; ALL-LABEL: insertqi_len0_idx0:
192 ; ALL:       # BB#0:
193 ; ALL-NEXT:    insertq {{.*#+}} xmm0 = xmm1[0,1,2,3,4,5,6,7],xmm0[u,u,u,u,u,u,u,u]
194 ; ALL-NEXT:    retq
195   %1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %a, <2 x i64> %b, i8 0, i8 0)
196   ret <2 x i64> %1
197 }
198
199 define <2 x i64> @insertqi_len8_idx16(<2 x i64> %a, <2 x i64> %b) {
200 ; ALL-LABEL: insertqi_len8_idx16:
201 ; ALL:       # BB#0:
202 ; ALL-NEXT:    insertq {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3,4,5,6,7,u,u,u,u,u,u,u,u]
203 ; ALL-NEXT:    retq
204   %1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %a, <2 x i64> %b, i8 8, i8 16)
205   ret <2 x i64> %1
206 }
207
208 ; If the length + index exceeds the bottom 64 bits the result is undefined
209 define <2 x i64> @insertqi_len32_idx48(<2 x i64> %a, <2 x i64> %b) {
210 ; ALL-LABEL: insertqi_len32_idx48:
211 ; ALL:       # BB#0:
212 ; ALL-NEXT:    insertq {{.*#+}} xmm0 = xmm0[u,u,u,u,u,u,u,u,u,u,u,u,u,u,u,u]
213 ; ALL-NEXT:    retq
214   %1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %a, <2 x i64> %b, i8 32, i8 48)
215   ret <2 x i64> %1
216 }
217
218 define <16 x i8> @shuf_0_0_2_3_uuuu_uuuu_uuuu(<16 x i8> %a0, <16 x i8> %a1) {
219 ; ALL-LABEL: shuf_0_0_2_3_uuuu_uuuu_uuuu:
220 ; ALL:       # BB#0:
221 ; ALL-NEXT:    insertq {{.*#+}} xmm0 = xmm0[0,0,2,3,4,5,6,7,u,u,u,u,u,u,u,u]
222 ; ALL-NEXT:    retq
223   %s = shufflevector <16 x i8> %a0, <16 x i8> %a1, <16 x i32> <i32 0, i32 0, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
224   ret <16 x i8> %s
225 }
226
227 define <16 x i8> @shuf_0_16_2_3_uuuu_uuuu_uuuu(<16 x i8> %a0, <16 x i8> %a1) {
228 ; ALL-LABEL: shuf_0_16_2_3_uuuu_uuuu_uuuu:
229 ; ALL:       # BB#0:
230 ; ALL-NEXT:    insertq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3,4,5,6,7,u,u,u,u,u,u,u,u]
231 ; ALL-NEXT:    retq
232   %s = shufflevector <16 x i8> %a0, <16 x i8> %a1, <16 x i32> <i32 0, i32 16, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
233   ret <16 x i8> %s
234 }
235
236 define <16 x i8> @shuf_16_1_2_3_uuuu_uuuu_uuuu(<16 x i8> %a0, <16 x i8> %a1) {
237 ; ALL-LABEL: shuf_16_1_2_3_uuuu_uuuu_uuuu:
238 ; ALL:       # BB#0:
239 ; ALL-NEXT:    insertq {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3,4,5,6,7,u,u,u,u,u,u,u,u]
240 ; ALL-NEXT:    retq
241   %s = shufflevector <16 x i8> %a0, <16 x i8> %a1, <16 x i32> <i32 16, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
242   ret <16 x i8> %s
243 }
244
245 define <8 x i16> @shuf_0823uuuu(<8 x i16> %a0, <8 x i16> %a1) {
246 ; ALL-LABEL: shuf_0823uuuu:
247 ; ALL:       # BB#0:
248 ; ALL-NEXT:    insertq {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1],xmm0[4,5,6,7,u,u,u,u,u,u,u,u]
249 ; ALL-NEXT:    retq
250   %s = shufflevector <8 x i16> %a0, <8 x i16> %a1, <8 x i32> <i32 0, i32 8, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
251   ret <8 x i16> %s
252 }
253
254 define <8 x i16> @shuf_0183uuuu(<8 x i16> %a0, <8 x i16> %a1) {
255 ; ALL-LABEL: shuf_0183uuuu:
256 ; ALL:       # BB#0:
257 ; ALL-NEXT:    insertq {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[0,1],xmm0[6,7,u,u,u,u,u,u,u,u]
258 ; ALL-NEXT:    retq
259   %s = shufflevector <8 x i16> %a0, <8 x i16> %a1, <8 x i32> <i32 0, i32 1, i32 8, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
260   ret <8 x i16> %s
261 }
262
263 define <8 x i16> @shuf_0128uuuu(<8 x i16> %a0, <8 x i16> %a1) {
264 ; ALL-LABEL: shuf_0128uuuu:
265 ; ALL:       # BB#0:
266 ; ALL-NEXT:    insertq {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5],xmm1[0,1],xmm0[u,u,u,u,u,u,u,u]
267 ; ALL-NEXT:    retq
268   %s = shufflevector <8 x i16> %a0, <8 x i16> %a1, <8 x i32> <i32 0, i32 1, i32 2, i32 8, i32 undef, i32 undef, i32 undef, i32 undef>
269   ret <8 x i16> %s
270 }
271
272 define <8 x i16> @shuf_0893uuuu(<8 x i16> %a0, <8 x i16> %a1) {
273 ; ALL-LABEL: shuf_0893uuuu:
274 ; ALL:       # BB#0:
275 ; ALL-NEXT:    insertq {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1,2,3],xmm0[6,7,u,u,u,u,u,u,u,u]
276 ; ALL-NEXT:    retq
277   %s = shufflevector <8 x i16> %a0, <8 x i16> %a1, <8 x i32> <i32 0, i32 8, i32 9, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
278   ret <8 x i16> %s
279 }
280
281 define <8 x i16> @shuf_089Auuuu(<8 x i16> %a0, <8 x i16> %a1) {
282 ; ALL-LABEL: shuf_089Auuuu:
283 ; ALL:       # BB#0:
284 ; ALL-NEXT:    insertq {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1,2,3,4,5],xmm0[u,u,u,u,u,u,u,u]
285 ; ALL-NEXT:    retq
286   %s = shufflevector <8 x i16> %a0, <8 x i16> %a1, <8 x i32> <i32 0, i32 8, i32 9, i32 10, i32 undef, i32 undef, i32 undef, i32 undef>
287   ret <8 x i16> %s
288 }
289
290 define <8 x i16> @shuf_089uuuuu(<8 x i16> %a0, <8 x i16> %a1) {
291 ; ALL-LABEL: shuf_089uuuuu:
292 ; ALL:       # BB#0:
293 ; ALL-NEXT:    insertq {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,1,2,3],xmm0[6,7,u,u,u,u,u,u,u,u]
294 ; ALL-NEXT:    retq
295   %s = shufflevector <8 x i16> %a0, <8 x i16> %a1, <8 x i32> <i32 0, i32 8, i32 9, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
296   ret <8 x i16> %s
297 }
298
299 declare <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64>, i8, i8) nounwind
300 declare <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64>, <2 x i64>, i8, i8) nounwind