1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefixes=CHECK,X86,X86-FAST
3; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+slow-shld | FileCheck %s --check-prefixes=CHECK,X86,X86-SLOW
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=CHECK,X64,X64-FAST
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+slow-shld | FileCheck %s --check-prefixes=CHECK,X64,X64-SLOW
6
7declare i8 @llvm.fshr.i8(i8, i8, i8) nounwind readnone
8declare i16 @llvm.fshr.i16(i16, i16, i16) nounwind readnone
9declare i32 @llvm.fshr.i32(i32, i32, i32) nounwind readnone
10declare i64 @llvm.fshr.i64(i64, i64, i64) nounwind readnone
11
12;
13; Variable Funnel Shift
14;
15
16define i8 @var_shift_i8(i8 %x, i8 %y, i8 %z) nounwind {
17; X86-LABEL: var_shift_i8:
18; X86:       # %bb.0:
19; X86-NEXT:    movb {{[0-9]+}}(%esp), %ah
20; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
21; X86-NEXT:    movb {{[0-9]+}}(%esp), %dl
22; X86-NEXT:    andb $7, %dl
23; X86-NEXT:    movb %al, %ch
24; X86-NEXT:    movb %dl, %cl
25; X86-NEXT:    shrb %cl, %ch
26; X86-NEXT:    movb $8, %cl
27; X86-NEXT:    subb %dl, %cl
28; X86-NEXT:    shlb %cl, %ah
29; X86-NEXT:    testb %dl, %dl
30; X86-NEXT:    je .LBB0_2
31; X86-NEXT:  # %bb.1:
32; X86-NEXT:    orb %ch, %ah
33; X86-NEXT:    movb %ah, %al
34; X86-NEXT:  .LBB0_2:
35; X86-NEXT:    retl
36;
37; X64-LABEL: var_shift_i8:
38; X64:       # %bb.0:
39; X64-NEXT:    movl %esi, %eax
40; X64-NEXT:    andb $7, %dl
41; X64-NEXT:    movl %edx, %ecx
42; X64-NEXT:    shrb %cl, %sil
43; X64-NEXT:    movb $8, %cl
44; X64-NEXT:    subb %dl, %cl
45; X64-NEXT:    shlb %cl, %dil
46; X64-NEXT:    testb %dl, %dl
47; X64-NEXT:    je .LBB0_2
48; X64-NEXT:  # %bb.1:
49; X64-NEXT:    orb %sil, %dil
50; X64-NEXT:    movl %edi, %eax
51; X64-NEXT:  .LBB0_2:
52; X64-NEXT:    # kill: def $al killed $al killed $eax
53; X64-NEXT:    retq
54  %tmp = tail call i8 @llvm.fshr.i8(i8 %x, i8 %y, i8 %z)
55  ret i8 %tmp
56}
57
58define i16 @var_shift_i16(i16 %x, i16 %y, i16 %z) nounwind {
59; X86-FAST-LABEL: var_shift_i16:
60; X86-FAST:       # %bb.0:
61; X86-FAST-NEXT:    movzwl {{[0-9]+}}(%esp), %edx
62; X86-FAST-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
63; X86-FAST-NEXT:    movb {{[0-9]+}}(%esp), %cl
64; X86-FAST-NEXT:    andb $15, %cl
65; X86-FAST-NEXT:    shrdw %cl, %dx, %ax
66; X86-FAST-NEXT:    retl
67;
68; X86-SLOW-LABEL: var_shift_i16:
69; X86-SLOW:       # %bb.0:
70; X86-SLOW-NEXT:    pushl %edi
71; X86-SLOW-NEXT:    pushl %esi
72; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %esi
73; X86-SLOW-NEXT:    movb {{[0-9]+}}(%esp), %dl
74; X86-SLOW-NEXT:    andb $15, %dl
75; X86-SLOW-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
76; X86-SLOW-NEXT:    movl %eax, %edi
77; X86-SLOW-NEXT:    movl %edx, %ecx
78; X86-SLOW-NEXT:    shrl %cl, %edi
79; X86-SLOW-NEXT:    movb $16, %cl
80; X86-SLOW-NEXT:    subb %dl, %cl
81; X86-SLOW-NEXT:    shll %cl, %esi
82; X86-SLOW-NEXT:    testb %dl, %dl
83; X86-SLOW-NEXT:    je .LBB1_2
84; X86-SLOW-NEXT:  # %bb.1:
85; X86-SLOW-NEXT:    orl %edi, %esi
86; X86-SLOW-NEXT:    movl %esi, %eax
87; X86-SLOW-NEXT:  .LBB1_2:
88; X86-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax
89; X86-SLOW-NEXT:    popl %esi
90; X86-SLOW-NEXT:    popl %edi
91; X86-SLOW-NEXT:    retl
92;
93; X64-FAST-LABEL: var_shift_i16:
94; X64-FAST:       # %bb.0:
95; X64-FAST-NEXT:    movl %edx, %ecx
96; X64-FAST-NEXT:    movl %esi, %eax
97; X64-FAST-NEXT:    andb $15, %cl
98; X64-FAST-NEXT:    # kill: def $cl killed $cl killed $ecx
99; X64-FAST-NEXT:    shrdw %cl, %di, %ax
100; X64-FAST-NEXT:    # kill: def $ax killed $ax killed $eax
101; X64-FAST-NEXT:    retq
102;
103; X64-SLOW-LABEL: var_shift_i16:
104; X64-SLOW:       # %bb.0:
105; X64-SLOW-NEXT:    movzwl %si, %eax
106; X64-SLOW-NEXT:    andb $15, %dl
107; X64-SLOW-NEXT:    movl %edx, %ecx
108; X64-SLOW-NEXT:    shrl %cl, %eax
109; X64-SLOW-NEXT:    movb $16, %cl
110; X64-SLOW-NEXT:    subb %dl, %cl
111; X64-SLOW-NEXT:    shll %cl, %edi
112; X64-SLOW-NEXT:    orl %edi, %eax
113; X64-SLOW-NEXT:    testb %dl, %dl
114; X64-SLOW-NEXT:    cmovel %esi, %eax
115; X64-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax
116; X64-SLOW-NEXT:    retq
117  %tmp = tail call i16 @llvm.fshr.i16(i16 %x, i16 %y, i16 %z)
118  ret i16 %tmp
119}
120
121define i32 @var_shift_i32(i32 %x, i32 %y, i32 %z) nounwind {
122; X86-FAST-LABEL: var_shift_i32:
123; X86-FAST:       # %bb.0:
124; X86-FAST-NEXT:    movb {{[0-9]+}}(%esp), %cl
125; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %edx
126; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %eax
127; X86-FAST-NEXT:    shrdl %cl, %edx, %eax
128; X86-FAST-NEXT:    retl
129;
130; X86-SLOW-LABEL: var_shift_i32:
131; X86-SLOW:       # %bb.0:
132; X86-SLOW-NEXT:    pushl %edi
133; X86-SLOW-NEXT:    pushl %esi
134; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %esi
135; X86-SLOW-NEXT:    movb {{[0-9]+}}(%esp), %dl
136; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %eax
137; X86-SLOW-NEXT:    movl %eax, %edi
138; X86-SLOW-NEXT:    movl %edx, %ecx
139; X86-SLOW-NEXT:    shrl %cl, %edi
140; X86-SLOW-NEXT:    andb $31, %dl
141; X86-SLOW-NEXT:    movl %edx, %ecx
142; X86-SLOW-NEXT:    negb %cl
143; X86-SLOW-NEXT:    shll %cl, %esi
144; X86-SLOW-NEXT:    testb %dl, %dl
145; X86-SLOW-NEXT:    je .LBB2_2
146; X86-SLOW-NEXT:  # %bb.1:
147; X86-SLOW-NEXT:    orl %edi, %esi
148; X86-SLOW-NEXT:    movl %esi, %eax
149; X86-SLOW-NEXT:  .LBB2_2:
150; X86-SLOW-NEXT:    popl %esi
151; X86-SLOW-NEXT:    popl %edi
152; X86-SLOW-NEXT:    retl
153;
154; X64-FAST-LABEL: var_shift_i32:
155; X64-FAST:       # %bb.0:
156; X64-FAST-NEXT:    movl %edx, %ecx
157; X64-FAST-NEXT:    movl %esi, %eax
158; X64-FAST-NEXT:    # kill: def $cl killed $cl killed $ecx
159; X64-FAST-NEXT:    shrdl %cl, %edi, %eax
160; X64-FAST-NEXT:    retq
161;
162; X64-SLOW-LABEL: var_shift_i32:
163; X64-SLOW:       # %bb.0:
164; X64-SLOW-NEXT:    movl %edi, %eax
165; X64-SLOW-NEXT:    movl %esi, %edi
166; X64-SLOW-NEXT:    movl %edx, %ecx
167; X64-SLOW-NEXT:    shrl %cl, %edi
168; X64-SLOW-NEXT:    andb $31, %dl
169; X64-SLOW-NEXT:    movl %edx, %ecx
170; X64-SLOW-NEXT:    negb %cl
171; X64-SLOW-NEXT:    shll %cl, %eax
172; X64-SLOW-NEXT:    orl %edi, %eax
173; X64-SLOW-NEXT:    testb %dl, %dl
174; X64-SLOW-NEXT:    cmovel %esi, %eax
175; X64-SLOW-NEXT:    retq
176  %tmp = tail call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 %z)
177  ret i32 %tmp
178}
179
180define i64 @var_shift_i64(i64 %x, i64 %y, i64 %z) nounwind {
181; X86-FAST-LABEL: var_shift_i64:
182; X86-FAST:       # %bb.0:
183; X86-FAST-NEXT:    pushl %ebp
184; X86-FAST-NEXT:    pushl %ebx
185; X86-FAST-NEXT:    pushl %edi
186; X86-FAST-NEXT:    pushl %esi
187; X86-FAST-NEXT:    pushl %eax
188; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %eax
189; X86-FAST-NEXT:    movl %eax, (%esp) # 4-byte Spill
190; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %edx
191; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %eax
192; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %esi
193; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %ebx
194; X86-FAST-NEXT:    andl $63, %ebx
195; X86-FAST-NEXT:    movb $64, %cl
196; X86-FAST-NEXT:    subb %bl, %cl
197; X86-FAST-NEXT:    movl %eax, %edi
198; X86-FAST-NEXT:    shll %cl, %edi
199; X86-FAST-NEXT:    shldl %cl, %eax, %esi
200; X86-FAST-NEXT:    testb $32, %cl
201; X86-FAST-NEXT:    je .LBB3_2
202; X86-FAST-NEXT:  # %bb.1:
203; X86-FAST-NEXT:    movl %edi, %esi
204; X86-FAST-NEXT:    xorl %edi, %edi
205; X86-FAST-NEXT:  .LBB3_2:
206; X86-FAST-NEXT:    movl %edx, %ebp
207; X86-FAST-NEXT:    movl %ebx, %ecx
208; X86-FAST-NEXT:    shrl %cl, %ebp
209; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %eax
210; X86-FAST-NEXT:    shrdl %cl, %edx, %eax
211; X86-FAST-NEXT:    testb $32, %bl
212; X86-FAST-NEXT:    je .LBB3_4
213; X86-FAST-NEXT:  # %bb.3:
214; X86-FAST-NEXT:    movl %ebp, %eax
215; X86-FAST-NEXT:    xorl %ebp, %ebp
216; X86-FAST-NEXT:  .LBB3_4:
217; X86-FAST-NEXT:    testl %ebx, %ebx
218; X86-FAST-NEXT:    je .LBB3_6
219; X86-FAST-NEXT:  # %bb.5:
220; X86-FAST-NEXT:    orl %ebp, %esi
221; X86-FAST-NEXT:    orl %eax, %edi
222; X86-FAST-NEXT:    movl %edi, (%esp) # 4-byte Spill
223; X86-FAST-NEXT:    movl %esi, %edx
224; X86-FAST-NEXT:  .LBB3_6:
225; X86-FAST-NEXT:    movl (%esp), %eax # 4-byte Reload
226; X86-FAST-NEXT:    addl $4, %esp
227; X86-FAST-NEXT:    popl %esi
228; X86-FAST-NEXT:    popl %edi
229; X86-FAST-NEXT:    popl %ebx
230; X86-FAST-NEXT:    popl %ebp
231; X86-FAST-NEXT:    retl
232;
233; X86-SLOW-LABEL: var_shift_i64:
234; X86-SLOW:       # %bb.0:
235; X86-SLOW-NEXT:    pushl %ebp
236; X86-SLOW-NEXT:    pushl %ebx
237; X86-SLOW-NEXT:    pushl %edi
238; X86-SLOW-NEXT:    pushl %esi
239; X86-SLOW-NEXT:    subl $8, %esp
240; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %eax
241; X86-SLOW-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
242; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %esi
243; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %edx
244; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %ebx
245; X86-SLOW-NEXT:    andl $63, %ebx
246; X86-SLOW-NEXT:    movb $64, %al
247; X86-SLOW-NEXT:    subb %bl, %al
248; X86-SLOW-NEXT:    movl %edx, (%esp) # 4-byte Spill
249; X86-SLOW-NEXT:    movl %eax, %ecx
250; X86-SLOW-NEXT:    shll %cl, %edx
251; X86-SLOW-NEXT:    movb %al, %ch
252; X86-SLOW-NEXT:    andb $31, %ch
253; X86-SLOW-NEXT:    movb %ch, %cl
254; X86-SLOW-NEXT:    negb %cl
255; X86-SLOW-NEXT:    movl %esi, %edi
256; X86-SLOW-NEXT:    shrl %cl, %edi
257; X86-SLOW-NEXT:    testb %ch, %ch
258; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %ebp
259; X86-SLOW-NEXT:    je .LBB3_2
260; X86-SLOW-NEXT:  # %bb.1:
261; X86-SLOW-NEXT:    orl %edi, %edx
262; X86-SLOW-NEXT:    movl %edx, (%esp) # 4-byte Spill
263; X86-SLOW-NEXT:  .LBB3_2:
264; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %ecx
265; X86-SLOW-NEXT:    movl %ecx, %edx
266; X86-SLOW-NEXT:    movl %ebx, %ecx
267; X86-SLOW-NEXT:    shrl %cl, %edx
268; X86-SLOW-NEXT:    movb %bl, %ah
269; X86-SLOW-NEXT:    andb $31, %ah
270; X86-SLOW-NEXT:    movb %ah, %cl
271; X86-SLOW-NEXT:    negb %cl
272; X86-SLOW-NEXT:    movl %ebp, %edi
273; X86-SLOW-NEXT:    shll %cl, %edi
274; X86-SLOW-NEXT:    testb %ah, %ah
275; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %ebp
276; X86-SLOW-NEXT:    je .LBB3_4
277; X86-SLOW-NEXT:  # %bb.3:
278; X86-SLOW-NEXT:    orl %edx, %edi
279; X86-SLOW-NEXT:    movl %edi, %ebp
280; X86-SLOW-NEXT:  .LBB3_4:
281; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %edi
282; X86-SLOW-NEXT:    movl %ebx, %ecx
283; X86-SLOW-NEXT:    shrl %cl, %edi
284; X86-SLOW-NEXT:    testb $32, %bl
285; X86-SLOW-NEXT:    je .LBB3_6
286; X86-SLOW-NEXT:  # %bb.5:
287; X86-SLOW-NEXT:    movl %edi, %ebp
288; X86-SLOW-NEXT:    xorl %edi, %edi
289; X86-SLOW-NEXT:  .LBB3_6:
290; X86-SLOW-NEXT:    movl %eax, %ecx
291; X86-SLOW-NEXT:    shll %cl, %esi
292; X86-SLOW-NEXT:    testb $32, %al
293; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %edx
294; X86-SLOW-NEXT:    jne .LBB3_7
295; X86-SLOW-NEXT:  # %bb.8:
296; X86-SLOW-NEXT:    movl (%esp), %eax # 4-byte Reload
297; X86-SLOW-NEXT:    testl %ebx, %ebx
298; X86-SLOW-NEXT:    jne .LBB3_10
299; X86-SLOW-NEXT:    jmp .LBB3_11
300; X86-SLOW-NEXT:  .LBB3_7:
301; X86-SLOW-NEXT:    movl %esi, %eax
302; X86-SLOW-NEXT:    xorl %esi, %esi
303; X86-SLOW-NEXT:    testl %ebx, %ebx
304; X86-SLOW-NEXT:    je .LBB3_11
305; X86-SLOW-NEXT:  .LBB3_10:
306; X86-SLOW-NEXT:    orl %ebp, %esi
307; X86-SLOW-NEXT:    orl %edi, %eax
308; X86-SLOW-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
309; X86-SLOW-NEXT:    movl %eax, %edx
310; X86-SLOW-NEXT:  .LBB3_11:
311; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
312; X86-SLOW-NEXT:    addl $8, %esp
313; X86-SLOW-NEXT:    popl %esi
314; X86-SLOW-NEXT:    popl %edi
315; X86-SLOW-NEXT:    popl %ebx
316; X86-SLOW-NEXT:    popl %ebp
317; X86-SLOW-NEXT:    retl
318;
319; X64-FAST-LABEL: var_shift_i64:
320; X64-FAST:       # %bb.0:
321; X64-FAST-NEXT:    movq %rdx, %rcx
322; X64-FAST-NEXT:    movq %rsi, %rax
323; X64-FAST-NEXT:    # kill: def $cl killed $cl killed $rcx
324; X64-FAST-NEXT:    shrdq %cl, %rdi, %rax
325; X64-FAST-NEXT:    retq
326;
327; X64-SLOW-LABEL: var_shift_i64:
328; X64-SLOW:       # %bb.0:
329; X64-SLOW-NEXT:    movq %rdi, %rax
330; X64-SLOW-NEXT:    movq %rsi, %rdi
331; X64-SLOW-NEXT:    movl %edx, %ecx
332; X64-SLOW-NEXT:    shrq %cl, %rdi
333; X64-SLOW-NEXT:    andb $63, %dl
334; X64-SLOW-NEXT:    movl %edx, %ecx
335; X64-SLOW-NEXT:    negb %cl
336; X64-SLOW-NEXT:    shlq %cl, %rax
337; X64-SLOW-NEXT:    orq %rdi, %rax
338; X64-SLOW-NEXT:    testb %dl, %dl
339; X64-SLOW-NEXT:    cmoveq %rsi, %rax
340; X64-SLOW-NEXT:    retq
341  %tmp = tail call i64 @llvm.fshr.i64(i64 %x, i64 %y, i64 %z)
342  ret i64 %tmp
343}
344
345;
346; Const Funnel Shift
347;
348
349define i8 @const_shift_i8(i8 %x, i8 %y) nounwind {
350; X86-LABEL: const_shift_i8:
351; X86:       # %bb.0:
352; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
353; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
354; X86-NEXT:    shrb $7, %cl
355; X86-NEXT:    addb %al, %al
356; X86-NEXT:    orb %cl, %al
357; X86-NEXT:    retl
358;
359; X64-LABEL: const_shift_i8:
360; X64:       # %bb.0:
361; X64-NEXT:    movl %edi, %eax
362; X64-NEXT:    shrb $7, %sil
363; X64-NEXT:    addb %al, %al
364; X64-NEXT:    orb %sil, %al
365; X64-NEXT:    # kill: def $al killed $al killed $eax
366; X64-NEXT:    retq
367  %tmp = tail call i8 @llvm.fshr.i8(i8 %x, i8 %y, i8 7)
368  ret i8 %tmp
369}
370
371define i16 @const_shift_i16(i16 %x, i16 %y) nounwind {
372; X86-FAST-LABEL: const_shift_i16:
373; X86-FAST:       # %bb.0:
374; X86-FAST-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
375; X86-FAST-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
376; X86-FAST-NEXT:    shrdw $7, %cx, %ax
377; X86-FAST-NEXT:    retl
378;
379; X86-SLOW-LABEL: const_shift_i16:
380; X86-SLOW:       # %bb.0:
381; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %eax
382; X86-SLOW-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
383; X86-SLOW-NEXT:    shrl $7, %ecx
384; X86-SLOW-NEXT:    shll $9, %eax
385; X86-SLOW-NEXT:    orl %ecx, %eax
386; X86-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax
387; X86-SLOW-NEXT:    retl
388;
389; X64-FAST-LABEL: const_shift_i16:
390; X64-FAST:       # %bb.0:
391; X64-FAST-NEXT:    movl %esi, %eax
392; X64-FAST-NEXT:    shrdw $7, %di, %ax
393; X64-FAST-NEXT:    # kill: def $ax killed $ax killed $eax
394; X64-FAST-NEXT:    retq
395;
396; X64-SLOW-LABEL: const_shift_i16:
397; X64-SLOW:       # %bb.0:
398; X64-SLOW-NEXT:    movzwl %si, %eax
399; X64-SLOW-NEXT:    shll $9, %edi
400; X64-SLOW-NEXT:    shrl $7, %eax
401; X64-SLOW-NEXT:    orl %edi, %eax
402; X64-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax
403; X64-SLOW-NEXT:    retq
404  %tmp = tail call i16 @llvm.fshr.i16(i16 %x, i16 %y, i16 7)
405  ret i16 %tmp
406}
407
408define i32 @const_shift_i32(i32 %x, i32 %y) nounwind {
409; X86-FAST-LABEL: const_shift_i32:
410; X86-FAST:       # %bb.0:
411; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %ecx
412; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %eax
413; X86-FAST-NEXT:    shrdl $7, %ecx, %eax
414; X86-FAST-NEXT:    retl
415;
416; X86-SLOW-LABEL: const_shift_i32:
417; X86-SLOW:       # %bb.0:
418; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %eax
419; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %ecx
420; X86-SLOW-NEXT:    shrl $7, %ecx
421; X86-SLOW-NEXT:    shll $25, %eax
422; X86-SLOW-NEXT:    orl %ecx, %eax
423; X86-SLOW-NEXT:    retl
424;
425; X64-FAST-LABEL: const_shift_i32:
426; X64-FAST:       # %bb.0:
427; X64-FAST-NEXT:    movl %edi, %eax
428; X64-FAST-NEXT:    shldl $25, %esi, %eax
429; X64-FAST-NEXT:    retq
430;
431; X64-SLOW-LABEL: const_shift_i32:
432; X64-SLOW:       # %bb.0:
433; X64-SLOW-NEXT:    # kill: def $esi killed $esi def $rsi
434; X64-SLOW-NEXT:    # kill: def $edi killed $edi def $rdi
435; X64-SLOW-NEXT:    shrl $7, %esi
436; X64-SLOW-NEXT:    shll $25, %edi
437; X64-SLOW-NEXT:    leal (%rdi,%rsi), %eax
438; X64-SLOW-NEXT:    retq
439  %tmp = tail call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 7)
440  ret i32 %tmp
441}
442
443define i64 @const_shift_i64(i64 %x, i64 %y) nounwind {
444; X86-FAST-LABEL: const_shift_i64:
445; X86-FAST:       # %bb.0:
446; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %eax
447; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %ecx
448; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %edx
449; X86-FAST-NEXT:    shldl $25, %ecx, %edx
450; X86-FAST-NEXT:    shrdl $7, %ecx, %eax
451; X86-FAST-NEXT:    retl
452;
453; X86-SLOW-LABEL: const_shift_i64:
454; X86-SLOW:       # %bb.0:
455; X86-SLOW-NEXT:    pushl %esi
456; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %edx
457; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %eax
458; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %ecx
459; X86-SLOW-NEXT:    movl %ecx, %esi
460; X86-SLOW-NEXT:    shll $25, %esi
461; X86-SLOW-NEXT:    shrl $7, %eax
462; X86-SLOW-NEXT:    orl %esi, %eax
463; X86-SLOW-NEXT:    shrl $7, %ecx
464; X86-SLOW-NEXT:    shll $25, %edx
465; X86-SLOW-NEXT:    orl %ecx, %edx
466; X86-SLOW-NEXT:    popl %esi
467; X86-SLOW-NEXT:    retl
468;
469; X64-FAST-LABEL: const_shift_i64:
470; X64-FAST:       # %bb.0:
471; X64-FAST-NEXT:    movq %rdi, %rax
472; X64-FAST-NEXT:    shldq $57, %rsi, %rax
473; X64-FAST-NEXT:    retq
474;
475; X64-SLOW-LABEL: const_shift_i64:
476; X64-SLOW:       # %bb.0:
477; X64-SLOW-NEXT:    shrq $7, %rsi
478; X64-SLOW-NEXT:    shlq $57, %rdi
479; X64-SLOW-NEXT:    leaq (%rdi,%rsi), %rax
480; X64-SLOW-NEXT:    retq
481  %tmp = tail call i64 @llvm.fshr.i64(i64 %x, i64 %y, i64 7)
482  ret i64 %tmp
483}
484