blob: 1f6fdda46b532f754ba629be3054afb8cfd6363e [file] [log] [blame]
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +00001; 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
Pawel Bylica3b0adaf2015-05-06 16:43:21 +00006
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +00007;
8; ExtractElement - Constant Index
9;
10
Simon Pilgrim26fbc752016-05-15 19:27:28 +000011define i8 @extractelement_v16i8_1(<16 x i8> %a) nounwind {
12; SSE2-LABEL: extractelement_v16i8_1:
13; SSE2: # BB#0:
14; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
15; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al
16; SSE2-NEXT: retq
17;
18; SSE41-LABEL: extractelement_v16i8_1:
19; SSE41: # BB#0:
20; SSE41-NEXT: pextrb $1, %xmm0, %eax
21; SSE41-NEXT: retq
22;
23; AVX-LABEL: extractelement_v16i8_1:
24; AVX: # BB#0:
25; AVX-NEXT: vpextrb $1, %xmm0, %eax
26; AVX-NEXT: retq
27 %b = extractelement <16 x i8> %a, i256 1
28 ret i8 %b
29}
30
Simon Pilgrim1ced2a62016-05-22 20:35:42 +000031define i8 @extractelement_v16i8_11(<16 x i8> %a) nounwind {
32; SSE2-LABEL: extractelement_v16i8_11:
33; SSE2: # BB#0:
34; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
35; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al
36; SSE2-NEXT: retq
37;
38; SSE41-LABEL: extractelement_v16i8_11:
39; SSE41: # BB#0:
40; SSE41-NEXT: pextrb $11, %xmm0, %eax
41; SSE41-NEXT: retq
42;
43; AVX-LABEL: extractelement_v16i8_11:
44; AVX: # BB#0:
45; AVX-NEXT: vpextrb $11, %xmm0, %eax
46; AVX-NEXT: retq
47 %b = extractelement <16 x i8> %a, i256 11
48 ret i8 %b
49}
50
Simon Pilgrim26fbc752016-05-15 19:27:28 +000051define i8 @extractelement_v16i8_14(<16 x i8> %a) nounwind {
52; SSE2-LABEL: extractelement_v16i8_14:
53; SSE2: # BB#0:
54; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
55; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al
56; SSE2-NEXT: retq
57;
58; SSE41-LABEL: extractelement_v16i8_14:
59; SSE41: # BB#0:
60; SSE41-NEXT: pextrb $14, %xmm0, %eax
61; SSE41-NEXT: retq
62;
63; AVX-LABEL: extractelement_v16i8_14:
64; AVX: # BB#0:
65; AVX-NEXT: vpextrb $14, %xmm0, %eax
66; AVX-NEXT: retq
67 %b = extractelement <16 x i8> %a, i256 14
68 ret i8 %b
69}
70
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +000071define i8 @extractelement_v32i8_1(<32 x i8> %a) nounwind {
72; SSE2-LABEL: extractelement_v32i8_1:
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +000073; SSE2: # BB#0:
74; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
75; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al
76; SSE2-NEXT: retq
77;
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +000078; SSE41-LABEL: extractelement_v32i8_1:
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +000079; SSE41: # BB#0:
80; SSE41-NEXT: pextrb $1, %xmm0, %eax
81; SSE41-NEXT: retq
82;
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +000083; AVX-LABEL: extractelement_v32i8_1:
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +000084; AVX: # BB#0:
85; AVX-NEXT: vpextrb $1, %xmm0, %eax
86; AVX-NEXT: vzeroupper
87; AVX-NEXT: retq
Pawel Bylica3b0adaf2015-05-06 16:43:21 +000088 %b = extractelement <32 x i8> %a, i256 1
89 ret i8 %b
90}
91
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +000092define i8 @extractelement_v32i8_17(<32 x i8> %a) nounwind {
93; SSE2-LABEL: extractelement_v32i8_17:
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +000094; SSE2: # BB#0:
Simon Pilgrim91c28392016-05-15 18:50:22 +000095; SSE2-NEXT: movaps %xmm1, -{{[0-9]+}}(%rsp)
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +000096; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +000097; SSE2-NEXT: retq
98;
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +000099; SSE41-LABEL: extractelement_v32i8_17:
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +0000100; SSE41: # BB#0:
Simon Pilgrim91c28392016-05-15 18:50:22 +0000101; SSE41-NEXT: pextrb $1, %xmm1, %eax
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +0000102; SSE41-NEXT: retq
103;
Simon Pilgrim91c28392016-05-15 18:50:22 +0000104; AVX1-LABEL: extractelement_v32i8_17:
105; AVX1: # BB#0:
106; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
107; AVX1-NEXT: vpextrb $1, %xmm0, %eax
108; AVX1-NEXT: vzeroupper
109; AVX1-NEXT: retq
110;
111; AVX2-LABEL: extractelement_v32i8_17:
112; AVX2: # BB#0:
113; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
114; AVX2-NEXT: vpextrb $1, %xmm0, %eax
115; AVX2-NEXT: vzeroupper
116; AVX2-NEXT: retq
117 %b = extractelement <32 x i8> %a, i256 17
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +0000118 ret i8 %b
119}
120
Simon Pilgrim26fbc752016-05-15 19:27:28 +0000121define i16 @extractelement_v8i16_0(<8 x i16> %a, i256 %i) nounwind {
122; SSE-LABEL: extractelement_v8i16_0:
123; SSE: # BB#0:
124; SSE-NEXT: movd %xmm0, %eax
125; SSE-NEXT: retq
126;
127; AVX-LABEL: extractelement_v8i16_0:
128; AVX: # BB#0:
129; AVX-NEXT: vmovd %xmm0, %eax
130; AVX-NEXT: retq
131 %b = extractelement <8 x i16> %a, i256 0
132 ret i16 %b
133}
134
135define i16 @extractelement_v8i16_3(<8 x i16> %a, i256 %i) nounwind {
136; SSE-LABEL: extractelement_v8i16_3:
137; SSE: # BB#0:
138; SSE-NEXT: pextrw $3, %xmm0, %eax
139; SSE-NEXT: retq
140;
141; AVX-LABEL: extractelement_v8i16_3:
142; AVX: # BB#0:
143; AVX-NEXT: vpextrw $3, %xmm0, %eax
144; AVX-NEXT: retq
145 %b = extractelement <8 x i16> %a, i256 3
146 ret i16 %b
147}
148
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +0000149define i16 @extractelement_v16i16_0(<16 x i16> %a, i256 %i) nounwind {
150; SSE-LABEL: extractelement_v16i16_0:
151; SSE: # BB#0:
152; SSE-NEXT: movd %xmm0, %eax
153; SSE-NEXT: retq
154;
155; AVX-LABEL: extractelement_v16i16_0:
156; AVX: # BB#0:
157; AVX-NEXT: vmovd %xmm0, %eax
158; AVX-NEXT: vzeroupper
159; AVX-NEXT: retq
160 %b = extractelement <16 x i16> %a, i256 0
161 ret i16 %b
162}
163
164define i16 @extractelement_v16i16_13(<16 x i16> %a, i256 %i) nounwind {
165; SSE-LABEL: extractelement_v16i16_13:
166; SSE: # BB#0:
167; SSE-NEXT: pextrw $5, %xmm1, %eax
168; SSE-NEXT: retq
169;
170; AVX1-LABEL: extractelement_v16i16_13:
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +0000171; AVX1: # BB#0:
172; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +0000173; AVX1-NEXT: vpextrw $5, %xmm0, %eax
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +0000174; AVX1-NEXT: vzeroupper
175; AVX1-NEXT: retq
176;
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +0000177; AVX2-LABEL: extractelement_v16i16_13:
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +0000178; AVX2: # BB#0:
179; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +0000180; AVX2-NEXT: vpextrw $5, %xmm0, %eax
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +0000181; AVX2-NEXT: vzeroupper
182; AVX2-NEXT: retq
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +0000183 %b = extractelement <16 x i16> %a, i256 13
184 ret i16 %b
Pawel Bylica3b0adaf2015-05-06 16:43:21 +0000185}
186
Simon Pilgrim26fbc752016-05-15 19:27:28 +0000187define i32 @extractelement_v4i32_0(<4 x i32> %a) nounwind {
188; SSE-LABEL: extractelement_v4i32_0:
189; SSE: # BB#0:
190; SSE-NEXT: movd %xmm0, %eax
191; SSE-NEXT: retq
192;
193; AVX-LABEL: extractelement_v4i32_0:
194; AVX: # BB#0:
195; AVX-NEXT: vmovd %xmm0, %eax
196; AVX-NEXT: retq
197 %b = extractelement <4 x i32> %a, i256 0
198 ret i32 %b
199}
200
201define i32 @extractelement_v4i32_3(<4 x i32> %a) nounwind {
202; SSE2-LABEL: extractelement_v4i32_3:
203; SSE2: # BB#0:
204; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3]
205; SSE2-NEXT: movd %xmm0, %eax
206; SSE2-NEXT: retq
207;
208; SSE41-LABEL: extractelement_v4i32_3:
209; SSE41: # BB#0:
210; SSE41-NEXT: pextrd $3, %xmm0, %eax
211; SSE41-NEXT: retq
212;
213; AVX-LABEL: extractelement_v4i32_3:
214; AVX: # BB#0:
215; AVX-NEXT: vpextrd $3, %xmm0, %eax
216; AVX-NEXT: retq
217 %b = extractelement <4 x i32> %a, i256 3
218 ret i32 %b
219}
220
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +0000221define i32 @extractelement_v8i32_0(<8 x i32> %a) nounwind {
222; SSE-LABEL: extractelement_v8i32_0:
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +0000223; SSE: # BB#0:
224; SSE-NEXT: movd %xmm1, %eax
225; SSE-NEXT: retq
226;
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +0000227; AVX-LABEL: extractelement_v8i32_0:
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +0000228; AVX: # BB#0:
229; AVX-NEXT: vextractf128 $1, %ymm0, %xmm0
230; AVX-NEXT: vmovd %xmm0, %eax
231; AVX-NEXT: vzeroupper
232; AVX-NEXT: retq
Pawel Bylica3b0adaf2015-05-06 16:43:21 +0000233 %b = extractelement <8 x i32> %a, i256 4
234 ret i32 %b
235}
236
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +0000237define i32 @extractelement_v8i32_4(<8 x i32> %a) nounwind {
238; SSE-LABEL: extractelement_v8i32_4:
239; SSE: # BB#0:
240; SSE-NEXT: movd %xmm1, %eax
241; SSE-NEXT: retq
242;
243; AVX-LABEL: extractelement_v8i32_4:
244; AVX: # BB#0:
245; AVX-NEXT: vextractf128 $1, %ymm0, %xmm0
246; AVX-NEXT: vmovd %xmm0, %eax
247; AVX-NEXT: vzeroupper
248; AVX-NEXT: retq
249 %b = extractelement <8 x i32> %a, i256 4
250 ret i32 %b
251}
252
253define i32 @extractelement_v8i32_7(<8 x i32> %a) nounwind {
254; SSE2-LABEL: extractelement_v8i32_7:
255; SSE2: # BB#0:
256; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[3,1,2,3]
257; SSE2-NEXT: movd %xmm0, %eax
258; SSE2-NEXT: retq
259;
260; SSE41-LABEL: extractelement_v8i32_7:
261; SSE41: # BB#0:
262; SSE41-NEXT: pextrd $3, %xmm1, %eax
263; SSE41-NEXT: retq
264;
265; AVX1-LABEL: extractelement_v8i32_7:
266; AVX1: # BB#0:
267; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
268; AVX1-NEXT: vpextrd $3, %xmm0, %eax
269; AVX1-NEXT: vzeroupper
270; AVX1-NEXT: retq
271;
272; AVX2-LABEL: extractelement_v8i32_7:
273; AVX2: # BB#0:
274; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
275; AVX2-NEXT: vpextrd $3, %xmm0, %eax
276; AVX2-NEXT: vzeroupper
277; AVX2-NEXT: retq
278 %b = extractelement <8 x i32> %a, i64 7
279 ret i32 %b
280}
281
Simon Pilgrim26fbc752016-05-15 19:27:28 +0000282define i64 @extractelement_v2i64_0(<2 x i64> %a, i256 %i) nounwind {
283; SSE-LABEL: extractelement_v2i64_0:
284; SSE: # BB#0:
285; SSE-NEXT: movd %xmm0, %rax
286; SSE-NEXT: retq
287;
288; AVX-LABEL: extractelement_v2i64_0:
289; AVX: # BB#0:
290; AVX-NEXT: vmovq %xmm0, %rax
291; AVX-NEXT: retq
292 %b = extractelement <2 x i64> %a, i256 0
293 ret i64 %b
294}
295
296define i64 @extractelement_v2i64_1(<2 x i64> %a, i256 %i) nounwind {
297; SSE2-LABEL: extractelement_v2i64_1:
298; SSE2: # BB#0:
299; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
300; SSE2-NEXT: movd %xmm0, %rax
301; SSE2-NEXT: retq
302;
303; SSE41-LABEL: extractelement_v2i64_1:
304; SSE41: # BB#0:
305; SSE41-NEXT: pextrq $1, %xmm0, %rax
306; SSE41-NEXT: retq
307;
308; AVX-LABEL: extractelement_v2i64_1:
309; AVX: # BB#0:
310; AVX-NEXT: vpextrq $1, %xmm0, %rax
311; AVX-NEXT: retq
312 %b = extractelement <2 x i64> %a, i256 1
313 ret i64 %b
314}
315
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +0000316define i64 @extractelement_v4i64_1(<4 x i64> %a, i256 %i) nounwind {
317; SSE2-LABEL: extractelement_v4i64_1:
318; SSE2: # BB#0:
319; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
320; SSE2-NEXT: movd %xmm0, %rax
321; SSE2-NEXT: retq
322;
323; SSE41-LABEL: extractelement_v4i64_1:
324; SSE41: # BB#0:
325; SSE41-NEXT: pextrq $1, %xmm0, %rax
326; SSE41-NEXT: retq
327;
328; AVX-LABEL: extractelement_v4i64_1:
329; AVX: # BB#0:
330; AVX-NEXT: vpextrq $1, %xmm0, %rax
331; AVX-NEXT: vzeroupper
332; AVX-NEXT: retq
333 %b = extractelement <4 x i64> %a, i256 1
334 ret i64 %b
335}
336
337define i64 @extractelement_v4i64_3(<4 x i64> %a, i256 %i) nounwind {
338; SSE2-LABEL: extractelement_v4i64_3:
339; SSE2: # BB#0:
340; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
341; SSE2-NEXT: movd %xmm0, %rax
342; SSE2-NEXT: retq
343;
344; SSE41-LABEL: extractelement_v4i64_3:
345; SSE41: # BB#0:
346; SSE41-NEXT: pextrq $1, %xmm1, %rax
347; SSE41-NEXT: retq
348;
349; AVX1-LABEL: extractelement_v4i64_3:
350; AVX1: # BB#0:
351; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
352; AVX1-NEXT: vpextrq $1, %xmm0, %rax
353; AVX1-NEXT: vzeroupper
354; AVX1-NEXT: retq
355;
356; AVX2-LABEL: extractelement_v4i64_3:
357; AVX2: # BB#0:
358; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
359; AVX2-NEXT: vpextrq $1, %xmm0, %rax
360; AVX2-NEXT: vzeroupper
361; AVX2-NEXT: retq
362 %b = extractelement <4 x i64> %a, i256 3
363 ret i64 %b
364}
365
366;
367; ExtractElement - Variable Index
368;
369
Simon Pilgrim73b496e2016-05-15 19:12:39 +0000370define i8 @extractelement_v16i8_var(<16 x i8> %a, i256 %i) nounwind {
371; SSE-LABEL: extractelement_v16i8_var:
372; SSE: # BB#0:
373; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
374; SSE-NEXT: leaq -{{[0-9]+}}(%rsp), %rax
375; SSE-NEXT: movb (%rdi,%rax), %al
376; SSE-NEXT: retq
377;
378; AVX-LABEL: extractelement_v16i8_var:
379; AVX: # BB#0:
380; AVX-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)
381; AVX-NEXT: leaq -{{[0-9]+}}(%rsp), %rax
382; AVX-NEXT: movb (%rdi,%rax), %al
383; AVX-NEXT: retq
384 %b = extractelement <16 x i8> %a, i256 %i
385 ret i8 %b
386}
387
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +0000388define i8 @extractelement_v32i8_var(<32 x i8> %a, i256 %i) nounwind {
389; SSE-LABEL: extractelement_v32i8_var:
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +0000390; SSE: # BB#0:
391; SSE-NEXT: pushq %rbp
392; SSE-NEXT: movq %rsp, %rbp
393; SSE-NEXT: andq $-32, %rsp
394; SSE-NEXT: subq $64, %rsp
395; SSE-NEXT: movaps %xmm1, {{[0-9]+}}(%rsp)
396; SSE-NEXT: movaps %xmm0, (%rsp)
397; SSE-NEXT: leaq (%rsp), %rax
398; SSE-NEXT: movb (%rdi,%rax), %al
399; SSE-NEXT: movq %rbp, %rsp
400; SSE-NEXT: popq %rbp
401; SSE-NEXT: retq
402;
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +0000403; AVX-LABEL: extractelement_v32i8_var:
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +0000404; AVX: # BB#0:
405; AVX-NEXT: pushq %rbp
406; AVX-NEXT: movq %rsp, %rbp
407; AVX-NEXT: andq $-32, %rsp
408; AVX-NEXT: subq $64, %rsp
409; AVX-NEXT: vmovaps %ymm0, (%rsp)
410; AVX-NEXT: leaq (%rsp), %rax
411; AVX-NEXT: movb (%rdi,%rax), %al
412; AVX-NEXT: movq %rbp, %rsp
413; AVX-NEXT: popq %rbp
414; AVX-NEXT: vzeroupper
415; AVX-NEXT: retq
Pawel Bylica3b0adaf2015-05-06 16:43:21 +0000416 %b = extractelement <32 x i8> %a, i256 %i
417 ret i8 %b
418}
419
Simon Pilgrim73b496e2016-05-15 19:12:39 +0000420define i16 @extractelement_v8i16_var(<8 x i16> %a, i256 %i) nounwind {
421; SSE-LABEL: extractelement_v8i16_var:
422; SSE: # BB#0:
423; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
424; SSE-NEXT: movzwl -24(%rsp,%rdi,2), %eax
425; SSE-NEXT: retq
426;
427; AVX-LABEL: extractelement_v8i16_var:
428; AVX: # BB#0:
429; AVX-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)
430; AVX-NEXT: movzwl -24(%rsp,%rdi,2), %eax
431; AVX-NEXT: retq
432 %b = extractelement <8 x i16> %a, i256 %i
433 ret i16 %b
434}
435
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +0000436define i16 @extractelement_v16i16_var(<16 x i16> %a, i256 %i) nounwind {
437; SSE-LABEL: extractelement_v16i16_var:
438; SSE: # BB#0:
439; SSE-NEXT: pushq %rbp
440; SSE-NEXT: movq %rsp, %rbp
441; SSE-NEXT: andq $-32, %rsp
442; SSE-NEXT: subq $64, %rsp
443; SSE-NEXT: movaps %xmm1, {{[0-9]+}}(%rsp)
444; SSE-NEXT: movaps %xmm0, (%rsp)
445; SSE-NEXT: movzwl (%rsp,%rdi,2), %eax
446; SSE-NEXT: movq %rbp, %rsp
447; SSE-NEXT: popq %rbp
448; SSE-NEXT: retq
449;
450; AVX-LABEL: extractelement_v16i16_var:
451; AVX: # BB#0:
452; AVX-NEXT: pushq %rbp
453; AVX-NEXT: movq %rsp, %rbp
454; AVX-NEXT: andq $-32, %rsp
455; AVX-NEXT: subq $64, %rsp
456; AVX-NEXT: vmovaps %ymm0, (%rsp)
457; AVX-NEXT: movzwl (%rsp,%rdi,2), %eax
458; AVX-NEXT: movq %rbp, %rsp
459; AVX-NEXT: popq %rbp
460; AVX-NEXT: vzeroupper
461; AVX-NEXT: retq
462 %b = extractelement <16 x i16> %a, i256 %i
463 ret i16 %b
464}
465
Simon Pilgrim73b496e2016-05-15 19:12:39 +0000466define i32 @extractelement_v4i32_var(<4 x i32> %a, i256 %i) nounwind {
467; SSE-LABEL: extractelement_v4i32_var:
468; SSE: # BB#0:
469; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
470; SSE-NEXT: movl -24(%rsp,%rdi,4), %eax
471; SSE-NEXT: retq
472;
473; AVX-LABEL: extractelement_v4i32_var:
474; AVX: # BB#0:
475; AVX-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)
476; AVX-NEXT: movl -24(%rsp,%rdi,4), %eax
477; AVX-NEXT: retq
478 %b = extractelement <4 x i32> %a, i256 %i
479 ret i32 %b
480}
481
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +0000482define i32 @extractelement_v8i32_var(<8 x i32> %a, i256 %i) nounwind {
483; SSE-LABEL: extractelement_v8i32_var:
484; SSE: # BB#0:
485; SSE-NEXT: pushq %rbp
486; SSE-NEXT: movq %rsp, %rbp
487; SSE-NEXT: andq $-32, %rsp
488; SSE-NEXT: subq $64, %rsp
489; SSE-NEXT: movaps %xmm1, {{[0-9]+}}(%rsp)
490; SSE-NEXT: movaps %xmm0, (%rsp)
491; SSE-NEXT: movl (%rsp,%rdi,4), %eax
492; SSE-NEXT: movq %rbp, %rsp
493; SSE-NEXT: popq %rbp
494; SSE-NEXT: retq
495;
496; AVX1-LABEL: extractelement_v8i32_var:
497; AVX1: # BB#0:
498; AVX1-NEXT: pushq %rbp
499; AVX1-NEXT: movq %rsp, %rbp
500; AVX1-NEXT: andq $-32, %rsp
501; AVX1-NEXT: subq $64, %rsp
502; AVX1-NEXT: vmovaps %ymm0, (%rsp)
503; AVX1-NEXT: movl (%rsp,%rdi,4), %eax
504; AVX1-NEXT: movq %rbp, %rsp
505; AVX1-NEXT: popq %rbp
506; AVX1-NEXT: vzeroupper
507; AVX1-NEXT: retq
508;
509; AVX2-LABEL: extractelement_v8i32_var:
510; AVX2: # BB#0:
511; AVX2-NEXT: vmovd %edi, %xmm1
512; AVX2-NEXT: vpermd %ymm0, %ymm1, %ymm0
513; AVX2-NEXT: vmovd %xmm0, %eax
514; AVX2-NEXT: vzeroupper
515; AVX2-NEXT: retq
516 %b = extractelement <8 x i32> %a, i256 %i
517 ret i32 %b
518}
519
Simon Pilgrim73b496e2016-05-15 19:12:39 +0000520define i64 @extractelement_v2i64_var(<2 x i64> %a, i256 %i) nounwind {
521; SSE-LABEL: extractelement_v2i64_var:
522; SSE: # BB#0:
523; SSE-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
524; SSE-NEXT: movq -24(%rsp,%rdi,8), %rax
525; SSE-NEXT: retq
526;
527; AVX-LABEL: extractelement_v2i64_var:
528; AVX: # BB#0:
529; AVX-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)
530; AVX-NEXT: movq -24(%rsp,%rdi,8), %rax
531; AVX-NEXT: retq
532 %b = extractelement <2 x i64> %a, i256 %i
533 ret i64 %b
534}
535
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +0000536define i64 @extractelement_v4i64_var(<4 x i64> %a, i256 %i) nounwind {
537; SSE-LABEL: extractelement_v4i64_var:
538; SSE: # BB#0:
539; SSE-NEXT: pushq %rbp
540; SSE-NEXT: movq %rsp, %rbp
541; SSE-NEXT: andq $-32, %rsp
542; SSE-NEXT: subq $64, %rsp
543; SSE-NEXT: movaps %xmm1, {{[0-9]+}}(%rsp)
544; SSE-NEXT: movaps %xmm0, (%rsp)
545; SSE-NEXT: movq (%rsp,%rdi,8), %rax
546; SSE-NEXT: movq %rbp, %rsp
547; SSE-NEXT: popq %rbp
548; SSE-NEXT: retq
549;
550; AVX-LABEL: extractelement_v4i64_var:
551; AVX: # BB#0:
552; AVX-NEXT: pushq %rbp
553; AVX-NEXT: movq %rsp, %rbp
554; AVX-NEXT: andq $-32, %rsp
555; AVX-NEXT: subq $64, %rsp
556; AVX-NEXT: vmovaps %ymm0, (%rsp)
557; AVX-NEXT: movq (%rsp,%rdi,8), %rax
558; AVX-NEXT: movq %rbp, %rsp
559; AVX-NEXT: popq %rbp
560; AVX-NEXT: vzeroupper
561; AVX-NEXT: retq
562 %b = extractelement <4 x i64> %a, i256 %i
563 ret i64 %b
564}
565
566;
567; ExtractElement - Constant (Out Of Range) Index
568;
569
570define i8 @extractelement_32i8_m1(<32 x i8> %a) nounwind {
571; SSE-LABEL: extractelement_32i8_m1:
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +0000572; SSE: # BB#0:
573; SSE-NEXT: retq
574;
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +0000575; AVX-LABEL: extractelement_32i8_m1:
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +0000576; AVX: # BB#0:
577; AVX-NEXT: retq
Pawel Bylica3b0adaf2015-05-06 16:43:21 +0000578 %b = extractelement <32 x i8> %a, i256 -1
579 ret i8 %b
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +0000580}
Simon Pilgrim5b68a0d2016-05-15 18:22:21 +0000581
582define i16 @extractelement_v16i16_m4(<16 x i16> %a, i256 %i) nounwind {
583; SSE-LABEL: extractelement_v16i16_m4:
584; SSE: # BB#0:
585; SSE-NEXT: retq
586;
587; AVX-LABEL: extractelement_v16i16_m4:
588; AVX: # BB#0:
589; AVX-NEXT: retq
590 %b = extractelement <16 x i16> %a, i256 -4
591 ret i16 %b
592}
593
594define i32 @extractelement_v8i32_15(<8 x i32> %a) nounwind {
595; SSE-LABEL: extractelement_v8i32_15:
596; SSE: # BB#0:
597; SSE-NEXT: retq
598;
599; AVX-LABEL: extractelement_v8i32_15:
600; AVX: # BB#0:
601; AVX-NEXT: retq
602 %b = extractelement <8 x i32> %a, i64 15
603 ret i32 %b
604}
605
606define i64 @extractelement_v4i64_4(<4 x i64> %a, i256 %i) nounwind {
607; SSE-LABEL: extractelement_v4i64_4:
608; SSE: # BB#0:
609; SSE-NEXT: retq
610;
611; AVX-LABEL: extractelement_v4i64_4:
612; AVX: # BB#0:
613; AVX-NEXT: retq
614 %b = extractelement <4 x i64> %a, i256 4
615 ret i64 %b
616}