1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=x86_64-- < %s -pre-RA-sched=list-ilp | FileCheck %s --check-prefix=ILP
3 ; RUN: llc -mtriple=x86_64-- < %s -pre-RA-sched=list-hybrid | FileCheck %s --check-prefix=HYBRID
4 ; RUN: llc -mtriple=x86_64-- < %s -pre-RA-sched=list-burr | FileCheck %s --check-prefix=BURR
5 ; RUN: llc -mtriple=x86_64-- < %s -pre-RA-sched=source | FileCheck %s --check-prefix=SRC
6 ; FIXME: Fix machine verifier issues and remove -verify-machineinstrs=0. PR39452.
7 ; RUN: llc -mtriple=x86_64-- < %s -pre-RA-sched=linearize -verify-machineinstrs=0 | FileCheck %s --check-prefix=LIN
9 ; PR22304 https://llvm.org/bugs/show_bug.cgi?id=22304
10 ; Tests checking backtracking in source scheduler. llc used to crash on them.
12 define i256 @test1(i256 %a) nounwind {
15 ; ILP-NEXT: movq %rdi, %rax
16 ; ILP-NEXT: xorps %xmm0, %xmm0
17 ; ILP-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
18 ; ILP-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
19 ; ILP-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
20 ; ILP-NEXT: leal (%rsi,%rsi), %ecx
21 ; ILP-NEXT: addb $3, %cl
22 ; ILP-NEXT: movq $0, -{{[0-9]+}}(%rsp)
23 ; ILP-NEXT: movq $1, -{{[0-9]+}}(%rsp)
24 ; ILP-NEXT: movl %ecx, %edx
25 ; ILP-NEXT: shrb $3, %dl
26 ; ILP-NEXT: andb $24, %dl
28 ; ILP-NEXT: movsbq %dl, %rdx
29 ; ILP-NEXT: movq -24(%rsp,%rdx), %rsi
30 ; ILP-NEXT: movq -16(%rsp,%rdx), %rdi
31 ; ILP-NEXT: shldq %cl, %rsi, %rdi
32 ; ILP-NEXT: movq -40(%rsp,%rdx), %r8
33 ; ILP-NEXT: movq -32(%rsp,%rdx), %rdx
34 ; ILP-NEXT: movq %r8, %r9
35 ; ILP-NEXT: shlq %cl, %r9
36 ; ILP-NEXT: movq %rdx, %r10
37 ; ILP-NEXT: shldq %cl, %r8, %r10
38 ; ILP-NEXT: movq %rdi, 24(%rax)
39 ; ILP-NEXT: movq %r10, 8(%rax)
40 ; ILP-NEXT: movq %r9, (%rax)
41 ; ILP-NEXT: shlq %cl, %rsi
44 ; ILP-NEXT: # kill: def $cl killed $cl killed $ecx
45 ; ILP-NEXT: shrq %cl, %rdx
46 ; ILP-NEXT: orq %rsi, %rdx
47 ; ILP-NEXT: movq %rdx, 16(%rax)
50 ; HYBRID-LABEL: test1:
52 ; HYBRID-NEXT: movq %rdi, %rax
53 ; HYBRID-NEXT: xorps %xmm0, %xmm0
54 ; HYBRID-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
55 ; HYBRID-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
56 ; HYBRID-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
57 ; HYBRID-NEXT: movq $0, -{{[0-9]+}}(%rsp)
58 ; HYBRID-NEXT: movq $1, -{{[0-9]+}}(%rsp)
59 ; HYBRID-NEXT: leal (%rsi,%rsi), %ecx
60 ; HYBRID-NEXT: addb $3, %cl
61 ; HYBRID-NEXT: movl %ecx, %edx
62 ; HYBRID-NEXT: shrb $3, %dl
63 ; HYBRID-NEXT: andb $24, %dl
64 ; HYBRID-NEXT: negb %dl
65 ; HYBRID-NEXT: movsbq %dl, %rdx
66 ; HYBRID-NEXT: movq -24(%rsp,%rdx), %rsi
67 ; HYBRID-NEXT: movq -16(%rsp,%rdx), %rdi
68 ; HYBRID-NEXT: shldq %cl, %rsi, %rdi
69 ; HYBRID-NEXT: movq %rdi, 24(%rax)
70 ; HYBRID-NEXT: movq -40(%rsp,%rdx), %rdi
71 ; HYBRID-NEXT: movq -32(%rsp,%rdx), %rdx
72 ; HYBRID-NEXT: movq %rdx, %r8
73 ; HYBRID-NEXT: shldq %cl, %rdi, %r8
74 ; HYBRID-NEXT: movq %r8, 8(%rax)
75 ; HYBRID-NEXT: shlq %cl, %rdi
76 ; HYBRID-NEXT: movq %rdi, (%rax)
77 ; HYBRID-NEXT: shlq %cl, %rsi
78 ; HYBRID-NEXT: notb %cl
79 ; HYBRID-NEXT: shrq %rdx
80 ; HYBRID-NEXT: # kill: def $cl killed $cl killed $ecx
81 ; HYBRID-NEXT: shrq %cl, %rdx
82 ; HYBRID-NEXT: orq %rsi, %rdx
83 ; HYBRID-NEXT: movq %rdx, 16(%rax)
88 ; BURR-NEXT: movq %rdi, %rax
89 ; BURR-NEXT: xorps %xmm0, %xmm0
90 ; BURR-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
91 ; BURR-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
92 ; BURR-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
93 ; BURR-NEXT: movq $0, -{{[0-9]+}}(%rsp)
94 ; BURR-NEXT: movq $1, -{{[0-9]+}}(%rsp)
95 ; BURR-NEXT: leal (%rsi,%rsi), %ecx
96 ; BURR-NEXT: addb $3, %cl
97 ; BURR-NEXT: movl %ecx, %edx
98 ; BURR-NEXT: shrb $3, %dl
99 ; BURR-NEXT: andb $24, %dl
100 ; BURR-NEXT: negb %dl
101 ; BURR-NEXT: movsbq %dl, %rdx
102 ; BURR-NEXT: movq -24(%rsp,%rdx), %rsi
103 ; BURR-NEXT: movq -16(%rsp,%rdx), %rdi
104 ; BURR-NEXT: shldq %cl, %rsi, %rdi
105 ; BURR-NEXT: movq %rdi, 24(%rax)
106 ; BURR-NEXT: movq -40(%rsp,%rdx), %rdi
107 ; BURR-NEXT: movq -32(%rsp,%rdx), %rdx
108 ; BURR-NEXT: movq %rdx, %r8
109 ; BURR-NEXT: shldq %cl, %rdi, %r8
110 ; BURR-NEXT: movq %r8, 8(%rax)
111 ; BURR-NEXT: shlq %cl, %rdi
112 ; BURR-NEXT: movq %rdi, (%rax)
113 ; BURR-NEXT: shlq %cl, %rsi
114 ; BURR-NEXT: notb %cl
115 ; BURR-NEXT: shrq %rdx
116 ; BURR-NEXT: # kill: def $cl killed $cl killed $ecx
117 ; BURR-NEXT: shrq %cl, %rdx
118 ; BURR-NEXT: orq %rsi, %rdx
119 ; BURR-NEXT: movq %rdx, 16(%rax)
124 ; SRC-NEXT: movq %rdi, %rax
125 ; SRC-NEXT: leal (%rsi,%rsi), %edx
126 ; SRC-NEXT: addb $3, %dl
127 ; SRC-NEXT: xorps %xmm0, %xmm0
128 ; SRC-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
129 ; SRC-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
130 ; SRC-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
131 ; SRC-NEXT: movq $0, -{{[0-9]+}}(%rsp)
132 ; SRC-NEXT: movq $1, -{{[0-9]+}}(%rsp)
133 ; SRC-NEXT: movl %edx, %ecx
134 ; SRC-NEXT: shrb $3, %cl
135 ; SRC-NEXT: andb $24, %cl
137 ; SRC-NEXT: movsbq %cl, %rsi
138 ; SRC-NEXT: movq -24(%rsp,%rsi), %rdi
139 ; SRC-NEXT: movq %rdi, %r8
140 ; SRC-NEXT: movl %edx, %ecx
141 ; SRC-NEXT: shlq %cl, %r8
143 ; SRC-NEXT: movq -40(%rsp,%rsi), %r9
144 ; SRC-NEXT: movq -32(%rsp,%rsi), %r10
145 ; SRC-NEXT: movq %r10, %r11
146 ; SRC-NEXT: shrq %r11
147 ; SRC-NEXT: shrq %cl, %r11
148 ; SRC-NEXT: orq %r8, %r11
149 ; SRC-NEXT: movq -16(%rsp,%rsi), %rsi
150 ; SRC-NEXT: movl %edx, %ecx
151 ; SRC-NEXT: shldq %cl, %rdi, %rsi
152 ; SRC-NEXT: movq %r9, %rdi
153 ; SRC-NEXT: shlq %cl, %rdi
154 ; SRC-NEXT: shldq %cl, %r9, %r10
155 ; SRC-NEXT: movq %rsi, 24(%rax)
156 ; SRC-NEXT: movq %r10, 8(%rax)
157 ; SRC-NEXT: movq %rdi, (%rax)
158 ; SRC-NEXT: movq %r11, 16(%rax)
163 ; LIN-NEXT: movq %rdi, %rax
164 ; LIN-NEXT: leal (%rsi,%rsi), %edx
165 ; LIN-NEXT: addb $3, %dl
166 ; LIN-NEXT: movl %edx, %ecx
167 ; LIN-NEXT: shrb $3, %cl
168 ; LIN-NEXT: andb $24, %cl
170 ; LIN-NEXT: movsbq %cl, %rsi
171 ; LIN-NEXT: xorps %xmm0, %xmm0
172 ; LIN-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
173 ; LIN-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
174 ; LIN-NEXT: movq $1, -{{[0-9]+}}(%rsp)
175 ; LIN-NEXT: movq $0, -{{[0-9]+}}(%rsp)
176 ; LIN-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
177 ; LIN-NEXT: movq -40(%rsp,%rsi), %rdi
178 ; LIN-NEXT: movq %rdi, %r8
179 ; LIN-NEXT: movl %edx, %ecx
180 ; LIN-NEXT: shlq %cl, %r8
181 ; LIN-NEXT: movq %r8, (%rax)
182 ; LIN-NEXT: movq -32(%rsp,%rsi), %r8
183 ; LIN-NEXT: movq %r8, %r9
184 ; LIN-NEXT: shldq %cl, %rdi, %r9
185 ; LIN-NEXT: movq %r9, 8(%rax)
186 ; LIN-NEXT: movq -24(%rsp,%rsi), %rdi
187 ; LIN-NEXT: movq %rdi, %r9
188 ; LIN-NEXT: shlq %cl, %r9
191 ; LIN-NEXT: shrq %cl, %r8
192 ; LIN-NEXT: orq %r9, %r8
193 ; LIN-NEXT: movq %r8, 16(%rax)
194 ; LIN-NEXT: movq -16(%rsp,%rsi), %rsi
195 ; LIN-NEXT: movl %edx, %ecx
196 ; LIN-NEXT: shldq %cl, %rdi, %rsi
197 ; LIN-NEXT: movq %rsi, 24(%rax)
202 %v = lshr i256 %b, %p
203 %t = trunc i256 %v to i1
205 %f = select i1 %t, i256 undef, i256 %c
209 define i256 @test2(i256 %a) nounwind {
212 ; ILP-NEXT: movq %rdi, %rax
213 ; ILP-NEXT: xorps %xmm0, %xmm0
214 ; ILP-NEXT: movaps %xmm0, 16(%rdi)
215 ; ILP-NEXT: xorl %edi, %edi
216 ; ILP-NEXT: movq %rsi, %r11
217 ; ILP-NEXT: negq %r11
218 ; ILP-NEXT: movl $0, %r10d
219 ; ILP-NEXT: sbbq %rdx, %r10
220 ; ILP-NEXT: movl $0, %r9d
221 ; ILP-NEXT: sbbq %rcx, %r9
222 ; ILP-NEXT: sbbq %r8, %rdi
223 ; ILP-NEXT: andq %r8, %rdi
224 ; ILP-NEXT: bsrq %rdi, %r8
225 ; ILP-NEXT: andq %rdx, %r10
226 ; ILP-NEXT: bsrq %r10, %rdx
227 ; ILP-NEXT: xorq $63, %r8
228 ; ILP-NEXT: andq %rcx, %r9
229 ; ILP-NEXT: bsrq %r9, %rcx
230 ; ILP-NEXT: xorq $63, %rcx
231 ; ILP-NEXT: orq $64, %rcx
232 ; ILP-NEXT: testq %rdi, %rdi
233 ; ILP-NEXT: cmovneq %r8, %rcx
234 ; ILP-NEXT: xorq $63, %rdx
235 ; ILP-NEXT: andq %rsi, %r11
236 ; ILP-NEXT: movl $127, %esi
237 ; ILP-NEXT: bsrq %r11, %rsi
238 ; ILP-NEXT: xorq $63, %rsi
239 ; ILP-NEXT: addq $64, %rsi
240 ; ILP-NEXT: testq %r10, %r10
241 ; ILP-NEXT: cmovneq %rdx, %rsi
242 ; ILP-NEXT: subq $-128, %rsi
243 ; ILP-NEXT: orq %rdi, %r9
244 ; ILP-NEXT: cmovneq %rcx, %rsi
245 ; ILP-NEXT: movq %rsi, (%rax)
246 ; ILP-NEXT: movq $0, 8(%rax)
249 ; HYBRID-LABEL: test2:
251 ; HYBRID-NEXT: movq %rdi, %rax
252 ; HYBRID-NEXT: xorps %xmm0, %xmm0
253 ; HYBRID-NEXT: movaps %xmm0, 16(%rdi)
254 ; HYBRID-NEXT: xorl %edi, %edi
255 ; HYBRID-NEXT: movq %rsi, %r11
256 ; HYBRID-NEXT: negq %r11
257 ; HYBRID-NEXT: movl $0, %r10d
258 ; HYBRID-NEXT: sbbq %rdx, %r10
259 ; HYBRID-NEXT: movl $0, %r9d
260 ; HYBRID-NEXT: sbbq %rcx, %r9
261 ; HYBRID-NEXT: sbbq %r8, %rdi
262 ; HYBRID-NEXT: andq %r8, %rdi
263 ; HYBRID-NEXT: bsrq %rdi, %r8
264 ; HYBRID-NEXT: xorq $63, %r8
265 ; HYBRID-NEXT: andq %rcx, %r9
266 ; HYBRID-NEXT: bsrq %r9, %rcx
267 ; HYBRID-NEXT: xorq $63, %rcx
268 ; HYBRID-NEXT: orq $64, %rcx
269 ; HYBRID-NEXT: testq %rdi, %rdi
270 ; HYBRID-NEXT: cmovneq %r8, %rcx
271 ; HYBRID-NEXT: andq %rdx, %r10
272 ; HYBRID-NEXT: bsrq %r10, %rdx
273 ; HYBRID-NEXT: xorq $63, %rdx
274 ; HYBRID-NEXT: andq %rsi, %r11
275 ; HYBRID-NEXT: movl $127, %esi
276 ; HYBRID-NEXT: bsrq %r11, %rsi
277 ; HYBRID-NEXT: xorq $63, %rsi
278 ; HYBRID-NEXT: addq $64, %rsi
279 ; HYBRID-NEXT: testq %r10, %r10
280 ; HYBRID-NEXT: cmovneq %rdx, %rsi
281 ; HYBRID-NEXT: subq $-128, %rsi
282 ; HYBRID-NEXT: orq %rdi, %r9
283 ; HYBRID-NEXT: cmovneq %rcx, %rsi
284 ; HYBRID-NEXT: movq %rsi, (%rax)
285 ; HYBRID-NEXT: movq $0, 8(%rax)
290 ; BURR-NEXT: movq %rdi, %rax
291 ; BURR-NEXT: xorps %xmm0, %xmm0
292 ; BURR-NEXT: movaps %xmm0, 16(%rdi)
293 ; BURR-NEXT: xorl %edi, %edi
294 ; BURR-NEXT: movq %rsi, %r11
295 ; BURR-NEXT: negq %r11
296 ; BURR-NEXT: movl $0, %r10d
297 ; BURR-NEXT: sbbq %rdx, %r10
298 ; BURR-NEXT: movl $0, %r9d
299 ; BURR-NEXT: sbbq %rcx, %r9
300 ; BURR-NEXT: sbbq %r8, %rdi
301 ; BURR-NEXT: andq %r8, %rdi
302 ; BURR-NEXT: bsrq %rdi, %r8
303 ; BURR-NEXT: xorq $63, %r8
304 ; BURR-NEXT: andq %rcx, %r9
305 ; BURR-NEXT: bsrq %r9, %rcx
306 ; BURR-NEXT: xorq $63, %rcx
307 ; BURR-NEXT: orq $64, %rcx
308 ; BURR-NEXT: testq %rdi, %rdi
309 ; BURR-NEXT: cmovneq %r8, %rcx
310 ; BURR-NEXT: andq %rdx, %r10
311 ; BURR-NEXT: bsrq %r10, %rdx
312 ; BURR-NEXT: xorq $63, %rdx
313 ; BURR-NEXT: andq %rsi, %r11
314 ; BURR-NEXT: movl $127, %esi
315 ; BURR-NEXT: bsrq %r11, %rsi
316 ; BURR-NEXT: xorq $63, %rsi
317 ; BURR-NEXT: addq $64, %rsi
318 ; BURR-NEXT: testq %r10, %r10
319 ; BURR-NEXT: cmovneq %rdx, %rsi
320 ; BURR-NEXT: subq $-128, %rsi
321 ; BURR-NEXT: orq %rdi, %r9
322 ; BURR-NEXT: cmovneq %rcx, %rsi
323 ; BURR-NEXT: movq %rsi, (%rax)
324 ; BURR-NEXT: movq $0, 8(%rax)
329 ; SRC-NEXT: movq %rdi, %rax
330 ; SRC-NEXT: xorl %edi, %edi
331 ; SRC-NEXT: movq %rsi, %r11
332 ; SRC-NEXT: negq %r11
333 ; SRC-NEXT: movl $0, %r10d
334 ; SRC-NEXT: sbbq %rdx, %r10
335 ; SRC-NEXT: movl $0, %r9d
336 ; SRC-NEXT: sbbq %rcx, %r9
337 ; SRC-NEXT: sbbq %r8, %rdi
338 ; SRC-NEXT: andq %rdx, %r10
339 ; SRC-NEXT: andq %rcx, %r9
340 ; SRC-NEXT: andq %r8, %rdi
341 ; SRC-NEXT: andq %rsi, %r11
342 ; SRC-NEXT: bsrq %rdi, %rcx
343 ; SRC-NEXT: xorq $63, %rcx
344 ; SRC-NEXT: bsrq %r9, %rdx
345 ; SRC-NEXT: xorq $63, %rdx
346 ; SRC-NEXT: orq $64, %rdx
347 ; SRC-NEXT: testq %rdi, %rdi
348 ; SRC-NEXT: cmovneq %rcx, %rdx
349 ; SRC-NEXT: bsrq %r10, %rcx
350 ; SRC-NEXT: xorq $63, %rcx
351 ; SRC-NEXT: movl $127, %esi
352 ; SRC-NEXT: bsrq %r11, %rsi
353 ; SRC-NEXT: xorq $63, %rsi
354 ; SRC-NEXT: addq $64, %rsi
355 ; SRC-NEXT: testq %r10, %r10
356 ; SRC-NEXT: cmovneq %rcx, %rsi
357 ; SRC-NEXT: subq $-128, %rsi
358 ; SRC-NEXT: orq %r9, %rdi
359 ; SRC-NEXT: cmovneq %rdx, %rsi
360 ; SRC-NEXT: xorps %xmm0, %xmm0
361 ; SRC-NEXT: movaps %xmm0, 16(%rax)
362 ; SRC-NEXT: movq %rsi, (%rax)
363 ; SRC-NEXT: movq $0, 8(%rax)
368 ; LIN-NEXT: movq %rdi, %rax
369 ; LIN-NEXT: xorps %xmm0, %xmm0
370 ; LIN-NEXT: movaps %xmm0, 16(%rdi)
371 ; LIN-NEXT: movl $127, %edi
372 ; LIN-NEXT: movq %rsi, %r9
374 ; LIN-NEXT: andq %rsi, %r9
375 ; LIN-NEXT: bsrq %r9, %rdi
376 ; LIN-NEXT: xorq $63, %rdi
377 ; LIN-NEXT: addq $64, %rdi
378 ; LIN-NEXT: xorl %esi, %esi
379 ; LIN-NEXT: movl $0, %r9d
380 ; LIN-NEXT: sbbq %rdx, %r9
381 ; LIN-NEXT: andq %rdx, %r9
382 ; LIN-NEXT: bsrq %r9, %rdx
383 ; LIN-NEXT: xorq $63, %rdx
384 ; LIN-NEXT: testq %r9, %r9
385 ; LIN-NEXT: cmoveq %rdi, %rdx
386 ; LIN-NEXT: subq $-128, %rdx
387 ; LIN-NEXT: movl $0, %edi
388 ; LIN-NEXT: sbbq %rcx, %rdi
389 ; LIN-NEXT: andq %rcx, %rdi
390 ; LIN-NEXT: bsrq %rdi, %rcx
391 ; LIN-NEXT: xorq $63, %rcx
392 ; LIN-NEXT: orq $64, %rcx
393 ; LIN-NEXT: sbbq %r8, %rsi
394 ; LIN-NEXT: andq %r8, %rsi
395 ; LIN-NEXT: bsrq %rsi, %r8
396 ; LIN-NEXT: xorq $63, %r8
397 ; LIN-NEXT: testq %rsi, %rsi
398 ; LIN-NEXT: cmoveq %rcx, %r8
399 ; LIN-NEXT: orq %rdi, %rsi
400 ; LIN-NEXT: cmoveq %rdx, %r8
401 ; LIN-NEXT: movq %r8, (%rax)
402 ; LIN-NEXT: movq $0, 8(%rax)
406 %d = call i256 @llvm.ctlz.i256(i256 %c, i1 false)
410 define i256 @test3(i256 %n) nounwind {
413 ; ILP-NEXT: movq %rdi, %rax
414 ; ILP-NEXT: xorps %xmm0, %xmm0
415 ; ILP-NEXT: movaps %xmm0, 16(%rdi)
416 ; ILP-NEXT: xorl %r9d, %r9d
417 ; ILP-NEXT: movq %rsi, %rdi
418 ; ILP-NEXT: negq %rdi
419 ; ILP-NEXT: movl $0, %r10d
420 ; ILP-NEXT: sbbq %rdx, %r10
421 ; ILP-NEXT: movl $0, %r11d
422 ; ILP-NEXT: sbbq %rcx, %r11
423 ; ILP-NEXT: sbbq %r8, %r9
425 ; ILP-NEXT: andq %r9, %r8
426 ; ILP-NEXT: bsrq %r8, %r9
427 ; ILP-NEXT: notq %rdx
428 ; ILP-NEXT: andq %r10, %rdx
429 ; ILP-NEXT: bsrq %rdx, %r10
430 ; ILP-NEXT: xorq $63, %r9
431 ; ILP-NEXT: notq %rcx
432 ; ILP-NEXT: andq %r11, %rcx
433 ; ILP-NEXT: bsrq %rcx, %r11
434 ; ILP-NEXT: xorq $63, %r11
435 ; ILP-NEXT: orq $64, %r11
436 ; ILP-NEXT: testq %r8, %r8
437 ; ILP-NEXT: cmovneq %r9, %r11
438 ; ILP-NEXT: xorq $63, %r10
439 ; ILP-NEXT: notq %rsi
440 ; ILP-NEXT: andq %rdi, %rsi
441 ; ILP-NEXT: movl $127, %edi
442 ; ILP-NEXT: bsrq %rsi, %rdi
443 ; ILP-NEXT: xorq $63, %rdi
444 ; ILP-NEXT: addq $64, %rdi
445 ; ILP-NEXT: testq %rdx, %rdx
446 ; ILP-NEXT: cmovneq %r10, %rdi
447 ; ILP-NEXT: subq $-128, %rdi
448 ; ILP-NEXT: orq %r8, %rcx
449 ; ILP-NEXT: cmovneq %r11, %rdi
450 ; ILP-NEXT: movq %rdi, (%rax)
451 ; ILP-NEXT: movq $0, 8(%rax)
454 ; HYBRID-LABEL: test3:
456 ; HYBRID-NEXT: pushq %rbx
457 ; HYBRID-NEXT: movq %rdi, %rax
458 ; HYBRID-NEXT: xorps %xmm0, %xmm0
459 ; HYBRID-NEXT: movaps %xmm0, 16(%rdi)
460 ; HYBRID-NEXT: xorl %r9d, %r9d
461 ; HYBRID-NEXT: movq %rsi, %rdi
462 ; HYBRID-NEXT: negq %rdi
463 ; HYBRID-NEXT: movl $0, %r10d
464 ; HYBRID-NEXT: sbbq %rdx, %r10
465 ; HYBRID-NEXT: movl $0, %r11d
466 ; HYBRID-NEXT: sbbq %rcx, %r11
467 ; HYBRID-NEXT: sbbq %r8, %r9
468 ; HYBRID-NEXT: notq %r8
469 ; HYBRID-NEXT: andq %r9, %r8
470 ; HYBRID-NEXT: bsrq %r8, %rbx
471 ; HYBRID-NEXT: xorq $63, %rbx
472 ; HYBRID-NEXT: notq %rcx
473 ; HYBRID-NEXT: andq %r11, %rcx
474 ; HYBRID-NEXT: bsrq %rcx, %r9
475 ; HYBRID-NEXT: xorq $63, %r9
476 ; HYBRID-NEXT: orq $64, %r9
477 ; HYBRID-NEXT: testq %r8, %r8
478 ; HYBRID-NEXT: cmovneq %rbx, %r9
479 ; HYBRID-NEXT: notq %rdx
480 ; HYBRID-NEXT: andq %r10, %rdx
481 ; HYBRID-NEXT: bsrq %rdx, %r10
482 ; HYBRID-NEXT: xorq $63, %r10
483 ; HYBRID-NEXT: notq %rsi
484 ; HYBRID-NEXT: andq %rdi, %rsi
485 ; HYBRID-NEXT: movl $127, %edi
486 ; HYBRID-NEXT: bsrq %rsi, %rdi
487 ; HYBRID-NEXT: xorq $63, %rdi
488 ; HYBRID-NEXT: addq $64, %rdi
489 ; HYBRID-NEXT: testq %rdx, %rdx
490 ; HYBRID-NEXT: cmovneq %r10, %rdi
491 ; HYBRID-NEXT: subq $-128, %rdi
492 ; HYBRID-NEXT: orq %r8, %rcx
493 ; HYBRID-NEXT: cmovneq %r9, %rdi
494 ; HYBRID-NEXT: movq %rdi, (%rax)
495 ; HYBRID-NEXT: movq $0, 8(%rax)
496 ; HYBRID-NEXT: popq %rbx
501 ; BURR-NEXT: pushq %rbx
502 ; BURR-NEXT: movq %rdi, %rax
503 ; BURR-NEXT: xorps %xmm0, %xmm0
504 ; BURR-NEXT: movaps %xmm0, 16(%rdi)
505 ; BURR-NEXT: xorl %r9d, %r9d
506 ; BURR-NEXT: movq %rsi, %rdi
507 ; BURR-NEXT: negq %rdi
508 ; BURR-NEXT: movl $0, %r10d
509 ; BURR-NEXT: sbbq %rdx, %r10
510 ; BURR-NEXT: movl $0, %r11d
511 ; BURR-NEXT: sbbq %rcx, %r11
512 ; BURR-NEXT: sbbq %r8, %r9
513 ; BURR-NEXT: notq %r8
514 ; BURR-NEXT: andq %r9, %r8
515 ; BURR-NEXT: bsrq %r8, %rbx
516 ; BURR-NEXT: xorq $63, %rbx
517 ; BURR-NEXT: notq %rcx
518 ; BURR-NEXT: andq %r11, %rcx
519 ; BURR-NEXT: bsrq %rcx, %r9
520 ; BURR-NEXT: xorq $63, %r9
521 ; BURR-NEXT: orq $64, %r9
522 ; BURR-NEXT: testq %r8, %r8
523 ; BURR-NEXT: cmovneq %rbx, %r9
524 ; BURR-NEXT: notq %rdx
525 ; BURR-NEXT: andq %r10, %rdx
526 ; BURR-NEXT: bsrq %rdx, %r10
527 ; BURR-NEXT: xorq $63, %r10
528 ; BURR-NEXT: notq %rsi
529 ; BURR-NEXT: andq %rdi, %rsi
530 ; BURR-NEXT: movl $127, %edi
531 ; BURR-NEXT: bsrq %rsi, %rdi
532 ; BURR-NEXT: xorq $63, %rdi
533 ; BURR-NEXT: addq $64, %rdi
534 ; BURR-NEXT: testq %rdx, %rdx
535 ; BURR-NEXT: cmovneq %r10, %rdi
536 ; BURR-NEXT: subq $-128, %rdi
537 ; BURR-NEXT: orq %r8, %rcx
538 ; BURR-NEXT: cmovneq %r9, %rdi
539 ; BURR-NEXT: movq %rdi, (%rax)
540 ; BURR-NEXT: movq $0, 8(%rax)
541 ; BURR-NEXT: popq %rbx
546 ; SRC-NEXT: movq %rdi, %rax
547 ; SRC-NEXT: movq %rsi, %rdi
548 ; SRC-NEXT: notq %rdi
549 ; SRC-NEXT: xorl %r9d, %r9d
550 ; SRC-NEXT: negq %rsi
551 ; SRC-NEXT: movl $0, %r10d
552 ; SRC-NEXT: sbbq %rdx, %r10
553 ; SRC-NEXT: notq %rdx
554 ; SRC-NEXT: movl $0, %r11d
555 ; SRC-NEXT: sbbq %rcx, %r11
556 ; SRC-NEXT: notq %rcx
557 ; SRC-NEXT: sbbq %r8, %r9
559 ; SRC-NEXT: andq %r10, %rdx
560 ; SRC-NEXT: andq %r11, %rcx
561 ; SRC-NEXT: andq %r9, %r8
562 ; SRC-NEXT: andq %rdi, %rsi
563 ; SRC-NEXT: bsrq %r8, %rdi
564 ; SRC-NEXT: xorq $63, %rdi
565 ; SRC-NEXT: bsrq %rcx, %r9
566 ; SRC-NEXT: xorq $63, %r9
567 ; SRC-NEXT: orq $64, %r9
568 ; SRC-NEXT: testq %r8, %r8
569 ; SRC-NEXT: cmovneq %rdi, %r9
570 ; SRC-NEXT: bsrq %rdx, %rdi
571 ; SRC-NEXT: xorq $63, %rdi
572 ; SRC-NEXT: movl $127, %r10d
573 ; SRC-NEXT: bsrq %rsi, %r10
574 ; SRC-NEXT: xorq $63, %r10
575 ; SRC-NEXT: addq $64, %r10
576 ; SRC-NEXT: testq %rdx, %rdx
577 ; SRC-NEXT: cmovneq %rdi, %r10
578 ; SRC-NEXT: subq $-128, %r10
579 ; SRC-NEXT: orq %rcx, %r8
580 ; SRC-NEXT: cmovneq %r9, %r10
581 ; SRC-NEXT: xorps %xmm0, %xmm0
582 ; SRC-NEXT: movaps %xmm0, 16(%rax)
583 ; SRC-NEXT: movq %r10, (%rax)
584 ; SRC-NEXT: movq $0, 8(%rax)
589 ; LIN-NEXT: movq %rdi, %rax
590 ; LIN-NEXT: xorps %xmm0, %xmm0
591 ; LIN-NEXT: movaps %xmm0, 16(%rdi)
592 ; LIN-NEXT: movl $127, %r9d
593 ; LIN-NEXT: movq %rsi, %rdi
594 ; LIN-NEXT: negq %rdi
595 ; LIN-NEXT: notq %rsi
596 ; LIN-NEXT: andq %rdi, %rsi
597 ; LIN-NEXT: bsrq %rsi, %r9
598 ; LIN-NEXT: xorq $63, %r9
599 ; LIN-NEXT: addq $64, %r9
600 ; LIN-NEXT: xorl %edi, %edi
601 ; LIN-NEXT: movl $0, %esi
602 ; LIN-NEXT: sbbq %rdx, %rsi
603 ; LIN-NEXT: notq %rdx
604 ; LIN-NEXT: andq %rsi, %rdx
605 ; LIN-NEXT: bsrq %rdx, %rsi
606 ; LIN-NEXT: xorq $63, %rsi
607 ; LIN-NEXT: testq %rdx, %rdx
608 ; LIN-NEXT: cmoveq %r9, %rsi
609 ; LIN-NEXT: subq $-128, %rsi
610 ; LIN-NEXT: movl $0, %edx
611 ; LIN-NEXT: sbbq %rcx, %rdx
612 ; LIN-NEXT: notq %rcx
613 ; LIN-NEXT: andq %rdx, %rcx
614 ; LIN-NEXT: bsrq %rcx, %rdx
615 ; LIN-NEXT: xorq $63, %rdx
616 ; LIN-NEXT: orq $64, %rdx
617 ; LIN-NEXT: sbbq %r8, %rdi
619 ; LIN-NEXT: andq %rdi, %r8
620 ; LIN-NEXT: bsrq %r8, %rdi
621 ; LIN-NEXT: xorq $63, %rdi
622 ; LIN-NEXT: testq %r8, %r8
623 ; LIN-NEXT: cmoveq %rdx, %rdi
624 ; LIN-NEXT: orq %rcx, %r8
625 ; LIN-NEXT: cmoveq %rsi, %rdi
626 ; LIN-NEXT: movq %rdi, (%rax)
627 ; LIN-NEXT: movq $0, 8(%rax)
632 %z = call i256 @llvm.ctlz.i256(i256 %y, i1 false)
636 declare i256 @llvm.ctlz.i256(i256, i1) nounwind readnone
638 define i64 @test4(i64 %a, i64 %b) nounwind {
641 ; ILP-NEXT: xorl %eax, %eax
642 ; ILP-NEXT: xorl %ecx, %ecx
643 ; ILP-NEXT: incq %rsi
645 ; ILP-NEXT: cmpq %rdi, %rsi
646 ; ILP-NEXT: sbbq $0, %rcx
647 ; ILP-NEXT: movl $0, %ecx
648 ; ILP-NEXT: sbbq %rcx, %rcx
649 ; ILP-NEXT: movl $0, %ecx
650 ; ILP-NEXT: sbbq %rcx, %rcx
651 ; ILP-NEXT: adcq $1, %rax
654 ; HYBRID-LABEL: test4:
656 ; HYBRID-NEXT: xorl %eax, %eax
657 ; HYBRID-NEXT: xorl %ecx, %ecx
658 ; HYBRID-NEXT: incq %rsi
659 ; HYBRID-NEXT: sete %cl
660 ; HYBRID-NEXT: cmpq %rdi, %rsi
661 ; HYBRID-NEXT: sbbq $0, %rcx
662 ; HYBRID-NEXT: movl $0, %ecx
663 ; HYBRID-NEXT: sbbq %rcx, %rcx
664 ; HYBRID-NEXT: movl $0, %ecx
665 ; HYBRID-NEXT: sbbq %rcx, %rcx
666 ; HYBRID-NEXT: adcq $1, %rax
671 ; BURR-NEXT: xorl %eax, %eax
672 ; BURR-NEXT: xorl %ecx, %ecx
673 ; BURR-NEXT: incq %rsi
674 ; BURR-NEXT: sete %cl
675 ; BURR-NEXT: cmpq %rdi, %rsi
676 ; BURR-NEXT: sbbq $0, %rcx
677 ; BURR-NEXT: movl $0, %ecx
678 ; BURR-NEXT: sbbq %rcx, %rcx
679 ; BURR-NEXT: movl $0, %ecx
680 ; BURR-NEXT: sbbq %rcx, %rcx
681 ; BURR-NEXT: adcq $1, %rax
686 ; SRC-NEXT: xorl %ecx, %ecx
687 ; SRC-NEXT: incq %rsi
689 ; SRC-NEXT: xorl %eax, %eax
690 ; SRC-NEXT: cmpq %rdi, %rsi
691 ; SRC-NEXT: sbbq $0, %rcx
692 ; SRC-NEXT: movl $0, %ecx
693 ; SRC-NEXT: sbbq %rcx, %rcx
694 ; SRC-NEXT: movl $0, %ecx
695 ; SRC-NEXT: sbbq %rcx, %rcx
696 ; SRC-NEXT: adcq $1, %rax
701 ; LIN-NEXT: xorl %eax, %eax
702 ; LIN-NEXT: xorl %ecx, %ecx
703 ; LIN-NEXT: incq %rsi
705 ; LIN-NEXT: cmpq %rdi, %rsi
706 ; LIN-NEXT: sbbq $0, %rcx
707 ; LIN-NEXT: movl $0, %ecx
708 ; LIN-NEXT: sbbq %rcx, %rcx
709 ; LIN-NEXT: movl $0, %ecx
710 ; LIN-NEXT: sbbq %rcx, %rcx
711 ; LIN-NEXT: adcq $1, %rax
713 %r = zext i64 %b to i256
715 %w = and i256 %u, 1461501637330902918203684832716283019655932542975
716 %x = zext i64 %a to i256
717 %c = icmp uge i256 %w, %x
718 %y = select i1 %c, i64 0, i64 1
723 define i256 @PR25498(i256 %a) nounwind {
724 ; ILP-LABEL: PR25498:
726 ; ILP-NEXT: pushq %rbx
727 ; ILP-NEXT: movq %rdi, %rax
728 ; ILP-NEXT: xorl %edi, %edi
729 ; ILP-NEXT: movq %rsi, %rbx
730 ; ILP-NEXT: negq %rbx
731 ; ILP-NEXT: movl $0, %r11d
732 ; ILP-NEXT: sbbq %rdx, %r11
733 ; ILP-NEXT: movl $0, %r9d
734 ; ILP-NEXT: sbbq %rcx, %r9
735 ; ILP-NEXT: movl $0, %r10d
736 ; ILP-NEXT: sbbq %r8, %r10
737 ; ILP-NEXT: orq %r8, %rdx
738 ; ILP-NEXT: orq %rcx, %rsi
739 ; ILP-NEXT: orq %rdx, %rsi
740 ; ILP-NEXT: je .LBB4_1
741 ; ILP-NEXT: # %bb.2: # %cond.false
742 ; ILP-NEXT: bsrq %r11, %rdx
743 ; ILP-NEXT: bsrq %r10, %rcx
744 ; ILP-NEXT: xorq $63, %rcx
745 ; ILP-NEXT: bsrq %r9, %rsi
746 ; ILP-NEXT: xorq $63, %rsi
747 ; ILP-NEXT: orq $64, %rsi
748 ; ILP-NEXT: testq %r10, %r10
749 ; ILP-NEXT: cmovneq %rcx, %rsi
750 ; ILP-NEXT: xorq $63, %rdx
751 ; ILP-NEXT: bsrq %rbx, %rcx
752 ; ILP-NEXT: xorq $63, %rcx
753 ; ILP-NEXT: orq $64, %rcx
754 ; ILP-NEXT: testq %r11, %r11
755 ; ILP-NEXT: cmovneq %rdx, %rcx
756 ; ILP-NEXT: orq $128, %rcx
757 ; ILP-NEXT: xorl %edi, %edi
758 ; ILP-NEXT: orq %r10, %r9
759 ; ILP-NEXT: cmovneq %rsi, %rcx
760 ; ILP-NEXT: jmp .LBB4_3
762 ; ILP-NEXT: movl $256, %ecx # imm = 0x100
763 ; ILP-NEXT: .LBB4_3: # %cond.end
764 ; ILP-NEXT: movq %rcx, (%rax)
765 ; ILP-NEXT: movq %rdi, 8(%rax)
766 ; ILP-NEXT: movq %rdi, 16(%rax)
767 ; ILP-NEXT: movq %rdi, 24(%rax)
768 ; ILP-NEXT: popq %rbx
771 ; HYBRID-LABEL: PR25498:
773 ; HYBRID-NEXT: pushq %rbx
774 ; HYBRID-NEXT: movq %rdi, %rax
775 ; HYBRID-NEXT: xorl %edi, %edi
776 ; HYBRID-NEXT: movq %rsi, %rbx
777 ; HYBRID-NEXT: negq %rbx
778 ; HYBRID-NEXT: movl $0, %r11d
779 ; HYBRID-NEXT: sbbq %rdx, %r11
780 ; HYBRID-NEXT: movl $0, %r9d
781 ; HYBRID-NEXT: sbbq %rcx, %r9
782 ; HYBRID-NEXT: movl $0, %r10d
783 ; HYBRID-NEXT: sbbq %r8, %r10
784 ; HYBRID-NEXT: orq %r8, %rdx
785 ; HYBRID-NEXT: orq %rcx, %rsi
786 ; HYBRID-NEXT: orq %rdx, %rsi
787 ; HYBRID-NEXT: je .LBB4_1
788 ; HYBRID-NEXT: # %bb.2: # %cond.false
789 ; HYBRID-NEXT: bsrq %r10, %rcx
790 ; HYBRID-NEXT: xorq $63, %rcx
791 ; HYBRID-NEXT: bsrq %r9, %rdx
792 ; HYBRID-NEXT: xorq $63, %rdx
793 ; HYBRID-NEXT: orq $64, %rdx
794 ; HYBRID-NEXT: testq %r10, %r10
795 ; HYBRID-NEXT: cmovneq %rcx, %rdx
796 ; HYBRID-NEXT: bsrq %r11, %rsi
797 ; HYBRID-NEXT: xorq $63, %rsi
798 ; HYBRID-NEXT: bsrq %rbx, %rcx
799 ; HYBRID-NEXT: xorq $63, %rcx
800 ; HYBRID-NEXT: orq $64, %rcx
801 ; HYBRID-NEXT: testq %r11, %r11
802 ; HYBRID-NEXT: cmovneq %rsi, %rcx
803 ; HYBRID-NEXT: orq $128, %rcx
804 ; HYBRID-NEXT: orq %r10, %r9
805 ; HYBRID-NEXT: cmovneq %rdx, %rcx
806 ; HYBRID-NEXT: xorl %edi, %edi
807 ; HYBRID-NEXT: jmp .LBB4_3
808 ; HYBRID-NEXT: .LBB4_1:
809 ; HYBRID-NEXT: movl $256, %ecx # imm = 0x100
810 ; HYBRID-NEXT: .LBB4_3: # %cond.end
811 ; HYBRID-NEXT: movq %rcx, (%rax)
812 ; HYBRID-NEXT: movq %rdi, 8(%rax)
813 ; HYBRID-NEXT: movq %rdi, 16(%rax)
814 ; HYBRID-NEXT: movq %rdi, 24(%rax)
815 ; HYBRID-NEXT: popq %rbx
818 ; BURR-LABEL: PR25498:
820 ; BURR-NEXT: pushq %rbx
821 ; BURR-NEXT: movq %rdi, %rax
822 ; BURR-NEXT: xorl %edi, %edi
823 ; BURR-NEXT: movq %rsi, %rbx
824 ; BURR-NEXT: negq %rbx
825 ; BURR-NEXT: movl $0, %r11d
826 ; BURR-NEXT: sbbq %rdx, %r11
827 ; BURR-NEXT: movl $0, %r9d
828 ; BURR-NEXT: sbbq %rcx, %r9
829 ; BURR-NEXT: movl $0, %r10d
830 ; BURR-NEXT: sbbq %r8, %r10
831 ; BURR-NEXT: orq %r8, %rdx
832 ; BURR-NEXT: orq %rcx, %rsi
833 ; BURR-NEXT: orq %rdx, %rsi
834 ; BURR-NEXT: je .LBB4_1
835 ; BURR-NEXT: # %bb.2: # %cond.false
836 ; BURR-NEXT: bsrq %r10, %rcx
837 ; BURR-NEXT: xorq $63, %rcx
838 ; BURR-NEXT: bsrq %r9, %rdx
839 ; BURR-NEXT: xorq $63, %rdx
840 ; BURR-NEXT: orq $64, %rdx
841 ; BURR-NEXT: testq %r10, %r10
842 ; BURR-NEXT: cmovneq %rcx, %rdx
843 ; BURR-NEXT: bsrq %r11, %rsi
844 ; BURR-NEXT: xorq $63, %rsi
845 ; BURR-NEXT: bsrq %rbx, %rcx
846 ; BURR-NEXT: xorq $63, %rcx
847 ; BURR-NEXT: orq $64, %rcx
848 ; BURR-NEXT: testq %r11, %r11
849 ; BURR-NEXT: cmovneq %rsi, %rcx
850 ; BURR-NEXT: orq $128, %rcx
851 ; BURR-NEXT: orq %r10, %r9
852 ; BURR-NEXT: cmovneq %rdx, %rcx
853 ; BURR-NEXT: xorl %edi, %edi
854 ; BURR-NEXT: jmp .LBB4_3
855 ; BURR-NEXT: .LBB4_1:
856 ; BURR-NEXT: movl $256, %ecx # imm = 0x100
857 ; BURR-NEXT: .LBB4_3: # %cond.end
858 ; BURR-NEXT: movq %rcx, (%rax)
859 ; BURR-NEXT: movq %rdi, 8(%rax)
860 ; BURR-NEXT: movq %rdi, 16(%rax)
861 ; BURR-NEXT: movq %rdi, 24(%rax)
862 ; BURR-NEXT: popq %rbx
865 ; SRC-LABEL: PR25498:
867 ; SRC-NEXT: pushq %rbx
868 ; SRC-NEXT: movq %rdi, %rax
869 ; SRC-NEXT: xorl %edi, %edi
870 ; SRC-NEXT: movq %rsi, %rbx
871 ; SRC-NEXT: negq %rbx
872 ; SRC-NEXT: movl $0, %r11d
873 ; SRC-NEXT: sbbq %rdx, %r11
874 ; SRC-NEXT: movl $0, %r9d
875 ; SRC-NEXT: sbbq %rcx, %r9
876 ; SRC-NEXT: movl $0, %r10d
877 ; SRC-NEXT: sbbq %r8, %r10
878 ; SRC-NEXT: orq %r8, %rdx
879 ; SRC-NEXT: orq %rcx, %rsi
880 ; SRC-NEXT: orq %rdx, %rsi
881 ; SRC-NEXT: je .LBB4_1
882 ; SRC-NEXT: # %bb.2: # %cond.false
883 ; SRC-NEXT: bsrq %r10, %rcx
884 ; SRC-NEXT: xorq $63, %rcx
885 ; SRC-NEXT: bsrq %r9, %rdx
886 ; SRC-NEXT: xorq $63, %rdx
887 ; SRC-NEXT: orq $64, %rdx
888 ; SRC-NEXT: testq %r10, %r10
889 ; SRC-NEXT: cmovneq %rcx, %rdx
890 ; SRC-NEXT: bsrq %r11, %rsi
891 ; SRC-NEXT: xorq $63, %rsi
892 ; SRC-NEXT: bsrq %rbx, %rcx
893 ; SRC-NEXT: xorq $63, %rcx
894 ; SRC-NEXT: orq $64, %rcx
895 ; SRC-NEXT: testq %r11, %r11
896 ; SRC-NEXT: cmovneq %rsi, %rcx
897 ; SRC-NEXT: orq $128, %rcx
898 ; SRC-NEXT: orq %r10, %r9
899 ; SRC-NEXT: cmovneq %rdx, %rcx
900 ; SRC-NEXT: xorl %edi, %edi
901 ; SRC-NEXT: jmp .LBB4_3
903 ; SRC-NEXT: movl $256, %ecx # imm = 0x100
904 ; SRC-NEXT: .LBB4_3: # %cond.end
905 ; SRC-NEXT: movq %rcx, (%rax)
906 ; SRC-NEXT: movq %rdi, 8(%rax)
907 ; SRC-NEXT: movq %rdi, 16(%rax)
908 ; SRC-NEXT: movq %rdi, 24(%rax)
909 ; SRC-NEXT: popq %rbx
912 ; LIN-LABEL: PR25498:
914 ; LIN-NEXT: pushq %rbx
915 ; LIN-NEXT: movq %rdi, %rax
916 ; LIN-NEXT: movq %rsi, %rbx
917 ; LIN-NEXT: negq %rbx
918 ; LIN-NEXT: xorl %edi, %edi
919 ; LIN-NEXT: movl $0, %r11d
920 ; LIN-NEXT: sbbq %rdx, %r11
921 ; LIN-NEXT: movl $0, %r9d
922 ; LIN-NEXT: sbbq %rcx, %r9
923 ; LIN-NEXT: movl $0, %r10d
924 ; LIN-NEXT: sbbq %r8, %r10
925 ; LIN-NEXT: orq %rcx, %rsi
926 ; LIN-NEXT: orq %r8, %rdx
927 ; LIN-NEXT: orq %rsi, %rdx
928 ; LIN-NEXT: je .LBB4_1
929 ; LIN-NEXT: # %bb.2: # %cond.false
930 ; LIN-NEXT: bsrq %rbx, %rcx
931 ; LIN-NEXT: xorq $63, %rcx
932 ; LIN-NEXT: orq $64, %rcx
933 ; LIN-NEXT: bsrq %r11, %rdx
934 ; LIN-NEXT: xorq $63, %rdx
935 ; LIN-NEXT: testq %r11, %r11
936 ; LIN-NEXT: cmoveq %rcx, %rdx
937 ; LIN-NEXT: orq $128, %rdx
938 ; LIN-NEXT: bsrq %r9, %rsi
939 ; LIN-NEXT: xorq $63, %rsi
940 ; LIN-NEXT: orq $64, %rsi
941 ; LIN-NEXT: bsrq %r10, %rcx
942 ; LIN-NEXT: xorq $63, %rcx
943 ; LIN-NEXT: testq %r10, %r10
944 ; LIN-NEXT: cmoveq %rsi, %rcx
945 ; LIN-NEXT: orq %r10, %r9
946 ; LIN-NEXT: cmoveq %rdx, %rcx
947 ; LIN-NEXT: xorl %edi, %edi
948 ; LIN-NEXT: jmp .LBB4_3
950 ; LIN-NEXT: movl $256, %ecx # imm = 0x100
951 ; LIN-NEXT: .LBB4_3: # %cond.end
952 ; LIN-NEXT: movq %rcx, (%rax)
953 ; LIN-NEXT: movq %rdi, 8(%rax)
954 ; LIN-NEXT: movq %rdi, 16(%rax)
955 ; LIN-NEXT: movq %rdi, 24(%rax)
956 ; LIN-NEXT: popq %rbx
959 %cmpz = icmp eq i256 %b, 0
960 br i1 %cmpz, label %cond.end, label %cond.false
963 %d = call i256 @llvm.ctlz.i256(i256 %b, i1 true)
967 %ctz = phi i256 [ 256, %0 ], [ %d, %cond.false ]