• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+sse2   | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
4; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+avx    | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
5; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+avx2   | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
6
7;
8; ExtractElement - Constant Index
9;
10
11define i8 @extractelement_v16i8_1(<16 x i8> %a) nounwind {
12; SSE2-LABEL: extractelement_v16i8_1:
13; SSE2:       # %bb.0:
14; SSE2-NEXT:    movd %xmm0, %eax
15; SSE2-NEXT:    shrl $8, %eax
16; SSE2-NEXT:    # kill: def $al killed $al killed $eax
17; SSE2-NEXT:    retq
18;
19; SSE41-LABEL: extractelement_v16i8_1:
20; SSE41:       # %bb.0:
21; SSE41-NEXT:    pextrb $1, %xmm0, %eax
22; SSE41-NEXT:    # kill: def $al killed $al killed $eax
23; SSE41-NEXT:    retq
24;
25; AVX-LABEL: extractelement_v16i8_1:
26; AVX:       # %bb.0:
27; AVX-NEXT:    vpextrb $1, %xmm0, %eax
28; AVX-NEXT:    # kill: def $al killed $al killed $eax
29; AVX-NEXT:    retq
30  %b = extractelement <16 x i8> %a, i256 1
31  ret i8 %b
32}
33
34define i8 @extractelement_v16i8_11(<16 x i8> %a) nounwind {
35; SSE2-LABEL: extractelement_v16i8_11:
36; SSE2:       # %bb.0:
37; SSE2-NEXT:    pextrw $5, %xmm0, %eax
38; SSE2-NEXT:    shrl $8, %eax
39; SSE2-NEXT:    # kill: def $al killed $al killed $eax
40; SSE2-NEXT:    retq
41;
42; SSE41-LABEL: extractelement_v16i8_11:
43; SSE41:       # %bb.0:
44; SSE41-NEXT:    pextrb $11, %xmm0, %eax
45; SSE41-NEXT:    # kill: def $al killed $al killed $eax
46; SSE41-NEXT:    retq
47;
48; AVX-LABEL: extractelement_v16i8_11:
49; AVX:       # %bb.0:
50; AVX-NEXT:    vpextrb $11, %xmm0, %eax
51; AVX-NEXT:    # kill: def $al killed $al killed $eax
52; AVX-NEXT:    retq
53  %b = extractelement <16 x i8> %a, i256 11
54  ret i8 %b
55}
56
57define i8 @extractelement_v16i8_14(<16 x i8> %a) nounwind {
58; SSE2-LABEL: extractelement_v16i8_14:
59; SSE2:       # %bb.0:
60; SSE2-NEXT:    pextrw $7, %xmm0, %eax
61; SSE2-NEXT:    # kill: def $al killed $al killed $eax
62; SSE2-NEXT:    retq
63;
64; SSE41-LABEL: extractelement_v16i8_14:
65; SSE41:       # %bb.0:
66; SSE41-NEXT:    pextrb $14, %xmm0, %eax
67; SSE41-NEXT:    # kill: def $al killed $al killed $eax
68; SSE41-NEXT:    retq
69;
70; AVX-LABEL: extractelement_v16i8_14:
71; AVX:       # %bb.0:
72; AVX-NEXT:    vpextrb $14, %xmm0, %eax
73; AVX-NEXT:    # kill: def $al killed $al killed $eax
74; AVX-NEXT:    retq
75  %b = extractelement <16 x i8> %a, i256 14
76  ret i8 %b
77}
78
79define i8 @extractelement_v32i8_1(<32 x i8> %a) nounwind {
80; SSE2-LABEL: extractelement_v32i8_1:
81; SSE2:       # %bb.0:
82; SSE2-NEXT:    movd %xmm0, %eax
83; SSE2-NEXT:    shrl $8, %eax
84; SSE2-NEXT:    # kill: def $al killed $al killed $eax
85; SSE2-NEXT:    retq
86;
87; SSE41-LABEL: extractelement_v32i8_1:
88; SSE41:       # %bb.0:
89; SSE41-NEXT:    pextrb $1, %xmm0, %eax
90; SSE41-NEXT:    # kill: def $al killed $al killed $eax
91; SSE41-NEXT:    retq
92;
93; AVX-LABEL: extractelement_v32i8_1:
94; AVX:       # %bb.0:
95; AVX-NEXT:    vpextrb $1, %xmm0, %eax
96; AVX-NEXT:    # kill: def $al killed $al killed $eax
97; AVX-NEXT:    vzeroupper
98; AVX-NEXT:    retq
99  %b = extractelement <32 x i8> %a, i256 1
100  ret i8 %b
101}
102
103define i8 @extractelement_v32i8_17(<32 x i8> %a) nounwind {
104; SSE2-LABEL: extractelement_v32i8_17:
105; SSE2:       # %bb.0:
106; SSE2-NEXT:    movd %xmm1, %eax
107; SSE2-NEXT:    shrl $8, %eax
108; SSE2-NEXT:    # kill: def $al killed $al killed $eax
109; SSE2-NEXT:    retq
110;
111; SSE41-LABEL: extractelement_v32i8_17:
112; SSE41:       # %bb.0:
113; SSE41-NEXT:    pextrb $1, %xmm1, %eax
114; SSE41-NEXT:    # kill: def $al killed $al killed $eax
115; SSE41-NEXT:    retq
116;
117; AVX1-LABEL: extractelement_v32i8_17:
118; AVX1:       # %bb.0:
119; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
120; AVX1-NEXT:    vpextrb $1, %xmm0, %eax
121; AVX1-NEXT:    # kill: def $al killed $al killed $eax
122; AVX1-NEXT:    vzeroupper
123; AVX1-NEXT:    retq
124;
125; AVX2-LABEL: extractelement_v32i8_17:
126; AVX2:       # %bb.0:
127; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
128; AVX2-NEXT:    vpextrb $1, %xmm0, %eax
129; AVX2-NEXT:    # kill: def $al killed $al killed $eax
130; AVX2-NEXT:    vzeroupper
131; AVX2-NEXT:    retq
132  %b = extractelement <32 x i8> %a, i256 17
133  ret i8 %b
134}
135
136define i16 @extractelement_v8i16_0(<8 x i16> %a, i256 %i) nounwind {
137; SSE-LABEL: extractelement_v8i16_0:
138; SSE:       # %bb.0:
139; SSE-NEXT:    movd %xmm0, %eax
140; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
141; SSE-NEXT:    retq
142;
143; AVX-LABEL: extractelement_v8i16_0:
144; AVX:       # %bb.0:
145; AVX-NEXT:    vmovd %xmm0, %eax
146; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
147; AVX-NEXT:    retq
148  %b = extractelement <8 x i16> %a, i256 0
149  ret i16 %b
150}
151
152define i16 @extractelement_v8i16_3(<8 x i16> %a, i256 %i) nounwind {
153; SSE-LABEL: extractelement_v8i16_3:
154; SSE:       # %bb.0:
155; SSE-NEXT:    pextrw $3, %xmm0, %eax
156; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
157; SSE-NEXT:    retq
158;
159; AVX-LABEL: extractelement_v8i16_3:
160; AVX:       # %bb.0:
161; AVX-NEXT:    vpextrw $3, %xmm0, %eax
162; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
163; AVX-NEXT:    retq
164  %b = extractelement <8 x i16> %a, i256 3
165  ret i16 %b
166}
167
168define i16 @extractelement_v16i16_0(<16 x i16> %a, i256 %i) nounwind {
169; SSE-LABEL: extractelement_v16i16_0:
170; SSE:       # %bb.0:
171; SSE-NEXT:    movd %xmm0, %eax
172; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
173; SSE-NEXT:    retq
174;
175; AVX-LABEL: extractelement_v16i16_0:
176; AVX:       # %bb.0:
177; AVX-NEXT:    vmovd %xmm0, %eax
178; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
179; AVX-NEXT:    vzeroupper
180; AVX-NEXT:    retq
181  %b = extractelement <16 x i16> %a, i256 0
182  ret i16 %b
183}
184
185define i16 @extractelement_v16i16_13(<16 x i16> %a, i256 %i) nounwind {
186; SSE-LABEL: extractelement_v16i16_13:
187; SSE:       # %bb.0:
188; SSE-NEXT:    pextrw $5, %xmm1, %eax
189; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
190; SSE-NEXT:    retq
191;
192; AVX1-LABEL: extractelement_v16i16_13:
193; AVX1:       # %bb.0:
194; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
195; AVX1-NEXT:    vpextrw $5, %xmm0, %eax
196; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
197; AVX1-NEXT:    vzeroupper
198; AVX1-NEXT:    retq
199;
200; AVX2-LABEL: extractelement_v16i16_13:
201; AVX2:       # %bb.0:
202; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
203; AVX2-NEXT:    vpextrw $5, %xmm0, %eax
204; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
205; AVX2-NEXT:    vzeroupper
206; AVX2-NEXT:    retq
207  %b = extractelement <16 x i16> %a, i256 13
208  ret i16 %b
209}
210
211define i32 @extractelement_v4i32_0(<4 x i32> %a) nounwind {
212; SSE-LABEL: extractelement_v4i32_0:
213; SSE:       # %bb.0:
214; SSE-NEXT:    movd %xmm0, %eax
215; SSE-NEXT:    retq
216;
217; AVX-LABEL: extractelement_v4i32_0:
218; AVX:       # %bb.0:
219; AVX-NEXT:    vmovd %xmm0, %eax
220; AVX-NEXT:    retq
221  %b = extractelement <4 x i32> %a, i256 0
222  ret i32 %b
223}
224
225define i32 @extractelement_v4i32_3(<4 x i32> %a) nounwind {
226; SSE2-LABEL: extractelement_v4i32_3:
227; SSE2:       # %bb.0:
228; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
229; SSE2-NEXT:    movd %xmm0, %eax
230; SSE2-NEXT:    retq
231;
232; SSE41-LABEL: extractelement_v4i32_3:
233; SSE41:       # %bb.0:
234; SSE41-NEXT:    extractps $3, %xmm0, %eax
235; SSE41-NEXT:    retq
236;
237; AVX-LABEL: extractelement_v4i32_3:
238; AVX:       # %bb.0:
239; AVX-NEXT:    vextractps $3, %xmm0, %eax
240; AVX-NEXT:    retq
241  %b = extractelement <4 x i32> %a, i256 3
242  ret i32 %b
243}
244
245define i32 @extractelement_v8i32_0(<8 x i32> %a) nounwind {
246; SSE-LABEL: extractelement_v8i32_0:
247; SSE:       # %bb.0:
248; SSE-NEXT:    movd %xmm1, %eax
249; SSE-NEXT:    retq
250;
251; AVX1-LABEL: extractelement_v8i32_0:
252; AVX1:       # %bb.0:
253; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
254; AVX1-NEXT:    vmovd %xmm0, %eax
255; AVX1-NEXT:    vzeroupper
256; AVX1-NEXT:    retq
257;
258; AVX2-LABEL: extractelement_v8i32_0:
259; AVX2:       # %bb.0:
260; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
261; AVX2-NEXT:    vmovd %xmm0, %eax
262; AVX2-NEXT:    vzeroupper
263; AVX2-NEXT:    retq
264  %b = extractelement <8 x i32> %a, i256 4
265  ret i32 %b
266}
267
268define i32 @extractelement_v8i32_4(<8 x i32> %a) nounwind {
269; SSE-LABEL: extractelement_v8i32_4:
270; SSE:       # %bb.0:
271; SSE-NEXT:    movd %xmm1, %eax
272; SSE-NEXT:    retq
273;
274; AVX1-LABEL: extractelement_v8i32_4:
275; AVX1:       # %bb.0:
276; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
277; AVX1-NEXT:    vmovd %xmm0, %eax
278; AVX1-NEXT:    vzeroupper
279; AVX1-NEXT:    retq
280;
281; AVX2-LABEL: extractelement_v8i32_4:
282; AVX2:       # %bb.0:
283; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
284; AVX2-NEXT:    vmovd %xmm0, %eax
285; AVX2-NEXT:    vzeroupper
286; AVX2-NEXT:    retq
287  %b = extractelement <8 x i32> %a, i256 4
288  ret i32 %b
289}
290
291define i32 @extractelement_v8i32_7(<8 x i32> %a) nounwind {
292; SSE2-LABEL: extractelement_v8i32_7:
293; SSE2:       # %bb.0:
294; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[3,1,2,3]
295; SSE2-NEXT:    movd %xmm0, %eax
296; SSE2-NEXT:    retq
297;
298; SSE41-LABEL: extractelement_v8i32_7:
299; SSE41:       # %bb.0:
300; SSE41-NEXT:    extractps $3, %xmm1, %eax
301; SSE41-NEXT:    retq
302;
303; AVX-LABEL: extractelement_v8i32_7:
304; AVX:       # %bb.0:
305; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm0
306; AVX-NEXT:    vextractps $3, %xmm0, %eax
307; AVX-NEXT:    vzeroupper
308; AVX-NEXT:    retq
309  %b = extractelement <8 x i32> %a, i64 7
310  ret i32 %b
311}
312
313define i64 @extractelement_v2i64_0(<2 x i64> %a, i256 %i) nounwind {
314; SSE-LABEL: extractelement_v2i64_0:
315; SSE:       # %bb.0:
316; SSE-NEXT:    movq %xmm0, %rax
317; SSE-NEXT:    retq
318;
319; AVX-LABEL: extractelement_v2i64_0:
320; AVX:       # %bb.0:
321; AVX-NEXT:    vmovq %xmm0, %rax
322; AVX-NEXT:    retq
323  %b = extractelement <2 x i64> %a, i256 0
324  ret i64 %b
325}
326
327define i64 @extractelement_v2i64_1(<2 x i64> %a, i256 %i) nounwind {
328; SSE2-LABEL: extractelement_v2i64_1:
329; SSE2:       # %bb.0:
330; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
331; SSE2-NEXT:    movq %xmm0, %rax
332; SSE2-NEXT:    retq
333;
334; SSE41-LABEL: extractelement_v2i64_1:
335; SSE41:       # %bb.0:
336; SSE41-NEXT:    pextrq $1, %xmm0, %rax
337; SSE41-NEXT:    retq
338;
339; AVX-LABEL: extractelement_v2i64_1:
340; AVX:       # %bb.0:
341; AVX-NEXT:    vpextrq $1, %xmm0, %rax
342; AVX-NEXT:    retq
343  %b = extractelement <2 x i64> %a, i256 1
344  ret i64 %b
345}
346
347define i64 @extractelement_v4i64_1(<4 x i64> %a, i256 %i) nounwind {
348; SSE2-LABEL: extractelement_v4i64_1:
349; SSE2:       # %bb.0:
350; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
351; SSE2-NEXT:    movq %xmm0, %rax
352; SSE2-NEXT:    retq
353;
354; SSE41-LABEL: extractelement_v4i64_1:
355; SSE41:       # %bb.0:
356; SSE41-NEXT:    pextrq $1, %xmm0, %rax
357; SSE41-NEXT:    retq
358;
359; AVX-LABEL: extractelement_v4i64_1:
360; AVX:       # %bb.0:
361; AVX-NEXT:    vpextrq $1, %xmm0, %rax
362; AVX-NEXT:    vzeroupper
363; AVX-NEXT:    retq
364  %b = extractelement <4 x i64> %a, i256 1
365  ret i64 %b
366}
367
368define i64 @extractelement_v4i64_3(<4 x i64> %a, i256 %i) nounwind {
369; SSE2-LABEL: extractelement_v4i64_3:
370; SSE2:       # %bb.0:
371; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
372; SSE2-NEXT:    movq %xmm0, %rax
373; SSE2-NEXT:    retq
374;
375; SSE41-LABEL: extractelement_v4i64_3:
376; SSE41:       # %bb.0:
377; SSE41-NEXT:    pextrq $1, %xmm1, %rax
378; SSE41-NEXT:    retq
379;
380; AVX1-LABEL: extractelement_v4i64_3:
381; AVX1:       # %bb.0:
382; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
383; AVX1-NEXT:    vpextrq $1, %xmm0, %rax
384; AVX1-NEXT:    vzeroupper
385; AVX1-NEXT:    retq
386;
387; AVX2-LABEL: extractelement_v4i64_3:
388; AVX2:       # %bb.0:
389; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
390; AVX2-NEXT:    vpextrq $1, %xmm0, %rax
391; AVX2-NEXT:    vzeroupper
392; AVX2-NEXT:    retq
393  %b = extractelement <4 x i64> %a, i256 3
394  ret i64 %b
395}
396
397;
398; ExtractElement - Variable Index
399;
400
401define i8 @extractelement_v16i8_var(<16 x i8> %a, i256 %i) nounwind {
402; SSE-LABEL: extractelement_v16i8_var:
403; SSE:       # %bb.0:
404; SSE-NEXT:    andl $15, %edi
405; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
406; SSE-NEXT:    movb -24(%rsp,%rdi), %al
407; SSE-NEXT:    retq
408;
409; AVX-LABEL: extractelement_v16i8_var:
410; AVX:       # %bb.0:
411; AVX-NEXT:    andl $15, %edi
412; AVX-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)
413; AVX-NEXT:    movb -24(%rsp,%rdi), %al
414; AVX-NEXT:    retq
415  %b = extractelement <16 x i8> %a, i256 %i
416  ret i8 %b
417}
418
419define i8 @extractelement_v32i8_var(<32 x i8> %a, i256 %i) nounwind {
420; SSE-LABEL: extractelement_v32i8_var:
421; SSE:       # %bb.0:
422; SSE-NEXT:    pushq %rbp
423; SSE-NEXT:    movq %rsp, %rbp
424; SSE-NEXT:    andq $-32, %rsp
425; SSE-NEXT:    subq $64, %rsp
426; SSE-NEXT:    andl $31, %edi
427; SSE-NEXT:    movaps %xmm1, {{[0-9]+}}(%rsp)
428; SSE-NEXT:    movaps %xmm0, (%rsp)
429; SSE-NEXT:    movb (%rsp,%rdi), %al
430; SSE-NEXT:    movq %rbp, %rsp
431; SSE-NEXT:    popq %rbp
432; SSE-NEXT:    retq
433;
434; AVX-LABEL: extractelement_v32i8_var:
435; AVX:       # %bb.0:
436; AVX-NEXT:    pushq %rbp
437; AVX-NEXT:    movq %rsp, %rbp
438; AVX-NEXT:    andq $-32, %rsp
439; AVX-NEXT:    subq $64, %rsp
440; AVX-NEXT:    andl $31, %edi
441; AVX-NEXT:    vmovaps %ymm0, (%rsp)
442; AVX-NEXT:    movb (%rsp,%rdi), %al
443; AVX-NEXT:    movq %rbp, %rsp
444; AVX-NEXT:    popq %rbp
445; AVX-NEXT:    vzeroupper
446; AVX-NEXT:    retq
447  %b = extractelement <32 x i8> %a, i256 %i
448  ret i8 %b
449}
450
451define i16 @extractelement_v8i16_var(<8 x i16> %a, i256 %i) nounwind {
452; SSE-LABEL: extractelement_v8i16_var:
453; SSE:       # %bb.0:
454; SSE-NEXT:    andl $7, %edi
455; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
456; SSE-NEXT:    movzwl -24(%rsp,%rdi,2), %eax
457; SSE-NEXT:    retq
458;
459; AVX-LABEL: extractelement_v8i16_var:
460; AVX:       # %bb.0:
461; AVX-NEXT:    andl $7, %edi
462; AVX-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)
463; AVX-NEXT:    movzwl -24(%rsp,%rdi,2), %eax
464; AVX-NEXT:    retq
465  %b = extractelement <8 x i16> %a, i256 %i
466  ret i16 %b
467}
468
469define i16 @extractelement_v16i16_var(<16 x i16> %a, i256 %i) nounwind {
470; SSE-LABEL: extractelement_v16i16_var:
471; SSE:       # %bb.0:
472; SSE-NEXT:    pushq %rbp
473; SSE-NEXT:    movq %rsp, %rbp
474; SSE-NEXT:    andq $-32, %rsp
475; SSE-NEXT:    subq $64, %rsp
476; SSE-NEXT:    andl $15, %edi
477; SSE-NEXT:    movaps %xmm1, {{[0-9]+}}(%rsp)
478; SSE-NEXT:    movaps %xmm0, (%rsp)
479; SSE-NEXT:    movzwl (%rsp,%rdi,2), %eax
480; SSE-NEXT:    movq %rbp, %rsp
481; SSE-NEXT:    popq %rbp
482; SSE-NEXT:    retq
483;
484; AVX-LABEL: extractelement_v16i16_var:
485; AVX:       # %bb.0:
486; AVX-NEXT:    pushq %rbp
487; AVX-NEXT:    movq %rsp, %rbp
488; AVX-NEXT:    andq $-32, %rsp
489; AVX-NEXT:    subq $64, %rsp
490; AVX-NEXT:    andl $15, %edi
491; AVX-NEXT:    vmovaps %ymm0, (%rsp)
492; AVX-NEXT:    movzwl (%rsp,%rdi,2), %eax
493; AVX-NEXT:    movq %rbp, %rsp
494; AVX-NEXT:    popq %rbp
495; AVX-NEXT:    vzeroupper
496; AVX-NEXT:    retq
497  %b = extractelement <16 x i16> %a, i256 %i
498  ret i16 %b
499}
500
501define i32 @extractelement_v4i32_var(<4 x i32> %a, i256 %i) nounwind {
502; SSE-LABEL: extractelement_v4i32_var:
503; SSE:       # %bb.0:
504; SSE-NEXT:    andl $3, %edi
505; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
506; SSE-NEXT:    movl -24(%rsp,%rdi,4), %eax
507; SSE-NEXT:    retq
508;
509; AVX-LABEL: extractelement_v4i32_var:
510; AVX:       # %bb.0:
511; AVX-NEXT:    andl $3, %edi
512; AVX-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)
513; AVX-NEXT:    movl -24(%rsp,%rdi,4), %eax
514; AVX-NEXT:    retq
515  %b = extractelement <4 x i32> %a, i256 %i
516  ret i32 %b
517}
518
519define i32 @extractelement_v8i32_var(<8 x i32> %a, i256 %i) nounwind {
520; SSE-LABEL: extractelement_v8i32_var:
521; SSE:       # %bb.0:
522; SSE-NEXT:    pushq %rbp
523; SSE-NEXT:    movq %rsp, %rbp
524; SSE-NEXT:    andq $-32, %rsp
525; SSE-NEXT:    subq $64, %rsp
526; SSE-NEXT:    andl $7, %edi
527; SSE-NEXT:    movaps %xmm1, {{[0-9]+}}(%rsp)
528; SSE-NEXT:    movaps %xmm0, (%rsp)
529; SSE-NEXT:    movl (%rsp,%rdi,4), %eax
530; SSE-NEXT:    movq %rbp, %rsp
531; SSE-NEXT:    popq %rbp
532; SSE-NEXT:    retq
533;
534; AVX-LABEL: extractelement_v8i32_var:
535; AVX:       # %bb.0:
536; AVX-NEXT:    pushq %rbp
537; AVX-NEXT:    movq %rsp, %rbp
538; AVX-NEXT:    andq $-32, %rsp
539; AVX-NEXT:    subq $64, %rsp
540; AVX-NEXT:    andl $7, %edi
541; AVX-NEXT:    vmovaps %ymm0, (%rsp)
542; AVX-NEXT:    movl (%rsp,%rdi,4), %eax
543; AVX-NEXT:    movq %rbp, %rsp
544; AVX-NEXT:    popq %rbp
545; AVX-NEXT:    vzeroupper
546; AVX-NEXT:    retq
547  %b = extractelement <8 x i32> %a, i256 %i
548  ret i32 %b
549}
550
551define i64 @extractelement_v2i64_var(<2 x i64> %a, i256 %i) nounwind {
552; SSE-LABEL: extractelement_v2i64_var:
553; SSE:       # %bb.0:
554; SSE-NEXT:    andl $1, %edi
555; SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
556; SSE-NEXT:    movq -24(%rsp,%rdi,8), %rax
557; SSE-NEXT:    retq
558;
559; AVX-LABEL: extractelement_v2i64_var:
560; AVX:       # %bb.0:
561; AVX-NEXT:    andl $1, %edi
562; AVX-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)
563; AVX-NEXT:    movq -24(%rsp,%rdi,8), %rax
564; AVX-NEXT:    retq
565  %b = extractelement <2 x i64> %a, i256 %i
566  ret i64 %b
567}
568
569define i64 @extractelement_v4i64_var(<4 x i64> %a, i256 %i) nounwind {
570; SSE-LABEL: extractelement_v4i64_var:
571; SSE:       # %bb.0:
572; SSE-NEXT:    pushq %rbp
573; SSE-NEXT:    movq %rsp, %rbp
574; SSE-NEXT:    andq $-32, %rsp
575; SSE-NEXT:    subq $64, %rsp
576; SSE-NEXT:    andl $3, %edi
577; SSE-NEXT:    movaps %xmm1, {{[0-9]+}}(%rsp)
578; SSE-NEXT:    movaps %xmm0, (%rsp)
579; SSE-NEXT:    movq (%rsp,%rdi,8), %rax
580; SSE-NEXT:    movq %rbp, %rsp
581; SSE-NEXT:    popq %rbp
582; SSE-NEXT:    retq
583;
584; AVX-LABEL: extractelement_v4i64_var:
585; AVX:       # %bb.0:
586; AVX-NEXT:    pushq %rbp
587; AVX-NEXT:    movq %rsp, %rbp
588; AVX-NEXT:    andq $-32, %rsp
589; AVX-NEXT:    subq $64, %rsp
590; AVX-NEXT:    andl $3, %edi
591; AVX-NEXT:    vmovaps %ymm0, (%rsp)
592; AVX-NEXT:    movq (%rsp,%rdi,8), %rax
593; AVX-NEXT:    movq %rbp, %rsp
594; AVX-NEXT:    popq %rbp
595; AVX-NEXT:    vzeroupper
596; AVX-NEXT:    retq
597  %b = extractelement <4 x i64> %a, i256 %i
598  ret i64 %b
599}
600
601;
602; ExtractElement - Constant (Out Of Range) Index
603;
604
605define i8 @extractelement_32i8_m1(<32 x i8> %a) nounwind {
606; SSE-LABEL: extractelement_32i8_m1:
607; SSE:       # %bb.0:
608; SSE-NEXT:    retq
609;
610; AVX-LABEL: extractelement_32i8_m1:
611; AVX:       # %bb.0:
612; AVX-NEXT:    retq
613  %b = extractelement <32 x i8> %a, i256 -1
614  ret i8 %b
615}
616
617define i16 @extractelement_v16i16_m4(<16 x i16> %a, i256 %i) nounwind {
618; SSE-LABEL: extractelement_v16i16_m4:
619; SSE:       # %bb.0:
620; SSE-NEXT:    retq
621;
622; AVX-LABEL: extractelement_v16i16_m4:
623; AVX:       # %bb.0:
624; AVX-NEXT:    retq
625  %b = extractelement <16 x i16> %a, i256 -4
626  ret i16 %b
627}
628
629define i32 @extractelement_v8i32_15(<8 x i32> %a) nounwind {
630; SSE-LABEL: extractelement_v8i32_15:
631; SSE:       # %bb.0:
632; SSE-NEXT:    retq
633;
634; AVX-LABEL: extractelement_v8i32_15:
635; AVX:       # %bb.0:
636; AVX-NEXT:    retq
637  %b = extractelement <8 x i32> %a, i64 15
638  ret i32 %b
639}
640
641define i64 @extractelement_v4i64_4(<4 x i64> %a, i256 %i) nounwind {
642; SSE-LABEL: extractelement_v4i64_4:
643; SSE:       # %bb.0:
644; SSE-NEXT:    retq
645;
646; AVX-LABEL: extractelement_v4i64_4:
647; AVX:       # %bb.0:
648; AVX-NEXT:    retq
649  %b = extractelement <4 x i64> %a, i256 4
650  ret i64 %b
651}
652