1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 2; RUN: llc < %s -mtriple=i686-- -mattr=+lzcnt | FileCheck %s --check-prefix=X86 3; RUN: llc < %s -mtriple=x86_64-linux-gnux32 -mattr=+lzcnt | FileCheck %s --check-prefix=X32 4; RUN: llc < %s -mtriple=x86_64-- -mattr=+lzcnt | FileCheck %s --check-prefix=X64 5 6declare i8 @llvm.ctlz.i8(i8, i1) nounwind readnone 7declare i16 @llvm.ctlz.i16(i16, i1) nounwind readnone 8declare i32 @llvm.ctlz.i32(i32, i1) nounwind readnone 9declare i64 @llvm.ctlz.i64(i64, i1) nounwind readnone 10 11define i8 @t1(i8 %x) nounwind { 12; X86-LABEL: t1: 13; X86: # %bb.0: 14; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax 15; X86-NEXT: lzcntl %eax, %eax 16; X86-NEXT: addl $-24, %eax 17; X86-NEXT: # kill: def $al killed $al killed $eax 18; X86-NEXT: retl 19; 20; X32-LABEL: t1: 21; X32: # %bb.0: 22; X32-NEXT: movzbl %dil, %eax 23; X32-NEXT: lzcntl %eax, %eax 24; X32-NEXT: addl $-24, %eax 25; X32-NEXT: # kill: def $al killed $al killed $eax 26; X32-NEXT: retq 27; 28; X64-LABEL: t1: 29; X64: # %bb.0: 30; X64-NEXT: movzbl %dil, %eax 31; X64-NEXT: lzcntl %eax, %eax 32; X64-NEXT: addl $-24, %eax 33; X64-NEXT: # kill: def $al killed $al killed $eax 34; X64-NEXT: retq 35 %tmp = tail call i8 @llvm.ctlz.i8( i8 %x, i1 false ) 36 ret i8 %tmp 37} 38 39define i16 @t2(i16 %x) nounwind { 40; X86-LABEL: t2: 41; X86: # %bb.0: 42; X86-NEXT: lzcntw {{[0-9]+}}(%esp), %ax 43; X86-NEXT: retl 44; 45; X32-LABEL: t2: 46; X32: # %bb.0: 47; X32-NEXT: lzcntw %di, %ax 48; X32-NEXT: retq 49; 50; X64-LABEL: t2: 51; X64: # %bb.0: 52; X64-NEXT: lzcntw %di, %ax 53; X64-NEXT: retq 54 %tmp = tail call i16 @llvm.ctlz.i16( i16 %x, i1 false ) 55 ret i16 %tmp 56} 57 58define i32 @t3(i32 %x) nounwind { 59; X86-LABEL: t3: 60; X86: # %bb.0: 61; X86-NEXT: lzcntl {{[0-9]+}}(%esp), %eax 62; X86-NEXT: retl 63; 64; X32-LABEL: t3: 65; X32: # %bb.0: 66; X32-NEXT: lzcntl %edi, %eax 67; X32-NEXT: retq 68; 69; X64-LABEL: t3: 70; X64: # %bb.0: 71; X64-NEXT: lzcntl %edi, %eax 72; X64-NEXT: retq 73 %tmp = tail call i32 @llvm.ctlz.i32( i32 %x, i1 false ) 74 ret i32 %tmp 75} 76 77define i64 @t4(i64 %x) nounwind { 78; X86-LABEL: t4: 79; X86: # %bb.0: 80; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 81; X86-NEXT: testl %eax, %eax 82; X86-NEXT: jne .LBB3_1 83; X86-NEXT: # %bb.2: 84; X86-NEXT: lzcntl {{[0-9]+}}(%esp), %eax 85; X86-NEXT: addl $32, %eax 86; X86-NEXT: xorl %edx, %edx 87; X86-NEXT: retl 88; X86-NEXT: .LBB3_1: 89; X86-NEXT: lzcntl %eax, %eax 90; X86-NEXT: xorl %edx, %edx 91; X86-NEXT: retl 92; 93; X32-LABEL: t4: 94; X32: # %bb.0: 95; X32-NEXT: lzcntq %rdi, %rax 96; X32-NEXT: retq 97; 98; X64-LABEL: t4: 99; X64: # %bb.0: 100; X64-NEXT: lzcntq %rdi, %rax 101; X64-NEXT: retq 102 %tmp = tail call i64 @llvm.ctlz.i64( i64 %x, i1 false ) 103 ret i64 %tmp 104} 105 106define i8 @t5(i8 %x) nounwind { 107; X86-LABEL: t5: 108; X86: # %bb.0: 109; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 110; X86-NEXT: shll $24, %eax 111; X86-NEXT: lzcntl %eax, %eax 112; X86-NEXT: # kill: def $al killed $al killed $eax 113; X86-NEXT: retl 114; 115; X32-LABEL: t5: 116; X32: # %bb.0: 117; X32-NEXT: shll $24, %edi 118; X32-NEXT: lzcntl %edi, %eax 119; X32-NEXT: # kill: def $al killed $al killed $eax 120; X32-NEXT: retq 121; 122; X64-LABEL: t5: 123; X64: # %bb.0: 124; X64-NEXT: shll $24, %edi 125; X64-NEXT: lzcntl %edi, %eax 126; X64-NEXT: # kill: def $al killed $al killed $eax 127; X64-NEXT: retq 128 %tmp = tail call i8 @llvm.ctlz.i8( i8 %x, i1 true ) 129 ret i8 %tmp 130} 131 132define i16 @t6(i16 %x) nounwind { 133; X86-LABEL: t6: 134; X86: # %bb.0: 135; X86-NEXT: lzcntw {{[0-9]+}}(%esp), %ax 136; X86-NEXT: retl 137; 138; X32-LABEL: t6: 139; X32: # %bb.0: 140; X32-NEXT: lzcntw %di, %ax 141; X32-NEXT: retq 142; 143; X64-LABEL: t6: 144; X64: # %bb.0: 145; X64-NEXT: lzcntw %di, %ax 146; X64-NEXT: retq 147 %tmp = tail call i16 @llvm.ctlz.i16( i16 %x, i1 true ) 148 ret i16 %tmp 149} 150 151define i32 @t7(i32 %x) nounwind { 152; X86-LABEL: t7: 153; X86: # %bb.0: 154; X86-NEXT: lzcntl {{[0-9]+}}(%esp), %eax 155; X86-NEXT: retl 156; 157; X32-LABEL: t7: 158; X32: # %bb.0: 159; X32-NEXT: lzcntl %edi, %eax 160; X32-NEXT: retq 161; 162; X64-LABEL: t7: 163; X64: # %bb.0: 164; X64-NEXT: lzcntl %edi, %eax 165; X64-NEXT: retq 166 %tmp = tail call i32 @llvm.ctlz.i32( i32 %x, i1 true ) 167 ret i32 %tmp 168} 169 170define i64 @t8(i64 %x) nounwind { 171; X86-LABEL: t8: 172; X86: # %bb.0: 173; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 174; X86-NEXT: testl %eax, %eax 175; X86-NEXT: jne .LBB7_1 176; X86-NEXT: # %bb.2: 177; X86-NEXT: lzcntl {{[0-9]+}}(%esp), %eax 178; X86-NEXT: addl $32, %eax 179; X86-NEXT: xorl %edx, %edx 180; X86-NEXT: retl 181; X86-NEXT: .LBB7_1: 182; X86-NEXT: lzcntl %eax, %eax 183; X86-NEXT: xorl %edx, %edx 184; X86-NEXT: retl 185; 186; X32-LABEL: t8: 187; X32: # %bb.0: 188; X32-NEXT: lzcntq %rdi, %rax 189; X32-NEXT: retq 190; 191; X64-LABEL: t8: 192; X64: # %bb.0: 193; X64-NEXT: lzcntq %rdi, %rax 194; X64-NEXT: retq 195 %tmp = tail call i64 @llvm.ctlz.i64( i64 %x, i1 true ) 196 ret i64 %tmp 197} 198