135 lines · plain
1; RUN: llc -mtriple=x86_64-unknown-unknown < %s | FileCheck %s2 3define i8 @ctz_v8i16(<8 x i16> %a) {4; CHECK-LABEL: .LCPI0_0:5; CHECK-NEXT: .byte 86; CHECK-NEXT: .byte 77; CHECK-NEXT: .byte 68; CHECK-NEXT: .byte 59; CHECK-NEXT: .byte 410; CHECK-NEXT: .byte 311; CHECK-NEXT: .byte 212; CHECK-NEXT: .byte 113; CHECK-LABEL: ctz_v8i16:14; CHECK: # %bb.0:15; CHECK-NEXT: pxor %xmm1, %xmm116; CHECK-NEXT: pcmpeqw %xmm0, %xmm117; CHECK-NEXT: packsswb %xmm1, %xmm118; CHECK-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm119; CHECK-NEXT: movdqa %xmm1, -{{[0-9]+}}(%rsp)20; CHECK-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx21; CHECK-NEXT: movl -{{[0-9]+}}(%rsp), %eax22; CHECK-NEXT: movl -{{[0-9]+}}(%rsp), %edx23; CHECK-NEXT: cmpb %cl, %al24; CHECK-NEXT: cmoval %eax, %ecx25; CHECK-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax26; CHECK-NEXT: cmpb %al, %cl27; CHECK-NEXT: cmovbel %eax, %ecx28; CHECK-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax29; CHECK-NEXT: cmpb %al, %cl30; CHECK-NEXT: cmovbel %eax, %ecx31; CHECK-NEXT: cmpb %dl, %cl32; CHECK-NEXT: cmovbel %edx, %ecx33; CHECK-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax34; CHECK-NEXT: cmpb %al, %cl35; CHECK-NEXT: cmovbel %eax, %ecx36; CHECK-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax37; CHECK-NEXT: cmpb %al, %cl38; CHECK-NEXT: cmovbel %eax, %ecx39; CHECK-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax40; CHECK-NEXT: cmpb %al, %cl41; CHECK-NEXT: cmovbel %eax, %ecx42; CHECK-NEXT: movb $8, %al43; CHECK-NEXT: subb %cl, %al44; CHECK-NEXT: retq45 %res = call i8 @llvm.experimental.cttz.elts.i8.v8i16(<8 x i16> %a, i1 0)46 ret i8 %res47}48 49define i16 @ctz_v4i32(<4 x i32> %a) {50; CHECK-LABEL: .LCPI1_0:51; CHECK-NEXT: .byte 452; CHECK-NEXT: .byte 353; CHECK-NEXT: .byte 254; CHECK-NEXT: .byte 155; CHECK-LABEL: ctz_v4i32:56; CHECK: # %bb.0:57; CHECK-NEXT: pxor %xmm1, %xmm158; CHECK-NEXT: pcmpeqd %xmm0, %xmm159; CHECK-NEXT: packssdw %xmm1, %xmm160; CHECK-NEXT: pcmpeqd %xmm0, %xmm061; CHECK-NEXT: pxor %xmm1, %xmm062; CHECK-NEXT: packsswb %xmm0, %xmm063; CHECK-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm064; CHECK-NEXT: movd %xmm0, %eax65; CHECK-NEXT: movl %eax, %ecx66; CHECK-NEXT: shrl $8, %ecx67; CHECK-NEXT: cmpb %cl, %al68; CHECK-NEXT: cmoval %eax, %ecx69; CHECK-NEXT: movl %eax, %edx70; CHECK-NEXT: shrl $16, %edx71; CHECK-NEXT: cmpb %dl, %cl72; CHECK-NEXT: cmoval %ecx, %edx73; CHECK-NEXT: shrl $24, %eax74; CHECK-NEXT: cmpb %al, %dl75; CHECK-NEXT: cmoval %edx, %eax76; CHECK-NEXT: movb $4, %cl77; CHECK-NEXT: subb %al, %cl78; CHECK-NEXT: movzbl %cl, %eax79; CHECK-NEXT: # kill: def $ax killed $ax killed $eax80; CHECK-NEXT: retq81 %res = call i16 @llvm.experimental.cttz.elts.i16.v4i32(<4 x i32> %a, i1 0)82 ret i16 %res83}84 85; ZERO IS POISON86 87define i8 @ctz_v8i16_poison(<8 x i16> %a) {88; CHECK-LABEL: .LCPI2_0:89; CHECK-NEXT: .byte 890; CHECK-NEXT: .byte 791; CHECK-NEXT: .byte 692; CHECK-NEXT: .byte 593; CHECK-NEXT: .byte 494; CHECK-NEXT: .byte 395; CHECK-NEXT: .byte 296; CHECK-NEXT: .byte 197; CHECK-LABEL: ctz_v8i16_poison:98; CHECK: # %bb.0:99; CHECK-NEXT: pxor %xmm1, %xmm1100; CHECK-NEXT: pcmpeqw %xmm0, %xmm1101; CHECK-NEXT: packsswb %xmm1, %xmm1102; CHECK-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1103; CHECK-NEXT: movdqa %xmm1, -{{[0-9]+}}(%rsp)104; CHECK-NEXT: movzbl -{{[0-9]+}}(%rsp), %ecx105; CHECK-NEXT: movl -{{[0-9]+}}(%rsp), %eax106; CHECK-NEXT: movl -{{[0-9]+}}(%rsp), %edx107; CHECK-NEXT: cmpb %cl, %al108; CHECK-NEXT: cmoval %eax, %ecx109; CHECK-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax110; CHECK-NEXT: cmpb %al, %cl111; CHECK-NEXT: cmovbel %eax, %ecx112; CHECK-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax113; CHECK-NEXT: cmpb %al, %cl114; CHECK-NEXT: cmovbel %eax, %ecx115; CHECK-NEXT: cmpb %dl, %cl116; CHECK-NEXT: cmovbel %edx, %ecx117; CHECK-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax118; CHECK-NEXT: cmpb %al, %cl119; CHECK-NEXT: cmovbel %eax, %ecx120; CHECK-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax121; CHECK-NEXT: cmpb %al, %cl122; CHECK-NEXT: cmovbel %eax, %ecx123; CHECK-NEXT: movzbl -{{[0-9]+}}(%rsp), %eax124; CHECK-NEXT: cmpb %al, %cl125; CHECK-NEXT: cmovbel %eax, %ecx126; CHECK-NEXT: movb $8, %al127; CHECK-NEXT: subb %cl, %al128; CHECK-NEXT: retq129 %res = call i8 @llvm.experimental.cttz.elts.i8.v8i16(<8 x i16> %a, i1 1)130 ret i8 %res131}132 133declare i8 @llvm.experimental.cttz.elts.i8.v8i16(<8 x i16>, i1)134declare i16 @llvm.experimental.cttz.elts.i16.v4i32(<4 x i32>, i1)135