1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=X64
3 ; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefix=X86
7 define i32 @and_signbit_select_shl(i32 %x, i1 %cond, ptr %dst) {
8 ; X64-LABEL: and_signbit_select_shl:
10 ; X64-NEXT: movl %edi, %eax
11 ; X64-NEXT: andl $16711680, %eax # imm = 0xFF0000
12 ; X64-NEXT: testb $1, %sil
13 ; X64-NEXT: cmovel %edi, %eax
14 ; X64-NEXT: shll $8, %eax
15 ; X64-NEXT: movl %eax, (%rdx)
18 ; X86-LABEL: and_signbit_select_shl:
20 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
21 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
22 ; X86-NEXT: testb $1, {{[0-9]+}}(%esp)
23 ; X86-NEXT: je .LBB0_2
25 ; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000
27 ; X86-NEXT: shll $8, %eax
28 ; X86-NEXT: movl %eax, (%ecx)
30 %t0 = and i32 %x, 4294901760 ; 0xFFFF0000
31 %t1 = select i1 %cond, i32 %t0, i32 %x
33 store i32 %r, ptr %dst
36 define i32 @and_nosignbit_select_shl(i32 %x, i1 %cond, ptr %dst) {
37 ; X64-LABEL: and_nosignbit_select_shl:
39 ; X64-NEXT: movl %edi, %eax
40 ; X64-NEXT: andl $16711680, %eax # imm = 0xFF0000
41 ; X64-NEXT: testb $1, %sil
42 ; X64-NEXT: cmovel %edi, %eax
43 ; X64-NEXT: shll $8, %eax
44 ; X64-NEXT: movl %eax, (%rdx)
47 ; X86-LABEL: and_nosignbit_select_shl:
49 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
50 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
51 ; X86-NEXT: testb $1, {{[0-9]+}}(%esp)
52 ; X86-NEXT: je .LBB1_2
54 ; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000
56 ; X86-NEXT: shll $8, %eax
57 ; X86-NEXT: movl %eax, (%ecx)
59 %t0 = and i32 %x, 2147418112 ; 0x7FFF0000
60 %t1 = select i1 %cond, i32 %t0, i32 %x
62 store i32 %r, ptr %dst
66 define i32 @or_signbit_select_shl(i32 %x, i1 %cond, ptr %dst) {
67 ; X64-LABEL: or_signbit_select_shl:
69 ; X64-NEXT: movl %edi, %eax
70 ; X64-NEXT: orl $16711680, %eax # imm = 0xFF0000
71 ; X64-NEXT: testb $1, %sil
72 ; X64-NEXT: cmovel %edi, %eax
73 ; X64-NEXT: shll $8, %eax
74 ; X64-NEXT: movl %eax, (%rdx)
77 ; X86-LABEL: or_signbit_select_shl:
79 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
80 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
81 ; X86-NEXT: andl $1, %eax
83 ; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000
84 ; X86-NEXT: orl {{[0-9]+}}(%esp), %eax
85 ; X86-NEXT: shll $8, %eax
86 ; X86-NEXT: movl %eax, (%ecx)
88 %t0 = or i32 %x, 4294901760 ; 0xFFFF0000
89 %t1 = select i1 %cond, i32 %t0, i32 %x
91 store i32 %r, ptr %dst
94 define i32 @or_nosignbit_select_shl(i32 %x, i1 %cond, ptr %dst) {
95 ; X64-LABEL: or_nosignbit_select_shl:
97 ; X64-NEXT: movl %edi, %eax
98 ; X64-NEXT: orl $16711680, %eax # imm = 0xFF0000
99 ; X64-NEXT: testb $1, %sil
100 ; X64-NEXT: cmovel %edi, %eax
101 ; X64-NEXT: shll $8, %eax
102 ; X64-NEXT: movl %eax, (%rdx)
105 ; X86-LABEL: or_nosignbit_select_shl:
107 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
108 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
109 ; X86-NEXT: andl $1, %eax
110 ; X86-NEXT: negl %eax
111 ; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000
112 ; X86-NEXT: orl {{[0-9]+}}(%esp), %eax
113 ; X86-NEXT: shll $8, %eax
114 ; X86-NEXT: movl %eax, (%ecx)
116 %t0 = or i32 %x, 2147418112 ; 0x7FFF0000
117 %t1 = select i1 %cond, i32 %t0, i32 %x
119 store i32 %r, ptr %dst
123 define i32 @xor_signbit_select_shl(i32 %x, i1 %cond, ptr %dst) {
124 ; X64-LABEL: xor_signbit_select_shl:
126 ; X64-NEXT: movl %edi, %eax
127 ; X64-NEXT: xorl $16711680, %eax # imm = 0xFF0000
128 ; X64-NEXT: testb $1, %sil
129 ; X64-NEXT: cmovel %edi, %eax
130 ; X64-NEXT: shll $8, %eax
131 ; X64-NEXT: movl %eax, (%rdx)
134 ; X86-LABEL: xor_signbit_select_shl:
136 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
137 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
138 ; X86-NEXT: andl $1, %eax
139 ; X86-NEXT: negl %eax
140 ; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000
141 ; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax
142 ; X86-NEXT: shll $8, %eax
143 ; X86-NEXT: movl %eax, (%ecx)
145 %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000
146 %t1 = select i1 %cond, i32 %t0, i32 %x
148 store i32 %r, ptr %dst
151 define i32 @xor_nosignbit_select_shl(i32 %x, i1 %cond, ptr %dst) {
152 ; X64-LABEL: xor_nosignbit_select_shl:
154 ; X64-NEXT: movl %edi, %eax
155 ; X64-NEXT: xorl $16711680, %eax # imm = 0xFF0000
156 ; X64-NEXT: testb $1, %sil
157 ; X64-NEXT: cmovel %edi, %eax
158 ; X64-NEXT: shll $8, %eax
159 ; X64-NEXT: movl %eax, (%rdx)
162 ; X86-LABEL: xor_nosignbit_select_shl:
164 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
165 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
166 ; X86-NEXT: andl $1, %eax
167 ; X86-NEXT: negl %eax
168 ; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000
169 ; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax
170 ; X86-NEXT: shll $8, %eax
171 ; X86-NEXT: movl %eax, (%ecx)
173 %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000
174 %t1 = select i1 %cond, i32 %t0, i32 %x
176 store i32 %r, ptr %dst
180 define i32 @add_signbit_select_shl(i32 %x, i1 %cond, ptr %dst) {
181 ; X64-LABEL: add_signbit_select_shl:
183 ; X64-NEXT: # kill: def $edi killed $edi def $rdi
184 ; X64-NEXT: leal -65536(%rdi), %eax
185 ; X64-NEXT: testb $1, %sil
186 ; X64-NEXT: cmovel %edi, %eax
187 ; X64-NEXT: shll $8, %eax
188 ; X64-NEXT: movl %eax, (%rdx)
191 ; X86-LABEL: add_signbit_select_shl:
193 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
194 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
195 ; X86-NEXT: andl $1, %eax
196 ; X86-NEXT: negl %eax
197 ; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000
198 ; X86-NEXT: addl {{[0-9]+}}(%esp), %eax
199 ; X86-NEXT: shll $8, %eax
200 ; X86-NEXT: movl %eax, (%ecx)
202 %t0 = add i32 %x, 4294901760 ; 0xFFFF0000
203 %t1 = select i1 %cond, i32 %t0, i32 %x
205 store i32 %r, ptr %dst
208 define i32 @add_nosignbit_select_shl(i32 %x, i1 %cond, ptr %dst) {
209 ; X64-LABEL: add_nosignbit_select_shl:
211 ; X64-NEXT: # kill: def $edi killed $edi def $rdi
212 ; X64-NEXT: leal 2147418112(%rdi), %eax
213 ; X64-NEXT: testb $1, %sil
214 ; X64-NEXT: cmovel %edi, %eax
215 ; X64-NEXT: shll $8, %eax
216 ; X64-NEXT: movl %eax, (%rdx)
219 ; X86-LABEL: add_nosignbit_select_shl:
221 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
222 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
223 ; X86-NEXT: andl $1, %eax
224 ; X86-NEXT: negl %eax
225 ; X86-NEXT: andl $16711680, %eax # imm = 0xFF0000
226 ; X86-NEXT: addl {{[0-9]+}}(%esp), %eax
227 ; X86-NEXT: shll $8, %eax
228 ; X86-NEXT: movl %eax, (%ecx)
230 %t0 = add i32 %x, 2147418112 ; 0x7FFF0000
231 %t1 = select i1 %cond, i32 %t0, i32 %x
233 store i32 %r, ptr %dst
237 ; logical shift right
239 define i32 @and_signbit_select_lshr(i32 %x, i1 %cond, ptr %dst) {
240 ; X64-LABEL: and_signbit_select_lshr:
242 ; X64-NEXT: movl %edi, %eax
243 ; X64-NEXT: andl $-65536, %eax # imm = 0xFFFF0000
244 ; X64-NEXT: testb $1, %sil
245 ; X64-NEXT: cmovel %edi, %eax
246 ; X64-NEXT: shrl $8, %eax
247 ; X64-NEXT: movl %eax, (%rdx)
250 ; X86-LABEL: and_signbit_select_lshr:
252 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
253 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
254 ; X86-NEXT: testb $1, {{[0-9]+}}(%esp)
255 ; X86-NEXT: je .LBB8_2
257 ; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000
259 ; X86-NEXT: shrl $8, %eax
260 ; X86-NEXT: movl %eax, (%ecx)
262 %t0 = and i32 %x, 4294901760 ; 0xFFFF0000
263 %t1 = select i1 %cond, i32 %t0, i32 %x
265 store i32 %r, ptr %dst
268 define i32 @and_nosignbit_select_lshr(i32 %x, i1 %cond, ptr %dst) {
269 ; X64-LABEL: and_nosignbit_select_lshr:
271 ; X64-NEXT: movl %edi, %eax
272 ; X64-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000
273 ; X64-NEXT: testb $1, %sil
274 ; X64-NEXT: cmovel %edi, %eax
275 ; X64-NEXT: shrl $8, %eax
276 ; X64-NEXT: movl %eax, (%rdx)
279 ; X86-LABEL: and_nosignbit_select_lshr:
281 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
282 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
283 ; X86-NEXT: testb $1, {{[0-9]+}}(%esp)
284 ; X86-NEXT: je .LBB9_2
286 ; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000
288 ; X86-NEXT: shrl $8, %eax
289 ; X86-NEXT: movl %eax, (%ecx)
291 %t0 = and i32 %x, 2147418112 ; 0x7FFF0000
292 %t1 = select i1 %cond, i32 %t0, i32 %x
294 store i32 %r, ptr %dst
298 define i32 @or_signbit_select_lshr(i32 %x, i1 %cond, ptr %dst) {
299 ; X64-LABEL: or_signbit_select_lshr:
301 ; X64-NEXT: movl %edi, %eax
302 ; X64-NEXT: orl $-65536, %eax # imm = 0xFFFF0000
303 ; X64-NEXT: testb $1, %sil
304 ; X64-NEXT: cmovel %edi, %eax
305 ; X64-NEXT: shrl $8, %eax
306 ; X64-NEXT: movl %eax, (%rdx)
309 ; X86-LABEL: or_signbit_select_lshr:
311 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
312 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
313 ; X86-NEXT: andl $1, %eax
314 ; X86-NEXT: negl %eax
315 ; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000
316 ; X86-NEXT: orl {{[0-9]+}}(%esp), %eax
317 ; X86-NEXT: shrl $8, %eax
318 ; X86-NEXT: movl %eax, (%ecx)
320 %t0 = or i32 %x, 4294901760 ; 0xFFFF0000
321 %t1 = select i1 %cond, i32 %t0, i32 %x
323 store i32 %r, ptr %dst
326 define i32 @or_nosignbit_select_lshr(i32 %x, i1 %cond, ptr %dst) {
327 ; X64-LABEL: or_nosignbit_select_lshr:
329 ; X64-NEXT: movl %edi, %eax
330 ; X64-NEXT: orl $2147418112, %eax # imm = 0x7FFF0000
331 ; X64-NEXT: testb $1, %sil
332 ; X64-NEXT: cmovel %edi, %eax
333 ; X64-NEXT: shrl $8, %eax
334 ; X64-NEXT: movl %eax, (%rdx)
337 ; X86-LABEL: or_nosignbit_select_lshr:
339 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
340 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
341 ; X86-NEXT: andl $1, %eax
342 ; X86-NEXT: negl %eax
343 ; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000
344 ; X86-NEXT: orl {{[0-9]+}}(%esp), %eax
345 ; X86-NEXT: shrl $8, %eax
346 ; X86-NEXT: movl %eax, (%ecx)
348 %t0 = or i32 %x, 2147418112 ; 0x7FFF0000
349 %t1 = select i1 %cond, i32 %t0, i32 %x
351 store i32 %r, ptr %dst
355 define i32 @xor_signbit_select_lshr(i32 %x, i1 %cond, ptr %dst) {
356 ; X64-LABEL: xor_signbit_select_lshr:
358 ; X64-NEXT: movl %edi, %eax
359 ; X64-NEXT: xorl $-65536, %eax # imm = 0xFFFF0000
360 ; X64-NEXT: testb $1, %sil
361 ; X64-NEXT: cmovel %edi, %eax
362 ; X64-NEXT: shrl $8, %eax
363 ; X64-NEXT: movl %eax, (%rdx)
366 ; X86-LABEL: xor_signbit_select_lshr:
368 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
369 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
370 ; X86-NEXT: andl $1, %eax
371 ; X86-NEXT: negl %eax
372 ; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000
373 ; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax
374 ; X86-NEXT: shrl $8, %eax
375 ; X86-NEXT: movl %eax, (%ecx)
377 %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000
378 %t1 = select i1 %cond, i32 %t0, i32 %x
380 store i32 %r, ptr %dst
383 define i32 @xor_nosignbit_select_lshr(i32 %x, i1 %cond, ptr %dst) {
384 ; X64-LABEL: xor_nosignbit_select_lshr:
386 ; X64-NEXT: movl %edi, %eax
387 ; X64-NEXT: xorl $2147418112, %eax # imm = 0x7FFF0000
388 ; X64-NEXT: testb $1, %sil
389 ; X64-NEXT: cmovel %edi, %eax
390 ; X64-NEXT: shrl $8, %eax
391 ; X64-NEXT: movl %eax, (%rdx)
394 ; X86-LABEL: xor_nosignbit_select_lshr:
396 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
397 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
398 ; X86-NEXT: andl $1, %eax
399 ; X86-NEXT: negl %eax
400 ; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000
401 ; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax
402 ; X86-NEXT: shrl $8, %eax
403 ; X86-NEXT: movl %eax, (%ecx)
405 %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000
406 %t1 = select i1 %cond, i32 %t0, i32 %x
408 store i32 %r, ptr %dst
412 define i32 @add_signbit_select_lshr(i32 %x, i1 %cond, ptr %dst) {
413 ; X64-LABEL: add_signbit_select_lshr:
415 ; X64-NEXT: # kill: def $edi killed $edi def $rdi
416 ; X64-NEXT: leal -65536(%rdi), %eax
417 ; X64-NEXT: testb $1, %sil
418 ; X64-NEXT: cmovel %edi, %eax
419 ; X64-NEXT: shrl $8, %eax
420 ; X64-NEXT: movl %eax, (%rdx)
423 ; X86-LABEL: add_signbit_select_lshr:
425 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
426 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
427 ; X86-NEXT: andl $1, %eax
428 ; X86-NEXT: negl %eax
429 ; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000
430 ; X86-NEXT: addl {{[0-9]+}}(%esp), %eax
431 ; X86-NEXT: shrl $8, %eax
432 ; X86-NEXT: movl %eax, (%ecx)
434 %t0 = add i32 %x, 4294901760 ; 0xFFFF0000
435 %t1 = select i1 %cond, i32 %t0, i32 %x
437 store i32 %r, ptr %dst
440 define i32 @add_nosignbit_select_lshr(i32 %x, i1 %cond, ptr %dst) {
441 ; X64-LABEL: add_nosignbit_select_lshr:
443 ; X64-NEXT: # kill: def $edi killed $edi def $rdi
444 ; X64-NEXT: leal 2147418112(%rdi), %eax
445 ; X64-NEXT: testb $1, %sil
446 ; X64-NEXT: cmovel %edi, %eax
447 ; X64-NEXT: shrl $8, %eax
448 ; X64-NEXT: movl %eax, (%rdx)
451 ; X86-LABEL: add_nosignbit_select_lshr:
453 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
454 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
455 ; X86-NEXT: andl $1, %eax
456 ; X86-NEXT: negl %eax
457 ; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000
458 ; X86-NEXT: addl {{[0-9]+}}(%esp), %eax
459 ; X86-NEXT: shrl $8, %eax
460 ; X86-NEXT: movl %eax, (%ecx)
462 %t0 = add i32 %x, 2147418112 ; 0x7FFF0000
463 %t1 = select i1 %cond, i32 %t0, i32 %x
465 store i32 %r, ptr %dst
469 ; arithmetic shift right
471 define i32 @and_signbit_select_ashr(i32 %x, i1 %cond, ptr %dst) {
472 ; X64-LABEL: and_signbit_select_ashr:
474 ; X64-NEXT: movl %edi, %eax
475 ; X64-NEXT: andl $-65536, %eax # imm = 0xFFFF0000
476 ; X64-NEXT: testb $1, %sil
477 ; X64-NEXT: cmovel %edi, %eax
478 ; X64-NEXT: sarl $8, %eax
479 ; X64-NEXT: movl %eax, (%rdx)
482 ; X86-LABEL: and_signbit_select_ashr:
484 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
485 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
486 ; X86-NEXT: testb $1, {{[0-9]+}}(%esp)
487 ; X86-NEXT: je .LBB16_2
489 ; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000
490 ; X86-NEXT: .LBB16_2:
491 ; X86-NEXT: sarl $8, %eax
492 ; X86-NEXT: movl %eax, (%ecx)
494 %t0 = and i32 %x, 4294901760 ; 0xFFFF0000
495 %t1 = select i1 %cond, i32 %t0, i32 %x
497 store i32 %r, ptr %dst
500 define i32 @and_nosignbit_select_ashr(i32 %x, i1 %cond, ptr %dst) {
501 ; X64-LABEL: and_nosignbit_select_ashr:
503 ; X64-NEXT: movl %edi, %eax
504 ; X64-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000
505 ; X64-NEXT: testb $1, %sil
506 ; X64-NEXT: cmovel %edi, %eax
507 ; X64-NEXT: sarl $8, %eax
508 ; X64-NEXT: movl %eax, (%rdx)
511 ; X86-LABEL: and_nosignbit_select_ashr:
513 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
514 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
515 ; X86-NEXT: testb $1, {{[0-9]+}}(%esp)
516 ; X86-NEXT: je .LBB17_2
518 ; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000
519 ; X86-NEXT: .LBB17_2:
520 ; X86-NEXT: sarl $8, %eax
521 ; X86-NEXT: movl %eax, (%ecx)
523 %t0 = and i32 %x, 2147418112 ; 0x7FFF0000
524 %t1 = select i1 %cond, i32 %t0, i32 %x
526 store i32 %r, ptr %dst
530 define i32 @or_signbit_select_ashr(i32 %x, i1 %cond, ptr %dst) {
531 ; X64-LABEL: or_signbit_select_ashr:
533 ; X64-NEXT: movl %edi, %eax
534 ; X64-NEXT: orl $-65536, %eax # imm = 0xFFFF0000
535 ; X64-NEXT: testb $1, %sil
536 ; X64-NEXT: cmovel %edi, %eax
537 ; X64-NEXT: sarl $8, %eax
538 ; X64-NEXT: movl %eax, (%rdx)
541 ; X86-LABEL: or_signbit_select_ashr:
543 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
544 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
545 ; X86-NEXT: andl $1, %eax
546 ; X86-NEXT: negl %eax
547 ; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000
548 ; X86-NEXT: orl {{[0-9]+}}(%esp), %eax
549 ; X86-NEXT: sarl $8, %eax
550 ; X86-NEXT: movl %eax, (%ecx)
552 %t0 = or i32 %x, 4294901760 ; 0xFFFF0000
553 %t1 = select i1 %cond, i32 %t0, i32 %x
555 store i32 %r, ptr %dst
558 define i32 @or_nosignbit_select_ashr(i32 %x, i1 %cond, ptr %dst) {
559 ; X64-LABEL: or_nosignbit_select_ashr:
561 ; X64-NEXT: movl %edi, %eax
562 ; X64-NEXT: orl $2147418112, %eax # imm = 0x7FFF0000
563 ; X64-NEXT: testb $1, %sil
564 ; X64-NEXT: cmovel %edi, %eax
565 ; X64-NEXT: sarl $8, %eax
566 ; X64-NEXT: movl %eax, (%rdx)
569 ; X86-LABEL: or_nosignbit_select_ashr:
571 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
572 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
573 ; X86-NEXT: andl $1, %eax
574 ; X86-NEXT: negl %eax
575 ; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000
576 ; X86-NEXT: orl {{[0-9]+}}(%esp), %eax
577 ; X86-NEXT: sarl $8, %eax
578 ; X86-NEXT: movl %eax, (%ecx)
580 %t0 = or i32 %x, 2147418112 ; 0x7FFF0000
581 %t1 = select i1 %cond, i32 %t0, i32 %x
583 store i32 %r, ptr %dst
587 define i32 @xor_signbit_select_ashr(i32 %x, i1 %cond, ptr %dst) {
588 ; X64-LABEL: xor_signbit_select_ashr:
590 ; X64-NEXT: movl %edi, %eax
591 ; X64-NEXT: xorl $-65536, %eax # imm = 0xFFFF0000
592 ; X64-NEXT: testb $1, %sil
593 ; X64-NEXT: cmovel %edi, %eax
594 ; X64-NEXT: sarl $8, %eax
595 ; X64-NEXT: movl %eax, (%rdx)
598 ; X86-LABEL: xor_signbit_select_ashr:
600 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
601 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
602 ; X86-NEXT: andl $1, %eax
603 ; X86-NEXT: negl %eax
604 ; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000
605 ; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax
606 ; X86-NEXT: sarl $8, %eax
607 ; X86-NEXT: movl %eax, (%ecx)
609 %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000
610 %t1 = select i1 %cond, i32 %t0, i32 %x
612 store i32 %r, ptr %dst
615 define i32 @xor_nosignbit_select_ashr(i32 %x, i1 %cond, ptr %dst) {
616 ; X64-LABEL: xor_nosignbit_select_ashr:
618 ; X64-NEXT: movl %edi, %eax
619 ; X64-NEXT: xorl $2147418112, %eax # imm = 0x7FFF0000
620 ; X64-NEXT: testb $1, %sil
621 ; X64-NEXT: cmovel %edi, %eax
622 ; X64-NEXT: sarl $8, %eax
623 ; X64-NEXT: movl %eax, (%rdx)
626 ; X86-LABEL: xor_nosignbit_select_ashr:
628 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
629 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
630 ; X86-NEXT: andl $1, %eax
631 ; X86-NEXT: negl %eax
632 ; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000
633 ; X86-NEXT: xorl {{[0-9]+}}(%esp), %eax
634 ; X86-NEXT: sarl $8, %eax
635 ; X86-NEXT: movl %eax, (%ecx)
637 %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000
638 %t1 = select i1 %cond, i32 %t0, i32 %x
640 store i32 %r, ptr %dst
644 define i32 @add_signbit_select_ashr(i32 %x, i1 %cond, ptr %dst) {
645 ; X64-LABEL: add_signbit_select_ashr:
647 ; X64-NEXT: # kill: def $edi killed $edi def $rdi
648 ; X64-NEXT: leal -65536(%rdi), %eax
649 ; X64-NEXT: testb $1, %sil
650 ; X64-NEXT: cmovel %edi, %eax
651 ; X64-NEXT: sarl $8, %eax
652 ; X64-NEXT: movl %eax, (%rdx)
655 ; X86-LABEL: add_signbit_select_ashr:
657 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
658 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
659 ; X86-NEXT: andl $1, %eax
660 ; X86-NEXT: negl %eax
661 ; X86-NEXT: andl $-65536, %eax # imm = 0xFFFF0000
662 ; X86-NEXT: addl {{[0-9]+}}(%esp), %eax
663 ; X86-NEXT: sarl $8, %eax
664 ; X86-NEXT: movl %eax, (%ecx)
666 %t0 = add i32 %x, 4294901760 ; 0xFFFF0000
667 %t1 = select i1 %cond, i32 %t0, i32 %x
669 store i32 %r, ptr %dst
672 define i32 @add_nosignbit_select_ashr(i32 %x, i1 %cond, ptr %dst) {
673 ; X64-LABEL: add_nosignbit_select_ashr:
675 ; X64-NEXT: # kill: def $edi killed $edi def $rdi
676 ; X64-NEXT: leal 2147418112(%rdi), %eax
677 ; X64-NEXT: testb $1, %sil
678 ; X64-NEXT: cmovel %edi, %eax
679 ; X64-NEXT: sarl $8, %eax
680 ; X64-NEXT: movl %eax, (%rdx)
683 ; X86-LABEL: add_nosignbit_select_ashr:
685 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
686 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
687 ; X86-NEXT: andl $1, %eax
688 ; X86-NEXT: negl %eax
689 ; X86-NEXT: andl $2147418112, %eax # imm = 0x7FFF0000
690 ; X86-NEXT: addl {{[0-9]+}}(%esp), %eax
691 ; X86-NEXT: sarl $8, %eax
692 ; X86-NEXT: movl %eax, (%ecx)
694 %t0 = add i32 %x, 2147418112 ; 0x7FFF0000
695 %t1 = select i1 %cond, i32 %t0, i32 %x
697 store i32 %r, ptr %dst
701 define i32 @shl_signbit_select_add(i32 %x, i1 %cond, ptr %dst) {
702 ; X64-LABEL: shl_signbit_select_add:
704 ; X64-NEXT: movl %edi, %eax
705 ; X64-NEXT: shll $4, %eax
706 ; X64-NEXT: testb $1, %sil
707 ; X64-NEXT: cmovel %edi, %eax
708 ; X64-NEXT: addl $123456, %eax # imm = 0x1E240
709 ; X64-NEXT: movl %eax, (%rdx)
712 ; X86-LABEL: shl_signbit_select_add:
714 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
715 ; X86-NEXT: andb $1, %cl
716 ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
717 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
719 ; X86-NEXT: andb $4, %cl
720 ; X86-NEXT: shll %cl, %eax
721 ; X86-NEXT: addl $123456, %eax # imm = 0x1E240
722 ; X86-NEXT: movl %eax, (%edx)
725 %t1 = select i1 %cond, i32 %t0, i32 %x
726 %r = add i32 %t1, 123456
727 store i32 %r, ptr %dst
731 define i32 @shl_signbit_select_add_fail(i32 %x, i1 %cond, ptr %dst) {
732 ; X64-LABEL: shl_signbit_select_add_fail:
734 ; X64-NEXT: movl %edi, %eax
735 ; X64-NEXT: shll $4, %eax
736 ; X64-NEXT: testb $1, %sil
737 ; X64-NEXT: cmovnel %edi, %eax
738 ; X64-NEXT: addl $123456, %eax # imm = 0x1E240
739 ; X64-NEXT: movl %eax, (%rdx)
742 ; X86-LABEL: shl_signbit_select_add_fail:
744 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
745 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
746 ; X86-NEXT: testb $1, {{[0-9]+}}(%esp)
747 ; X86-NEXT: jne .LBB25_2
749 ; X86-NEXT: shll $4, %eax
750 ; X86-NEXT: .LBB25_2:
751 ; X86-NEXT: addl $123456, %eax # imm = 0x1E240
752 ; X86-NEXT: movl %eax, (%ecx)
755 %t1 = select i1 %cond, i32 %x, i32 %t0
756 %r = add i32 %t1, 123456
757 store i32 %r, ptr %dst
761 define i32 @lshr_signbit_select_add(i32 %x, i1 %cond, ptr %dst, i32 %y) {
762 ; X64-LABEL: lshr_signbit_select_add:
764 ; X64-NEXT: movl %edi, %eax
765 ; X64-NEXT: # kill: def $cl killed $cl killed $ecx
766 ; X64-NEXT: shrl %cl, %eax
767 ; X64-NEXT: testb $1, %sil
768 ; X64-NEXT: cmovel %edi, %eax
769 ; X64-NEXT: addl $123456, %eax # imm = 0x1E240
770 ; X64-NEXT: movl %eax, (%rdx)
773 ; X86-LABEL: lshr_signbit_select_add:
775 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
776 ; X86-NEXT: andb $1, %cl
777 ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
778 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
780 ; X86-NEXT: andb {{[0-9]+}}(%esp), %cl
781 ; X86-NEXT: shrl %cl, %eax
782 ; X86-NEXT: addl $123456, %eax # imm = 0x1E240
783 ; X86-NEXT: movl %eax, (%edx)
785 %t0 = lshr i32 %x, %y
786 %t1 = select i1 %cond, i32 %t0, i32 %x
787 %r = add i32 %t1, 123456
788 store i32 %r, ptr %dst
792 define i32 @ashr_signbit_select_add(i32 %x, i1 %cond, ptr %dst) {
793 ; X64-LABEL: ashr_signbit_select_add:
795 ; X64-NEXT: movl %edi, %eax
796 ; X64-NEXT: sarl $4, %eax
797 ; X64-NEXT: testb $1, %sil
798 ; X64-NEXT: cmovel %edi, %eax
799 ; X64-NEXT: addl $123456, %eax # imm = 0x1E240
800 ; X64-NEXT: movl %eax, (%rdx)
803 ; X86-LABEL: ashr_signbit_select_add:
805 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
806 ; X86-NEXT: andb $1, %cl
807 ; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
808 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
810 ; X86-NEXT: andb $4, %cl
811 ; X86-NEXT: sarl %cl, %eax
812 ; X86-NEXT: addl $123456, %eax # imm = 0x1E240
813 ; X86-NEXT: movl %eax, (%edx)
816 %t1 = select i1 %cond, i32 %t0, i32 %x
817 %r = add i32 %t1, 123456
818 store i32 %r, ptr %dst
822 define i32 @and_signbit_select_add(i32 %x, i1 %cond, ptr %dst, i32 %y) {
823 ; X64-LABEL: and_signbit_select_add:
825 ; X64-NEXT: # kill: def $ecx killed $ecx def $rcx
826 ; X64-NEXT: andl %edi, %ecx
827 ; X64-NEXT: testb $1, %sil
828 ; X64-NEXT: cmovnel %edi, %ecx
829 ; X64-NEXT: leal 123456(%rcx), %eax
830 ; X64-NEXT: movl %eax, (%rdx)
833 ; X86-LABEL: and_signbit_select_add:
835 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
836 ; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax
837 ; X86-NEXT: andl $1, %eax
838 ; X86-NEXT: negl %eax
839 ; X86-NEXT: orl {{[0-9]+}}(%esp), %eax
840 ; X86-NEXT: andl {{[0-9]+}}(%esp), %eax
841 ; X86-NEXT: addl $123456, %eax # imm = 0x1E240
842 ; X86-NEXT: movl %eax, (%ecx)
845 %t1 = select i1 %cond, i32 %x, i32 %t0
846 %r = add i32 %t1, 123456
847 store i32 %r, ptr %dst
852 define i32 @and_signbit_select_add_fail(i32 %x, i1 %cond, ptr %dst, i32 %y) {
853 ; X64-LABEL: and_signbit_select_add_fail:
855 ; X64-NEXT: # kill: def $ecx killed $ecx def $rcx
856 ; X64-NEXT: andl %edi, %ecx
857 ; X64-NEXT: testb $1, %sil
858 ; X64-NEXT: cmovel %edi, %ecx
859 ; X64-NEXT: leal 123456(%rcx), %eax
860 ; X64-NEXT: movl %eax, (%rdx)
863 ; X86-LABEL: and_signbit_select_add_fail:
865 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
866 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
867 ; X86-NEXT: testb $1, {{[0-9]+}}(%esp)
868 ; X86-NEXT: je .LBB29_2
870 ; X86-NEXT: andl {{[0-9]+}}(%esp), %eax
871 ; X86-NEXT: .LBB29_2:
872 ; X86-NEXT: addl $123456, %eax # imm = 0x1E240
873 ; X86-NEXT: movl %eax, (%ecx)
876 %t1 = select i1 %cond, i32 %t0, i32 %x
877 %r = add i32 %t1, 123456
878 store i32 %r, ptr %dst