blob: d50d53bfc65a08e845b105cab06b253b33abc995 [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
Pawel Bylica3b0adaf2015-05-06 16:43:21 +00007define i8 @extractelement_index_1(<32 x i8> %a) nounwind {
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +00008; SSE2-LABEL: extractelement_index_1:
9; SSE2: # BB#0:
10; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
11; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al
12; SSE2-NEXT: retq
13;
14; SSE41-LABEL: extractelement_index_1:
15; SSE41: # BB#0:
16; SSE41-NEXT: pextrb $1, %xmm0, %eax
17; SSE41-NEXT: retq
18;
19; AVX-LABEL: extractelement_index_1:
20; AVX: # BB#0:
21; AVX-NEXT: vpextrb $1, %xmm0, %eax
22; AVX-NEXT: vzeroupper
23; AVX-NEXT: retq
Pawel Bylica3b0adaf2015-05-06 16:43:21 +000024 %b = extractelement <32 x i8> %a, i256 1
25 ret i8 %b
26}
27
Pawel Bylica3b0adaf2015-05-06 16:43:21 +000028define i32 @extractelement_index_2(<8 x i32> %a) nounwind {
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +000029; SSE2-LABEL: extractelement_index_2:
30; SSE2: # BB#0:
31; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[3,1,2,3]
32; SSE2-NEXT: movd %xmm0, %eax
33; SSE2-NEXT: retq
34;
35; SSE41-LABEL: extractelement_index_2:
36; SSE41: # BB#0:
37; SSE41-NEXT: pextrd $3, %xmm1, %eax
38; SSE41-NEXT: retq
39;
40; AVX1-LABEL: extractelement_index_2:
41; AVX1: # BB#0:
42; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
43; AVX1-NEXT: vpextrd $3, %xmm0, %eax
44; AVX1-NEXT: vzeroupper
45; AVX1-NEXT: retq
46;
47; AVX2-LABEL: extractelement_index_2:
48; AVX2: # BB#0:
49; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0
50; AVX2-NEXT: vpextrd $3, %xmm0, %eax
51; AVX2-NEXT: vzeroupper
52; AVX2-NEXT: retq
Pawel Bylica3b0adaf2015-05-06 16:43:21 +000053 %b = extractelement <8 x i32> %a, i64 7
54 ret i32 %b
55}
56
Pawel Bylica3b0adaf2015-05-06 16:43:21 +000057define i32 @extractelement_index_3(<8 x i32> %a) nounwind {
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +000058; SSE-LABEL: extractelement_index_3:
59; SSE: # BB#0:
60; SSE-NEXT: retq
61;
62; AVX-LABEL: extractelement_index_3:
63; AVX: # BB#0:
64; AVX-NEXT: retq
Pawel Bylica3b0adaf2015-05-06 16:43:21 +000065 %b = extractelement <8 x i32> %a, i64 15
66 ret i32 %b
67}
68
Pawel Bylica3b0adaf2015-05-06 16:43:21 +000069define i32 @extractelement_index_4(<8 x i32> %a) nounwind {
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +000070; SSE-LABEL: extractelement_index_4:
71; SSE: # BB#0:
72; SSE-NEXT: movd %xmm1, %eax
73; SSE-NEXT: retq
74;
75; AVX-LABEL: extractelement_index_4:
76; AVX: # BB#0:
77; AVX-NEXT: vextractf128 $1, %ymm0, %xmm0
78; AVX-NEXT: vmovd %xmm0, %eax
79; AVX-NEXT: vzeroupper
80; AVX-NEXT: retq
Pawel Bylica3b0adaf2015-05-06 16:43:21 +000081 %b = extractelement <8 x i32> %a, i256 4
82 ret i32 %b
83}
84
Pawel Bylica3b0adaf2015-05-06 16:43:21 +000085define i8 @extractelement_index_5(<32 x i8> %a, i256 %i) nounwind {
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +000086; SSE-LABEL: extractelement_index_5:
87; SSE: # BB#0:
88; SSE-NEXT: pushq %rbp
89; SSE-NEXT: movq %rsp, %rbp
90; SSE-NEXT: andq $-32, %rsp
91; SSE-NEXT: subq $64, %rsp
92; SSE-NEXT: movaps %xmm1, {{[0-9]+}}(%rsp)
93; SSE-NEXT: movaps %xmm0, (%rsp)
94; SSE-NEXT: leaq (%rsp), %rax
95; SSE-NEXT: movb (%rdi,%rax), %al
96; SSE-NEXT: movq %rbp, %rsp
97; SSE-NEXT: popq %rbp
98; SSE-NEXT: retq
99;
100; AVX-LABEL: extractelement_index_5:
101; AVX: # BB#0:
102; AVX-NEXT: pushq %rbp
103; AVX-NEXT: movq %rsp, %rbp
104; AVX-NEXT: andq $-32, %rsp
105; AVX-NEXT: subq $64, %rsp
106; AVX-NEXT: vmovaps %ymm0, (%rsp)
107; AVX-NEXT: leaq (%rsp), %rax
108; AVX-NEXT: movb (%rdi,%rax), %al
109; AVX-NEXT: movq %rbp, %rsp
110; AVX-NEXT: popq %rbp
111; AVX-NEXT: vzeroupper
112; AVX-NEXT: retq
Pawel Bylica3b0adaf2015-05-06 16:43:21 +0000113 %b = extractelement <32 x i8> %a, i256 %i
114 ret i8 %b
115}
116
Pawel Bylica3b0adaf2015-05-06 16:43:21 +0000117define i8 @extractelement_index_6(<32 x i8> %a) nounwind {
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +0000118; SSE-LABEL: extractelement_index_6:
119; SSE: # BB#0:
120; SSE-NEXT: retq
121;
122; AVX-LABEL: extractelement_index_6:
123; AVX: # BB#0:
124; AVX-NEXT: retq
Pawel Bylica3b0adaf2015-05-06 16:43:21 +0000125 %b = extractelement <32 x i8> %a, i256 -1
126 ret i8 %b
Simon Pilgrim8fe1b1f2016-05-15 18:02:39 +0000127}