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=X32
4
5; shift left
6
7define i32 @and_signbit_shl(i32 %x, i32* %dst) {
8; X64-LABEL: and_signbit_shl:
9; X64:       # %bb.0:
10; X64-NEXT:    movl %edi, %eax
11; X64-NEXT:    shll $8, %eax
12; X64-NEXT:    andl $-16777216, %eax # imm = 0xFF000000
13; X64-NEXT:    movl %eax, (%rsi)
14; X64-NEXT:    retq
15;
16; X32-LABEL: and_signbit_shl:
17; X32:       # %bb.0:
18; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
19; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
20; X32-NEXT:    shll $24, %eax
21; X32-NEXT:    movl %eax, (%ecx)
22; X32-NEXT:    retl
23  %t0 = and i32 %x, 4294901760 ; 0xFFFF0000
24  %r = shl i32 %t0, 8
25  store i32 %r, i32* %dst
26  ret i32 %r
27}
28define i32 @and_nosignbit_shl(i32 %x, i32* %dst) {
29; X64-LABEL: and_nosignbit_shl:
30; X64:       # %bb.0:
31; X64-NEXT:    movl %edi, %eax
32; X64-NEXT:    shll $8, %eax
33; X64-NEXT:    andl $-16777216, %eax # imm = 0xFF000000
34; X64-NEXT:    movl %eax, (%rsi)
35; X64-NEXT:    retq
36;
37; X32-LABEL: and_nosignbit_shl:
38; X32:       # %bb.0:
39; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
40; X32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
41; X32-NEXT:    shll $24, %eax
42; X32-NEXT:    movl %eax, (%ecx)
43; X32-NEXT:    retl
44  %t0 = and i32 %x, 2147418112 ; 0x7FFF0000
45  %r = shl i32 %t0, 8
46  store i32 %r, i32* %dst
47  ret i32 %r
48}
49
50define i32 @or_signbit_shl(i32 %x, i32* %dst) {
51; X64-LABEL: or_signbit_shl:
52; X64:       # %bb.0:
53; X64-NEXT:    movl %edi, %eax
54; X64-NEXT:    shll $8, %eax
55; X64-NEXT:    orl $-16777216, %eax # imm = 0xFF000000
56; X64-NEXT:    movl %eax, (%rsi)
57; X64-NEXT:    retq
58;
59; X32-LABEL: or_signbit_shl:
60; X32:       # %bb.0:
61; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
62; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
63; X32-NEXT:    shll $8, %eax
64; X32-NEXT:    orl $-16777216, %eax # imm = 0xFF000000
65; X32-NEXT:    movl %eax, (%ecx)
66; X32-NEXT:    retl
67  %t0 = or i32 %x, 4294901760 ; 0xFFFF0000
68  %r = shl i32 %t0, 8
69  store i32 %r, i32* %dst
70  ret i32 %r
71}
72define i32 @or_nosignbit_shl(i32 %x, i32* %dst) {
73; X64-LABEL: or_nosignbit_shl:
74; X64:       # %bb.0:
75; X64-NEXT:    movl %edi, %eax
76; X64-NEXT:    shll $8, %eax
77; X64-NEXT:    orl $-16777216, %eax # imm = 0xFF000000
78; X64-NEXT:    movl %eax, (%rsi)
79; X64-NEXT:    retq
80;
81; X32-LABEL: or_nosignbit_shl:
82; X32:       # %bb.0:
83; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
84; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
85; X32-NEXT:    shll $8, %eax
86; X32-NEXT:    orl $-16777216, %eax # imm = 0xFF000000
87; X32-NEXT:    movl %eax, (%ecx)
88; X32-NEXT:    retl
89  %t0 = or i32 %x, 2147418112 ; 0x7FFF0000
90  %r = shl i32 %t0, 8
91  store i32 %r, i32* %dst
92  ret i32 %r
93}
94
95define i32 @xor_signbit_shl(i32 %x, i32* %dst) {
96; X64-LABEL: xor_signbit_shl:
97; X64:       # %bb.0:
98; X64-NEXT:    movl %edi, %eax
99; X64-NEXT:    shll $8, %eax
100; X64-NEXT:    xorl $-16777216, %eax # imm = 0xFF000000
101; X64-NEXT:    movl %eax, (%rsi)
102; X64-NEXT:    retq
103;
104; X32-LABEL: xor_signbit_shl:
105; X32:       # %bb.0:
106; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
107; X32-NEXT:    movl $16711680, %eax # imm = 0xFF0000
108; X32-NEXT:    xorl {{[0-9]+}}(%esp), %eax
109; X32-NEXT:    shll $8, %eax
110; X32-NEXT:    movl %eax, (%ecx)
111; X32-NEXT:    retl
112  %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000
113  %r = shl i32 %t0, 8
114  store i32 %r, i32* %dst
115  ret i32 %r
116}
117define i32 @xor_nosignbit_shl(i32 %x, i32* %dst) {
118; X64-LABEL: xor_nosignbit_shl:
119; X64:       # %bb.0:
120; X64-NEXT:    movl %edi, %eax
121; X64-NEXT:    shll $8, %eax
122; X64-NEXT:    xorl $-16777216, %eax # imm = 0xFF000000
123; X64-NEXT:    movl %eax, (%rsi)
124; X64-NEXT:    retq
125;
126; X32-LABEL: xor_nosignbit_shl:
127; X32:       # %bb.0:
128; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
129; X32-NEXT:    movl $16711680, %eax # imm = 0xFF0000
130; X32-NEXT:    xorl {{[0-9]+}}(%esp), %eax
131; X32-NEXT:    shll $8, %eax
132; X32-NEXT:    movl %eax, (%ecx)
133; X32-NEXT:    retl
134  %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000
135  %r = shl i32 %t0, 8
136  store i32 %r, i32* %dst
137  ret i32 %r
138}
139
140define i32 @add_signbit_shl(i32 %x, i32* %dst) {
141; X64-LABEL: add_signbit_shl:
142; X64:       # %bb.0:
143; X64-NEXT:    # kill: def $edi killed $edi def $rdi
144; X64-NEXT:    shll $8, %edi
145; X64-NEXT:    leal -16777216(%rdi), %eax
146; X64-NEXT:    movl %eax, (%rsi)
147; X64-NEXT:    retq
148;
149; X32-LABEL: add_signbit_shl:
150; X32:       # %bb.0:
151; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
152; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
153; X32-NEXT:    shll $8, %eax
154; X32-NEXT:    addl $-16777216, %eax # imm = 0xFF000000
155; X32-NEXT:    movl %eax, (%ecx)
156; X32-NEXT:    retl
157  %t0 = add i32 %x, 4294901760 ; 0xFFFF0000
158  %r = shl i32 %t0, 8
159  store i32 %r, i32* %dst
160  ret i32 %r
161}
162define i32 @add_nosignbit_shl(i32 %x, i32* %dst) {
163; X64-LABEL: add_nosignbit_shl:
164; X64:       # %bb.0:
165; X64-NEXT:    # kill: def $edi killed $edi def $rdi
166; X64-NEXT:    shll $8, %edi
167; X64-NEXT:    leal -16777216(%rdi), %eax
168; X64-NEXT:    movl %eax, (%rsi)
169; X64-NEXT:    retq
170;
171; X32-LABEL: add_nosignbit_shl:
172; X32:       # %bb.0:
173; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
174; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
175; X32-NEXT:    shll $8, %eax
176; X32-NEXT:    addl $-16777216, %eax # imm = 0xFF000000
177; X32-NEXT:    movl %eax, (%ecx)
178; X32-NEXT:    retl
179  %t0 = add i32 %x, 2147418112 ; 0x7FFF0000
180  %r = shl i32 %t0, 8
181  store i32 %r, i32* %dst
182  ret i32 %r
183}
184
185; logical shift right
186
187define i32 @and_signbit_lshr(i32 %x, i32* %dst) {
188; X64-LABEL: and_signbit_lshr:
189; X64:       # %bb.0:
190; X64-NEXT:    movl %edi, %eax
191; X64-NEXT:    shrl $8, %eax
192; X64-NEXT:    andl $16776960, %eax # imm = 0xFFFF00
193; X64-NEXT:    movl %eax, (%rsi)
194; X64-NEXT:    retq
195;
196; X32-LABEL: and_signbit_lshr:
197; X32:       # %bb.0:
198; X32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
199; X32-NEXT:    shll $16, %eax
200; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
201; X32-NEXT:    shrl $8, %eax
202; X32-NEXT:    movl %eax, (%ecx)
203; X32-NEXT:    retl
204  %t0 = and i32 %x, 4294901760 ; 0xFFFF0000
205  %r = lshr i32 %t0, 8
206  store i32 %r, i32* %dst
207  ret i32 %r
208}
209define i32 @and_nosignbit_lshr(i32 %x, i32* %dst) {
210; X64-LABEL: and_nosignbit_lshr:
211; X64:       # %bb.0:
212; X64-NEXT:    movl %edi, %eax
213; X64-NEXT:    shrl $8, %eax
214; X64-NEXT:    andl $8388352, %eax # imm = 0x7FFF00
215; X64-NEXT:    movl %eax, (%rsi)
216; X64-NEXT:    retq
217;
218; X32-LABEL: and_nosignbit_lshr:
219; X32:       # %bb.0:
220; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
221; X32-NEXT:    movl $2147418112, %eax # imm = 0x7FFF0000
222; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
223; X32-NEXT:    shrl $8, %eax
224; X32-NEXT:    movl %eax, (%ecx)
225; X32-NEXT:    retl
226  %t0 = and i32 %x, 2147418112 ; 0x7FFF0000
227  %r = lshr i32 %t0, 8
228  store i32 %r, i32* %dst
229  ret i32 %r
230}
231
232define i32 @or_signbit_lshr(i32 %x, i32* %dst) {
233; X64-LABEL: or_signbit_lshr:
234; X64:       # %bb.0:
235; X64-NEXT:    movl %edi, %eax
236; X64-NEXT:    shrl $8, %eax
237; X64-NEXT:    orl $16776960, %eax # imm = 0xFFFF00
238; X64-NEXT:    movl %eax, (%rsi)
239; X64-NEXT:    retq
240;
241; X32-LABEL: or_signbit_lshr:
242; X32:       # %bb.0:
243; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
244; X32-NEXT:    movl $-65536, %eax # imm = 0xFFFF0000
245; X32-NEXT:    orl {{[0-9]+}}(%esp), %eax
246; X32-NEXT:    shrl $8, %eax
247; X32-NEXT:    movl %eax, (%ecx)
248; X32-NEXT:    retl
249  %t0 = or i32 %x, 4294901760 ; 0xFFFF0000
250  %r = lshr i32 %t0, 8
251  store i32 %r, i32* %dst
252  ret i32 %r
253}
254define i32 @or_nosignbit_lshr(i32 %x, i32* %dst) {
255; X64-LABEL: or_nosignbit_lshr:
256; X64:       # %bb.0:
257; X64-NEXT:    movl %edi, %eax
258; X64-NEXT:    shrl $8, %eax
259; X64-NEXT:    orl $8388352, %eax # imm = 0x7FFF00
260; X64-NEXT:    movl %eax, (%rsi)
261; X64-NEXT:    retq
262;
263; X32-LABEL: or_nosignbit_lshr:
264; X32:       # %bb.0:
265; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
266; X32-NEXT:    movl $2147418112, %eax # imm = 0x7FFF0000
267; X32-NEXT:    orl {{[0-9]+}}(%esp), %eax
268; X32-NEXT:    shrl $8, %eax
269; X32-NEXT:    movl %eax, (%ecx)
270; X32-NEXT:    retl
271  %t0 = or i32 %x, 2147418112 ; 0x7FFF0000
272  %r = lshr i32 %t0, 8
273  store i32 %r, i32* %dst
274  ret i32 %r
275}
276
277define i32 @xor_signbit_lshr(i32 %x, i32* %dst) {
278; X64-LABEL: xor_signbit_lshr:
279; X64:       # %bb.0:
280; X64-NEXT:    movl %edi, %eax
281; X64-NEXT:    shrl $8, %eax
282; X64-NEXT:    xorl $16776960, %eax # imm = 0xFFFF00
283; X64-NEXT:    movl %eax, (%rsi)
284; X64-NEXT:    retq
285;
286; X32-LABEL: xor_signbit_lshr:
287; X32:       # %bb.0:
288; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
289; X32-NEXT:    movl $-65536, %eax # imm = 0xFFFF0000
290; X32-NEXT:    xorl {{[0-9]+}}(%esp), %eax
291; X32-NEXT:    shrl $8, %eax
292; X32-NEXT:    movl %eax, (%ecx)
293; X32-NEXT:    retl
294  %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000
295  %r = lshr i32 %t0, 8
296  store i32 %r, i32* %dst
297  ret i32 %r
298}
299define i32 @xor_nosignbit_lshr(i32 %x, i32* %dst) {
300; X64-LABEL: xor_nosignbit_lshr:
301; X64:       # %bb.0:
302; X64-NEXT:    movl %edi, %eax
303; X64-NEXT:    shrl $8, %eax
304; X64-NEXT:    xorl $8388352, %eax # imm = 0x7FFF00
305; X64-NEXT:    movl %eax, (%rsi)
306; X64-NEXT:    retq
307;
308; X32-LABEL: xor_nosignbit_lshr:
309; X32:       # %bb.0:
310; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
311; X32-NEXT:    movl $2147418112, %eax # imm = 0x7FFF0000
312; X32-NEXT:    xorl {{[0-9]+}}(%esp), %eax
313; X32-NEXT:    shrl $8, %eax
314; X32-NEXT:    movl %eax, (%ecx)
315; X32-NEXT:    retl
316  %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000
317  %r = lshr i32 %t0, 8
318  store i32 %r, i32* %dst
319  ret i32 %r
320}
321
322define i32 @add_signbit_lshr(i32 %x, i32* %dst) {
323; X64-LABEL: add_signbit_lshr:
324; X64:       # %bb.0:
325; X64-NEXT:    # kill: def $edi killed $edi def $rdi
326; X64-NEXT:    leal -65536(%rdi), %eax
327; X64-NEXT:    shrl $8, %eax
328; X64-NEXT:    movl %eax, (%rsi)
329; X64-NEXT:    retq
330;
331; X32-LABEL: add_signbit_lshr:
332; X32:       # %bb.0:
333; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
334; X32-NEXT:    movl $-65536, %eax # imm = 0xFFFF0000
335; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax
336; X32-NEXT:    shrl $8, %eax
337; X32-NEXT:    movl %eax, (%ecx)
338; X32-NEXT:    retl
339  %t0 = add i32 %x, 4294901760 ; 0xFFFF0000
340  %r = lshr i32 %t0, 8
341  store i32 %r, i32* %dst
342  ret i32 %r
343}
344define i32 @add_nosignbit_lshr(i32 %x, i32* %dst) {
345; X64-LABEL: add_nosignbit_lshr:
346; X64:       # %bb.0:
347; X64-NEXT:    # kill: def $edi killed $edi def $rdi
348; X64-NEXT:    leal 2147418112(%rdi), %eax
349; X64-NEXT:    shrl $8, %eax
350; X64-NEXT:    movl %eax, (%rsi)
351; X64-NEXT:    retq
352;
353; X32-LABEL: add_nosignbit_lshr:
354; X32:       # %bb.0:
355; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
356; X32-NEXT:    movl $2147418112, %eax # imm = 0x7FFF0000
357; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax
358; X32-NEXT:    shrl $8, %eax
359; X32-NEXT:    movl %eax, (%ecx)
360; X32-NEXT:    retl
361  %t0 = add i32 %x, 2147418112 ; 0x7FFF0000
362  %r = lshr i32 %t0, 8
363  store i32 %r, i32* %dst
364  ret i32 %r
365}
366
367; arithmetic shift right
368
369define i32 @and_signbit_ashr(i32 %x, i32* %dst) {
370; X64-LABEL: and_signbit_ashr:
371; X64:       # %bb.0:
372; X64-NEXT:    movl %edi, %eax
373; X64-NEXT:    sarl $8, %eax
374; X64-NEXT:    andl $-256, %eax
375; X64-NEXT:    movl %eax, (%rsi)
376; X64-NEXT:    retq
377;
378; X32-LABEL: and_signbit_ashr:
379; X32:       # %bb.0:
380; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
381; X32-NEXT:    movswl {{[0-9]+}}(%esp), %eax
382; X32-NEXT:    shll $8, %eax
383; X32-NEXT:    movl %eax, (%ecx)
384; X32-NEXT:    retl
385  %t0 = and i32 %x, 4294901760 ; 0xFFFF0000
386  %r = ashr i32 %t0, 8
387  store i32 %r, i32* %dst
388  ret i32 %r
389}
390define i32 @and_nosignbit_ashr(i32 %x, i32* %dst) {
391; X64-LABEL: and_nosignbit_ashr:
392; X64:       # %bb.0:
393; X64-NEXT:    movl %edi, %eax
394; X64-NEXT:    shrl $8, %eax
395; X64-NEXT:    andl $8388352, %eax # imm = 0x7FFF00
396; X64-NEXT:    movl %eax, (%rsi)
397; X64-NEXT:    retq
398;
399; X32-LABEL: and_nosignbit_ashr:
400; X32:       # %bb.0:
401; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
402; X32-NEXT:    movl $2147418112, %eax # imm = 0x7FFF0000
403; X32-NEXT:    andl {{[0-9]+}}(%esp), %eax
404; X32-NEXT:    shrl $8, %eax
405; X32-NEXT:    movl %eax, (%ecx)
406; X32-NEXT:    retl
407  %t0 = and i32 %x, 2147418112 ; 0x7FFF0000
408  %r = ashr i32 %t0, 8
409  store i32 %r, i32* %dst
410  ret i32 %r
411}
412
413define i32 @or_signbit_ashr(i32 %x, i32* %dst) {
414; X64-LABEL: or_signbit_ashr:
415; X64:       # %bb.0:
416; X64-NEXT:    movl %edi, %eax
417; X64-NEXT:    shrl $8, %eax
418; X64-NEXT:    orl $-256, %eax
419; X64-NEXT:    movl %eax, (%rsi)
420; X64-NEXT:    retq
421;
422; X32-LABEL: or_signbit_ashr:
423; X32:       # %bb.0:
424; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
425; X32-NEXT:    movl $-65536, %eax # imm = 0xFFFF0000
426; X32-NEXT:    orl {{[0-9]+}}(%esp), %eax
427; X32-NEXT:    sarl $8, %eax
428; X32-NEXT:    movl %eax, (%ecx)
429; X32-NEXT:    retl
430  %t0 = or i32 %x, 4294901760 ; 0xFFFF0000
431  %r = ashr i32 %t0, 8
432  store i32 %r, i32* %dst
433  ret i32 %r
434}
435define i32 @or_nosignbit_ashr(i32 %x, i32* %dst) {
436; X64-LABEL: or_nosignbit_ashr:
437; X64:       # %bb.0:
438; X64-NEXT:    movl %edi, %eax
439; X64-NEXT:    sarl $8, %eax
440; X64-NEXT:    orl $8388352, %eax # imm = 0x7FFF00
441; X64-NEXT:    movl %eax, (%rsi)
442; X64-NEXT:    retq
443;
444; X32-LABEL: or_nosignbit_ashr:
445; X32:       # %bb.0:
446; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
447; X32-NEXT:    movl $2147418112, %eax # imm = 0x7FFF0000
448; X32-NEXT:    orl {{[0-9]+}}(%esp), %eax
449; X32-NEXT:    sarl $8, %eax
450; X32-NEXT:    movl %eax, (%ecx)
451; X32-NEXT:    retl
452  %t0 = or i32 %x, 2147418112 ; 0x7FFF0000
453  %r = ashr i32 %t0, 8
454  store i32 %r, i32* %dst
455  ret i32 %r
456}
457
458define i32 @xor_signbit_ashr(i32 %x, i32* %dst) {
459; X64-LABEL: xor_signbit_ashr:
460; X64:       # %bb.0:
461; X64-NEXT:    movl %edi, %eax
462; X64-NEXT:    sarl $8, %eax
463; X64-NEXT:    xorl $-256, %eax
464; X64-NEXT:    movl %eax, (%rsi)
465; X64-NEXT:    retq
466;
467; X32-LABEL: xor_signbit_ashr:
468; X32:       # %bb.0:
469; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
470; X32-NEXT:    movl $-65536, %eax # imm = 0xFFFF0000
471; X32-NEXT:    xorl {{[0-9]+}}(%esp), %eax
472; X32-NEXT:    sarl $8, %eax
473; X32-NEXT:    movl %eax, (%ecx)
474; X32-NEXT:    retl
475  %t0 = xor i32 %x, 4294901760 ; 0xFFFF0000
476  %r = ashr i32 %t0, 8
477  store i32 %r, i32* %dst
478  ret i32 %r
479}
480define i32 @xor_nosignbit_ashr(i32 %x, i32* %dst) {
481; X64-LABEL: xor_nosignbit_ashr:
482; X64:       # %bb.0:
483; X64-NEXT:    movl %edi, %eax
484; X64-NEXT:    sarl $8, %eax
485; X64-NEXT:    xorl $8388352, %eax # imm = 0x7FFF00
486; X64-NEXT:    movl %eax, (%rsi)
487; X64-NEXT:    retq
488;
489; X32-LABEL: xor_nosignbit_ashr:
490; X32:       # %bb.0:
491; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
492; X32-NEXT:    movl $2147418112, %eax # imm = 0x7FFF0000
493; X32-NEXT:    xorl {{[0-9]+}}(%esp), %eax
494; X32-NEXT:    sarl $8, %eax
495; X32-NEXT:    movl %eax, (%ecx)
496; X32-NEXT:    retl
497  %t0 = xor i32 %x, 2147418112 ; 0x7FFF0000
498  %r = ashr i32 %t0, 8
499  store i32 %r, i32* %dst
500  ret i32 %r
501}
502
503define i32 @add_signbit_ashr(i32 %x, i32* %dst) {
504; X64-LABEL: add_signbit_ashr:
505; X64:       # %bb.0:
506; X64-NEXT:    # kill: def $edi killed $edi def $rdi
507; X64-NEXT:    leal -65536(%rdi), %eax
508; X64-NEXT:    sarl $8, %eax
509; X64-NEXT:    movl %eax, (%rsi)
510; X64-NEXT:    retq
511;
512; X32-LABEL: add_signbit_ashr:
513; X32:       # %bb.0:
514; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
515; X32-NEXT:    movl $-65536, %eax # imm = 0xFFFF0000
516; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax
517; X32-NEXT:    sarl $8, %eax
518; X32-NEXT:    movl %eax, (%ecx)
519; X32-NEXT:    retl
520  %t0 = add i32 %x, 4294901760 ; 0xFFFF0000
521  %r = ashr i32 %t0, 8
522  store i32 %r, i32* %dst
523  ret i32 %r
524}
525define i32 @add_nosignbit_ashr(i32 %x, i32* %dst) {
526; X64-LABEL: add_nosignbit_ashr:
527; X64:       # %bb.0:
528; X64-NEXT:    # kill: def $edi killed $edi def $rdi
529; X64-NEXT:    leal 2147418112(%rdi), %eax
530; X64-NEXT:    sarl $8, %eax
531; X64-NEXT:    movl %eax, (%rsi)
532; X64-NEXT:    retq
533;
534; X32-LABEL: add_nosignbit_ashr:
535; X32:       # %bb.0:
536; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
537; X32-NEXT:    movl $2147418112, %eax # imm = 0x7FFF0000
538; X32-NEXT:    addl {{[0-9]+}}(%esp), %eax
539; X32-NEXT:    sarl $8, %eax
540; X32-NEXT:    movl %eax, (%ecx)
541; X32-NEXT:    retl
542  %t0 = add i32 %x, 2147418112 ; 0x7FFF0000
543  %r = ashr i32 %t0, 8
544  store i32 %r, i32* %dst
545  ret i32 %r
546}
547