OSDN Git Service

[X86] Regenerate LZCNT tests on x86/x32/x64 targets
[android-x86/external-llvm.git] / test / CodeGen / X86 / lzcnt.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-- -mattr=+lzcnt | FileCheck %s --check-prefixes=CHECK,X86
3 ; RUN: llc < %s -mtriple=x86_64-linux-gnux32  -mattr=+lzcnt | FileCheck %s --check-prefixes=CHECK,X32
4 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+lzcnt | FileCheck %s --check-prefixes=CHECK,X64
5
6 declare i8 @llvm.ctlz.i8(i8, i1) nounwind readnone
7 declare i16 @llvm.ctlz.i16(i16, i1) nounwind readnone
8 declare i32 @llvm.ctlz.i32(i32, i1) nounwind readnone
9 declare i64 @llvm.ctlz.i64(i64, i1) nounwind readnone
10
11 define 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
39 define 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
58 define 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
77 define 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
106 define i8 @t5(i8 %x) nounwind  {
107 ; X86-LABEL: t5:
108 ; X86:       # %bb.0:
109 ; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
110 ; X86-NEXT:    lzcntl %eax, %eax
111 ; X86-NEXT:    addl $-24, %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:    movzbl %dil, %eax
118 ; X32-NEXT:    lzcntl %eax, %eax
119 ; X32-NEXT:    addl $-24, %eax
120 ; X32-NEXT:    # kill: def $al killed $al killed $eax
121 ; X32-NEXT:    retq
122 ;
123 ; X64-LABEL: t5:
124 ; X64:       # %bb.0:
125 ; X64-NEXT:    movzbl %dil, %eax
126 ; X64-NEXT:    lzcntl %eax, %eax
127 ; X64-NEXT:    addl $-24, %eax
128 ; X64-NEXT:    # kill: def $al killed $al killed $eax
129 ; X64-NEXT:    retq
130         %tmp = tail call i8 @llvm.ctlz.i8( i8 %x, i1 true )
131         ret i8 %tmp
132 }
133
134 define i16 @t6(i16 %x) nounwind  {
135 ; X86-LABEL: t6:
136 ; X86:       # %bb.0:
137 ; X86-NEXT:    lzcntw {{[0-9]+}}(%esp), %ax
138 ; X86-NEXT:    retl
139 ;
140 ; X32-LABEL: t6:
141 ; X32:       # %bb.0:
142 ; X32-NEXT:    lzcntw %di, %ax
143 ; X32-NEXT:    retq
144 ;
145 ; X64-LABEL: t6:
146 ; X64:       # %bb.0:
147 ; X64-NEXT:    lzcntw %di, %ax
148 ; X64-NEXT:    retq
149         %tmp = tail call i16 @llvm.ctlz.i16( i16 %x, i1 true )
150         ret i16 %tmp
151 }
152
153 define i32 @t7(i32 %x) nounwind  {
154 ; X86-LABEL: t7:
155 ; X86:       # %bb.0:
156 ; X86-NEXT:    lzcntl {{[0-9]+}}(%esp), %eax
157 ; X86-NEXT:    retl
158 ;
159 ; X32-LABEL: t7:
160 ; X32:       # %bb.0:
161 ; X32-NEXT:    lzcntl %edi, %eax
162 ; X32-NEXT:    retq
163 ;
164 ; X64-LABEL: t7:
165 ; X64:       # %bb.0:
166 ; X64-NEXT:    lzcntl %edi, %eax
167 ; X64-NEXT:    retq
168         %tmp = tail call i32 @llvm.ctlz.i32( i32 %x, i1 true )
169         ret i32 %tmp
170 }
171
172 define i64 @t8(i64 %x) nounwind  {
173 ; X86-LABEL: t8:
174 ; X86:       # %bb.0:
175 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
176 ; X86-NEXT:    testl %eax, %eax
177 ; X86-NEXT:    jne .LBB7_1
178 ; X86-NEXT:  # %bb.2:
179 ; X86-NEXT:    lzcntl {{[0-9]+}}(%esp), %eax
180 ; X86-NEXT:    addl $32, %eax
181 ; X86-NEXT:    xorl %edx, %edx
182 ; X86-NEXT:    retl
183 ; X86-NEXT:  .LBB7_1:
184 ; X86-NEXT:    lzcntl %eax, %eax
185 ; X86-NEXT:    xorl %edx, %edx
186 ; X86-NEXT:    retl
187 ;
188 ; X32-LABEL: t8:
189 ; X32:       # %bb.0:
190 ; X32-NEXT:    lzcntq %rdi, %rax
191 ; X32-NEXT:    retq
192 ;
193 ; X64-LABEL: t8:
194 ; X64:       # %bb.0:
195 ; X64-NEXT:    lzcntq %rdi, %rax
196 ; X64-NEXT:    retq
197         %tmp = tail call i64 @llvm.ctlz.i64( i64 %x, i1 true )
198         ret i64 %tmp
199 }