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