| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp |
| ; RUN: llc < %s -mtriple=i686-- | FileCheck %s --check-prefixes=X86 |
| ; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu | FileCheck %s --check-prefixes=X64 |
| |
| define i32 @extract3(ptr, i32) nounwind { |
| ; X86-LABEL: extract3: |
| ; X86: # %bb.0: # %_L1 |
| ; X86-NEXT: pushl %ebx |
| ; X86-NEXT: pushl %esi |
| ; X86-NEXT: subl $8, %esp |
| ; X86-NEXT: movl 24(%esp), %esi |
| ; X86-NEXT: andl $7, %esi |
| ; X86-NEXT: movl 20(%esp), %eax |
| ; X86-NEXT: movzwl (%eax), %ebx |
| ; X86-NEXT: movl %ebx, %ecx |
| ; X86-NEXT: shrb $3, %cl |
| ; X86-NEXT: andb $7, %cl |
| ; X86-NEXT: movb %bl, %ch |
| ; X86-NEXT: andb $7, %ch |
| ; X86-NEXT: movl %ebx, %eax |
| ; X86-NEXT: shrl $6, %eax |
| ; X86-NEXT: andb $7, %al |
| ; X86-NEXT: movl %ebx, %edx |
| ; X86-NEXT: shrl $9, %edx |
| ; X86-NEXT: andb $7, %dl |
| ; X86-NEXT: shrl $12, %ebx |
| ; X86-NEXT: movb %bl, 4(%esp) |
| ; X86-NEXT: movb %dl, 3(%esp) |
| ; X86-NEXT: movb %al, 2(%esp) |
| ; X86-NEXT: movb %ch, (%esp) |
| ; X86-NEXT: movb %cl, 1(%esp) |
| ; X86-NEXT: movzbl (%esp,%esi), %eax |
| ; X86-NEXT: andl $7, %eax |
| ; X86-NEXT: addl $8, %esp |
| ; X86-NEXT: popl %esi |
| ; X86-NEXT: popl %ebx |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: extract3: |
| ; X64: # %bb.0: # %_L1 |
| ; X64-NEXT: # kill: def $esi killed $esi def $rsi |
| ; X64-NEXT: movzwl (%rdi), %eax |
| ; X64-NEXT: movl %eax, %ecx |
| ; X64-NEXT: shrl $9, %ecx |
| ; X64-NEXT: andl $7, %ecx |
| ; X64-NEXT: movd %ecx, %xmm0 |
| ; X64-NEXT: movl %eax, %ecx |
| ; X64-NEXT: shrl $6, %ecx |
| ; X64-NEXT: andl $7, %ecx |
| ; X64-NEXT: movd %ecx, %xmm1 |
| ; X64-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] |
| ; X64-NEXT: movl %eax, %ecx |
| ; X64-NEXT: andl $7, %ecx |
| ; X64-NEXT: movd %ecx, %xmm0 |
| ; X64-NEXT: movl %eax, %ecx |
| ; X64-NEXT: shrl $3, %ecx |
| ; X64-NEXT: andl $7, %ecx |
| ; X64-NEXT: movd %ecx, %xmm2 |
| ; X64-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1],xmm0[2],xmm2[2],xmm0[3],xmm2[3] |
| ; X64-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] |
| ; X64-NEXT: shrl $12, %eax |
| ; X64-NEXT: movd %eax, %xmm1 |
| ; X64-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] |
| ; X64-NEXT: movdqa %xmm0, -24(%rsp) |
| ; X64-NEXT: andl $7, %esi |
| ; X64-NEXT: movzwl -24(%rsp,%rsi,2), %eax |
| ; X64-NEXT: andl $7, %eax |
| ; X64-NEXT: retq |
| _L1: |
| %2 = load i15, ptr %0 |
| %3 = bitcast i15 %2 to <5 x i3> |
| %4 = extractelement <5 x i3> %3, i32 %1 |
| %5 = zext i3 %4 to i32 |
| ret i32 %5 |
| } |