| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64 | FileCheck %s --check-prefixes=SSE2 | |
| ; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=SSE42 | |
| ; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=AVX | |
| ; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=AVX | |
| define i64 @PR214388(i8 %arg) { | |
| ; SSE2-LABEL: PR214388: | |
| ; SSE2: # %bb.0: # %entry | |
| ; SSE2-NEXT: movzbl %dil, %eax | |
| ; SSE2-NEXT: movd %eax, %xmm0 | |
| ; SSE2-NEXT: por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 | |
| ; SSE2-NEXT: movl $20, %eax | |
| ; SSE2-NEXT: movd %eax, %xmm1 | |
| ; SSE2-NEXT: psubb %xmm0, %xmm1 | |
| ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255] | |
| ; SSE2-NEXT: pand %xmm1, %xmm0 | |
| ; SSE2-NEXT: movd %xmm0, %eax | |
| ; SSE2-NEXT: movw %ax, -{{[0-9]+}}(%rsp) | |
| ; SSE2-NEXT: movdqa %xmm1, -{{[0-9]+}}(%rsp) | |
| ; SSE2-NEXT: cmpb $0, -{{[0-9]+}}(%rsp) | |
| ; SSE2-NEXT: je .LBB0_1 | |
| ; SSE2-NEXT: # %bb.2: # %for.body8.preheader | |
| ; SSE2-NEXT: leaq -{{[0-9]+}}(%rsp), %rcx | |
| ; SSE2-NEXT: xorl %esi, %esi | |
| ; SSE2-NEXT: leaq -{{[0-9]+}}(%rsp), %rdx | |
| ; SSE2-NEXT: .p2align 4 | |
| ; SSE2-NEXT: .LBB0_3: # %for.body8 | |
| ; SSE2-NEXT: # =>This Inner Loop Header: Depth=1 | |
| ; SSE2-NEXT: movq %rsi, %rax | |
| ; SSE2-NEXT: movl $1, %esi | |
| ; SSE2-NEXT: cmpb $0, 1(%rcx) | |
| ; SSE2-NEXT: movq %rdx, %rcx | |
| ; SSE2-NEXT: jne .LBB0_3 | |
| ; SSE2-NEXT: # %bb.4: # %for.end11 | |
| ; SSE2-NEXT: retq | |
| ; SSE2-NEXT: .LBB0_1: | |
| ; SSE2-NEXT: xorl %eax, %eax | |
| ; SSE2-NEXT: retq | |
| ; | |
| ; SSE42-LABEL: PR214388: | |
| ; SSE42: # %bb.0: # %entry | |
| ; SSE42-NEXT: movdqa {{.*#+}} xmm0 = [u,1,u,u,u,u,u,u,u,u,u,u,u,u,u,u] | |
| ; SSE42-NEXT: pinsrb $0, %edi, %xmm0 | |
| ; SSE42-NEXT: movl $20, %eax | |
| ; SSE42-NEXT: movd %eax, %xmm1 | |
| ; SSE42-NEXT: psubb %xmm0, %xmm1 | |
| ; SSE42-NEXT: pextrb $0, %xmm1, %eax | |
| ; SSE42-NEXT: movw %ax, -{{[0-9]+}}(%rsp) | |
| ; SSE42-NEXT: movd %xmm1, %eax | |
| ; SSE42-NEXT: testl %eax, %eax | |
| ; SSE42-NEXT: je .LBB0_1 | |
| ; SSE42-NEXT: # %bb.2: # %for.body8.preheader | |
| ; SSE42-NEXT: leaq -{{[0-9]+}}(%rsp), %rcx | |
| ; SSE42-NEXT: xorl %esi, %esi | |
| ; SSE42-NEXT: leaq -{{[0-9]+}}(%rsp), %rdx | |
| ; SSE42-NEXT: .p2align 4 | |
| ; SSE42-NEXT: .LBB0_3: # %for.body8 | |
| ; SSE42-NEXT: # =>This Inner Loop Header: Depth=1 | |
| ; SSE42-NEXT: movq %rsi, %rax | |
| ; SSE42-NEXT: movl $1, %esi | |
| ; SSE42-NEXT: cmpb $0, 1(%rcx) | |
| ; SSE42-NEXT: movq %rdx, %rcx | |
| ; SSE42-NEXT: jne .LBB0_3 | |
| ; SSE42-NEXT: # %bb.4: # %for.end11 | |
| ; SSE42-NEXT: retq | |
| ; SSE42-NEXT: .LBB0_1: | |
| ; SSE42-NEXT: xorl %eax, %eax | |
| ; SSE42-NEXT: retq | |
| ; | |
| ; AVX-LABEL: PR214388: | |
| ; AVX: # %bb.0: # %entry | |
| ; AVX-NEXT: vpbroadcastd {{.*#+}} xmm0 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] | |
| ; AVX-NEXT: vpinsrb $0, %edi, %xmm0, %xmm0 | |
| ; AVX-NEXT: movl $20, %eax | |
| ; AVX-NEXT: vmovd %eax, %xmm1 | |
| ; AVX-NEXT: vpsubb %xmm0, %xmm1, %xmm0 | |
| ; AVX-NEXT: vpextrb $0, %xmm0, %eax | |
| ; AVX-NEXT: movw %ax, -{{[0-9]+}}(%rsp) | |
| ; AVX-NEXT: vmovd %xmm0, %eax | |
| ; AVX-NEXT: testl %eax, %eax | |
| ; AVX-NEXT: je .LBB0_1 | |
| ; AVX-NEXT: # %bb.2: # %for.body8.preheader | |
| ; AVX-NEXT: leaq -{{[0-9]+}}(%rsp), %rcx | |
| ; AVX-NEXT: xorl %esi, %esi | |
| ; AVX-NEXT: leaq -{{[0-9]+}}(%rsp), %rdx | |
| ; AVX-NEXT: .p2align 4 | |
| ; AVX-NEXT: .LBB0_3: # %for.body8 | |
| ; AVX-NEXT: # =>This Inner Loop Header: Depth=1 | |
| ; AVX-NEXT: movq %rsi, %rax | |
| ; AVX-NEXT: movl $1, %esi | |
| ; AVX-NEXT: cmpb $0, 1(%rcx) | |
| ; AVX-NEXT: movq %rdx, %rcx | |
| ; AVX-NEXT: jne .LBB0_3 | |
| ; AVX-NEXT: # %bb.4: # %for.end11 | |
| ; AVX-NEXT: retq | |
| ; AVX-NEXT: .LBB0_1: | |
| ; AVX-NEXT: xorl %eax, %eax | |
| ; AVX-NEXT: retq | |
| entry: | |
| %i0 = alloca [4 x i8], align 1 | |
| %i1 = insertelement <2 x i8> splat (i8 1), i8 %arg, i64 0 | |
| %i2 = sub nuw <2 x i8> <i8 20, i8 poison>, %i1 | |
| %i3 = insertelement <2 x i8> %i2, i8 0, i64 1 | |
| %i4 = getelementptr i8, ptr %i0, i64 2 | |
| store <2 x i8> %i3, ptr %i4, align 1 | |
| %i5 = extractelement <2 x i8> %i2, i64 0 | |
| %i6 = icmp eq i8 %i5, 0 | |
| br i1 %i6, label %for.end11, label %for.body8 | |
| for.body8: | |
| %i7 = phi ptr [ %i0, %for.body8 ], [ %i4, %entry ] | |
| %i8 = phi i64 [ 1, %for.body8 ], [ 0, %entry ] | |
| %i9 = getelementptr i8, ptr %i7, i64 1 | |
| %i10 = load i8, ptr %i9, align 1 | |
| %i11 = icmp eq i8 %i10, 0 | |
| br i1 %i11, label %for.end11, label %for.body8 | |
| for.end11: | |
| %i12 = phi i64 [ 0, %entry ], [ %i8, %for.body8 ] | |
| ret i64 %i12 | |
| } |