diff options
Diffstat (limited to 'test/CodeGen/X86/extractelement-index.ll')
-rw-r--r-- | test/CodeGen/X86/extractelement-index.ll | 58 |
1 files changed, 27 insertions, 31 deletions
diff --git a/test/CodeGen/X86/extractelement-index.ll b/test/CodeGen/X86/extractelement-index.ll index 8c12e7148aa7f..e36e33ffe66b7 100644 --- a/test/CodeGen/X86/extractelement-index.ll +++ b/test/CodeGen/X86/extractelement-index.ll @@ -11,8 +11,9 @@ define i8 @extractelement_v16i8_1(<16 x i8> %a) nounwind { ; SSE2-LABEL: extractelement_v16i8_1: ; SSE2: # BB#0: -; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al +; SSE2-NEXT: movd %xmm0, %eax +; SSE2-NEXT: shrl $8, %eax +; SSE2-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> ; SSE2-NEXT: retq ; ; SSE41-LABEL: extractelement_v16i8_1: @@ -33,8 +34,9 @@ define i8 @extractelement_v16i8_1(<16 x i8> %a) nounwind { define i8 @extractelement_v16i8_11(<16 x i8> %a) nounwind { ; SSE2-LABEL: extractelement_v16i8_11: ; SSE2: # BB#0: -; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al +; SSE2-NEXT: pextrw $5, %xmm0, %eax +; SSE2-NEXT: shrl $8, %eax +; SSE2-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> ; SSE2-NEXT: retq ; ; SSE41-LABEL: extractelement_v16i8_11: @@ -55,8 +57,8 @@ define i8 @extractelement_v16i8_11(<16 x i8> %a) nounwind { define i8 @extractelement_v16i8_14(<16 x i8> %a) nounwind { ; SSE2-LABEL: extractelement_v16i8_14: ; SSE2: # BB#0: -; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al +; SSE2-NEXT: pextrw $7, %xmm0, %eax +; SSE2-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> ; SSE2-NEXT: retq ; ; SSE41-LABEL: extractelement_v16i8_14: @@ -77,8 +79,9 @@ define i8 @extractelement_v16i8_14(<16 x i8> %a) nounwind { define i8 @extractelement_v32i8_1(<32 x i8> %a) nounwind { ; SSE2-LABEL: extractelement_v32i8_1: ; SSE2: # BB#0: -; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp) -; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al +; SSE2-NEXT: movd %xmm0, %eax +; SSE2-NEXT: shrl $8, %eax +; SSE2-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> ; SSE2-NEXT: retq ; ; SSE41-LABEL: extractelement_v32i8_1: @@ -100,8 +103,9 @@ define i8 @extractelement_v32i8_1(<32 x i8> %a) nounwind { define i8 @extractelement_v32i8_17(<32 x i8> %a) nounwind { ; SSE2-LABEL: extractelement_v32i8_17: ; SSE2: # BB#0: -; SSE2-NEXT: movaps %xmm1, -{{[0-9]+}}(%rsp) -; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al +; SSE2-NEXT: movd %xmm1, %eax +; SSE2-NEXT: shrl $8, %eax +; SSE2-NEXT: # kill: %AL<def> %AL<kill> %EAX<kill> ; SSE2-NEXT: retq ; ; SSE41-LABEL: extractelement_v32i8_17: @@ -538,27 +542,19 @@ define i32 @extractelement_v8i32_var(<8 x i32> %a, i256 %i) nounwind { ; SSE-NEXT: popq %rbp ; SSE-NEXT: retq ; -; AVX1-LABEL: extractelement_v8i32_var: -; AVX1: # BB#0: -; AVX1-NEXT: pushq %rbp -; AVX1-NEXT: movq %rsp, %rbp -; AVX1-NEXT: andq $-32, %rsp -; AVX1-NEXT: subq $64, %rsp -; AVX1-NEXT: andl $7, %edi -; AVX1-NEXT: vmovaps %ymm0, (%rsp) -; AVX1-NEXT: movl (%rsp,%rdi,4), %eax -; AVX1-NEXT: movq %rbp, %rsp -; AVX1-NEXT: popq %rbp -; AVX1-NEXT: vzeroupper -; AVX1-NEXT: retq -; -; AVX2-LABEL: extractelement_v8i32_var: -; AVX2: # BB#0: -; AVX2-NEXT: vmovd %edi, %xmm1 -; AVX2-NEXT: vpermd %ymm0, %ymm1, %ymm0 -; AVX2-NEXT: vmovd %xmm0, %eax -; AVX2-NEXT: vzeroupper -; AVX2-NEXT: retq +; AVX-LABEL: extractelement_v8i32_var: +; AVX: # BB#0: +; AVX-NEXT: pushq %rbp +; AVX-NEXT: movq %rsp, %rbp +; AVX-NEXT: andq $-32, %rsp +; AVX-NEXT: subq $64, %rsp +; AVX-NEXT: andl $7, %edi +; AVX-NEXT: vmovaps %ymm0, (%rsp) +; AVX-NEXT: movl (%rsp,%rdi,4), %eax +; AVX-NEXT: movq %rbp, %rsp +; AVX-NEXT: popq %rbp +; AVX-NEXT: vzeroupper +; AVX-NEXT: retq %b = extractelement <8 x i32> %a, i256 %i ret i32 %b } |