1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i686-pc-linux | FileCheck %s --check-prefix=X86
3; RUN: llc < %s -mtriple=x86_64-pc-linux | FileCheck %s --check-prefixes=X64,X64-MASK
4; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=bdver1 | FileCheck %s --check-prefixes=X64,X64-SHIFT,X64-SHIFT2
5; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=bdver2 | FileCheck %s --check-prefixes=X64,X64-SHIFT,X64-TBM
6; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=bdver3 | FileCheck %s --check-prefixes=X64,X64-SHIFT,X64-TBM
7; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=bdver4 | FileCheck %s --check-prefixes=X64,X64-SHIFT,X64-TBM
8; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=btver1 | FileCheck %s --check-prefixes=X64,X64-SHIFT,X64-SHIFT2
9; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=btver2 | FileCheck %s --check-prefixes=X64,X64-SHIFT,X64-BMI,X64-BMI1
10; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=znver1 | FileCheck %s --check-prefixes=X64,X64-SHIFT,X64-BMI,X64-BMI2
11; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=znver2 | FileCheck %s --check-prefixes=X64,X64-SHIFT,X64-BMI,X64-BMI2
12; RUN: llc < %s -mtriple=x86_64-pc-linux -mattr=+fast-scalar-shift-masks | FileCheck %s --check-prefixes=X64,X64-SHIFT,X64-SHIFT2
13
14;
15; fold (shl (lshr x, c1), c2) -> (0) (and x, MASK) or
16;                                (1) (and (shl x, (sub c2, c1), MASK) or
17;                                (2) (and (lshr x, (sub c1, c2), MASK)
18;
19
20define i8 @test_i8_shl_lshr_0(i8 %a0) {
21; X86-LABEL: test_i8_shl_lshr_0:
22; X86:       # %bb.0:
23; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
24; X86-NEXT:    andb $-8, %al
25; X86-NEXT:    retl
26;
27; X64-LABEL: test_i8_shl_lshr_0:
28; X64:       # %bb.0:
29; X64-NEXT:    movl %edi, %eax
30; X64-NEXT:    andb $-8, %al
31; X64-NEXT:    # kill: def $al killed $al killed $eax
32; X64-NEXT:    retq
33  %1 = lshr i8 %a0, 3
34  %2 = shl i8 %1, 3
35  ret i8 %2
36}
37
38define i8 @test_i8_shl_lshr_1(i8 %a0) {
39; X86-LABEL: test_i8_shl_lshr_1:
40; X86:       # %bb.0:
41; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
42; X86-NEXT:    shlb $2, %al
43; X86-NEXT:    andb $-32, %al
44; X86-NEXT:    retl
45;
46; X64-MASK-LABEL: test_i8_shl_lshr_1:
47; X64-MASK:       # %bb.0:
48; X64-MASK-NEXT:    # kill: def $edi killed $edi def $rdi
49; X64-MASK-NEXT:    leal (,%rdi,4), %eax
50; X64-MASK-NEXT:    andb $-32, %al
51; X64-MASK-NEXT:    # kill: def $al killed $al killed $eax
52; X64-MASK-NEXT:    retq
53;
54; X64-SHIFT-LABEL: test_i8_shl_lshr_1:
55; X64-SHIFT:       # %bb.0:
56; X64-SHIFT-NEXT:    movl %edi, %eax
57; X64-SHIFT-NEXT:    shrb $3, %al
58; X64-SHIFT-NEXT:    shlb $5, %al
59; X64-SHIFT-NEXT:    # kill: def $al killed $al killed $eax
60; X64-SHIFT-NEXT:    retq
61  %1 = lshr i8 %a0, 3
62  %2 = shl i8 %1, 5
63  ret i8 %2
64}
65
66define i8 @test_i8_shl_lshr_2(i8 %a0) {
67; X86-LABEL: test_i8_shl_lshr_2:
68; X86:       # %bb.0:
69; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
70; X86-NEXT:    shrb $2, %al
71; X86-NEXT:    andb $56, %al
72; X86-NEXT:    retl
73;
74; X64-MASK-LABEL: test_i8_shl_lshr_2:
75; X64-MASK:       # %bb.0:
76; X64-MASK-NEXT:    movl %edi, %eax
77; X64-MASK-NEXT:    shrb $2, %al
78; X64-MASK-NEXT:    andb $56, %al
79; X64-MASK-NEXT:    # kill: def $al killed $al killed $eax
80; X64-MASK-NEXT:    retq
81;
82; X64-SHIFT-LABEL: test_i8_shl_lshr_2:
83; X64-SHIFT:       # %bb.0:
84; X64-SHIFT-NEXT:    # kill: def $edi killed $edi def $rdi
85; X64-SHIFT-NEXT:    shrb $5, %dil
86; X64-SHIFT-NEXT:    leal (,%rdi,8), %eax
87; X64-SHIFT-NEXT:    # kill: def $al killed $al killed $eax
88; X64-SHIFT-NEXT:    retq
89  %1 = lshr i8 %a0, 5
90  %2 = shl i8 %1, 3
91  ret i8 %2
92}
93
94define i16 @test_i16_shl_lshr_0(i16 %a0) {
95; X86-LABEL: test_i16_shl_lshr_0:
96; X86:       # %bb.0:
97; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
98; X86-NEXT:    andl $-8, %eax
99; X86-NEXT:    # kill: def $ax killed $ax killed $eax
100; X86-NEXT:    retl
101;
102; X64-LABEL: test_i16_shl_lshr_0:
103; X64:       # %bb.0:
104; X64-NEXT:    movl %edi, %eax
105; X64-NEXT:    andl $65528, %eax # imm = 0xFFF8
106; X64-NEXT:    # kill: def $ax killed $ax killed $eax
107; X64-NEXT:    retq
108  %1 = lshr i16 %a0, 3
109  %2 = shl i16 %1, 3
110  ret i16 %2
111}
112
113define i16 @test_i16_shl_lshr_1(i16 %a0) {
114; X86-LABEL: test_i16_shl_lshr_1:
115; X86:       # %bb.0:
116; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
117; X86-NEXT:    shll $2, %eax
118; X86-NEXT:    andl $65504, %eax # imm = 0xFFE0
119; X86-NEXT:    # kill: def $ax killed $ax killed $eax
120; X86-NEXT:    retl
121;
122; X64-MASK-LABEL: test_i16_shl_lshr_1:
123; X64-MASK:       # %bb.0:
124; X64-MASK-NEXT:    # kill: def $edi killed $edi def $rdi
125; X64-MASK-NEXT:    leal (,%rdi,4), %eax
126; X64-MASK-NEXT:    andl $65504, %eax # imm = 0xFFE0
127; X64-MASK-NEXT:    # kill: def $ax killed $ax killed $eax
128; X64-MASK-NEXT:    retq
129;
130; X64-SHIFT-LABEL: test_i16_shl_lshr_1:
131; X64-SHIFT:       # %bb.0:
132; X64-SHIFT-NEXT:    movzwl %di, %eax
133; X64-SHIFT-NEXT:    shrl $3, %eax
134; X64-SHIFT-NEXT:    shll $5, %eax
135; X64-SHIFT-NEXT:    # kill: def $ax killed $ax killed $eax
136; X64-SHIFT-NEXT:    retq
137  %1 = lshr i16 %a0, 3
138  %2 = shl i16 %1, 5
139  ret i16 %2
140}
141
142define i16 @test_i16_shl_lshr_2(i16 %a0) {
143; X86-LABEL: test_i16_shl_lshr_2:
144; X86:       # %bb.0:
145; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
146; X86-NEXT:    shrl $2, %eax
147; X86-NEXT:    andl $16376, %eax # imm = 0x3FF8
148; X86-NEXT:    # kill: def $ax killed $ax killed $eax
149; X86-NEXT:    retl
150;
151; X64-MASK-LABEL: test_i16_shl_lshr_2:
152; X64-MASK:       # %bb.0:
153; X64-MASK-NEXT:    movl %edi, %eax
154; X64-MASK-NEXT:    shrl $2, %eax
155; X64-MASK-NEXT:    andl $16376, %eax # imm = 0x3FF8
156; X64-MASK-NEXT:    # kill: def $ax killed $ax killed $eax
157; X64-MASK-NEXT:    retq
158;
159; X64-SHIFT-LABEL: test_i16_shl_lshr_2:
160; X64-SHIFT:       # %bb.0:
161; X64-SHIFT-NEXT:    movzwl %di, %eax
162; X64-SHIFT-NEXT:    shrl $5, %eax
163; X64-SHIFT-NEXT:    shll $3, %eax
164; X64-SHIFT-NEXT:    # kill: def $ax killed $ax killed $eax
165; X64-SHIFT-NEXT:    retq
166  %1 = lshr i16 %a0, 5
167  %2 = shl i16 %1, 3
168  ret i16 %2
169}
170
171define i32 @test_i32_shl_lshr_0(i32 %a0) {
172; X86-LABEL: test_i32_shl_lshr_0:
173; X86:       # %bb.0:
174; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
175; X86-NEXT:    andl $-8, %eax
176; X86-NEXT:    retl
177;
178; X64-LABEL: test_i32_shl_lshr_0:
179; X64:       # %bb.0:
180; X64-NEXT:    movl %edi, %eax
181; X64-NEXT:    andl $-8, %eax
182; X64-NEXT:    retq
183  %1 = lshr i32 %a0, 3
184  %2 = shl i32 %1, 3
185  ret i32 %2
186}
187
188define i32 @test_i32_shl_lshr_1(i32 %a0) {
189; X86-LABEL: test_i32_shl_lshr_1:
190; X86:       # %bb.0:
191; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
192; X86-NEXT:    shll $2, %eax
193; X86-NEXT:    andl $-32, %eax
194; X86-NEXT:    retl
195;
196; X64-MASK-LABEL: test_i32_shl_lshr_1:
197; X64-MASK:       # %bb.0:
198; X64-MASK-NEXT:    # kill: def $edi killed $edi def $rdi
199; X64-MASK-NEXT:    leal (,%rdi,4), %eax
200; X64-MASK-NEXT:    andl $-32, %eax
201; X64-MASK-NEXT:    retq
202;
203; X64-SHIFT-LABEL: test_i32_shl_lshr_1:
204; X64-SHIFT:       # %bb.0:
205; X64-SHIFT-NEXT:    movl %edi, %eax
206; X64-SHIFT-NEXT:    shrl $3, %eax
207; X64-SHIFT-NEXT:    shll $5, %eax
208; X64-SHIFT-NEXT:    retq
209  %1 = lshr i32 %a0, 3
210  %2 = shl i32 %1, 5
211  ret i32 %2
212}
213
214define i32 @test_i32_shl_lshr_2(i32 %a0) {
215; X86-LABEL: test_i32_shl_lshr_2:
216; X86:       # %bb.0:
217; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
218; X86-NEXT:    shrl $2, %eax
219; X86-NEXT:    andl $-8, %eax
220; X86-NEXT:    retl
221;
222; X64-MASK-LABEL: test_i32_shl_lshr_2:
223; X64-MASK:       # %bb.0:
224; X64-MASK-NEXT:    movl %edi, %eax
225; X64-MASK-NEXT:    shrl $2, %eax
226; X64-MASK-NEXT:    andl $-8, %eax
227; X64-MASK-NEXT:    retq
228;
229; X64-SHIFT-LABEL: test_i32_shl_lshr_2:
230; X64-SHIFT:       # %bb.0:
231; X64-SHIFT-NEXT:    # kill: def $edi killed $edi def $rdi
232; X64-SHIFT-NEXT:    shrl $5, %edi
233; X64-SHIFT-NEXT:    leal (,%rdi,8), %eax
234; X64-SHIFT-NEXT:    retq
235  %1 = lshr i32 %a0, 5
236  %2 = shl i32 %1, 3
237  ret i32 %2
238}
239
240define i64 @test_i64_shl_lshr_0(i64 %a0) {
241; X86-LABEL: test_i64_shl_lshr_0:
242; X86:       # %bb.0:
243; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
244; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
245; X86-NEXT:    andl $-8, %eax
246; X86-NEXT:    retl
247;
248; X64-LABEL: test_i64_shl_lshr_0:
249; X64:       # %bb.0:
250; X64-NEXT:    movq %rdi, %rax
251; X64-NEXT:    andq $-8, %rax
252; X64-NEXT:    retq
253  %1 = lshr i64 %a0, 3
254  %2 = shl i64 %1, 3
255  ret i64 %2
256}
257
258define i64 @test_i64_shl_lshr_1(i64 %a0) {
259; X86-LABEL: test_i64_shl_lshr_1:
260; X86:       # %bb.0:
261; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
262; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
263; X86-NEXT:    leal (,%ecx,4), %eax
264; X86-NEXT:    andl $-32, %eax
265; X86-NEXT:    shldl $2, %ecx, %edx
266; X86-NEXT:    retl
267;
268; X64-MASK-LABEL: test_i64_shl_lshr_1:
269; X64-MASK:       # %bb.0:
270; X64-MASK-NEXT:    leaq (,%rdi,4), %rax
271; X64-MASK-NEXT:    andq $-32, %rax
272; X64-MASK-NEXT:    retq
273;
274; X64-SHIFT-LABEL: test_i64_shl_lshr_1:
275; X64-SHIFT:       # %bb.0:
276; X64-SHIFT-NEXT:    movq %rdi, %rax
277; X64-SHIFT-NEXT:    shrq $3, %rax
278; X64-SHIFT-NEXT:    shlq $5, %rax
279; X64-SHIFT-NEXT:    retq
280  %1 = lshr i64 %a0, 3
281  %2 = shl i64 %1, 5
282  ret i64 %2
283}
284
285define i64 @test_i64_shl_lshr_2(i64 %a0) {
286; X86-LABEL: test_i64_shl_lshr_2:
287; X86:       # %bb.0:
288; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
289; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
290; X86-NEXT:    shrdl $2, %edx, %eax
291; X86-NEXT:    andl $-8, %eax
292; X86-NEXT:    shrl $2, %edx
293; X86-NEXT:    retl
294;
295; X64-MASK-LABEL: test_i64_shl_lshr_2:
296; X64-MASK:       # %bb.0:
297; X64-MASK-NEXT:    movq %rdi, %rax
298; X64-MASK-NEXT:    shrq $2, %rax
299; X64-MASK-NEXT:    andq $-8, %rax
300; X64-MASK-NEXT:    retq
301;
302; X64-SHIFT-LABEL: test_i64_shl_lshr_2:
303; X64-SHIFT:       # %bb.0:
304; X64-SHIFT-NEXT:    shrq $5, %rdi
305; X64-SHIFT-NEXT:    leaq (,%rdi,8), %rax
306; X64-SHIFT-NEXT:    retq
307  %1 = lshr i64 %a0, 5
308  %2 = shl i64 %1, 3
309  ret i64 %2
310}
311
312;
313; fold (lshr (shl x, c1), c2) -> (0) (and x, MASK) or
314;                                (1) (and (shl x, (sub c1, c2), MASK) or
315;                                (2) (and (lshr x, (sub c2, c1), MASK)
316;
317
318define i8 @test_i8_lshr_lshr_0(i8 %a0) {
319; X86-LABEL: test_i8_lshr_lshr_0:
320; X86:       # %bb.0:
321; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
322; X86-NEXT:    andb $31, %al
323; X86-NEXT:    retl
324;
325; X64-LABEL: test_i8_lshr_lshr_0:
326; X64:       # %bb.0:
327; X64-NEXT:    movl %edi, %eax
328; X64-NEXT:    andb $31, %al
329; X64-NEXT:    # kill: def $al killed $al killed $eax
330; X64-NEXT:    retq
331  %1 = shl i8 %a0, 3
332  %2 = lshr i8 %1, 3
333  ret i8 %2
334}
335
336define i8 @test_i8_lshr_lshr_1(i8 %a0) {
337; X86-LABEL: test_i8_lshr_lshr_1:
338; X86:       # %bb.0:
339; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
340; X86-NEXT:    shlb $3, %al
341; X86-NEXT:    shrb $5, %al
342; X86-NEXT:    retl
343;
344; X64-LABEL: test_i8_lshr_lshr_1:
345; X64:       # %bb.0:
346; X64-NEXT:    # kill: def $edi killed $edi def $rdi
347; X64-NEXT:    leal (,%rdi,8), %eax
348; X64-NEXT:    shrb $5, %al
349; X64-NEXT:    # kill: def $al killed $al killed $eax
350; X64-NEXT:    retq
351  %1 = shl i8 %a0, 3
352  %2 = lshr i8 %1, 5
353  ret i8 %2
354}
355
356define i8 @test_i8_lshr_lshr_2(i8 %a0) {
357; X86-LABEL: test_i8_lshr_lshr_2:
358; X86:       # %bb.0:
359; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
360; X86-NEXT:    shlb $5, %al
361; X86-NEXT:    shrb $3, %al
362; X86-NEXT:    retl
363;
364; X64-LABEL: test_i8_lshr_lshr_2:
365; X64:       # %bb.0:
366; X64-NEXT:    movl %edi, %eax
367; X64-NEXT:    shlb $5, %al
368; X64-NEXT:    shrb $3, %al
369; X64-NEXT:    # kill: def $al killed $al killed $eax
370; X64-NEXT:    retq
371  %1 = shl i8 %a0, 5
372  %2 = lshr i8 %1, 3
373  ret i8 %2
374}
375
376define i16 @test_i16_lshr_lshr_0(i16 %a0) {
377; X86-LABEL: test_i16_lshr_lshr_0:
378; X86:       # %bb.0:
379; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
380; X86-NEXT:    andl $8191, %eax # imm = 0x1FFF
381; X86-NEXT:    # kill: def $ax killed $ax killed $eax
382; X86-NEXT:    retl
383;
384; X64-LABEL: test_i16_lshr_lshr_0:
385; X64:       # %bb.0:
386; X64-NEXT:    movl %edi, %eax
387; X64-NEXT:    andl $8191, %eax # imm = 0x1FFF
388; X64-NEXT:    # kill: def $ax killed $ax killed $eax
389; X64-NEXT:    retq
390  %1 = shl i16 %a0, 3
391  %2 = lshr i16 %1, 3
392  ret i16 %2
393}
394
395define i16 @test_i16_lshr_lshr_1(i16 %a0) {
396; X86-LABEL: test_i16_lshr_lshr_1:
397; X86:       # %bb.0:
398; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
399; X86-NEXT:    shrl $2, %eax
400; X86-NEXT:    andl $2047, %eax # imm = 0x7FF
401; X86-NEXT:    # kill: def $ax killed $ax killed $eax
402; X86-NEXT:    retl
403;
404; X64-MASK-LABEL: test_i16_lshr_lshr_1:
405; X64-MASK:       # %bb.0:
406; X64-MASK-NEXT:    movl %edi, %eax
407; X64-MASK-NEXT:    shrl $2, %eax
408; X64-MASK-NEXT:    andl $2047, %eax # imm = 0x7FF
409; X64-MASK-NEXT:    # kill: def $ax killed $ax killed $eax
410; X64-MASK-NEXT:    retq
411;
412; X64-SHIFT2-LABEL: test_i16_lshr_lshr_1:
413; X64-SHIFT2:       # %bb.0:
414; X64-SHIFT2-NEXT:    movl %edi, %eax
415; X64-SHIFT2-NEXT:    shrl $2, %eax
416; X64-SHIFT2-NEXT:    andl $2047, %eax # imm = 0x7FF
417; X64-SHIFT2-NEXT:    # kill: def $ax killed $ax killed $eax
418; X64-SHIFT2-NEXT:    retq
419;
420; X64-TBM-LABEL: test_i16_lshr_lshr_1:
421; X64-TBM:       # %bb.0:
422; X64-TBM-NEXT:    bextrl $2818, %edi, %eax # imm = 0xB02
423; X64-TBM-NEXT:    # kill: def $ax killed $ax killed $eax
424; X64-TBM-NEXT:    retq
425;
426; X64-BMI-LABEL: test_i16_lshr_lshr_1:
427; X64-BMI:       # %bb.0:
428; X64-BMI-NEXT:    movl $2818, %eax # imm = 0xB02
429; X64-BMI-NEXT:    bextrl %eax, %edi, %eax
430; X64-BMI-NEXT:    # kill: def $ax killed $ax killed $eax
431; X64-BMI-NEXT:    retq
432  %1 = shl i16 %a0, 3
433  %2 = lshr i16 %1, 5
434  ret i16 %2
435}
436
437define i16 @test_i16_lshr_lshr_2(i16 %a0) {
438; X86-LABEL: test_i16_lshr_lshr_2:
439; X86:       # %bb.0:
440; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
441; X86-NEXT:    shll $2, %eax
442; X86-NEXT:    andl $8188, %eax # imm = 0x1FFC
443; X86-NEXT:    # kill: def $ax killed $ax killed $eax
444; X86-NEXT:    retl
445;
446; X64-LABEL: test_i16_lshr_lshr_2:
447; X64:       # %bb.0:
448; X64-NEXT:    # kill: def $edi killed $edi def $rdi
449; X64-NEXT:    leal (,%rdi,4), %eax
450; X64-NEXT:    andl $8188, %eax # imm = 0x1FFC
451; X64-NEXT:    # kill: def $ax killed $ax killed $eax
452; X64-NEXT:    retq
453  %1 = shl i16 %a0, 5
454  %2 = lshr i16 %1, 3
455  ret i16 %2
456}
457
458define i32 @test_i32_lshr_lshr_0(i32 %a0) {
459; X86-LABEL: test_i32_lshr_lshr_0:
460; X86:       # %bb.0:
461; X86-NEXT:    movl $536870911, %eax # imm = 0x1FFFFFFF
462; X86-NEXT:    andl {{[0-9]+}}(%esp), %eax
463; X86-NEXT:    retl
464;
465; X64-LABEL: test_i32_lshr_lshr_0:
466; X64:       # %bb.0:
467; X64-NEXT:    movl %edi, %eax
468; X64-NEXT:    andl $536870911, %eax # imm = 0x1FFFFFFF
469; X64-NEXT:    retq
470  %1 = shl i32 %a0, 3
471  %2 = lshr i32 %1, 3
472  ret i32 %2
473}
474
475define i32 @test_i32_lshr_lshr_1(i32 %a0) {
476; X86-LABEL: test_i32_lshr_lshr_1:
477; X86:       # %bb.0:
478; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
479; X86-NEXT:    shll $3, %eax
480; X86-NEXT:    shrl $5, %eax
481; X86-NEXT:    retl
482;
483; X64-LABEL: test_i32_lshr_lshr_1:
484; X64:       # %bb.0:
485; X64-NEXT:    # kill: def $edi killed $edi def $rdi
486; X64-NEXT:    leal (,%rdi,8), %eax
487; X64-NEXT:    shrl $5, %eax
488; X64-NEXT:    retq
489  %1 = shl i32 %a0, 3
490  %2 = lshr i32 %1, 5
491  ret i32 %2
492}
493
494define i32 @test_i32_lshr_lshr_2(i32 %a0) {
495; X86-LABEL: test_i32_lshr_lshr_2:
496; X86:       # %bb.0:
497; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
498; X86-NEXT:    shll $5, %eax
499; X86-NEXT:    shrl $3, %eax
500; X86-NEXT:    retl
501;
502; X64-LABEL: test_i32_lshr_lshr_2:
503; X64:       # %bb.0:
504; X64-NEXT:    movl %edi, %eax
505; X64-NEXT:    shll $5, %eax
506; X64-NEXT:    shrl $3, %eax
507; X64-NEXT:    retq
508  %1 = shl i32 %a0, 5
509  %2 = lshr i32 %1, 3
510  ret i32 %2
511}
512
513define i64 @test_i64_lshr_lshr_0(i64 %a0) {
514; X86-LABEL: test_i64_lshr_lshr_0:
515; X86:       # %bb.0:
516; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
517; X86-NEXT:    movl $536870911, %edx # imm = 0x1FFFFFFF
518; X86-NEXT:    andl {{[0-9]+}}(%esp), %edx
519; X86-NEXT:    retl
520;
521; X64-MASK-LABEL: test_i64_lshr_lshr_0:
522; X64-MASK:       # %bb.0:
523; X64-MASK-NEXT:    movabsq $2305843009213693951, %rax # imm = 0x1FFFFFFFFFFFFFFF
524; X64-MASK-NEXT:    andq %rdi, %rax
525; X64-MASK-NEXT:    retq
526;
527; X64-SHIFT2-LABEL: test_i64_lshr_lshr_0:
528; X64-SHIFT2:       # %bb.0:
529; X64-SHIFT2-NEXT:    movabsq $2305843009213693951, %rax # imm = 0x1FFFFFFFFFFFFFFF
530; X64-SHIFT2-NEXT:    andq %rdi, %rax
531; X64-SHIFT2-NEXT:    retq
532;
533; X64-TBM-LABEL: test_i64_lshr_lshr_0:
534; X64-TBM:       # %bb.0:
535; X64-TBM-NEXT:    bextrq $15616, %rdi, %rax # imm = 0x3D00
536; X64-TBM-NEXT:    retq
537;
538; X64-BMI1-LABEL: test_i64_lshr_lshr_0:
539; X64-BMI1:       # %bb.0:
540; X64-BMI1-NEXT:    movl $15616, %eax # imm = 0x3D00
541; X64-BMI1-NEXT:    bextrq %rax, %rdi, %rax
542; X64-BMI1-NEXT:    retq
543;
544; X64-BMI2-LABEL: test_i64_lshr_lshr_0:
545; X64-BMI2:       # %bb.0:
546; X64-BMI2-NEXT:    movb $61, %al
547; X64-BMI2-NEXT:    bzhiq %rax, %rdi, %rax
548; X64-BMI2-NEXT:    retq
549  %1 = shl i64 %a0, 3
550  %2 = lshr i64 %1, 3
551  ret i64 %2
552}
553
554define i64 @test_i64_lshr_lshr_1(i64 %a0) {
555; X86-LABEL: test_i64_lshr_lshr_1:
556; X86:       # %bb.0:
557; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
558; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
559; X86-NEXT:    shldl $3, %eax, %edx
560; X86-NEXT:    shll $3, %eax
561; X86-NEXT:    shrdl $5, %edx, %eax
562; X86-NEXT:    shrl $5, %edx
563; X86-NEXT:    retl
564;
565; X64-LABEL: test_i64_lshr_lshr_1:
566; X64:       # %bb.0:
567; X64-NEXT:    leaq (,%rdi,8), %rax
568; X64-NEXT:    shrq $5, %rax
569; X64-NEXT:    retq
570  %1 = shl i64 %a0, 3
571  %2 = lshr i64 %1, 5
572  ret i64 %2
573}
574
575define i64 @test_i64_lshr_lshr_2(i64 %a0) {
576; X86-LABEL: test_i64_lshr_lshr_2:
577; X86:       # %bb.0:
578; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
579; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
580; X86-NEXT:    shldl $5, %eax, %edx
581; X86-NEXT:    movl %eax, %ecx
582; X86-NEXT:    shll $5, %ecx
583; X86-NEXT:    shrl $27, %eax
584; X86-NEXT:    shldl $29, %ecx, %eax
585; X86-NEXT:    shrl $3, %edx
586; X86-NEXT:    retl
587;
588; X64-LABEL: test_i64_lshr_lshr_2:
589; X64:       # %bb.0:
590; X64-NEXT:    movq %rdi, %rax
591; X64-NEXT:    shlq $5, %rax
592; X64-NEXT:    shrq $3, %rax
593; X64-NEXT:    retq
594  %1 = shl i64 %a0, 5
595  %2 = lshr i64 %1, 3
596  ret i64 %2
597}
598