| ; RUN: llc < %s -mtriple=x86_64-pc-linux | FileCheck %s -check-prefix=X64 |
| ; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+avx | FileCheck %s -check-prefix=AVX |
| |
| |
| ; CHECK-LABEL: extractelement_index_1: |
| define i8 @extractelement_index_1(<32 x i8> %a) nounwind { |
| ; X64: movaps |
| ; AVX: vpextrb $1 |
| %b = extractelement <32 x i8> %a, i256 1 |
| ret i8 %b |
| } |
| |
| ; CHECK-LABEL: extractelement_index_2: |
| define i32 @extractelement_index_2(<8 x i32> %a) nounwind { |
| ; X64: pshufd |
| ; AVX: vextractf128 $1 |
| ; AVX-NEXT: vpextrd $3 |
| %b = extractelement <8 x i32> %a, i64 7 |
| ret i32 %b |
| } |
| |
| ; CHECK-LABEL: extractelement_index_3: |
| define i32 @extractelement_index_3(<8 x i32> %a) nounwind { |
| ; CHECK-NOT: pextr |
| %b = extractelement <8 x i32> %a, i64 15 |
| ret i32 %b |
| } |
| |
| ; CHECK-LABEL: extractelement_index_4: |
| define i32 @extractelement_index_4(<8 x i32> %a) nounwind { |
| ; X64: movd |
| ; AVX: vextractf128 $1 |
| ; AVX-NEXT: vmovd |
| %b = extractelement <8 x i32> %a, i256 4 |
| ret i32 %b |
| } |
| |
| ; CHECK-LABEL: extractelement_index_5: |
| define i8 @extractelement_index_5(<32 x i8> %a, i256 %i) nounwind { |
| ; X64: movaps |
| ; AVX: vmovaps |
| %b = extractelement <32 x i8> %a, i256 %i |
| ret i8 %b |
| } |
| |
| ; CHECK-LABEL: extractelement_index_6: |
| define i8 @extractelement_index_6(<32 x i8> %a) nounwind { |
| ; CHECK-NOT: pextr |
| %b = extractelement <32 x i8> %a, i256 -1 |
| ret i8 %b |
| } |