blob: b53ba07406fb1541174030fdb31e2a554a46639c [file] [edit]
; 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
}