[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / extract-store.ll
blob4d557c942262de8094575922ec8c7556d16806e4
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse2     | FileCheck %s --check-prefix=X32 --check-prefix=SSE-X32 --check-prefix=SSE2-X32
3 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse2   | FileCheck %s --check-prefix=X64 --check-prefix=SSE-X64 --check-prefix=SSE2-X64
4 ; RUN: llc < %s -mtriple=i686-unknown -mattr=+sse4.1   | FileCheck %s --check-prefix=X32 --check-prefix=SSE-X32 --check-prefix=SSE41-X32
5 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=X64 --check-prefix=SSE-X64 --check-prefix=SSE41-X64
6 ; RUN: llc < %s -mtriple=i686-unknown -mattr=+avx      | FileCheck %s --check-prefix=X32 --check-prefix=AVX-X32
7 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx    | FileCheck %s --check-prefix=X64 --check-prefix=AVX-X64
8 ; RUN: llc < %s -O2 -mtriple=x86_64-linux-android -mattr=+mmx -enable-legalize-types-checking | FileCheck %s --check-prefix=X64 --check-prefix=SSE-X64 --check-prefix=SSE-F128
9 ; RUN: llc < %s -O2 -mtriple=x86_64-linux-gnu -mattr=+mmx -enable-legalize-types-checking | FileCheck %s --check-prefix=X64 --check-prefix=SSE-X64 --check-prefix=SSE-F128
11 define void @extract_i8_0(i8* nocapture %dst, <16 x i8> %foo) nounwind {
12 ; SSE2-X32-LABEL: extract_i8_0:
13 ; SSE2-X32:       # %bb.0:
14 ; SSE2-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
15 ; SSE2-X32-NEXT:    movd %xmm0, %ecx
16 ; SSE2-X32-NEXT:    movb %cl, (%eax)
17 ; SSE2-X32-NEXT:    retl
19 ; SSE2-X64-LABEL: extract_i8_0:
20 ; SSE2-X64:       # %bb.0:
21 ; SSE2-X64-NEXT:    movd %xmm0, %eax
22 ; SSE2-X64-NEXT:    movb %al, (%rdi)
23 ; SSE2-X64-NEXT:    retq
25 ; SSE41-X32-LABEL: extract_i8_0:
26 ; SSE41-X32:       # %bb.0:
27 ; SSE41-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
28 ; SSE41-X32-NEXT:    pextrb $0, %xmm0, (%eax)
29 ; SSE41-X32-NEXT:    retl
31 ; SSE41-X64-LABEL: extract_i8_0:
32 ; SSE41-X64:       # %bb.0:
33 ; SSE41-X64-NEXT:    pextrb $0, %xmm0, (%rdi)
34 ; SSE41-X64-NEXT:    retq
36 ; AVX-X32-LABEL: extract_i8_0:
37 ; AVX-X32:       # %bb.0:
38 ; AVX-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
39 ; AVX-X32-NEXT:    vpextrb $0, %xmm0, (%eax)
40 ; AVX-X32-NEXT:    retl
42 ; AVX-X64-LABEL: extract_i8_0:
43 ; AVX-X64:       # %bb.0:
44 ; AVX-X64-NEXT:    vpextrb $0, %xmm0, (%rdi)
45 ; AVX-X64-NEXT:    retq
47 ; SSE-F128-LABEL: extract_i8_0:
48 ; SSE-F128:       # %bb.0:
49 ; SSE-F128-NEXT:    movd %xmm0, %eax
50 ; SSE-F128-NEXT:    movb %al, (%rdi)
51 ; SSE-F128-NEXT:    retq
52   %vecext = extractelement <16 x i8> %foo, i32 0
53   store i8 %vecext, i8* %dst, align 1
54   ret void
57 define void @extract_i8_3(i8* nocapture %dst, <16 x i8> %foo) nounwind {
58 ; SSE2-X32-LABEL: extract_i8_3:
59 ; SSE2-X32:       # %bb.0:
60 ; SSE2-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
61 ; SSE2-X32-NEXT:    movd %xmm0, %ecx
62 ; SSE2-X32-NEXT:    shrl $24, %ecx
63 ; SSE2-X32-NEXT:    movb %cl, (%eax)
64 ; SSE2-X32-NEXT:    retl
66 ; SSE2-X64-LABEL: extract_i8_3:
67 ; SSE2-X64:       # %bb.0:
68 ; SSE2-X64-NEXT:    movd %xmm0, %eax
69 ; SSE2-X64-NEXT:    shrl $24, %eax
70 ; SSE2-X64-NEXT:    movb %al, (%rdi)
71 ; SSE2-X64-NEXT:    retq
73 ; SSE41-X32-LABEL: extract_i8_3:
74 ; SSE41-X32:       # %bb.0:
75 ; SSE41-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
76 ; SSE41-X32-NEXT:    pextrb $3, %xmm0, (%eax)
77 ; SSE41-X32-NEXT:    retl
79 ; SSE41-X64-LABEL: extract_i8_3:
80 ; SSE41-X64:       # %bb.0:
81 ; SSE41-X64-NEXT:    pextrb $3, %xmm0, (%rdi)
82 ; SSE41-X64-NEXT:    retq
84 ; AVX-X32-LABEL: extract_i8_3:
85 ; AVX-X32:       # %bb.0:
86 ; AVX-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
87 ; AVX-X32-NEXT:    vpextrb $3, %xmm0, (%eax)
88 ; AVX-X32-NEXT:    retl
90 ; AVX-X64-LABEL: extract_i8_3:
91 ; AVX-X64:       # %bb.0:
92 ; AVX-X64-NEXT:    vpextrb $3, %xmm0, (%rdi)
93 ; AVX-X64-NEXT:    retq
95 ; SSE-F128-LABEL: extract_i8_3:
96 ; SSE-F128:       # %bb.0:
97 ; SSE-F128-NEXT:    movd %xmm0, %eax
98 ; SSE-F128-NEXT:    shrl $24, %eax
99 ; SSE-F128-NEXT:    movb %al, (%rdi)
100 ; SSE-F128-NEXT:    retq
101   %vecext = extractelement <16 x i8> %foo, i32 3
102   store i8 %vecext, i8* %dst, align 1
103   ret void
106 define void @extract_i8_15(i8* nocapture %dst, <16 x i8> %foo) nounwind {
107 ; SSE2-X32-LABEL: extract_i8_15:
108 ; SSE2-X32:       # %bb.0:
109 ; SSE2-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
110 ; SSE2-X32-NEXT:    pextrw $7, %xmm0, %ecx
111 ; SSE2-X32-NEXT:    movb %ch, (%eax)
112 ; SSE2-X32-NEXT:    retl
114 ; SSE2-X64-LABEL: extract_i8_15:
115 ; SSE2-X64:       # %bb.0:
116 ; SSE2-X64-NEXT:    pextrw $7, %xmm0, %eax
117 ; SSE2-X64-NEXT:    movb %ah, (%rdi)
118 ; SSE2-X64-NEXT:    retq
120 ; SSE41-X32-LABEL: extract_i8_15:
121 ; SSE41-X32:       # %bb.0:
122 ; SSE41-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
123 ; SSE41-X32-NEXT:    pextrb $15, %xmm0, (%eax)
124 ; SSE41-X32-NEXT:    retl
126 ; SSE41-X64-LABEL: extract_i8_15:
127 ; SSE41-X64:       # %bb.0:
128 ; SSE41-X64-NEXT:    pextrb $15, %xmm0, (%rdi)
129 ; SSE41-X64-NEXT:    retq
131 ; AVX-X32-LABEL: extract_i8_15:
132 ; AVX-X32:       # %bb.0:
133 ; AVX-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
134 ; AVX-X32-NEXT:    vpextrb $15, %xmm0, (%eax)
135 ; AVX-X32-NEXT:    retl
137 ; AVX-X64-LABEL: extract_i8_15:
138 ; AVX-X64:       # %bb.0:
139 ; AVX-X64-NEXT:    vpextrb $15, %xmm0, (%rdi)
140 ; AVX-X64-NEXT:    retq
142 ; SSE-F128-LABEL: extract_i8_15:
143 ; SSE-F128:       # %bb.0:
144 ; SSE-F128-NEXT:    pextrw $7, %xmm0, %eax
145 ; SSE-F128-NEXT:    movb %ah, (%rdi)
146 ; SSE-F128-NEXT:    retq
147   %vecext = extractelement <16 x i8> %foo, i32 15
148   store i8 %vecext, i8* %dst, align 1
149   ret void
152 define void @extract_i16_0(i16* nocapture %dst, <8 x i16> %foo) nounwind {
153 ; SSE2-X32-LABEL: extract_i16_0:
154 ; SSE2-X32:       # %bb.0:
155 ; SSE2-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
156 ; SSE2-X32-NEXT:    movd %xmm0, %ecx
157 ; SSE2-X32-NEXT:    movw %cx, (%eax)
158 ; SSE2-X32-NEXT:    retl
160 ; SSE2-X64-LABEL: extract_i16_0:
161 ; SSE2-X64:       # %bb.0:
162 ; SSE2-X64-NEXT:    movd %xmm0, %eax
163 ; SSE2-X64-NEXT:    movw %ax, (%rdi)
164 ; SSE2-X64-NEXT:    retq
166 ; SSE41-X32-LABEL: extract_i16_0:
167 ; SSE41-X32:       # %bb.0:
168 ; SSE41-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
169 ; SSE41-X32-NEXT:    pextrw $0, %xmm0, (%eax)
170 ; SSE41-X32-NEXT:    retl
172 ; SSE41-X64-LABEL: extract_i16_0:
173 ; SSE41-X64:       # %bb.0:
174 ; SSE41-X64-NEXT:    pextrw $0, %xmm0, (%rdi)
175 ; SSE41-X64-NEXT:    retq
177 ; AVX-X32-LABEL: extract_i16_0:
178 ; AVX-X32:       # %bb.0:
179 ; AVX-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
180 ; AVX-X32-NEXT:    vpextrw $0, %xmm0, (%eax)
181 ; AVX-X32-NEXT:    retl
183 ; AVX-X64-LABEL: extract_i16_0:
184 ; AVX-X64:       # %bb.0:
185 ; AVX-X64-NEXT:    vpextrw $0, %xmm0, (%rdi)
186 ; AVX-X64-NEXT:    retq
188 ; SSE-F128-LABEL: extract_i16_0:
189 ; SSE-F128:       # %bb.0:
190 ; SSE-F128-NEXT:    movd %xmm0, %eax
191 ; SSE-F128-NEXT:    movw %ax, (%rdi)
192 ; SSE-F128-NEXT:    retq
193   %vecext = extractelement <8 x i16> %foo, i32 0
194   store i16 %vecext, i16* %dst, align 1
195   ret void
198 define void @extract_i16_7(i16* nocapture %dst, <8 x i16> %foo) nounwind {
199 ; SSE2-X32-LABEL: extract_i16_7:
200 ; SSE2-X32:       # %bb.0:
201 ; SSE2-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
202 ; SSE2-X32-NEXT:    pextrw $7, %xmm0, %ecx
203 ; SSE2-X32-NEXT:    movw %cx, (%eax)
204 ; SSE2-X32-NEXT:    retl
206 ; SSE2-X64-LABEL: extract_i16_7:
207 ; SSE2-X64:       # %bb.0:
208 ; SSE2-X64-NEXT:    pextrw $7, %xmm0, %eax
209 ; SSE2-X64-NEXT:    movw %ax, (%rdi)
210 ; SSE2-X64-NEXT:    retq
212 ; SSE41-X32-LABEL: extract_i16_7:
213 ; SSE41-X32:       # %bb.0:
214 ; SSE41-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
215 ; SSE41-X32-NEXT:    pextrw $7, %xmm0, (%eax)
216 ; SSE41-X32-NEXT:    retl
218 ; SSE41-X64-LABEL: extract_i16_7:
219 ; SSE41-X64:       # %bb.0:
220 ; SSE41-X64-NEXT:    pextrw $7, %xmm0, (%rdi)
221 ; SSE41-X64-NEXT:    retq
223 ; AVX-X32-LABEL: extract_i16_7:
224 ; AVX-X32:       # %bb.0:
225 ; AVX-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
226 ; AVX-X32-NEXT:    vpextrw $7, %xmm0, (%eax)
227 ; AVX-X32-NEXT:    retl
229 ; AVX-X64-LABEL: extract_i16_7:
230 ; AVX-X64:       # %bb.0:
231 ; AVX-X64-NEXT:    vpextrw $7, %xmm0, (%rdi)
232 ; AVX-X64-NEXT:    retq
234 ; SSE-F128-LABEL: extract_i16_7:
235 ; SSE-F128:       # %bb.0:
236 ; SSE-F128-NEXT:    pextrw $7, %xmm0, %eax
237 ; SSE-F128-NEXT:    movw %ax, (%rdi)
238 ; SSE-F128-NEXT:    retq
239   %vecext = extractelement <8 x i16> %foo, i32 7
240   store i16 %vecext, i16* %dst, align 1
241   ret void
244 define void @extract_i32_0(i32* nocapture %dst, <4 x i32> %foo) nounwind {
245 ; SSE-X32-LABEL: extract_i32_0:
246 ; SSE-X32:       # %bb.0:
247 ; SSE-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
248 ; SSE-X32-NEXT:    movss %xmm0, (%eax)
249 ; SSE-X32-NEXT:    retl
251 ; SSE-X64-LABEL: extract_i32_0:
252 ; SSE-X64:       # %bb.0:
253 ; SSE-X64-NEXT:    movss %xmm0, (%rdi)
254 ; SSE-X64-NEXT:    retq
256 ; AVX-X32-LABEL: extract_i32_0:
257 ; AVX-X32:       # %bb.0:
258 ; AVX-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
259 ; AVX-X32-NEXT:    vmovss %xmm0, (%eax)
260 ; AVX-X32-NEXT:    retl
262 ; AVX-X64-LABEL: extract_i32_0:
263 ; AVX-X64:       # %bb.0:
264 ; AVX-X64-NEXT:    vmovss %xmm0, (%rdi)
265 ; AVX-X64-NEXT:    retq
266   %vecext = extractelement <4 x i32> %foo, i32 0
267   store i32 %vecext, i32* %dst, align 1
268   ret void
271 define void @extract_i32_3(i32* nocapture %dst, <4 x i32> %foo) nounwind {
272 ; SSE2-X32-LABEL: extract_i32_3:
273 ; SSE2-X32:       # %bb.0:
274 ; SSE2-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
275 ; SSE2-X32-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
276 ; SSE2-X32-NEXT:    movd %xmm0, (%eax)
277 ; SSE2-X32-NEXT:    retl
279 ; SSE2-X64-LABEL: extract_i32_3:
280 ; SSE2-X64:       # %bb.0:
281 ; SSE2-X64-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
282 ; SSE2-X64-NEXT:    movd %xmm0, (%rdi)
283 ; SSE2-X64-NEXT:    retq
285 ; SSE41-X32-LABEL: extract_i32_3:
286 ; SSE41-X32:       # %bb.0:
287 ; SSE41-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
288 ; SSE41-X32-NEXT:    extractps $3, %xmm0, (%eax)
289 ; SSE41-X32-NEXT:    retl
291 ; SSE41-X64-LABEL: extract_i32_3:
292 ; SSE41-X64:       # %bb.0:
293 ; SSE41-X64-NEXT:    extractps $3, %xmm0, (%rdi)
294 ; SSE41-X64-NEXT:    retq
296 ; AVX-X32-LABEL: extract_i32_3:
297 ; AVX-X32:       # %bb.0:
298 ; AVX-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
299 ; AVX-X32-NEXT:    vextractps $3, %xmm0, (%eax)
300 ; AVX-X32-NEXT:    retl
302 ; AVX-X64-LABEL: extract_i32_3:
303 ; AVX-X64:       # %bb.0:
304 ; AVX-X64-NEXT:    vextractps $3, %xmm0, (%rdi)
305 ; AVX-X64-NEXT:    retq
307 ; SSE-F128-LABEL: extract_i32_3:
308 ; SSE-F128:       # %bb.0:
309 ; SSE-F128-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
310 ; SSE-F128-NEXT:    movd %xmm0, (%rdi)
311 ; SSE-F128-NEXT:    retq
312   %vecext = extractelement <4 x i32> %foo, i32 3
313   store i32 %vecext, i32* %dst, align 1
314   ret void
317 define void @extract_i64_0(i64* nocapture %dst, <2 x i64> %foo) nounwind {
318 ; SSE-X32-LABEL: extract_i64_0:
319 ; SSE-X32:       # %bb.0:
320 ; SSE-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
321 ; SSE-X32-NEXT:    movlps %xmm0, (%eax)
322 ; SSE-X32-NEXT:    retl
324 ; SSE-X64-LABEL: extract_i64_0:
325 ; SSE-X64:       # %bb.0:
326 ; SSE-X64-NEXT:    movlps %xmm0, (%rdi)
327 ; SSE-X64-NEXT:    retq
329 ; AVX-X32-LABEL: extract_i64_0:
330 ; AVX-X32:       # %bb.0:
331 ; AVX-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
332 ; AVX-X32-NEXT:    vmovlps %xmm0, (%eax)
333 ; AVX-X32-NEXT:    retl
335 ; AVX-X64-LABEL: extract_i64_0:
336 ; AVX-X64:       # %bb.0:
337 ; AVX-X64-NEXT:    vmovlps %xmm0, (%rdi)
338 ; AVX-X64-NEXT:    retq
339   %vecext = extractelement <2 x i64> %foo, i32 0
340   store i64 %vecext, i64* %dst, align 1
341   ret void
344 define void @extract_i64_1(i64* nocapture %dst, <2 x i64> %foo) nounwind {
345 ; SSE-X32-LABEL: extract_i64_1:
346 ; SSE-X32:       # %bb.0:
347 ; SSE-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
348 ; SSE-X32-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
349 ; SSE-X32-NEXT:    movq %xmm0, (%eax)
350 ; SSE-X32-NEXT:    retl
352 ; SSE2-X64-LABEL: extract_i64_1:
353 ; SSE2-X64:       # %bb.0:
354 ; SSE2-X64-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
355 ; SSE2-X64-NEXT:    movq %xmm0, (%rdi)
356 ; SSE2-X64-NEXT:    retq
358 ; SSE41-X64-LABEL: extract_i64_1:
359 ; SSE41-X64:       # %bb.0:
360 ; SSE41-X64-NEXT:    pextrq $1, %xmm0, (%rdi)
361 ; SSE41-X64-NEXT:    retq
363 ; AVX-X32-LABEL: extract_i64_1:
364 ; AVX-X32:       # %bb.0:
365 ; AVX-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
366 ; AVX-X32-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[2,3,0,1]
367 ; AVX-X32-NEXT:    vmovlps %xmm0, (%eax)
368 ; AVX-X32-NEXT:    retl
370 ; AVX-X64-LABEL: extract_i64_1:
371 ; AVX-X64:       # %bb.0:
372 ; AVX-X64-NEXT:    vpextrq $1, %xmm0, (%rdi)
373 ; AVX-X64-NEXT:    retq
375 ; SSE-F128-LABEL: extract_i64_1:
376 ; SSE-F128:       # %bb.0:
377 ; SSE-F128-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
378 ; SSE-F128-NEXT:    movq %xmm0, (%rdi)
379 ; SSE-F128-NEXT:    retq
380   %vecext = extractelement <2 x i64> %foo, i32 1
381   store i64 %vecext, i64* %dst, align 1
382   ret void
385 define void @extract_f32_0(float* nocapture %dst, <4 x float> %foo) nounwind {
386 ; SSE-X32-LABEL: extract_f32_0:
387 ; SSE-X32:       # %bb.0:
388 ; SSE-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
389 ; SSE-X32-NEXT:    movss %xmm0, (%eax)
390 ; SSE-X32-NEXT:    retl
392 ; SSE-X64-LABEL: extract_f32_0:
393 ; SSE-X64:       # %bb.0:
394 ; SSE-X64-NEXT:    movss %xmm0, (%rdi)
395 ; SSE-X64-NEXT:    retq
397 ; AVX-X32-LABEL: extract_f32_0:
398 ; AVX-X32:       # %bb.0:
399 ; AVX-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
400 ; AVX-X32-NEXT:    vmovss %xmm0, (%eax)
401 ; AVX-X32-NEXT:    retl
403 ; AVX-X64-LABEL: extract_f32_0:
404 ; AVX-X64:       # %bb.0:
405 ; AVX-X64-NEXT:    vmovss %xmm0, (%rdi)
406 ; AVX-X64-NEXT:    retq
407   %vecext = extractelement <4 x float> %foo, i32 0
408   store float %vecext, float* %dst, align 1
409   ret void
412 define void @extract_f32_3(float* nocapture %dst, <4 x float> %foo) nounwind {
413 ; SSE2-X32-LABEL: extract_f32_3:
414 ; SSE2-X32:       # %bb.0:
415 ; SSE2-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
416 ; SSE2-X32-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,1,2,3]
417 ; SSE2-X32-NEXT:    movss %xmm0, (%eax)
418 ; SSE2-X32-NEXT:    retl
420 ; SSE2-X64-LABEL: extract_f32_3:
421 ; SSE2-X64:       # %bb.0:
422 ; SSE2-X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,1,2,3]
423 ; SSE2-X64-NEXT:    movss %xmm0, (%rdi)
424 ; SSE2-X64-NEXT:    retq
426 ; SSE41-X32-LABEL: extract_f32_3:
427 ; SSE41-X32:       # %bb.0:
428 ; SSE41-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
429 ; SSE41-X32-NEXT:    extractps $3, %xmm0, (%eax)
430 ; SSE41-X32-NEXT:    retl
432 ; SSE41-X64-LABEL: extract_f32_3:
433 ; SSE41-X64:       # %bb.0:
434 ; SSE41-X64-NEXT:    extractps $3, %xmm0, (%rdi)
435 ; SSE41-X64-NEXT:    retq
437 ; AVX-X32-LABEL: extract_f32_3:
438 ; AVX-X32:       # %bb.0:
439 ; AVX-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
440 ; AVX-X32-NEXT:    vextractps $3, %xmm0, (%eax)
441 ; AVX-X32-NEXT:    retl
443 ; AVX-X64-LABEL: extract_f32_3:
444 ; AVX-X64:       # %bb.0:
445 ; AVX-X64-NEXT:    vextractps $3, %xmm0, (%rdi)
446 ; AVX-X64-NEXT:    retq
448 ; SSE-F128-LABEL: extract_f32_3:
449 ; SSE-F128:       # %bb.0:
450 ; SSE-F128-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,1,2,3]
451 ; SSE-F128-NEXT:    movss %xmm0, (%rdi)
452 ; SSE-F128-NEXT:    retq
453   %vecext = extractelement <4 x float> %foo, i32 3
454   store float %vecext, float* %dst, align 1
455   ret void
458 define void @extract_f64_0(double* nocapture %dst, <2 x double> %foo) nounwind {
459 ; SSE-X32-LABEL: extract_f64_0:
460 ; SSE-X32:       # %bb.0:
461 ; SSE-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
462 ; SSE-X32-NEXT:    movlps %xmm0, (%eax)
463 ; SSE-X32-NEXT:    retl
465 ; SSE-X64-LABEL: extract_f64_0:
466 ; SSE-X64:       # %bb.0:
467 ; SSE-X64-NEXT:    movlps %xmm0, (%rdi)
468 ; SSE-X64-NEXT:    retq
470 ; AVX-X32-LABEL: extract_f64_0:
471 ; AVX-X32:       # %bb.0:
472 ; AVX-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
473 ; AVX-X32-NEXT:    vmovlps %xmm0, (%eax)
474 ; AVX-X32-NEXT:    retl
476 ; AVX-X64-LABEL: extract_f64_0:
477 ; AVX-X64:       # %bb.0:
478 ; AVX-X64-NEXT:    vmovlps %xmm0, (%rdi)
479 ; AVX-X64-NEXT:    retq
480   %vecext = extractelement <2 x double> %foo, i32 0
481   store double %vecext, double* %dst, align 1
482   ret void
485 define void @extract_f64_1(double* nocapture %dst, <2 x double> %foo) nounwind {
486 ; SSE-X32-LABEL: extract_f64_1:
487 ; SSE-X32:       # %bb.0:
488 ; SSE-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
489 ; SSE-X32-NEXT:    movhps %xmm0, (%eax)
490 ; SSE-X32-NEXT:    retl
492 ; SSE-X64-LABEL: extract_f64_1:
493 ; SSE-X64:       # %bb.0:
494 ; SSE-X64-NEXT:    movhps %xmm0, (%rdi)
495 ; SSE-X64-NEXT:    retq
497 ; AVX-X32-LABEL: extract_f64_1:
498 ; AVX-X32:       # %bb.0:
499 ; AVX-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
500 ; AVX-X32-NEXT:    vmovhps %xmm0, (%eax)
501 ; AVX-X32-NEXT:    retl
503 ; AVX-X64-LABEL: extract_f64_1:
504 ; AVX-X64:       # %bb.0:
505 ; AVX-X64-NEXT:    vmovhps %xmm0, (%rdi)
506 ; AVX-X64-NEXT:    retq
507   %vecext = extractelement <2 x double> %foo, i32 1
508   store double %vecext, double* %dst, align 1
509   ret void
512 define void @extract_f128_0(fp128* nocapture %dst, <2 x fp128> %foo) nounwind {
513 ; SSE-X32-LABEL: extract_f128_0:
514 ; SSE-X32:       # %bb.0:
515 ; SSE-X32-NEXT:    pushl %edi
516 ; SSE-X32-NEXT:    pushl %esi
517 ; SSE-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
518 ; SSE-X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
519 ; SSE-X32-NEXT:    movl {{[0-9]+}}(%esp), %edx
520 ; SSE-X32-NEXT:    movl {{[0-9]+}}(%esp), %esi
521 ; SSE-X32-NEXT:    movl {{[0-9]+}}(%esp), %edi
522 ; SSE-X32-NEXT:    movl %esi, 12(%edi)
523 ; SSE-X32-NEXT:    movl %edx, 8(%edi)
524 ; SSE-X32-NEXT:    movl %ecx, 4(%edi)
525 ; SSE-X32-NEXT:    movl %eax, (%edi)
526 ; SSE-X32-NEXT:    popl %esi
527 ; SSE-X32-NEXT:    popl %edi
528 ; SSE-X32-NEXT:    retl
530 ; SSE2-X64-LABEL: extract_f128_0:
531 ; SSE2-X64:       # %bb.0:
532 ; SSE2-X64-NEXT:    movq %rdx, 8(%rdi)
533 ; SSE2-X64-NEXT:    movq %rsi, (%rdi)
534 ; SSE2-X64-NEXT:    retq
536 ; SSE41-X64-LABEL: extract_f128_0:
537 ; SSE41-X64:       # %bb.0:
538 ; SSE41-X64-NEXT:    movq %rdx, 8(%rdi)
539 ; SSE41-X64-NEXT:    movq %rsi, (%rdi)
540 ; SSE41-X64-NEXT:    retq
542 ; AVX-X32-LABEL: extract_f128_0:
543 ; AVX-X32:       # %bb.0:
544 ; AVX-X32-NEXT:    vmovups {{[0-9]+}}(%esp), %xmm0
545 ; AVX-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
546 ; AVX-X32-NEXT:    vmovups %xmm0, (%eax)
547 ; AVX-X32-NEXT:    retl
549 ; AVX-X64-LABEL: extract_f128_0:
550 ; AVX-X64:       # %bb.0:
551 ; AVX-X64-NEXT:    movq %rdx, 8(%rdi)
552 ; AVX-X64-NEXT:    movq %rsi, (%rdi)
553 ; AVX-X64-NEXT:    retq
555 ; SSE-F128-LABEL: extract_f128_0:
556 ; SSE-F128:       # %bb.0:
557 ; SSE-F128-NEXT:    movups %xmm0, (%rdi)
558 ; SSE-F128-NEXT:    retq
559   %vecext = extractelement <2 x fp128> %foo, i32 0
560   store fp128 %vecext, fp128* %dst, align 1
561   ret void
564 define void @extract_f128_1(fp128* nocapture %dst, <2 x fp128> %foo) nounwind {
565 ; SSE-X32-LABEL: extract_f128_1:
566 ; SSE-X32:       # %bb.0:
567 ; SSE-X32-NEXT:    pushl %edi
568 ; SSE-X32-NEXT:    pushl %esi
569 ; SSE-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
570 ; SSE-X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
571 ; SSE-X32-NEXT:    movl {{[0-9]+}}(%esp), %edx
572 ; SSE-X32-NEXT:    movl {{[0-9]+}}(%esp), %esi
573 ; SSE-X32-NEXT:    movl {{[0-9]+}}(%esp), %edi
574 ; SSE-X32-NEXT:    movl %esi, 12(%edi)
575 ; SSE-X32-NEXT:    movl %edx, 8(%edi)
576 ; SSE-X32-NEXT:    movl %ecx, 4(%edi)
577 ; SSE-X32-NEXT:    movl %eax, (%edi)
578 ; SSE-X32-NEXT:    popl %esi
579 ; SSE-X32-NEXT:    popl %edi
580 ; SSE-X32-NEXT:    retl
582 ; SSE2-X64-LABEL: extract_f128_1:
583 ; SSE2-X64:       # %bb.0:
584 ; SSE2-X64-NEXT:    movq %r8, 8(%rdi)
585 ; SSE2-X64-NEXT:    movq %rcx, (%rdi)
586 ; SSE2-X64-NEXT:    retq
588 ; SSE41-X64-LABEL: extract_f128_1:
589 ; SSE41-X64:       # %bb.0:
590 ; SSE41-X64-NEXT:    movq %r8, 8(%rdi)
591 ; SSE41-X64-NEXT:    movq %rcx, (%rdi)
592 ; SSE41-X64-NEXT:    retq
594 ; AVX-X32-LABEL: extract_f128_1:
595 ; AVX-X32:       # %bb.0:
596 ; AVX-X32-NEXT:    vmovups {{[0-9]+}}(%esp), %xmm0
597 ; AVX-X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
598 ; AVX-X32-NEXT:    vmovups %xmm0, (%eax)
599 ; AVX-X32-NEXT:    retl
601 ; AVX-X64-LABEL: extract_f128_1:
602 ; AVX-X64:       # %bb.0:
603 ; AVX-X64-NEXT:    movq %r8, 8(%rdi)
604 ; AVX-X64-NEXT:    movq %rcx, (%rdi)
605 ; AVX-X64-NEXT:    retq
607 ; SSE-F128-LABEL: extract_f128_1:
608 ; SSE-F128:       # %bb.0:
609 ; SSE-F128-NEXT:    movups %xmm1, (%rdi)
610 ; SSE-F128-NEXT:    retq
611   %vecext = extractelement <2 x fp128> %foo, i32 1
612   store fp128 %vecext, fp128* %dst, align 1
613   ret void
616 define void @extract_i8_undef(i8* nocapture %dst, <16 x i8> %foo) nounwind {
617 ; X32-LABEL: extract_i8_undef:
618 ; X32:       # %bb.0:
619 ; X32-NEXT:    retl
621 ; X64-LABEL: extract_i8_undef:
622 ; X64:       # %bb.0:
623 ; X64-NEXT:    retq
624   %vecext = extractelement <16 x i8> %foo, i32 16 ; undef
625   store i8 %vecext, i8* %dst, align 1
626   ret void
629 define void @extract_i16_undef(i16* nocapture %dst, <8 x i16> %foo) nounwind {
630 ; X32-LABEL: extract_i16_undef:
631 ; X32:       # %bb.0:
632 ; X32-NEXT:    retl
634 ; X64-LABEL: extract_i16_undef:
635 ; X64:       # %bb.0:
636 ; X64-NEXT:    retq
637   %vecext = extractelement <8 x i16> %foo, i32 9 ; undef
638   store i16 %vecext, i16* %dst, align 1
639   ret void
642 define void @extract_i32_undef(i32* nocapture %dst, <4 x i32> %foo) nounwind {
643 ; X32-LABEL: extract_i32_undef:
644 ; X32:       # %bb.0:
645 ; X32-NEXT:    retl
647 ; X64-LABEL: extract_i32_undef:
648 ; X64:       # %bb.0:
649 ; X64-NEXT:    retq
650   %vecext = extractelement <4 x i32> %foo, i32 6 ; undef
651   store i32 %vecext, i32* %dst, align 1
652   ret void
655 define void @extract_i64_undef(i64* nocapture %dst, <2 x i64> %foo) nounwind {
656 ; X32-LABEL: extract_i64_undef:
657 ; X32:       # %bb.0:
658 ; X32-NEXT:    retl
660 ; X64-LABEL: extract_i64_undef:
661 ; X64:       # %bb.0:
662 ; X64-NEXT:    retq
663   %vecext = extractelement <2 x i64> %foo, i32 2 ; undef
664   store i64 %vecext, i64* %dst, align 1
665   ret void
668 define void @extract_f32_undef(float* nocapture %dst, <4 x float> %foo) nounwind {
669 ; X32-LABEL: extract_f32_undef:
670 ; X32:       # %bb.0:
671 ; X32-NEXT:    retl
673 ; X64-LABEL: extract_f32_undef:
674 ; X64:       # %bb.0:
675 ; X64-NEXT:    retq
676   %vecext = extractelement <4 x float> %foo, i32 6 ; undef
677   store float %vecext, float* %dst, align 1
678   ret void
681 define void @extract_f64_undef(double* nocapture %dst, <2 x double> %foo) nounwind {
682 ; X32-LABEL: extract_f64_undef:
683 ; X32:       # %bb.0:
684 ; X32-NEXT:    retl
686 ; X64-LABEL: extract_f64_undef:
687 ; X64:       # %bb.0:
688 ; X64-NEXT:    retq
689   %vecext = extractelement <2 x double> %foo, i32 2 ; undef
690   store double %vecext, double* %dst, align 1
691   ret void
694 define void @extract_f128_undef(fp128* nocapture %dst, <2 x fp128> %foo) nounwind {
695 ; X32-LABEL: extract_f128_undef:
696 ; X32:       # %bb.0:
697 ; X32-NEXT:    retl
699 ; X64-LABEL: extract_f128_undef:
700 ; X64:       # %bb.0:
701 ; X64-NEXT:    retq
702   %vecext = extractelement <2 x fp128> %foo, i32 2 ; undef
703   store fp128 %vecext, fp128* %dst, align 1
704   ret void