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