[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / CodeGen / X86 / pull-conditional-binop-through-shift.ll
blob8c858e04de2a1447f15171387ba32f1a80880a74
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
5 ; shift left
7 define i32 @and_signbit_select_shl(i32 %x, i1 %cond, ptr %dst) {
8 ; X64-LABEL: and_signbit_select_shl:
9 ; X64:       # %bb.0:
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)
16 ; X64-NEXT:    retq
18 ; X86-LABEL: and_signbit_select_shl:
19 ; X86:       # %bb.0:
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
24 ; X86-NEXT:  # %bb.1:
25 ; X86-NEXT:    andl $16711680, %eax # imm = 0xFF0000
26 ; X86-NEXT:  .LBB0_2:
27 ; X86-NEXT:    shll $8, %eax
28 ; X86-NEXT:    movl %eax, (%ecx)
29 ; X86-NEXT:    retl
30   %t0 = and i32 %x, 4294901760 ; 0xFFFF0000
31   %t1 = select i1 %cond, i32 %t0, i32 %x
32   %r = shl i32 %t1, 8
33   store i32 %r, ptr %dst
34   ret i32 %r
36 define i32 @and_nosignbit_select_shl(i32 %x, i1 %cond, ptr %dst) {
37 ; X64-LABEL: and_nosignbit_select_shl:
38 ; X64:       # %bb.0:
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)
45 ; X64-NEXT:    retq
47 ; X86-LABEL: and_nosignbit_select_shl:
48 ; X86:       # %bb.0:
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
53 ; X86-NEXT:  # %bb.1:
54 ; X86-NEXT:    andl $16711680, %eax # imm = 0xFF0000
55 ; X86-NEXT:  .LBB1_2:
56 ; X86-NEXT:    shll $8, %eax
57 ; X86-NEXT:    movl %eax, (%ecx)
58 ; X86-NEXT:    retl
59   %t0 = and i32 %x, 2147418112 ; 0x7FFF0000
60   %t1 = select i1 %cond, i32 %t0, i32 %x
61   %r = shl i32 %t1, 8
62   store i32 %r, ptr %dst
63   ret i32 %r
66 define i32 @or_signbit_select_shl(i32 %x, i1 %cond, ptr %dst) {
67 ; X64-LABEL: or_signbit_select_shl:
68 ; X64:       # %bb.0:
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)
75 ; X64-NEXT:    retq
77 ; X86-LABEL: or_signbit_select_shl:
78 ; X86:       # %bb.0:
79 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
80 ; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
81 ; X86-NEXT:    andl $1, %eax
82 ; X86-NEXT:    negl %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)
87 ; X86-NEXT:    retl
88   %t0 = or i32 %x, 4294901760 ; 0xFFFF0000
89   %t1 = select i1 %cond, i32 %t0, i32 %x
90   %r = shl i32 %t1, 8
91   store i32 %r, ptr %dst
92   ret i32 %r
94 define i32 @or_nosignbit_select_shl(i32 %x, i1 %cond, ptr %dst) {
95 ; X64-LABEL: or_nosignbit_select_shl:
96 ; X64:       # %bb.0:
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)
103 ; X64-NEXT:    retq
105 ; X86-LABEL: or_nosignbit_select_shl:
106 ; X86:       # %bb.0:
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)
115 ; X86-NEXT:    retl
116   %t0 = or i32 %x, 2147418112 ; 0x7FFF0000
117   %t1 = select i1 %cond, i32 %t0, i32 %x
118   %r = shl i32 %t1, 8
119   store i32 %r, ptr %dst
120   ret i32 %r
123 define i32 @xor_signbit_select_shl(i32 %x, i1 %cond, ptr %dst) {
124 ; X64-LABEL: xor_signbit_select_shl:
125 ; X64:       # %bb.0:
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)
132 ; X64-NEXT:    retq
134 ; X86-LABEL: xor_signbit_select_shl:
135 ; X86:       # %bb.0:
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)
144 ; X86-NEXT:    retl
145   %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000
146   %t1 = select i1 %cond, i32 %t0, i32 %x
147   %r = shl i32 %t1, 8
148   store i32 %r, ptr %dst
149   ret i32 %r
151 define i32 @xor_nosignbit_select_shl(i32 %x, i1 %cond, ptr %dst) {
152 ; X64-LABEL: xor_nosignbit_select_shl:
153 ; X64:       # %bb.0:
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)
160 ; X64-NEXT:    retq
162 ; X86-LABEL: xor_nosignbit_select_shl:
163 ; X86:       # %bb.0:
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)
172 ; X86-NEXT:    retl
173   %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000
174   %t1 = select i1 %cond, i32 %t0, i32 %x
175   %r = shl i32 %t1, 8
176   store i32 %r, ptr %dst
177   ret i32 %r
180 define i32 @add_signbit_select_shl(i32 %x, i1 %cond, ptr %dst) {
181 ; X64-LABEL: add_signbit_select_shl:
182 ; X64:       # %bb.0:
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)
189 ; X64-NEXT:    retq
191 ; X86-LABEL: add_signbit_select_shl:
192 ; X86:       # %bb.0:
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)
201 ; X86-NEXT:    retl
202   %t0 = add i32 %x, 4294901760 ; 0xFFFF0000
203   %t1 = select i1 %cond, i32 %t0, i32 %x
204   %r = shl i32 %t1, 8
205   store i32 %r, ptr %dst
206   ret i32 %r
208 define i32 @add_nosignbit_select_shl(i32 %x, i1 %cond, ptr %dst) {
209 ; X64-LABEL: add_nosignbit_select_shl:
210 ; X64:       # %bb.0:
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)
217 ; X64-NEXT:    retq
219 ; X86-LABEL: add_nosignbit_select_shl:
220 ; X86:       # %bb.0:
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)
229 ; X86-NEXT:    retl
230   %t0 = add i32 %x, 2147418112 ; 0x7FFF0000
231   %t1 = select i1 %cond, i32 %t0, i32 %x
232   %r = shl i32 %t1, 8
233   store i32 %r, ptr %dst
234   ret i32 %r
237 ; logical shift right
239 define i32 @and_signbit_select_lshr(i32 %x, i1 %cond, ptr %dst) {
240 ; X64-LABEL: and_signbit_select_lshr:
241 ; X64:       # %bb.0:
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)
248 ; X64-NEXT:    retq
250 ; X86-LABEL: and_signbit_select_lshr:
251 ; X86:       # %bb.0:
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
256 ; X86-NEXT:  # %bb.1:
257 ; X86-NEXT:    andl $-65536, %eax # imm = 0xFFFF0000
258 ; X86-NEXT:  .LBB8_2:
259 ; X86-NEXT:    shrl $8, %eax
260 ; X86-NEXT:    movl %eax, (%ecx)
261 ; X86-NEXT:    retl
262   %t0 = and i32 %x, 4294901760 ; 0xFFFF0000
263   %t1 = select i1 %cond, i32 %t0, i32 %x
264   %r = lshr i32 %t1, 8
265   store i32 %r, ptr %dst
266   ret i32 %r
268 define i32 @and_nosignbit_select_lshr(i32 %x, i1 %cond, ptr %dst) {
269 ; X64-LABEL: and_nosignbit_select_lshr:
270 ; X64:       # %bb.0:
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)
277 ; X64-NEXT:    retq
279 ; X86-LABEL: and_nosignbit_select_lshr:
280 ; X86:       # %bb.0:
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
285 ; X86-NEXT:  # %bb.1:
286 ; X86-NEXT:    andl $2147418112, %eax # imm = 0x7FFF0000
287 ; X86-NEXT:  .LBB9_2:
288 ; X86-NEXT:    shrl $8, %eax
289 ; X86-NEXT:    movl %eax, (%ecx)
290 ; X86-NEXT:    retl
291   %t0 = and i32 %x, 2147418112 ; 0x7FFF0000
292   %t1 = select i1 %cond, i32 %t0, i32 %x
293   %r = lshr i32 %t1, 8
294   store i32 %r, ptr %dst
295   ret i32 %r
298 define i32 @or_signbit_select_lshr(i32 %x, i1 %cond, ptr %dst) {
299 ; X64-LABEL: or_signbit_select_lshr:
300 ; X64:       # %bb.0:
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)
307 ; X64-NEXT:    retq
309 ; X86-LABEL: or_signbit_select_lshr:
310 ; X86:       # %bb.0:
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)
319 ; X86-NEXT:    retl
320   %t0 = or i32 %x, 4294901760 ; 0xFFFF0000
321   %t1 = select i1 %cond, i32 %t0, i32 %x
322   %r = lshr i32 %t1, 8
323   store i32 %r, ptr %dst
324   ret i32 %r
326 define i32 @or_nosignbit_select_lshr(i32 %x, i1 %cond, ptr %dst) {
327 ; X64-LABEL: or_nosignbit_select_lshr:
328 ; X64:       # %bb.0:
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)
335 ; X64-NEXT:    retq
337 ; X86-LABEL: or_nosignbit_select_lshr:
338 ; X86:       # %bb.0:
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)
347 ; X86-NEXT:    retl
348   %t0 = or i32 %x, 2147418112 ; 0x7FFF0000
349   %t1 = select i1 %cond, i32 %t0, i32 %x
350   %r = lshr i32 %t1, 8
351   store i32 %r, ptr %dst
352   ret i32 %r
355 define i32 @xor_signbit_select_lshr(i32 %x, i1 %cond, ptr %dst) {
356 ; X64-LABEL: xor_signbit_select_lshr:
357 ; X64:       # %bb.0:
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)
364 ; X64-NEXT:    retq
366 ; X86-LABEL: xor_signbit_select_lshr:
367 ; X86:       # %bb.0:
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)
376 ; X86-NEXT:    retl
377   %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000
378   %t1 = select i1 %cond, i32 %t0, i32 %x
379   %r = lshr i32 %t1, 8
380   store i32 %r, ptr %dst
381   ret i32 %r
383 define i32 @xor_nosignbit_select_lshr(i32 %x, i1 %cond, ptr %dst) {
384 ; X64-LABEL: xor_nosignbit_select_lshr:
385 ; X64:       # %bb.0:
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)
392 ; X64-NEXT:    retq
394 ; X86-LABEL: xor_nosignbit_select_lshr:
395 ; X86:       # %bb.0:
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)
404 ; X86-NEXT:    retl
405   %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000
406   %t1 = select i1 %cond, i32 %t0, i32 %x
407   %r = lshr i32 %t1, 8
408   store i32 %r, ptr %dst
409   ret i32 %r
412 define i32 @add_signbit_select_lshr(i32 %x, i1 %cond, ptr %dst) {
413 ; X64-LABEL: add_signbit_select_lshr:
414 ; X64:       # %bb.0:
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)
421 ; X64-NEXT:    retq
423 ; X86-LABEL: add_signbit_select_lshr:
424 ; X86:       # %bb.0:
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)
433 ; X86-NEXT:    retl
434   %t0 = add i32 %x, 4294901760 ; 0xFFFF0000
435   %t1 = select i1 %cond, i32 %t0, i32 %x
436   %r = lshr i32 %t1, 8
437   store i32 %r, ptr %dst
438   ret i32 %r
440 define i32 @add_nosignbit_select_lshr(i32 %x, i1 %cond, ptr %dst) {
441 ; X64-LABEL: add_nosignbit_select_lshr:
442 ; X64:       # %bb.0:
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)
449 ; X64-NEXT:    retq
451 ; X86-LABEL: add_nosignbit_select_lshr:
452 ; X86:       # %bb.0:
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)
461 ; X86-NEXT:    retl
462   %t0 = add i32 %x, 2147418112 ; 0x7FFF0000
463   %t1 = select i1 %cond, i32 %t0, i32 %x
464   %r = lshr i32 %t1, 8
465   store i32 %r, ptr %dst
466   ret i32 %r
469 ; arithmetic shift right
471 define i32 @and_signbit_select_ashr(i32 %x, i1 %cond, ptr %dst) {
472 ; X64-LABEL: and_signbit_select_ashr:
473 ; X64:       # %bb.0:
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)
480 ; X64-NEXT:    retq
482 ; X86-LABEL: and_signbit_select_ashr:
483 ; X86:       # %bb.0:
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
488 ; X86-NEXT:  # %bb.1:
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)
493 ; X86-NEXT:    retl
494   %t0 = and i32 %x, 4294901760 ; 0xFFFF0000
495   %t1 = select i1 %cond, i32 %t0, i32 %x
496   %r = ashr i32 %t1, 8
497   store i32 %r, ptr %dst
498   ret i32 %r
500 define i32 @and_nosignbit_select_ashr(i32 %x, i1 %cond, ptr %dst) {
501 ; X64-LABEL: and_nosignbit_select_ashr:
502 ; X64:       # %bb.0:
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)
509 ; X64-NEXT:    retq
511 ; X86-LABEL: and_nosignbit_select_ashr:
512 ; X86:       # %bb.0:
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
517 ; X86-NEXT:  # %bb.1:
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)
522 ; X86-NEXT:    retl
523   %t0 = and i32 %x, 2147418112 ; 0x7FFF0000
524   %t1 = select i1 %cond, i32 %t0, i32 %x
525   %r = ashr i32 %t1, 8
526   store i32 %r, ptr %dst
527   ret i32 %r
530 define i32 @or_signbit_select_ashr(i32 %x, i1 %cond, ptr %dst) {
531 ; X64-LABEL: or_signbit_select_ashr:
532 ; X64:       # %bb.0:
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)
539 ; X64-NEXT:    retq
541 ; X86-LABEL: or_signbit_select_ashr:
542 ; X86:       # %bb.0:
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)
551 ; X86-NEXT:    retl
552   %t0 = or i32 %x, 4294901760 ; 0xFFFF0000
553   %t1 = select i1 %cond, i32 %t0, i32 %x
554   %r = ashr i32 %t1, 8
555   store i32 %r, ptr %dst
556   ret i32 %r
558 define i32 @or_nosignbit_select_ashr(i32 %x, i1 %cond, ptr %dst) {
559 ; X64-LABEL: or_nosignbit_select_ashr:
560 ; X64:       # %bb.0:
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)
567 ; X64-NEXT:    retq
569 ; X86-LABEL: or_nosignbit_select_ashr:
570 ; X86:       # %bb.0:
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)
579 ; X86-NEXT:    retl
580   %t0 = or i32 %x, 2147418112 ; 0x7FFF0000
581   %t1 = select i1 %cond, i32 %t0, i32 %x
582   %r = ashr i32 %t1, 8
583   store i32 %r, ptr %dst
584   ret i32 %r
587 define i32 @xor_signbit_select_ashr(i32 %x, i1 %cond, ptr %dst) {
588 ; X64-LABEL: xor_signbit_select_ashr:
589 ; X64:       # %bb.0:
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)
596 ; X64-NEXT:    retq
598 ; X86-LABEL: xor_signbit_select_ashr:
599 ; X86:       # %bb.0:
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)
608 ; X86-NEXT:    retl
609   %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000
610   %t1 = select i1 %cond, i32 %t0, i32 %x
611   %r = ashr i32 %t1, 8
612   store i32 %r, ptr %dst
613   ret i32 %r
615 define i32 @xor_nosignbit_select_ashr(i32 %x, i1 %cond, ptr %dst) {
616 ; X64-LABEL: xor_nosignbit_select_ashr:
617 ; X64:       # %bb.0:
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)
624 ; X64-NEXT:    retq
626 ; X86-LABEL: xor_nosignbit_select_ashr:
627 ; X86:       # %bb.0:
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)
636 ; X86-NEXT:    retl
637   %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000
638   %t1 = select i1 %cond, i32 %t0, i32 %x
639   %r = ashr i32 %t1, 8
640   store i32 %r, ptr %dst
641   ret i32 %r
644 define i32 @add_signbit_select_ashr(i32 %x, i1 %cond, ptr %dst) {
645 ; X64-LABEL: add_signbit_select_ashr:
646 ; X64:       # %bb.0:
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)
653 ; X64-NEXT:    retq
655 ; X86-LABEL: add_signbit_select_ashr:
656 ; X86:       # %bb.0:
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)
665 ; X86-NEXT:    retl
666   %t0 = add i32 %x, 4294901760 ; 0xFFFF0000
667   %t1 = select i1 %cond, i32 %t0, i32 %x
668   %r = ashr i32 %t1, 8
669   store i32 %r, ptr %dst
670   ret i32 %r
672 define i32 @add_nosignbit_select_ashr(i32 %x, i1 %cond, ptr %dst) {
673 ; X64-LABEL: add_nosignbit_select_ashr:
674 ; X64:       # %bb.0:
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)
681 ; X64-NEXT:    retq
683 ; X86-LABEL: add_nosignbit_select_ashr:
684 ; X86:       # %bb.0:
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)
693 ; X86-NEXT:    retl
694   %t0 = add i32 %x, 2147418112 ; 0x7FFF0000
695   %t1 = select i1 %cond, i32 %t0, i32 %x
696   %r = ashr i32 %t1, 8
697   store i32 %r, ptr %dst
698   ret i32 %r
701 define i32 @shl_signbit_select_add(i32 %x, i1 %cond, ptr %dst) {
702 ; X64-LABEL: shl_signbit_select_add:
703 ; X64:       # %bb.0:
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)
710 ; X64-NEXT:    retq
712 ; X86-LABEL: shl_signbit_select_add:
713 ; X86:       # %bb.0:
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
718 ; X86-NEXT:    negb %cl
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)
723 ; X86-NEXT:    retl
724   %t0 = shl i32 %x, 4
725   %t1 = select i1 %cond, i32 %t0, i32 %x
726   %r = add i32 %t1, 123456
727   store i32 %r, ptr %dst
728   ret i32 %r
731 define i32 @shl_signbit_select_add_fail(i32 %x, i1 %cond, ptr %dst) {
732 ; X64-LABEL: shl_signbit_select_add_fail:
733 ; X64:       # %bb.0:
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)
740 ; X64-NEXT:    retq
742 ; X86-LABEL: shl_signbit_select_add_fail:
743 ; X86:       # %bb.0:
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
748 ; X86-NEXT:  # %bb.1:
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)
753 ; X86-NEXT:    retl
754   %t0 = shl i32 %x, 4
755   %t1 = select i1 %cond, i32 %x, i32 %t0
756   %r = add i32 %t1, 123456
757   store i32 %r, ptr %dst
758   ret i32 %r
761 define i32 @lshr_signbit_select_add(i32 %x, i1 %cond, ptr %dst, i32 %y) {
762 ; X64-LABEL: lshr_signbit_select_add:
763 ; X64:       # %bb.0:
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)
771 ; X64-NEXT:    retq
773 ; X86-LABEL: lshr_signbit_select_add:
774 ; X86:       # %bb.0:
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
779 ; X86-NEXT:    negb %cl
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)
784 ; X86-NEXT:    retl
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
789   ret i32 %r
792 define i32 @ashr_signbit_select_add(i32 %x, i1 %cond, ptr %dst) {
793 ; X64-LABEL: ashr_signbit_select_add:
794 ; X64:       # %bb.0:
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)
801 ; X64-NEXT:    retq
803 ; X86-LABEL: ashr_signbit_select_add:
804 ; X86:       # %bb.0:
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
809 ; X86-NEXT:    negb %cl
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)
814 ; X86-NEXT:    retl
815   %t0 = ashr i32 %x, 4
816   %t1 = select i1 %cond, i32 %t0, i32 %x
817   %r = add i32 %t1, 123456
818   store i32 %r, ptr %dst
819   ret i32 %r
822 define i32 @and_signbit_select_add(i32 %x, i1 %cond, ptr %dst, i32 %y) {
823 ; X64-LABEL: and_signbit_select_add:
824 ; X64:       # %bb.0:
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)
831 ; X64-NEXT:    retq
833 ; X86-LABEL: and_signbit_select_add:
834 ; X86:       # %bb.0:
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)
843 ; X86-NEXT:    retl
844   %t0 = and i32 %x, %y
845   %t1 = select i1 %cond, i32 %x, i32 %t0
846   %r = add i32 %t1, 123456
847   store i32 %r, ptr %dst
848   ret i32 %r
852 define i32 @and_signbit_select_add_fail(i32 %x, i1 %cond, ptr %dst, i32 %y) {
853 ; X64-LABEL: and_signbit_select_add_fail:
854 ; X64:       # %bb.0:
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)
861 ; X64-NEXT:    retq
863 ; X86-LABEL: and_signbit_select_add_fail:
864 ; X86:       # %bb.0:
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
869 ; X86-NEXT:  # %bb.1:
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)
874 ; X86-NEXT:    retl
875   %t0 = and i32 %x, %y
876   %t1 = select i1 %cond, i32 %t0, i32 %x
877   %r = add i32 %t1, 123456
878   store i32 %r, ptr %dst
879   ret i32 %r