xref: /llvm-project/llvm/test/CodeGen/X86/lzcnt.ll (revision 69192e0193e60c169c7776f444362dffba31eb7d)
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