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=X86,X86-FAST
3; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+slow-shld | FileCheck %s --check-prefixes=X86,X86-SLOW
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=X64,X64-FAST
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+slow-shld | FileCheck %s --check-prefixes=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
11declare i128 @llvm.fshr.i128(i128, i128, i128) nounwind readnone
12
13;
14; Variable Funnel Shift
15;
16
17define i8 @var_shift_i8(i8 %x, i8 %y, i8 %z) nounwind {
18; X86-LABEL: var_shift_i8:
19; X86:       # %bb.0:
20; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
21; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %edx
22; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
23; X86-NEXT:    shll $8, %eax
24; X86-NEXT:    orl %edx, %eax
25; X86-NEXT:    andb $7, %cl
26; X86-NEXT:    shrl %cl, %eax
27; X86-NEXT:    # kill: def $al killed $al killed $eax
28; X86-NEXT:    retl
29;
30; X64-LABEL: var_shift_i8:
31; X64:       # %bb.0:
32; X64-NEXT:    movl %edx, %ecx
33; X64-NEXT:    shll $8, %edi
34; X64-NEXT:    movzbl %sil, %eax
35; X64-NEXT:    orl %edi, %eax
36; X64-NEXT:    andb $7, %cl
37; X64-NEXT:    # kill: def $cl killed $cl killed $ecx
38; X64-NEXT:    shrl %cl, %eax
39; X64-NEXT:    # kill: def $al killed $al killed $eax
40; X64-NEXT:    retq
41  %tmp = tail call i8 @llvm.fshr.i8(i8 %x, i8 %y, i8 %z)
42  ret i8 %tmp
43}
44
45define i16 @var_shift_i16(i16 %x, i16 %y, i16 %z) nounwind {
46; X86-FAST-LABEL: var_shift_i16:
47; X86-FAST:       # %bb.0:
48; X86-FAST-NEXT:    movzwl {{[0-9]+}}(%esp), %edx
49; X86-FAST-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
50; X86-FAST-NEXT:    movb {{[0-9]+}}(%esp), %cl
51; X86-FAST-NEXT:    andb $15, %cl
52; X86-FAST-NEXT:    shrdw %cl, %dx, %ax
53; X86-FAST-NEXT:    retl
54;
55; X86-SLOW-LABEL: var_shift_i16:
56; X86-SLOW:       # %bb.0:
57; X86-SLOW-NEXT:    movb {{[0-9]+}}(%esp), %cl
58; X86-SLOW-NEXT:    movzwl {{[0-9]+}}(%esp), %edx
59; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %eax
60; X86-SLOW-NEXT:    shll $16, %eax
61; X86-SLOW-NEXT:    orl %edx, %eax
62; X86-SLOW-NEXT:    andb $15, %cl
63; X86-SLOW-NEXT:    shrl %cl, %eax
64; X86-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax
65; X86-SLOW-NEXT:    retl
66;
67; X64-FAST-LABEL: var_shift_i16:
68; X64-FAST:       # %bb.0:
69; X64-FAST-NEXT:    movl %edx, %ecx
70; X64-FAST-NEXT:    movl %esi, %eax
71; X64-FAST-NEXT:    andb $15, %cl
72; X64-FAST-NEXT:    # kill: def $cl killed $cl killed $ecx
73; X64-FAST-NEXT:    shrdw %cl, %di, %ax
74; X64-FAST-NEXT:    # kill: def $ax killed $ax killed $eax
75; X64-FAST-NEXT:    retq
76;
77; X64-SLOW-LABEL: var_shift_i16:
78; X64-SLOW:       # %bb.0:
79; X64-SLOW-NEXT:    movl %edx, %ecx
80; X64-SLOW-NEXT:    shll $16, %edi
81; X64-SLOW-NEXT:    movzwl %si, %eax
82; X64-SLOW-NEXT:    orl %edi, %eax
83; X64-SLOW-NEXT:    andb $15, %cl
84; X64-SLOW-NEXT:    # kill: def $cl killed $cl killed $ecx
85; X64-SLOW-NEXT:    shrl %cl, %eax
86; X64-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax
87; X64-SLOW-NEXT:    retq
88  %tmp = tail call i16 @llvm.fshr.i16(i16 %x, i16 %y, i16 %z)
89  ret i16 %tmp
90}
91
92define i32 @var_shift_i32(i32 %x, i32 %y, i32 %z) nounwind {
93; X86-FAST-LABEL: var_shift_i32:
94; X86-FAST:       # %bb.0:
95; X86-FAST-NEXT:    movb {{[0-9]+}}(%esp), %cl
96; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %edx
97; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %eax
98; X86-FAST-NEXT:    shrdl %cl, %edx, %eax
99; X86-FAST-NEXT:    retl
100;
101; X86-SLOW-LABEL: var_shift_i32:
102; X86-SLOW:       # %bb.0:
103; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %eax
104; X86-SLOW-NEXT:    movb {{[0-9]+}}(%esp), %cl
105; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %edx
106; X86-SLOW-NEXT:    shrl %cl, %edx
107; X86-SLOW-NEXT:    notb %cl
108; X86-SLOW-NEXT:    addl %eax, %eax
109; X86-SLOW-NEXT:    shll %cl, %eax
110; X86-SLOW-NEXT:    orl %edx, %eax
111; X86-SLOW-NEXT:    retl
112;
113; X64-FAST-LABEL: var_shift_i32:
114; X64-FAST:       # %bb.0:
115; X64-FAST-NEXT:    movl %edx, %ecx
116; X64-FAST-NEXT:    movl %esi, %eax
117; X64-FAST-NEXT:    # kill: def $cl killed $cl killed $ecx
118; X64-FAST-NEXT:    shrdl %cl, %edi, %eax
119; X64-FAST-NEXT:    retq
120;
121; X64-SLOW-LABEL: var_shift_i32:
122; X64-SLOW:       # %bb.0:
123; X64-SLOW-NEXT:    movl %edx, %ecx
124; X64-SLOW-NEXT:    # kill: def $edi killed $edi def $rdi
125; X64-SLOW-NEXT:    shrl %cl, %esi
126; X64-SLOW-NEXT:    leal (%rdi,%rdi), %eax
127; X64-SLOW-NEXT:    notb %cl
128; X64-SLOW-NEXT:    # kill: def $cl killed $cl killed $ecx
129; X64-SLOW-NEXT:    shll %cl, %eax
130; X64-SLOW-NEXT:    orl %esi, %eax
131; X64-SLOW-NEXT:    retq
132  %tmp = tail call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 %z)
133  ret i32 %tmp
134}
135
136define i32 @var_shift_i32_optsize(i32 %x, i32 %y, i32 %z) nounwind optsize {
137; X86-LABEL: var_shift_i32_optsize:
138; X86:       # %bb.0:
139; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
140; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
141; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
142; X86-NEXT:    shrdl %cl, %edx, %eax
143; X86-NEXT:    retl
144;
145; X64-LABEL: var_shift_i32_optsize:
146; X64:       # %bb.0:
147; X64-NEXT:    movl %edx, %ecx
148; X64-NEXT:    movl %esi, %eax
149; X64-NEXT:    # kill: def $cl killed $cl killed $ecx
150; X64-NEXT:    shrdl %cl, %edi, %eax
151; X64-NEXT:    retq
152  %tmp = tail call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 %z)
153  ret i32 %tmp
154}
155
156define i32 @var_shift_i32_pgso(i32 %x, i32 %y, i32 %z) nounwind !prof !14 {
157; X86-LABEL: var_shift_i32_pgso:
158; X86:       # %bb.0:
159; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
160; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
161; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
162; X86-NEXT:    shrdl %cl, %edx, %eax
163; X86-NEXT:    retl
164;
165; X64-LABEL: var_shift_i32_pgso:
166; X64:       # %bb.0:
167; X64-NEXT:    movl %edx, %ecx
168; X64-NEXT:    movl %esi, %eax
169; X64-NEXT:    # kill: def $cl killed $cl killed $ecx
170; X64-NEXT:    shrdl %cl, %edi, %eax
171; X64-NEXT:    retq
172  %tmp = tail call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 %z)
173  ret i32 %tmp
174}
175
176define i64 @var_shift_i64(i64 %x, i64 %y, i64 %z) nounwind {
177; X86-FAST-LABEL: var_shift_i64:
178; X86-FAST:       # %bb.0:
179; X86-FAST-NEXT:    pushl %ebp
180; X86-FAST-NEXT:    pushl %ebx
181; X86-FAST-NEXT:    pushl %edi
182; X86-FAST-NEXT:    pushl %esi
183; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %esi
184; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %ebp
185; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %eax
186; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %edx
187; X86-FAST-NEXT:    movb {{[0-9]+}}(%esp), %bl
188; X86-FAST-NEXT:    movb %bl, %ch
189; X86-FAST-NEXT:    notb %ch
190; X86-FAST-NEXT:    shldl $1, %eax, %edx
191; X86-FAST-NEXT:    addl %eax, %eax
192; X86-FAST-NEXT:    movb %ch, %cl
193; X86-FAST-NEXT:    shldl %cl, %eax, %edx
194; X86-FAST-NEXT:    movl %ebp, %edi
195; X86-FAST-NEXT:    movb %bl, %cl
196; X86-FAST-NEXT:    shrl %cl, %edi
197; X86-FAST-NEXT:    shrdl %cl, %ebp, %esi
198; X86-FAST-NEXT:    testb $32, %bl
199; X86-FAST-NEXT:    je .LBB5_2
200; X86-FAST-NEXT:  # %bb.1:
201; X86-FAST-NEXT:    movl %edi, %esi
202; X86-FAST-NEXT:    xorl %edi, %edi
203; X86-FAST-NEXT:  .LBB5_2:
204; X86-FAST-NEXT:    movb %ch, %cl
205; X86-FAST-NEXT:    shll %cl, %eax
206; X86-FAST-NEXT:    testb $32, %ch
207; X86-FAST-NEXT:    je .LBB5_4
208; X86-FAST-NEXT:  # %bb.3:
209; X86-FAST-NEXT:    movl %eax, %edx
210; X86-FAST-NEXT:    xorl %eax, %eax
211; X86-FAST-NEXT:  .LBB5_4:
212; X86-FAST-NEXT:    orl %edi, %edx
213; X86-FAST-NEXT:    orl %esi, %eax
214; X86-FAST-NEXT:    popl %esi
215; X86-FAST-NEXT:    popl %edi
216; X86-FAST-NEXT:    popl %ebx
217; X86-FAST-NEXT:    popl %ebp
218; X86-FAST-NEXT:    retl
219;
220; X86-SLOW-LABEL: var_shift_i64:
221; X86-SLOW:       # %bb.0:
222; X86-SLOW-NEXT:    pushl %ebp
223; X86-SLOW-NEXT:    pushl %ebx
224; X86-SLOW-NEXT:    pushl %edi
225; X86-SLOW-NEXT:    pushl %esi
226; X86-SLOW-NEXT:    pushl %eax
227; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %ebp
228; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %esi
229; X86-SLOW-NEXT:    movb {{[0-9]+}}(%esp), %bl
230; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %eax
231; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %edx
232; X86-SLOW-NEXT:    movl %eax, %edi
233; X86-SLOW-NEXT:    andl $2147483647, %edi # imm = 0x7FFFFFFF
234; X86-SLOW-NEXT:    movl %ebx, %ecx
235; X86-SLOW-NEXT:    shrl %cl, %edi
236; X86-SLOW-NEXT:    movl %eax, %ecx
237; X86-SLOW-NEXT:    shrl $31, %ecx
238; X86-SLOW-NEXT:    leal (%ecx,%edx,2), %edx
239; X86-SLOW-NEXT:    movb %bl, %ch
240; X86-SLOW-NEXT:    notb %ch
241; X86-SLOW-NEXT:    movb %ch, %cl
242; X86-SLOW-NEXT:    shll %cl, %edx
243; X86-SLOW-NEXT:    movb %bl, %cl
244; X86-SLOW-NEXT:    shrl %cl, %ebp
245; X86-SLOW-NEXT:    movl %ebp, (%esp) # 4-byte Spill
246; X86-SLOW-NEXT:    leal (%esi,%esi), %ebp
247; X86-SLOW-NEXT:    movb %ch, %cl
248; X86-SLOW-NEXT:    shll %cl, %ebp
249; X86-SLOW-NEXT:    movb %bl, %cl
250; X86-SLOW-NEXT:    shrl %cl, %esi
251; X86-SLOW-NEXT:    testb $32, %bl
252; X86-SLOW-NEXT:    jne .LBB5_1
253; X86-SLOW-NEXT:  # %bb.2:
254; X86-SLOW-NEXT:    orl (%esp), %ebp # 4-byte Folded Reload
255; X86-SLOW-NEXT:    jmp .LBB5_3
256; X86-SLOW-NEXT:  .LBB5_1:
257; X86-SLOW-NEXT:    movl %esi, %ebp
258; X86-SLOW-NEXT:    xorl %esi, %esi
259; X86-SLOW-NEXT:  .LBB5_3:
260; X86-SLOW-NEXT:    addl %eax, %eax
261; X86-SLOW-NEXT:    movb %ch, %cl
262; X86-SLOW-NEXT:    shll %cl, %eax
263; X86-SLOW-NEXT:    testb $32, %ch
264; X86-SLOW-NEXT:    jne .LBB5_4
265; X86-SLOW-NEXT:  # %bb.5:
266; X86-SLOW-NEXT:    orl %edi, %edx
267; X86-SLOW-NEXT:    jmp .LBB5_6
268; X86-SLOW-NEXT:  .LBB5_4:
269; X86-SLOW-NEXT:    movl %eax, %edx
270; X86-SLOW-NEXT:    xorl %eax, %eax
271; X86-SLOW-NEXT:  .LBB5_6:
272; X86-SLOW-NEXT:    orl %esi, %edx
273; X86-SLOW-NEXT:    orl %ebp, %eax
274; X86-SLOW-NEXT:    addl $4, %esp
275; X86-SLOW-NEXT:    popl %esi
276; X86-SLOW-NEXT:    popl %edi
277; X86-SLOW-NEXT:    popl %ebx
278; X86-SLOW-NEXT:    popl %ebp
279; X86-SLOW-NEXT:    retl
280;
281; X64-FAST-LABEL: var_shift_i64:
282; X64-FAST:       # %bb.0:
283; X64-FAST-NEXT:    movq %rdx, %rcx
284; X64-FAST-NEXT:    movq %rsi, %rax
285; X64-FAST-NEXT:    # kill: def $cl killed $cl killed $rcx
286; X64-FAST-NEXT:    shrdq %cl, %rdi, %rax
287; X64-FAST-NEXT:    retq
288;
289; X64-SLOW-LABEL: var_shift_i64:
290; X64-SLOW:       # %bb.0:
291; X64-SLOW-NEXT:    movq %rdx, %rcx
292; X64-SLOW-NEXT:    shrq %cl, %rsi
293; X64-SLOW-NEXT:    leaq (%rdi,%rdi), %rax
294; X64-SLOW-NEXT:    notb %cl
295; X64-SLOW-NEXT:    # kill: def $cl killed $cl killed $rcx
296; X64-SLOW-NEXT:    shlq %cl, %rax
297; X64-SLOW-NEXT:    orq %rsi, %rax
298; X64-SLOW-NEXT:    retq
299  %tmp = tail call i64 @llvm.fshr.i64(i64 %x, i64 %y, i64 %z)
300  ret i64 %tmp
301}
302
303define i128 @var_shift_i128(i128 %x, i128 %y, i128 %z) nounwind {
304; X86-FAST-LABEL: var_shift_i128:
305; X86-FAST:       # %bb.0:
306; X86-FAST-NEXT:    pushl %ebp
307; X86-FAST-NEXT:    pushl %ebx
308; X86-FAST-NEXT:    pushl %edi
309; X86-FAST-NEXT:    pushl %esi
310; X86-FAST-NEXT:    subl $76, %esp
311; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %ebp
312; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %eax
313; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %edi
314; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %ebx
315; X86-FAST-NEXT:    movl %ebx, %ecx
316; X86-FAST-NEXT:    andl $127, %ecx
317; X86-FAST-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
318; X86-FAST-NEXT:    movb %cl, %ch
319; X86-FAST-NEXT:    movb $64, %cl
320; X86-FAST-NEXT:    subb %ch, %cl
321; X86-FAST-NEXT:    shll %cl, %edi
322; X86-FAST-NEXT:    movb %cl, (%esp) # 1-byte Spill
323; X86-FAST-NEXT:    testb $32, %cl
324; X86-FAST-NEXT:    movl $0, %esi
325; X86-FAST-NEXT:    jne .LBB6_2
326; X86-FAST-NEXT:  # %bb.1:
327; X86-FAST-NEXT:    movl %edi, %esi
328; X86-FAST-NEXT:  .LBB6_2:
329; X86-FAST-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
330; X86-FAST-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
331; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %edi
332; X86-FAST-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
333; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %esi
334; X86-FAST-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
335; X86-FAST-NEXT:    movl %eax, %edi
336; X86-FAST-NEXT:    movl %ebp, %eax
337; X86-FAST-NEXT:    shldl $1, %ebp, %edi
338; X86-FAST-NEXT:    addl %ebp, %eax
339; X86-FAST-NEXT:    notl %ebx
340; X86-FAST-NEXT:    andl $127, %ebx
341; X86-FAST-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
342; X86-FAST-NEXT:    movb %bl, %cl
343; X86-FAST-NEXT:    shldl %cl, %eax, %edi
344; X86-FAST-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
345; X86-FAST-NEXT:    shll %cl, %eax
346; X86-FAST-NEXT:    testb $32, %bl
347; X86-FAST-NEXT:    movl %eax, %esi
348; X86-FAST-NEXT:    jne .LBB6_4
349; X86-FAST-NEXT:  # %bb.3:
350; X86-FAST-NEXT:    movl %edi, %esi
351; X86-FAST-NEXT:  .LBB6_4:
352; X86-FAST-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
353; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %esi
354; X86-FAST-NEXT:    movb %ch, %cl
355; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %edi
356; X86-FAST-NEXT:    shrdl %cl, %edi, %esi
357; X86-FAST-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
358; X86-FAST-NEXT:    movl %edi, %esi
359; X86-FAST-NEXT:    shrl %cl, %esi
360; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %edi
361; X86-FAST-NEXT:    shrl %cl, %edi
362; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %ebp
363; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %edx
364; X86-FAST-NEXT:    shrdl %cl, %edx, %ebp
365; X86-FAST-NEXT:    testb $32, %ch
366; X86-FAST-NEXT:    jne .LBB6_5
367; X86-FAST-NEXT:  # %bb.6:
368; X86-FAST-NEXT:    movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
369; X86-FAST-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
370; X86-FAST-NEXT:    jmp .LBB6_7
371; X86-FAST-NEXT:  .LBB6_5:
372; X86-FAST-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
373; X86-FAST-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
374; X86-FAST-NEXT:    xorl %edi, %edi
375; X86-FAST-NEXT:    movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
376; X86-FAST-NEXT:  .LBB6_7:
377; X86-FAST-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
378; X86-FAST-NEXT:    testb $32, %bl
379; X86-FAST-NEXT:    movl $0, %esi
380; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %ebp
381; X86-FAST-NEXT:    jne .LBB6_9
382; X86-FAST-NEXT:  # %bb.8:
383; X86-FAST-NEXT:    movl %eax, %esi
384; X86-FAST-NEXT:  .LBB6_9:
385; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %edi
386; X86-FAST-NEXT:    cmpl $64, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
387; X86-FAST-NEXT:    jb .LBB6_11
388; X86-FAST-NEXT:  # %bb.10:
389; X86-FAST-NEXT:    movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
390; X86-FAST-NEXT:  .LBB6_11:
391; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %eax
392; X86-FAST-NEXT:    shrdl $31, %edi, %eax
393; X86-FAST-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
394; X86-FAST-NEXT:    movb %bl, %cl
395; X86-FAST-NEXT:    shll %cl, %eax
396; X86-FAST-NEXT:    testb $32, %bl
397; X86-FAST-NEXT:    movl $0, %edi
398; X86-FAST-NEXT:    jne .LBB6_13
399; X86-FAST-NEXT:  # %bb.12:
400; X86-FAST-NEXT:    movl %eax, %edi
401; X86-FAST-NEXT:  .LBB6_13:
402; X86-FAST-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
403; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %eax
404; X86-FAST-NEXT:    movb (%esp), %cl # 1-byte Reload
405; X86-FAST-NEXT:    shldl %cl, %ebp, %eax
406; X86-FAST-NEXT:    testb $32, %cl
407; X86-FAST-NEXT:    jne .LBB6_15
408; X86-FAST-NEXT:  # %bb.14:
409; X86-FAST-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
410; X86-FAST-NEXT:  .LBB6_15:
411; X86-FAST-NEXT:    movb %bl, %dh
412; X86-FAST-NEXT:    addb $-64, %dh
413; X86-FAST-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
414; X86-FAST-NEXT:    movb %dh, %cl
415; X86-FAST-NEXT:    shll %cl, %eax
416; X86-FAST-NEXT:    movl %eax, (%esp) # 4-byte Spill
417; X86-FAST-NEXT:    testb $32, %dh
418; X86-FAST-NEXT:    movl $0, %eax
419; X86-FAST-NEXT:    jne .LBB6_17
420; X86-FAST-NEXT:  # %bb.16:
421; X86-FAST-NEXT:    movl (%esp), %eax # 4-byte Reload
422; X86-FAST-NEXT:  .LBB6_17:
423; X86-FAST-NEXT:    cmpl $64, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
424; X86-FAST-NEXT:    jb .LBB6_19
425; X86-FAST-NEXT:  # %bb.18:
426; X86-FAST-NEXT:    movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
427; X86-FAST-NEXT:  .LBB6_19:
428; X86-FAST-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
429; X86-FAST-NEXT:    cmpl $64, %ebx
430; X86-FAST-NEXT:    jb .LBB6_21
431; X86-FAST-NEXT:  # %bb.20:
432; X86-FAST-NEXT:    xorl %esi, %esi
433; X86-FAST-NEXT:  .LBB6_21:
434; X86-FAST-NEXT:    addb $-64, %ch
435; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %eax
436; X86-FAST-NEXT:    movb %ch, %cl
437; X86-FAST-NEXT:    shrl %cl, %eax
438; X86-FAST-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
439; X86-FAST-NEXT:    testb $32, %ch
440; X86-FAST-NEXT:    movl $0, %eax
441; X86-FAST-NEXT:    jne .LBB6_23
442; X86-FAST-NEXT:  # %bb.22:
443; X86-FAST-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
444; X86-FAST-NEXT:  .LBB6_23:
445; X86-FAST-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
446; X86-FAST-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
447; X86-FAST-NEXT:    cmpl $64, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
448; X86-FAST-NEXT:    jae .LBB6_25
449; X86-FAST-NEXT:  # %bb.24:
450; X86-FAST-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
451; X86-FAST-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
452; X86-FAST-NEXT:  .LBB6_25:
453; X86-FAST-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
454; X86-FAST-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
455; X86-FAST-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
456; X86-FAST-NEXT:    movb %ch, %cl
457; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %eax
458; X86-FAST-NEXT:    shrdl %cl, %eax, %ebp
459; X86-FAST-NEXT:    testb $32, %ch
460; X86-FAST-NEXT:    jne .LBB6_27
461; X86-FAST-NEXT:  # %bb.26:
462; X86-FAST-NEXT:    movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
463; X86-FAST-NEXT:  .LBB6_27:
464; X86-FAST-NEXT:    cmpl $64, %ebx
465; X86-FAST-NEXT:    jb .LBB6_29
466; X86-FAST-NEXT:  # %bb.28:
467; X86-FAST-NEXT:    movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
468; X86-FAST-NEXT:  .LBB6_29:
469; X86-FAST-NEXT:    cmpl $64, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
470; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %ebp
471; X86-FAST-NEXT:    jae .LBB6_31
472; X86-FAST-NEXT:  # %bb.30:
473; X86-FAST-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
474; X86-FAST-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
475; X86-FAST-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
476; X86-FAST-NEXT:  .LBB6_31:
477; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %eax
478; X86-FAST-NEXT:    shldl $1, %eax, %ebp
479; X86-FAST-NEXT:    movl %ebp, %eax
480; X86-FAST-NEXT:    movl %ebx, %ecx
481; X86-FAST-NEXT:    shldl %cl, %edi, %eax
482; X86-FAST-NEXT:    testb $32, %bl
483; X86-FAST-NEXT:    jne .LBB6_33
484; X86-FAST-NEXT:  # %bb.32:
485; X86-FAST-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
486; X86-FAST-NEXT:  .LBB6_33:
487; X86-FAST-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
488; X86-FAST-NEXT:    movb %dh, %cl
489; X86-FAST-NEXT:    shldl %cl, %esi, %eax
490; X86-FAST-NEXT:    testb $32, %dh
491; X86-FAST-NEXT:    jne .LBB6_35
492; X86-FAST-NEXT:  # %bb.34:
493; X86-FAST-NEXT:    movl %eax, (%esp) # 4-byte Spill
494; X86-FAST-NEXT:  .LBB6_35:
495; X86-FAST-NEXT:    movb $64, %cl
496; X86-FAST-NEXT:    subb %bl, %cl
497; X86-FAST-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
498; X86-FAST-NEXT:    shrdl %cl, %eax, %esi
499; X86-FAST-NEXT:    shrl %cl, %eax
500; X86-FAST-NEXT:    testb $32, %cl
501; X86-FAST-NEXT:    je .LBB6_37
502; X86-FAST-NEXT:  # %bb.36:
503; X86-FAST-NEXT:    movl %eax, %esi
504; X86-FAST-NEXT:    xorl %eax, %eax
505; X86-FAST-NEXT:  .LBB6_37:
506; X86-FAST-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
507; X86-FAST-NEXT:    cmpl $64, %ebx
508; X86-FAST-NEXT:    jae .LBB6_39
509; X86-FAST-NEXT:  # %bb.38:
510; X86-FAST-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
511; X86-FAST-NEXT:    orl %eax, %ecx
512; X86-FAST-NEXT:    movl %ecx, (%esp) # 4-byte Spill
513; X86-FAST-NEXT:  .LBB6_39:
514; X86-FAST-NEXT:    cmpl $64, %ebx
515; X86-FAST-NEXT:    jae .LBB6_41
516; X86-FAST-NEXT:  # %bb.40:
517; X86-FAST-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
518; X86-FAST-NEXT:    orl %esi, %eax
519; X86-FAST-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
520; X86-FAST-NEXT:  .LBB6_41:
521; X86-FAST-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
522; X86-FAST-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
523; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %eax
524; X86-FAST-NEXT:    testl %ebx, %ebx
525; X86-FAST-NEXT:    je .LBB6_43
526; X86-FAST-NEXT:  # %bb.42:
527; X86-FAST-NEXT:    movl (%esp), %ebp # 4-byte Reload
528; X86-FAST-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
529; X86-FAST-NEXT:  .LBB6_43:
530; X86-FAST-NEXT:    orl %edx, %ebp
531; X86-FAST-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
532; X86-FAST-NEXT:    cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
533; X86-FAST-NEXT:    je .LBB6_45
534; X86-FAST-NEXT:  # %bb.44:
535; X86-FAST-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
536; X86-FAST-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
537; X86-FAST-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
538; X86-FAST-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
539; X86-FAST-NEXT:  .LBB6_45:
540; X86-FAST-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
541; X86-FAST-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
542; X86-FAST-NEXT:    movl %ecx, 4(%eax)
543; X86-FAST-NEXT:    movl %esi, (%eax)
544; X86-FAST-NEXT:    movl %ebp, 12(%eax)
545; X86-FAST-NEXT:    movl %edi, 8(%eax)
546; X86-FAST-NEXT:    addl $76, %esp
547; X86-FAST-NEXT:    popl %esi
548; X86-FAST-NEXT:    popl %edi
549; X86-FAST-NEXT:    popl %ebx
550; X86-FAST-NEXT:    popl %ebp
551; X86-FAST-NEXT:    retl $4
552;
553; X86-SLOW-LABEL: var_shift_i128:
554; X86-SLOW:       # %bb.0:
555; X86-SLOW-NEXT:    pushl %ebp
556; X86-SLOW-NEXT:    pushl %ebx
557; X86-SLOW-NEXT:    pushl %edi
558; X86-SLOW-NEXT:    pushl %esi
559; X86-SLOW-NEXT:    subl $72, %esp
560; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %edi
561; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %esi
562; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %eax
563; X86-SLOW-NEXT:    andl $127, %eax
564; X86-SLOW-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
565; X86-SLOW-NEXT:    movl %eax, %edx
566; X86-SLOW-NEXT:    movl %eax, %ecx
567; X86-SLOW-NEXT:    shrl %cl, %esi
568; X86-SLOW-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
569; X86-SLOW-NEXT:    leal (%edi,%edi), %ebp
570; X86-SLOW-NEXT:    notb %al
571; X86-SLOW-NEXT:    movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
572; X86-SLOW-NEXT:    movl %eax, %ecx
573; X86-SLOW-NEXT:    shll %cl, %ebp
574; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %edi
575; X86-SLOW-NEXT:    movl %edx, %ecx
576; X86-SLOW-NEXT:    shrl %cl, %edi
577; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %esi
578; X86-SLOW-NEXT:    leal (%esi,%esi), %ebx
579; X86-SLOW-NEXT:    movl %eax, %ecx
580; X86-SLOW-NEXT:    shll %cl, %ebx
581; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %eax
582; X86-SLOW-NEXT:    movl %edx, %ecx
583; X86-SLOW-NEXT:    shrl %cl, %eax
584; X86-SLOW-NEXT:    shrl %cl, %esi
585; X86-SLOW-NEXT:    testb $32, %dl
586; X86-SLOW-NEXT:    jne .LBB6_1
587; X86-SLOW-NEXT:  # %bb.2:
588; X86-SLOW-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
589; X86-SLOW-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
590; X86-SLOW-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Folded Reload
591; X86-SLOW-NEXT:    orl %edi, %ebx
592; X86-SLOW-NEXT:    movl %ebx, %esi
593; X86-SLOW-NEXT:    jmp .LBB6_3
594; X86-SLOW-NEXT:  .LBB6_1:
595; X86-SLOW-NEXT:    movl %eax, %ebp
596; X86-SLOW-NEXT:    movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
597; X86-SLOW-NEXT:    movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
598; X86-SLOW-NEXT:  .LBB6_3:
599; X86-SLOW-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
600; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %edi
601; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %ecx
602; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %eax
603; X86-SLOW-NEXT:    cmpl $64, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
604; X86-SLOW-NEXT:    jb .LBB6_5
605; X86-SLOW-NEXT:  # %bb.4:
606; X86-SLOW-NEXT:    movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
607; X86-SLOW-NEXT:  .LBB6_5:
608; X86-SLOW-NEXT:    leal (%ecx,%ecx), %esi
609; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %ebx
610; X86-SLOW-NEXT:    notl %ebx
611; X86-SLOW-NEXT:    andl $127, %ebx
612; X86-SLOW-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
613; X86-SLOW-NEXT:    movl %ebx, %ecx
614; X86-SLOW-NEXT:    shll %cl, %esi
615; X86-SLOW-NEXT:    movl %eax, %ecx
616; X86-SLOW-NEXT:    shrl $31, %ecx
617; X86-SLOW-NEXT:    leal (%ecx,%edi,2), %ecx
618; X86-SLOW-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
619; X86-SLOW-NEXT:    movl %ecx, %edi
620; X86-SLOW-NEXT:    movl %ebx, %ecx
621; X86-SLOW-NEXT:    shll %cl, %edi
622; X86-SLOW-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
623; X86-SLOW-NEXT:    testb $32, %bl
624; X86-SLOW-NEXT:    movl $0, %edi
625; X86-SLOW-NEXT:    movl $0, %ecx
626; X86-SLOW-NEXT:    jne .LBB6_7
627; X86-SLOW-NEXT:  # %bb.6:
628; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
629; X86-SLOW-NEXT:    movl %esi, %ecx
630; X86-SLOW-NEXT:  .LBB6_7:
631; X86-SLOW-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
632; X86-SLOW-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
633; X86-SLOW-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
634; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %edi
635; X86-SLOW-NEXT:    movl %edi, %ecx
636; X86-SLOW-NEXT:    shrl $31, %ecx
637; X86-SLOW-NEXT:    leal (%ecx,%eax,2), %esi
638; X86-SLOW-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
639; X86-SLOW-NEXT:    movl %ebx, %ecx
640; X86-SLOW-NEXT:    shll %cl, %esi
641; X86-SLOW-NEXT:    andl $2147483647, %edi # imm = 0x7FFFFFFF
642; X86-SLOW-NEXT:    movl %ebx, %ecx
643; X86-SLOW-NEXT:    notb %cl
644; X86-SLOW-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
645; X86-SLOW-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
646; X86-SLOW-NEXT:    shrl %cl, %edi
647; X86-SLOW-NEXT:    testb $32, %bl
648; X86-SLOW-NEXT:    jne .LBB6_9
649; X86-SLOW-NEXT:  # %bb.8:
650; X86-SLOW-NEXT:    orl %edi, %esi
651; X86-SLOW-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
652; X86-SLOW-NEXT:  .LBB6_9:
653; X86-SLOW-NEXT:    movb %bl, %dh
654; X86-SLOW-NEXT:    addb $-64, %dh
655; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
656; X86-SLOW-NEXT:    movb %dh, %cl
657; X86-SLOW-NEXT:    shll %cl, %esi
658; X86-SLOW-NEXT:    testb $32, %dh
659; X86-SLOW-NEXT:    movl $0, %ecx
660; X86-SLOW-NEXT:    jne .LBB6_11
661; X86-SLOW-NEXT:  # %bb.10:
662; X86-SLOW-NEXT:    movl %esi, %ecx
663; X86-SLOW-NEXT:  .LBB6_11:
664; X86-SLOW-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
665; X86-SLOW-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
666; X86-SLOW-NEXT:    cmpl $64, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
667; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %esi
668; X86-SLOW-NEXT:    jb .LBB6_13
669; X86-SLOW-NEXT:  # %bb.12:
670; X86-SLOW-NEXT:    xorl %ebp, %ebp
671; X86-SLOW-NEXT:  .LBB6_13:
672; X86-SLOW-NEXT:    movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
673; X86-SLOW-NEXT:    movb $64, %ch
674; X86-SLOW-NEXT:    movb $64, %ah
675; X86-SLOW-NEXT:    subb %dl, %ah
676; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %ebp
677; X86-SLOW-NEXT:    movb %ah, %cl
678; X86-SLOW-NEXT:    shll %cl, %ebp
679; X86-SLOW-NEXT:    notb %cl
680; X86-SLOW-NEXT:    movl %esi, %edi
681; X86-SLOW-NEXT:    shrl %edi
682; X86-SLOW-NEXT:    shrl %cl, %edi
683; X86-SLOW-NEXT:    movb %ah, %cl
684; X86-SLOW-NEXT:    shll %cl, %esi
685; X86-SLOW-NEXT:    testb $32, %ah
686; X86-SLOW-NEXT:    jne .LBB6_14
687; X86-SLOW-NEXT:  # %bb.15:
688; X86-SLOW-NEXT:    orl %edi, %ebp
689; X86-SLOW-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
690; X86-SLOW-NEXT:    movl %ebp, %esi
691; X86-SLOW-NEXT:    jmp .LBB6_16
692; X86-SLOW-NEXT:  .LBB6_14:
693; X86-SLOW-NEXT:    movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
694; X86-SLOW-NEXT:  .LBB6_16:
695; X86-SLOW-NEXT:    addb $-64, %dl
696; X86-SLOW-NEXT:    movb %dl, %cl
697; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %eax
698; X86-SLOW-NEXT:    shrl %cl, %eax
699; X86-SLOW-NEXT:    notb %cl
700; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
701; X86-SLOW-NEXT:    shll %cl, %ebp
702; X86-SLOW-NEXT:    movb %dl, %cl
703; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %edi
704; X86-SLOW-NEXT:    shrl %cl, %edi
705; X86-SLOW-NEXT:    testb $32, %dl
706; X86-SLOW-NEXT:    jne .LBB6_17
707; X86-SLOW-NEXT:  # %bb.18:
708; X86-SLOW-NEXT:    orl %eax, %ebp
709; X86-SLOW-NEXT:    cmpl $64, %ebx
710; X86-SLOW-NEXT:    jae .LBB6_20
711; X86-SLOW-NEXT:    jmp .LBB6_21
712; X86-SLOW-NEXT:  .LBB6_17:
713; X86-SLOW-NEXT:    movl %edi, %ebp
714; X86-SLOW-NEXT:    xorl %edi, %edi
715; X86-SLOW-NEXT:    cmpl $64, %ebx
716; X86-SLOW-NEXT:    jb .LBB6_21
717; X86-SLOW-NEXT:  .LBB6_20:
718; X86-SLOW-NEXT:    movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
719; X86-SLOW-NEXT:    movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
720; X86-SLOW-NEXT:  .LBB6_21:
721; X86-SLOW-NEXT:    cmpl $64, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
722; X86-SLOW-NEXT:    jae .LBB6_23
723; X86-SLOW-NEXT:  # %bb.22:
724; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
725; X86-SLOW-NEXT:    orl %esi, %edi
726; X86-SLOW-NEXT:  .LBB6_23:
727; X86-SLOW-NEXT:    cmpl $64, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
728; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %esi
729; X86-SLOW-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
730; X86-SLOW-NEXT:    jb .LBB6_24
731; X86-SLOW-NEXT:  # %bb.25:
732; X86-SLOW-NEXT:    movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
733; X86-SLOW-NEXT:    jmp .LBB6_26
734; X86-SLOW-NEXT:  .LBB6_24:
735; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
736; X86-SLOW-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
737; X86-SLOW-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
738; X86-SLOW-NEXT:  .LBB6_26:
739; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
740; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %eax
741; X86-SLOW-NEXT:    shrl $31, %eax
742; X86-SLOW-NEXT:    leal (%eax,%esi,2), %esi
743; X86-SLOW-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
744; X86-SLOW-NEXT:    movb %bl, %cl
745; X86-SLOW-NEXT:    shll %cl, %esi
746; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
747; X86-SLOW-NEXT:    shrl %edi
748; X86-SLOW-NEXT:    movb {{[-0-9]+}}(%e{{[sb]}}p), %cl # 1-byte Reload
749; X86-SLOW-NEXT:    shrl %cl, %edi
750; X86-SLOW-NEXT:    testb $32, %bl
751; X86-SLOW-NEXT:    jne .LBB6_28
752; X86-SLOW-NEXT:  # %bb.27:
753; X86-SLOW-NEXT:    orl %edi, %esi
754; X86-SLOW-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
755; X86-SLOW-NEXT:  .LBB6_28:
756; X86-SLOW-NEXT:    movl %ebp, %eax
757; X86-SLOW-NEXT:    movb %dh, %cl
758; X86-SLOW-NEXT:    shll %cl, %eax
759; X86-SLOW-NEXT:    notb %cl
760; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
761; X86-SLOW-NEXT:    shrl %cl, %esi
762; X86-SLOW-NEXT:    testb $32, %dh
763; X86-SLOW-NEXT:    jne .LBB6_30
764; X86-SLOW-NEXT:  # %bb.29:
765; X86-SLOW-NEXT:    orl %esi, %eax
766; X86-SLOW-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
767; X86-SLOW-NEXT:  .LBB6_30:
768; X86-SLOW-NEXT:    subb %bl, %ch
769; X86-SLOW-NEXT:    movl %ebp, %eax
770; X86-SLOW-NEXT:    movb %ch, %cl
771; X86-SLOW-NEXT:    shrl %cl, %eax
772; X86-SLOW-NEXT:    addl %ebp, %ebp
773; X86-SLOW-NEXT:    notb %cl
774; X86-SLOW-NEXT:    shll %cl, %ebp
775; X86-SLOW-NEXT:    movb %ch, %cl
776; X86-SLOW-NEXT:    movl %ebp, %esi
777; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
778; X86-SLOW-NEXT:    shrl %cl, %ebp
779; X86-SLOW-NEXT:    testb $32, %ch
780; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %ecx
781; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
782; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
783; X86-SLOW-NEXT:    jne .LBB6_31
784; X86-SLOW-NEXT:  # %bb.32:
785; X86-SLOW-NEXT:    orl %ebp, %esi
786; X86-SLOW-NEXT:    movl %esi, %ebp
787; X86-SLOW-NEXT:    cmpl $64, %ebx
788; X86-SLOW-NEXT:    jb .LBB6_34
789; X86-SLOW-NEXT:    jmp .LBB6_35
790; X86-SLOW-NEXT:  .LBB6_31:
791; X86-SLOW-NEXT:    movl %eax, %ebp
792; X86-SLOW-NEXT:    xorl %eax, %eax
793; X86-SLOW-NEXT:    cmpl $64, %ebx
794; X86-SLOW-NEXT:    jae .LBB6_35
795; X86-SLOW-NEXT:  .LBB6_34:
796; X86-SLOW-NEXT:    movl %ebp, %esi
797; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
798; X86-SLOW-NEXT:    orl %eax, %ebp
799; X86-SLOW-NEXT:    movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
800; X86-SLOW-NEXT:    movl %esi, %ebp
801; X86-SLOW-NEXT:  .LBB6_35:
802; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
803; X86-SLOW-NEXT:    cmpl $64, %ebx
804; X86-SLOW-NEXT:    jae .LBB6_37
805; X86-SLOW-NEXT:  # %bb.36:
806; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
807; X86-SLOW-NEXT:    orl %ebp, %eax
808; X86-SLOW-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
809; X86-SLOW-NEXT:  .LBB6_37:
810; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %ebp
811; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %eax
812; X86-SLOW-NEXT:    testl %ebx, %ebx
813; X86-SLOW-NEXT:    je .LBB6_39
814; X86-SLOW-NEXT:  # %bb.38:
815; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
816; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
817; X86-SLOW-NEXT:  .LBB6_39:
818; X86-SLOW-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
819; X86-SLOW-NEXT:    cmpl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
820; X86-SLOW-NEXT:    je .LBB6_41
821; X86-SLOW-NEXT:  # %bb.40:
822; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
823; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
824; X86-SLOW-NEXT:  .LBB6_41:
825; X86-SLOW-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
826; X86-SLOW-NEXT:    orl %ecx, %ebx
827; X86-SLOW-NEXT:    orl %ebp, %edx
828; X86-SLOW-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
829; X86-SLOW-NEXT:    movl %ebx, (%eax)
830; X86-SLOW-NEXT:    movl %esi, 12(%eax)
831; X86-SLOW-NEXT:    movl %edx, 4(%eax)
832; X86-SLOW-NEXT:    movl %edi, 8(%eax)
833; X86-SLOW-NEXT:    addl $72, %esp
834; X86-SLOW-NEXT:    popl %esi
835; X86-SLOW-NEXT:    popl %edi
836; X86-SLOW-NEXT:    popl %ebx
837; X86-SLOW-NEXT:    popl %ebp
838; X86-SLOW-NEXT:    retl $4
839;
840; X64-FAST-LABEL: var_shift_i128:
841; X64-FAST:       # %bb.0:
842; X64-FAST-NEXT:    movq %r8, %r10
843; X64-FAST-NEXT:    movq %rcx, %r9
844; X64-FAST-NEXT:    movq %rdx, %r8
845; X64-FAST-NEXT:    movq %rsi, %rdx
846; X64-FAST-NEXT:    movl %r10d, %ecx
847; X64-FAST-NEXT:    shrdq %cl, %r9, %r8
848; X64-FAST-NEXT:    shrq %cl, %r9
849; X64-FAST-NEXT:    xorl %eax, %eax
850; X64-FAST-NEXT:    testb $64, %r10b
851; X64-FAST-NEXT:    cmovneq %r9, %r8
852; X64-FAST-NEXT:    cmovneq %rax, %r9
853; X64-FAST-NEXT:    shldq $1, %rdi, %rdx
854; X64-FAST-NEXT:    addq %rdi, %rdi
855; X64-FAST-NEXT:    notb %r10b
856; X64-FAST-NEXT:    movl %r10d, %ecx
857; X64-FAST-NEXT:    shldq %cl, %rdi, %rdx
858; X64-FAST-NEXT:    shlq %cl, %rdi
859; X64-FAST-NEXT:    testb $64, %r10b
860; X64-FAST-NEXT:    cmovneq %rdi, %rdx
861; X64-FAST-NEXT:    cmoveq %rdi, %rax
862; X64-FAST-NEXT:    orq %r8, %rax
863; X64-FAST-NEXT:    orq %r9, %rdx
864; X64-FAST-NEXT:    retq
865;
866; X64-SLOW-LABEL: var_shift_i128:
867; X64-SLOW:       # %bb.0:
868; X64-SLOW-NEXT:    movq %rcx, %r9
869; X64-SLOW-NEXT:    movq %rdx, %r10
870; X64-SLOW-NEXT:    movabsq $9223372036854775807, %rax # imm = 0x7FFFFFFFFFFFFFFF
871; X64-SLOW-NEXT:    andq %rdi, %rax
872; X64-SLOW-NEXT:    movl %r8d, %ecx
873; X64-SLOW-NEXT:    shrq %cl, %rax
874; X64-SLOW-NEXT:    movq %rdi, %rcx
875; X64-SLOW-NEXT:    shrq $63, %rcx
876; X64-SLOW-NEXT:    leaq (%rcx,%rsi,2), %rdx
877; X64-SLOW-NEXT:    movl %r8d, %r11d
878; X64-SLOW-NEXT:    notb %r11b
879; X64-SLOW-NEXT:    movl %r11d, %ecx
880; X64-SLOW-NEXT:    shlq %cl, %rdx
881; X64-SLOW-NEXT:    orq %rax, %rdx
882; X64-SLOW-NEXT:    movl %r8d, %ecx
883; X64-SLOW-NEXT:    shrq %cl, %r10
884; X64-SLOW-NEXT:    leaq (%r9,%r9), %rsi
885; X64-SLOW-NEXT:    movl %r11d, %ecx
886; X64-SLOW-NEXT:    shlq %cl, %rsi
887; X64-SLOW-NEXT:    orq %r10, %rsi
888; X64-SLOW-NEXT:    movl %r8d, %ecx
889; X64-SLOW-NEXT:    shrq %cl, %r9
890; X64-SLOW-NEXT:    xorl %eax, %eax
891; X64-SLOW-NEXT:    testb $64, %r8b
892; X64-SLOW-NEXT:    cmovneq %r9, %rsi
893; X64-SLOW-NEXT:    cmovneq %rax, %r9
894; X64-SLOW-NEXT:    addq %rdi, %rdi
895; X64-SLOW-NEXT:    movl %r11d, %ecx
896; X64-SLOW-NEXT:    shlq %cl, %rdi
897; X64-SLOW-NEXT:    testb $64, %r11b
898; X64-SLOW-NEXT:    cmovneq %rdi, %rdx
899; X64-SLOW-NEXT:    cmoveq %rdi, %rax
900; X64-SLOW-NEXT:    orq %rsi, %rax
901; X64-SLOW-NEXT:    orq %r9, %rdx
902; X64-SLOW-NEXT:    retq
903  %tmp = tail call i128 @llvm.fshr.i128(i128 %x, i128 %y, i128 %z)
904  ret i128 %tmp
905}
906
907;
908; Const Funnel Shift
909;
910
911define i8 @const_shift_i8(i8 %x, i8 %y) nounwind {
912; X86-LABEL: const_shift_i8:
913; X86:       # %bb.0:
914; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
915; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
916; X86-NEXT:    shrb $7, %cl
917; X86-NEXT:    addb %al, %al
918; X86-NEXT:    orb %cl, %al
919; X86-NEXT:    retl
920;
921; X64-LABEL: const_shift_i8:
922; X64:       # %bb.0:
923; X64-NEXT:    # kill: def $edi killed $edi def $rdi
924; X64-NEXT:    shrb $7, %sil
925; X64-NEXT:    leal (%rdi,%rdi), %eax
926; X64-NEXT:    orb %sil, %al
927; X64-NEXT:    # kill: def $al killed $al killed $eax
928; X64-NEXT:    retq
929  %tmp = tail call i8 @llvm.fshr.i8(i8 %x, i8 %y, i8 7)
930  ret i8 %tmp
931}
932
933define i16 @const_shift_i16(i16 %x, i16 %y) nounwind {
934; X86-FAST-LABEL: const_shift_i16:
935; X86-FAST:       # %bb.0:
936; X86-FAST-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
937; X86-FAST-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
938; X86-FAST-NEXT:    shrdw $7, %cx, %ax
939; X86-FAST-NEXT:    retl
940;
941; X86-SLOW-LABEL: const_shift_i16:
942; X86-SLOW:       # %bb.0:
943; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %eax
944; X86-SLOW-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
945; X86-SLOW-NEXT:    shrl $7, %ecx
946; X86-SLOW-NEXT:    shll $9, %eax
947; X86-SLOW-NEXT:    orl %ecx, %eax
948; X86-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax
949; X86-SLOW-NEXT:    retl
950;
951; X64-FAST-LABEL: const_shift_i16:
952; X64-FAST:       # %bb.0:
953; X64-FAST-NEXT:    movl %esi, %eax
954; X64-FAST-NEXT:    shrdw $7, %di, %ax
955; X64-FAST-NEXT:    # kill: def $ax killed $ax killed $eax
956; X64-FAST-NEXT:    retq
957;
958; X64-SLOW-LABEL: const_shift_i16:
959; X64-SLOW:       # %bb.0:
960; X64-SLOW-NEXT:    movzwl %si, %eax
961; X64-SLOW-NEXT:    shll $9, %edi
962; X64-SLOW-NEXT:    shrl $7, %eax
963; X64-SLOW-NEXT:    orl %edi, %eax
964; X64-SLOW-NEXT:    # kill: def $ax killed $ax killed $eax
965; X64-SLOW-NEXT:    retq
966  %tmp = tail call i16 @llvm.fshr.i16(i16 %x, i16 %y, i16 7)
967  ret i16 %tmp
968}
969
970define i32 @const_shift_i32(i32 %x, i32 %y) nounwind {
971; X86-FAST-LABEL: const_shift_i32:
972; X86-FAST:       # %bb.0:
973; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %ecx
974; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %eax
975; X86-FAST-NEXT:    shrdl $7, %ecx, %eax
976; X86-FAST-NEXT:    retl
977;
978; X86-SLOW-LABEL: const_shift_i32:
979; X86-SLOW:       # %bb.0:
980; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %eax
981; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %ecx
982; X86-SLOW-NEXT:    shrl $7, %ecx
983; X86-SLOW-NEXT:    shll $25, %eax
984; X86-SLOW-NEXT:    orl %ecx, %eax
985; X86-SLOW-NEXT:    retl
986;
987; X64-FAST-LABEL: const_shift_i32:
988; X64-FAST:       # %bb.0:
989; X64-FAST-NEXT:    movl %edi, %eax
990; X64-FAST-NEXT:    shldl $25, %esi, %eax
991; X64-FAST-NEXT:    retq
992;
993; X64-SLOW-LABEL: const_shift_i32:
994; X64-SLOW:       # %bb.0:
995; X64-SLOW-NEXT:    # kill: def $esi killed $esi def $rsi
996; X64-SLOW-NEXT:    # kill: def $edi killed $edi def $rdi
997; X64-SLOW-NEXT:    shrl $7, %esi
998; X64-SLOW-NEXT:    shll $25, %edi
999; X64-SLOW-NEXT:    leal (%rdi,%rsi), %eax
1000; X64-SLOW-NEXT:    retq
1001  %tmp = tail call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 7)
1002  ret i32 %tmp
1003}
1004
1005define i64 @const_shift_i64(i64 %x, i64 %y) nounwind {
1006; X86-FAST-LABEL: const_shift_i64:
1007; X86-FAST:       # %bb.0:
1008; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %eax
1009; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1010; X86-FAST-NEXT:    movl {{[0-9]+}}(%esp), %edx
1011; X86-FAST-NEXT:    shldl $25, %ecx, %edx
1012; X86-FAST-NEXT:    shrdl $7, %ecx, %eax
1013; X86-FAST-NEXT:    retl
1014;
1015; X86-SLOW-LABEL: const_shift_i64:
1016; X86-SLOW:       # %bb.0:
1017; X86-SLOW-NEXT:    pushl %esi
1018; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %edx
1019; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1020; X86-SLOW-NEXT:    movl {{[0-9]+}}(%esp), %esi
1021; X86-SLOW-NEXT:    shrl $7, %ecx
1022; X86-SLOW-NEXT:    movl %esi, %eax
1023; X86-SLOW-NEXT:    shll $25, %eax
1024; X86-SLOW-NEXT:    orl %ecx, %eax
1025; X86-SLOW-NEXT:    shrl $7, %esi
1026; X86-SLOW-NEXT:    shll $25, %edx
1027; X86-SLOW-NEXT:    orl %esi, %edx
1028; X86-SLOW-NEXT:    popl %esi
1029; X86-SLOW-NEXT:    retl
1030;
1031; X64-FAST-LABEL: const_shift_i64:
1032; X64-FAST:       # %bb.0:
1033; X64-FAST-NEXT:    movq %rdi, %rax
1034; X64-FAST-NEXT:    shldq $57, %rsi, %rax
1035; X64-FAST-NEXT:    retq
1036;
1037; X64-SLOW-LABEL: const_shift_i64:
1038; X64-SLOW:       # %bb.0:
1039; X64-SLOW-NEXT:    shrq $7, %rsi
1040; X64-SLOW-NEXT:    shlq $57, %rdi
1041; X64-SLOW-NEXT:    leaq (%rdi,%rsi), %rax
1042; X64-SLOW-NEXT:    retq
1043  %tmp = tail call i64 @llvm.fshr.i64(i64 %x, i64 %y, i64 7)
1044  ret i64 %tmp
1045}
1046
1047;
1048; Combine Consecutive Loads
1049;
1050
1051define i8 @combine_fshr_load_i8(i8* %p) nounwind {
1052; X86-LABEL: combine_fshr_load_i8:
1053; X86:       # %bb.0:
1054; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1055; X86-NEXT:    movb (%eax), %al
1056; X86-NEXT:    retl
1057;
1058; X64-LABEL: combine_fshr_load_i8:
1059; X64:       # %bb.0:
1060; X64-NEXT:    movb (%rdi), %al
1061; X64-NEXT:    retq
1062  %p1 = getelementptr i8, i8* %p, i32 1
1063  %ld0 = load i8, i8 *%p
1064  %ld1 = load i8, i8 *%p1
1065  %res = call i8 @llvm.fshr.i8(i8 %ld1, i8 %ld0, i8 8)
1066  ret i8 %res
1067}
1068
1069define i16 @combine_fshr_load_i16(i16* %p) nounwind {
1070; X86-LABEL: combine_fshr_load_i16:
1071; X86:       # %bb.0:
1072; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1073; X86-NEXT:    movzwl 1(%eax), %eax
1074; X86-NEXT:    retl
1075;
1076; X64-LABEL: combine_fshr_load_i16:
1077; X64:       # %bb.0:
1078; X64-NEXT:    movzwl 1(%rdi), %eax
1079; X64-NEXT:    retq
1080  %p0 = getelementptr i16, i16* %p, i32 0
1081  %p1 = getelementptr i16, i16* %p, i32 1
1082  %ld0 = load i16, i16 *%p0
1083  %ld1 = load i16, i16 *%p1
1084  %res = call i16 @llvm.fshr.i16(i16 %ld1, i16 %ld0, i16 8)
1085  ret i16 %res
1086}
1087
1088define i32 @combine_fshr_load_i32(i32* %p) nounwind {
1089; X86-LABEL: combine_fshr_load_i32:
1090; X86:       # %bb.0:
1091; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1092; X86-NEXT:    movl 9(%eax), %eax
1093; X86-NEXT:    retl
1094;
1095; X64-LABEL: combine_fshr_load_i32:
1096; X64:       # %bb.0:
1097; X64-NEXT:    movl 9(%rdi), %eax
1098; X64-NEXT:    retq
1099  %p0 = getelementptr i32, i32* %p, i32 2
1100  %p1 = getelementptr i32, i32* %p, i32 3
1101  %ld0 = load i32, i32 *%p0
1102  %ld1 = load i32, i32 *%p1
1103  %res = call i32 @llvm.fshr.i32(i32 %ld1, i32 %ld0, i32 8)
1104  ret i32 %res
1105}
1106
1107define i64 @combine_fshr_load_i64(i64* %p) nounwind {
1108; X86-LABEL: combine_fshr_load_i64:
1109; X86:       # %bb.0:
1110; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1111; X86-NEXT:    movl 11(%ecx), %eax
1112; X86-NEXT:    movl 15(%ecx), %edx
1113; X86-NEXT:    retl
1114;
1115; X64-LABEL: combine_fshr_load_i64:
1116; X64:       # %bb.0:
1117; X64-NEXT:    movq 11(%rdi), %rax
1118; X64-NEXT:    retq
1119  %p0 = getelementptr i64, i64* %p, i64 1
1120  %p1 = getelementptr i64, i64* %p, i64 2
1121  %ld0 = load i64, i64 *%p0
1122  %ld1 = load i64, i64 *%p1
1123  %res = call i64 @llvm.fshr.i64(i64 %ld1, i64 %ld0, i64 24)
1124  ret i64 %res
1125}
1126
1127!llvm.module.flags = !{!0}
1128!0 = !{i32 1, !"ProfileSummary", !1}
1129!1 = !{!2, !3, !4, !5, !6, !7, !8, !9}
1130!2 = !{!"ProfileFormat", !"InstrProf"}
1131!3 = !{!"TotalCount", i64 10000}
1132!4 = !{!"MaxCount", i64 10}
1133!5 = !{!"MaxInternalCount", i64 1}
1134!6 = !{!"MaxFunctionCount", i64 1000}
1135!7 = !{!"NumCounts", i64 3}
1136!8 = !{!"NumFunctions", i64 3}
1137!9 = !{!"DetailedSummary", !10}
1138!10 = !{!11, !12, !13}
1139!11 = !{i32 10000, i64 100, i32 1}
1140!12 = !{i32 999000, i64 100, i32 1}
1141!13 = !{i32 999999, i64 1, i32 2}
1142!14 = !{!"function_entry_count", i64 0}
1143