| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | |
| ; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE2 | |
| ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX2 | |
| define <2 x i128> @PR233186(<2 x i128> %x, <2 x i128> %a) nounwind { | |
| ; SSE2-LABEL: PR233186: | |
| ; SSE2: # %bb.0: | |
| ; SSE2-NEXT: pushq %r14 | |
| ; SSE2-NEXT: pushq %rbx | |
| ; SSE2-NEXT: movq %r9, %r10 | |
| ; SSE2-NEXT: movq %rcx, %r9 | |
| ; SSE2-NEXT: movq %rdi, %rax | |
| ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %r11 | |
| ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rbx | |
| ; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rdi | |
| ; SSE2-NEXT: movl %r10d, %ecx | |
| ; SSE2-NEXT: shrdq %cl, %rdx, %rsi | |
| ; SSE2-NEXT: movl %edi, %ecx | |
| ; SSE2-NEXT: shrdq %cl, %r8, %r9 | |
| ; SSE2-NEXT: shrq %cl, %r8 | |
| ; SSE2-NEXT: xorl %r14d, %r14d | |
| ; SSE2-NEXT: testb $64, %dil | |
| ; SSE2-NEXT: cmovneq %r8, %r9 | |
| ; SSE2-NEXT: cmovneq %r14, %r8 | |
| ; SSE2-NEXT: movl %r10d, %ecx | |
| ; SSE2-NEXT: shrq %cl, %rdx | |
| ; SSE2-NEXT: testb $64, %r10b | |
| ; SSE2-NEXT: cmovneq %rdx, %rsi | |
| ; SSE2-NEXT: cmovneq %r14, %rdx | |
| ; SSE2-NEXT: cmpq $128, %r10 | |
| ; SSE2-NEXT: sbbq $0, %rbx | |
| ; SSE2-NEXT: cmovaeq %r14, %rsi | |
| ; SSE2-NEXT: cmovaeq %r14, %rdx | |
| ; SSE2-NEXT: cmpq $128, %rdi | |
| ; SSE2-NEXT: sbbq $0, %r11 | |
| ; SSE2-NEXT: cmovaeq %r14, %r9 | |
| ; SSE2-NEXT: cmovaeq %r14, %r8 | |
| ; SSE2-NEXT: movq %r8, 24(%rax) | |
| ; SSE2-NEXT: movq %r9, 16(%rax) | |
| ; SSE2-NEXT: movq %rdx, 8(%rax) | |
| ; SSE2-NEXT: movq %rsi, (%rax) | |
| ; SSE2-NEXT: popq %rbx | |
| ; SSE2-NEXT: popq %r14 | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; AVX2-LABEL: PR233186: | |
| ; AVX2: # %bb.0: | |
| ; AVX2-NEXT: pushq %r14 | |
| ; AVX2-NEXT: pushq %rbx | |
| ; AVX2-NEXT: movq %r9, %r10 | |
| ; AVX2-NEXT: movq %rcx, %r9 | |
| ; AVX2-NEXT: movq %rdi, %rax | |
| ; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %rbx | |
| ; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %rdi | |
| ; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %r11 | |
| ; AVX2-NEXT: movl %r10d, %ecx | |
| ; AVX2-NEXT: shrdq %cl, %rdx, %rsi | |
| ; AVX2-NEXT: movl %edi, %ecx | |
| ; AVX2-NEXT: shrdq %cl, %r8, %r9 | |
| ; AVX2-NEXT: shrq %cl, %r8 | |
| ; AVX2-NEXT: xorl %r14d, %r14d | |
| ; AVX2-NEXT: testb $64, %dil | |
| ; AVX2-NEXT: cmovneq %r8, %r9 | |
| ; AVX2-NEXT: cmovneq %r14, %r8 | |
| ; AVX2-NEXT: movl %r10d, %ecx | |
| ; AVX2-NEXT: shrq %cl, %rdx | |
| ; AVX2-NEXT: testb $64, %r10b | |
| ; AVX2-NEXT: cmovneq %rdx, %rsi | |
| ; AVX2-NEXT: cmovneq %r14, %rdx | |
| ; AVX2-NEXT: cmpq $128, %r10 | |
| ; AVX2-NEXT: sbbq $0, %rbx | |
| ; AVX2-NEXT: cmovaeq %r14, %rsi | |
| ; AVX2-NEXT: cmovaeq %r14, %rdx | |
| ; AVX2-NEXT: cmpq $128, %rdi | |
| ; AVX2-NEXT: sbbq $0, %r11 | |
| ; AVX2-NEXT: cmovaeq %r14, %r9 | |
| ; AVX2-NEXT: cmovaeq %r14, %r8 | |
| ; AVX2-NEXT: movq %r8, 24(%rax) | |
| ; AVX2-NEXT: movq %r9, 16(%rax) | |
| ; AVX2-NEXT: movq %rdx, 8(%rax) | |
| ; AVX2-NEXT: movq %rsi, (%rax) | |
| ; AVX2-NEXT: popq %rbx | |
| ; AVX2-NEXT: popq %r14 | |
| ; AVX2-NEXT: retq | |
| %c = icmp uge <2 x i128> %a, splat (i128 128) | |
| %s = lshr <2 x i128> %x, %a | |
| %r = select <2 x i1> %c, <2 x i128> zeroinitializer, <2 x i128> %s | |
| ret <2 x i128> %r | |
| } |