1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
4; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX
5
6define void @extract_i8_0(i8* nocapture %dst, <16 x i8> %foo) {
7; SSE2-LABEL: extract_i8_0:
8; SSE2:       # BB#0:
9; SSE2-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
10; SSE2-NEXT:    movb -{{[0-9]+}}(%rsp), %al
11; SSE2-NEXT:    movb %al, (%rdi)
12; SSE2-NEXT:    retq
13;
14; SSE41-LABEL: extract_i8_0:
15; SSE41:       # BB#0:
16; SSE41-NEXT:    pextrb $0, %xmm0, (%rdi)
17; SSE41-NEXT:    retq
18;
19; AVX-LABEL: extract_i8_0:
20; AVX:       # BB#0:
21; AVX-NEXT:    vpextrb $0, %xmm0, (%rdi)
22; AVX-NEXT:    retq
23  %vecext = extractelement <16 x i8> %foo, i32 0
24  store i8 %vecext, i8* %dst, align 1
25  ret void
26}
27
28define void @extract_i8_15(i8* nocapture %dst, <16 x i8> %foo) {
29; SSE2-LABEL: extract_i8_15:
30; SSE2:       # BB#0:
31; SSE2-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
32; SSE2-NEXT:    movb -{{[0-9]+}}(%rsp), %al
33; SSE2-NEXT:    movb %al, (%rdi)
34; SSE2-NEXT:    retq
35;
36; SSE41-LABEL: extract_i8_15:
37; SSE41:       # BB#0:
38; SSE41-NEXT:    pextrb $15, %xmm0, (%rdi)
39; SSE41-NEXT:    retq
40;
41; AVX-LABEL: extract_i8_15:
42; AVX:       # BB#0:
43; AVX-NEXT:    vpextrb $15, %xmm0, (%rdi)
44; AVX-NEXT:    retq
45  %vecext = extractelement <16 x i8> %foo, i32 15
46  store i8 %vecext, i8* %dst, align 1
47  ret void
48}
49
50define void @extract_i16_0(i16* nocapture %dst, <8 x i16> %foo) {
51; SSE2-LABEL: extract_i16_0:
52; SSE2:       # BB#0:
53; SSE2-NEXT:    movd %xmm0, %eax
54; SSE2-NEXT:    movw %ax, (%rdi)
55; SSE2-NEXT:    retq
56;
57; SSE41-LABEL: extract_i16_0:
58; SSE41:       # BB#0:
59; SSE41-NEXT:    pextrw $0, %xmm0, (%rdi)
60; SSE41-NEXT:    retq
61;
62; AVX-LABEL: extract_i16_0:
63; AVX:       # BB#0:
64; AVX-NEXT:    vpextrw $0, %xmm0, (%rdi)
65; AVX-NEXT:    retq
66  %vecext = extractelement <8 x i16> %foo, i32 0
67  store i16 %vecext, i16* %dst, align 1
68  ret void
69}
70
71define void @extract_i16_7(i16* nocapture %dst, <8 x i16> %foo) {
72; SSE2-LABEL: extract_i16_7:
73; SSE2:       # BB#0:
74; SSE2-NEXT:    pextrw $7, %xmm0, %eax
75; SSE2-NEXT:    movw %ax, (%rdi)
76; SSE2-NEXT:    retq
77;
78; SSE41-LABEL: extract_i16_7:
79; SSE41:       # BB#0:
80; SSE41-NEXT:    pextrw $7, %xmm0, (%rdi)
81; SSE41-NEXT:    retq
82;
83; AVX-LABEL: extract_i16_7:
84; AVX:       # BB#0:
85; AVX-NEXT:    vpextrw $7, %xmm0, (%rdi)
86; AVX-NEXT:    retq
87  %vecext = extractelement <8 x i16> %foo, i32 7
88  store i16 %vecext, i16* %dst, align 1
89  ret void
90}
91
92define void @extract_i8_undef(i8* nocapture %dst, <16 x i8> %foo) {
93; SSE-LABEL: extract_i8_undef:
94; SSE:       # BB#0:
95; SSE-NEXT:    retq
96;
97; AVX-LABEL: extract_i8_undef:
98; AVX:       # BB#0:
99; AVX-NEXT:    retq
100  %vecext = extractelement <16 x i8> %foo, i32 16 ; undef
101  store i8 %vecext, i8* %dst, align 1
102  ret void
103}
104
105define void @extract_i16_undef(i16* nocapture %dst, <8 x i16> %foo) {
106; SSE-LABEL: extract_i16_undef:
107; SSE:       # BB#0:
108; SSE-NEXT:    retq
109;
110; AVX-LABEL: extract_i16_undef:
111; AVX:       # BB#0:
112; AVX-NEXT:    retq
113  %vecext = extractelement <8 x i16> %foo, i32 9 ; undef
114  store i16 %vecext, i16* %dst, align 1
115  ret void
116}
117