blob: ccf451e045147eaf38b70e9f070f90cf7232116c [file] [log] [blame]
Simon Pilgrim96f79242018-11-16 17:48:52 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +00002; 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
Simon Pilgrim96f79242018-11-16 17:48:52 +00006
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: movl %edi, %eax
40; X64-NEXT: andb $7, %dl
41; X64-NEXT: movl %edx, %ecx
42; X64-NEXT: shlb %cl, %dil
43; X64-NEXT: movb $8, %cl
44; X64-NEXT: subb %dl, %cl
45; X64-NEXT: shrb %cl, %sil
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.fshl.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 {
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +000059; X86-FAST-LABEL: var_shift_i16:
60; X86-FAST: # %bb.0:
Simon Pilgrim180639a2018-12-05 11:12:12 +000061; 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: shldw %cl, %dx, %ax
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +000066; X86-FAST-NEXT: retl
Simon Pilgrim96f79242018-11-16 17:48:52 +000067;
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +000068; 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: movzwl {{[0-9]+}}(%esp), %esi
Simon Pilgrim180639a2018-12-05 11:12:12 +000073; X86-SLOW-NEXT: movb {{[0-9]+}}(%esp), %dl
74; X86-SLOW-NEXT: andb $15, %dl
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +000075; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %eax
76; X86-SLOW-NEXT: movl %eax, %edi
77; X86-SLOW-NEXT: movl %edx, %ecx
78; X86-SLOW-NEXT: shll %cl, %edi
Simon Pilgrim180639a2018-12-05 11:12:12 +000079; X86-SLOW-NEXT: movb $16, %cl
80; X86-SLOW-NEXT: subb %dl, %cl
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +000081; X86-SLOW-NEXT: shrl %cl, %esi
Simon Pilgrim180639a2018-12-05 11:12:12 +000082; X86-SLOW-NEXT: testb %dl, %dl
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +000083; X86-SLOW-NEXT: je .LBB1_2
84; X86-SLOW-NEXT: # %bb.1:
85; X86-SLOW-NEXT: orl %esi, %edi
86; X86-SLOW-NEXT: movl %edi, %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
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +000096; X64-FAST-NEXT: movl %edi, %eax
Simon Pilgrim180639a2018-12-05 11:12:12 +000097; X64-FAST-NEXT: andb $15, %cl
98; X64-FAST-NEXT: # kill: def $cl killed $cl killed $ecx
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +000099; X64-FAST-NEXT: shldw %cl, %si, %ax
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000100; 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
Simon Pilgrim180639a2018-12-05 11:12:12 +0000106; X64-SLOW-NEXT: andb $15, %dl
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000107; X64-SLOW-NEXT: movl %edi, %esi
108; X64-SLOW-NEXT: movl %edx, %ecx
109; X64-SLOW-NEXT: shll %cl, %esi
Simon Pilgrim180639a2018-12-05 11:12:12 +0000110; X64-SLOW-NEXT: movb $16, %cl
111; X64-SLOW-NEXT: subb %dl, %cl
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000112; X64-SLOW-NEXT: shrl %cl, %eax
113; X64-SLOW-NEXT: orl %esi, %eax
Simon Pilgrim180639a2018-12-05 11:12:12 +0000114; X64-SLOW-NEXT: testb %dl, %dl
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000115; X64-SLOW-NEXT: cmovel %edi, %eax
116; X64-SLOW-NEXT: # kill: def $ax killed $ax killed $eax
117; X64-SLOW-NEXT: retq
Simon Pilgrim96f79242018-11-16 17:48:52 +0000118 %tmp = tail call i16 @llvm.fshl.i16(i16 %x, i16 %y, i16 %z)
119 ret i16 %tmp
120}
121
122define i32 @var_shift_i32(i32 %x, i32 %y, i32 %z) nounwind {
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000123; X86-FAST-LABEL: var_shift_i32:
124; X86-FAST: # %bb.0:
Simon Pilgrim180639a2018-12-05 11:12:12 +0000125; X86-FAST-NEXT: movb {{[0-9]+}}(%esp), %cl
126; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %edx
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000127; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %eax
Simon Pilgrim180639a2018-12-05 11:12:12 +0000128; X86-FAST-NEXT: shldl %cl, %edx, %eax
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000129; X86-FAST-NEXT: retl
Simon Pilgrim96f79242018-11-16 17:48:52 +0000130;
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000131; X86-SLOW-LABEL: var_shift_i32:
132; X86-SLOW: # %bb.0:
133; X86-SLOW-NEXT: pushl %edi
134; X86-SLOW-NEXT: pushl %esi
135; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %esi
Simon Pilgrim180639a2018-12-05 11:12:12 +0000136; X86-SLOW-NEXT: movb {{[0-9]+}}(%esp), %dl
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000137; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %eax
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000138; X86-SLOW-NEXT: movl %eax, %edi
139; X86-SLOW-NEXT: movl %edx, %ecx
140; X86-SLOW-NEXT: shll %cl, %edi
Simon Pilgrim180639a2018-12-05 11:12:12 +0000141; X86-SLOW-NEXT: andb $31, %dl
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000142; X86-SLOW-NEXT: movl %edx, %ecx
Simon Pilgrim180639a2018-12-05 11:12:12 +0000143; X86-SLOW-NEXT: negb %cl
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000144; X86-SLOW-NEXT: shrl %cl, %esi
Simon Pilgrim180639a2018-12-05 11:12:12 +0000145; X86-SLOW-NEXT: testb %dl, %dl
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000146; X86-SLOW-NEXT: je .LBB2_2
147; X86-SLOW-NEXT: # %bb.1:
148; X86-SLOW-NEXT: orl %esi, %edi
149; X86-SLOW-NEXT: movl %edi, %eax
150; X86-SLOW-NEXT: .LBB2_2:
151; X86-SLOW-NEXT: popl %esi
152; X86-SLOW-NEXT: popl %edi
153; X86-SLOW-NEXT: retl
154;
155; X64-FAST-LABEL: var_shift_i32:
156; X64-FAST: # %bb.0:
157; X64-FAST-NEXT: movl %edx, %ecx
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000158; X64-FAST-NEXT: movl %edi, %eax
Simon Pilgrim180639a2018-12-05 11:12:12 +0000159; X64-FAST-NEXT: # kill: def $cl killed $cl killed $ecx
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000160; X64-FAST-NEXT: shldl %cl, %esi, %eax
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000161; X64-FAST-NEXT: retq
162;
163; X64-SLOW-LABEL: var_shift_i32:
164; X64-SLOW: # %bb.0:
165; X64-SLOW-NEXT: movl %esi, %eax
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000166; X64-SLOW-NEXT: movl %edi, %esi
167; X64-SLOW-NEXT: movl %edx, %ecx
168; X64-SLOW-NEXT: shll %cl, %esi
Simon Pilgrim180639a2018-12-05 11:12:12 +0000169; X64-SLOW-NEXT: andb $31, %dl
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000170; X64-SLOW-NEXT: movl %edx, %ecx
Simon Pilgrim180639a2018-12-05 11:12:12 +0000171; X64-SLOW-NEXT: negb %cl
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000172; X64-SLOW-NEXT: shrl %cl, %eax
173; X64-SLOW-NEXT: orl %esi, %eax
Simon Pilgrim180639a2018-12-05 11:12:12 +0000174; X64-SLOW-NEXT: testb %dl, %dl
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000175; X64-SLOW-NEXT: cmovel %edi, %eax
176; X64-SLOW-NEXT: retq
Simon Pilgrim96f79242018-11-16 17:48:52 +0000177 %tmp = tail call i32 @llvm.fshl.i32(i32 %x, i32 %y, i32 %z)
178 ret i32 %tmp
179}
180
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000181define i32 @var_shift_i32_optsize(i32 %x, i32 %y, i32 %z) nounwind optsize {
Simon Pilgrimef7b5942018-12-15 19:43:44 +0000182; X86-LABEL: var_shift_i32_optsize:
183; X86: # %bb.0:
184; X86-NEXT: movb {{[0-9]+}}(%esp), %cl
185; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
186; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
187; X86-NEXT: shldl %cl, %edx, %eax
188; X86-NEXT: retl
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000189;
Simon Pilgrimef7b5942018-12-15 19:43:44 +0000190; X64-LABEL: var_shift_i32_optsize:
191; X64: # %bb.0:
192; X64-NEXT: movl %edx, %ecx
193; X64-NEXT: movl %edi, %eax
194; X64-NEXT: # kill: def $cl killed $cl killed $ecx
195; X64-NEXT: shldl %cl, %esi, %eax
196; X64-NEXT: retq
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000197 %tmp = tail call i32 @llvm.fshl.i32(i32 %x, i32 %y, i32 %z)
198 ret i32 %tmp
199}
200
Simon Pilgrim96f79242018-11-16 17:48:52 +0000201define i64 @var_shift_i64(i64 %x, i64 %y, i64 %z) nounwind {
Simon Pilgrim180639a2018-12-05 11:12:12 +0000202; X86-FAST-LABEL: var_shift_i64:
203; X86-FAST: # %bb.0:
204; X86-FAST-NEXT: pushl %ebp
205; X86-FAST-NEXT: pushl %ebx
206; X86-FAST-NEXT: pushl %edi
207; X86-FAST-NEXT: pushl %esi
208; X86-FAST-NEXT: pushl %eax
209; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %eax
210; X86-FAST-NEXT: movl %eax, (%esp) # 4-byte Spill
211; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %edx
212; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %eax
213; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %ebp
214; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %ebx
215; X86-FAST-NEXT: andl $63, %ebx
216; X86-FAST-NEXT: movl %eax, %edi
217; X86-FAST-NEXT: movl %ebx, %ecx
218; X86-FAST-NEXT: shll %cl, %edi
219; X86-FAST-NEXT: shldl %cl, %eax, %ebp
220; X86-FAST-NEXT: testb $32, %bl
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000221; X86-FAST-NEXT: je .LBB4_2
Simon Pilgrim180639a2018-12-05 11:12:12 +0000222; X86-FAST-NEXT: # %bb.1:
223; X86-FAST-NEXT: movl %edi, %ebp
224; X86-FAST-NEXT: xorl %edi, %edi
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000225; X86-FAST-NEXT: .LBB4_2:
Sanjay Patele767bf42018-12-08 16:07:38 +0000226; X86-FAST-NEXT: movb $64, %cl
227; X86-FAST-NEXT: subb %bl, %cl
Simon Pilgrim180639a2018-12-05 11:12:12 +0000228; X86-FAST-NEXT: movl %edx, %esi
229; X86-FAST-NEXT: shrl %cl, %esi
230; X86-FAST-NEXT: shrdl %cl, %edx, (%esp) # 4-byte Folded Spill
231; X86-FAST-NEXT: testb $32, %cl
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000232; X86-FAST-NEXT: jne .LBB4_3
Simon Pilgrim180639a2018-12-05 11:12:12 +0000233; X86-FAST-NEXT: # %bb.4:
234; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %edx
235; X86-FAST-NEXT: movl (%esp), %ecx # 4-byte Reload
236; X86-FAST-NEXT: testl %ebx, %ebx
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000237; X86-FAST-NEXT: jne .LBB4_6
238; X86-FAST-NEXT: jmp .LBB4_7
239; X86-FAST-NEXT: .LBB4_3:
Simon Pilgrim180639a2018-12-05 11:12:12 +0000240; X86-FAST-NEXT: movl %esi, %ecx
241; X86-FAST-NEXT: xorl %esi, %esi
242; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %edx
243; X86-FAST-NEXT: testl %ebx, %ebx
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000244; X86-FAST-NEXT: je .LBB4_7
245; X86-FAST-NEXT: .LBB4_6:
Simon Pilgrim180639a2018-12-05 11:12:12 +0000246; X86-FAST-NEXT: orl %esi, %ebp
247; X86-FAST-NEXT: orl %ecx, %edi
248; X86-FAST-NEXT: movl %edi, %eax
249; X86-FAST-NEXT: movl %ebp, %edx
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000250; X86-FAST-NEXT: .LBB4_7:
Simon Pilgrim180639a2018-12-05 11:12:12 +0000251; X86-FAST-NEXT: addl $4, %esp
252; X86-FAST-NEXT: popl %esi
253; X86-FAST-NEXT: popl %edi
254; X86-FAST-NEXT: popl %ebx
255; X86-FAST-NEXT: popl %ebp
256; X86-FAST-NEXT: retl
257;
258; X86-SLOW-LABEL: var_shift_i64:
259; X86-SLOW: # %bb.0:
260; X86-SLOW-NEXT: pushl %ebp
261; X86-SLOW-NEXT: pushl %ebx
262; X86-SLOW-NEXT: pushl %edi
263; X86-SLOW-NEXT: pushl %esi
264; X86-SLOW-NEXT: subl $8, %esp
Sanjay Patel3af4ae92018-12-07 15:47:52 +0000265; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %edi
Sanjay Patele767bf42018-12-08 16:07:38 +0000266; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %eax
267; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %esi
Simon Pilgrim180639a2018-12-05 11:12:12 +0000268; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %ebx
269; X86-SLOW-NEXT: andl $63, %ebx
Sanjay Patele767bf42018-12-08 16:07:38 +0000270; X86-SLOW-NEXT: movb $64, %dh
271; X86-SLOW-NEXT: subb %bl, %dh
Simon Pilgrim180639a2018-12-05 11:12:12 +0000272; X86-SLOW-NEXT: movl %eax, (%esp) # 4-byte Spill
Sanjay Patele767bf42018-12-08 16:07:38 +0000273; X86-SLOW-NEXT: movb %dh, %cl
Simon Pilgrim180639a2018-12-05 11:12:12 +0000274; X86-SLOW-NEXT: shrl %cl, %eax
Sanjay Patele767bf42018-12-08 16:07:38 +0000275; X86-SLOW-NEXT: movb %dh, %dl
276; X86-SLOW-NEXT: andb $31, %dl
277; X86-SLOW-NEXT: movl %edx, %ecx
Sanjay Patel3af4ae92018-12-07 15:47:52 +0000278; X86-SLOW-NEXT: negb %cl
Sanjay Patele767bf42018-12-08 16:07:38 +0000279; X86-SLOW-NEXT: movl %esi, %ebp
280; X86-SLOW-NEXT: shll %cl, %ebp
281; X86-SLOW-NEXT: testb %dl, %dl
282; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %ecx
283; X86-SLOW-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000284; X86-SLOW-NEXT: je .LBB4_2
Simon Pilgrim180639a2018-12-05 11:12:12 +0000285; X86-SLOW-NEXT: # %bb.1:
Sanjay Patele767bf42018-12-08 16:07:38 +0000286; X86-SLOW-NEXT: orl %eax, %ebp
287; X86-SLOW-NEXT: movl %ebp, (%esp) # 4-byte Spill
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000288; X86-SLOW-NEXT: .LBB4_2:
Sanjay Patele767bf42018-12-08 16:07:38 +0000289; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %ebp
290; X86-SLOW-NEXT: movl %ebp, %eax
Simon Pilgrim180639a2018-12-05 11:12:12 +0000291; X86-SLOW-NEXT: movl %ebx, %ecx
292; X86-SLOW-NEXT: shll %cl, %eax
293; X86-SLOW-NEXT: movb %bl, %ch
294; X86-SLOW-NEXT: andb $31, %ch
295; X86-SLOW-NEXT: movb %ch, %cl
296; X86-SLOW-NEXT: negb %cl
Sanjay Patele767bf42018-12-08 16:07:38 +0000297; X86-SLOW-NEXT: shrl %cl, %edi
Simon Pilgrim180639a2018-12-05 11:12:12 +0000298; X86-SLOW-NEXT: testb %ch, %ch
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000299; X86-SLOW-NEXT: je .LBB4_4
Simon Pilgrim180639a2018-12-05 11:12:12 +0000300; X86-SLOW-NEXT: # %bb.3:
Sanjay Patele767bf42018-12-08 16:07:38 +0000301; X86-SLOW-NEXT: orl %edi, %eax
302; X86-SLOW-NEXT: movl %eax, %ebp
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000303; X86-SLOW-NEXT: .LBB4_4:
Sanjay Patele767bf42018-12-08 16:07:38 +0000304; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %eax
305; X86-SLOW-NEXT: movl %eax, %edi
Simon Pilgrim180639a2018-12-05 11:12:12 +0000306; X86-SLOW-NEXT: movl %ebx, %ecx
Sanjay Patele767bf42018-12-08 16:07:38 +0000307; X86-SLOW-NEXT: shll %cl, %edi
Simon Pilgrim180639a2018-12-05 11:12:12 +0000308; X86-SLOW-NEXT: testb $32, %bl
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000309; X86-SLOW-NEXT: je .LBB4_6
Simon Pilgrim180639a2018-12-05 11:12:12 +0000310; X86-SLOW-NEXT: # %bb.5:
Sanjay Patele767bf42018-12-08 16:07:38 +0000311; X86-SLOW-NEXT: movl %edi, %ebp
312; X86-SLOW-NEXT: xorl %edi, %edi
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000313; X86-SLOW-NEXT: .LBB4_6:
Sanjay Patele767bf42018-12-08 16:07:38 +0000314; X86-SLOW-NEXT: movb %dh, %cl
315; X86-SLOW-NEXT: shrl %cl, %esi
316; X86-SLOW-NEXT: testb $32, %dh
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000317; X86-SLOW-NEXT: jne .LBB4_7
Simon Pilgrim180639a2018-12-05 11:12:12 +0000318; X86-SLOW-NEXT: # %bb.8:
319; X86-SLOW-NEXT: movl (%esp), %ecx # 4-byte Reload
320; X86-SLOW-NEXT: testl %ebx, %ebx
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000321; X86-SLOW-NEXT: jne .LBB4_10
322; X86-SLOW-NEXT: jmp .LBB4_11
323; X86-SLOW-NEXT: .LBB4_7:
Sanjay Patele767bf42018-12-08 16:07:38 +0000324; X86-SLOW-NEXT: movl %esi, %ecx
325; X86-SLOW-NEXT: xorl %esi, %esi
Simon Pilgrim180639a2018-12-05 11:12:12 +0000326; X86-SLOW-NEXT: testl %ebx, %ebx
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000327; X86-SLOW-NEXT: je .LBB4_11
328; X86-SLOW-NEXT: .LBB4_10:
Sanjay Patele767bf42018-12-08 16:07:38 +0000329; X86-SLOW-NEXT: orl %esi, %ebp
330; X86-SLOW-NEXT: orl %ecx, %edi
331; X86-SLOW-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
332; X86-SLOW-NEXT: movl %edi, %eax
Simon Pilgrim53c8b1b2018-12-15 19:32:26 +0000333; X86-SLOW-NEXT: .LBB4_11:
Sanjay Patele767bf42018-12-08 16:07:38 +0000334; X86-SLOW-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
Simon Pilgrim180639a2018-12-05 11:12:12 +0000335; X86-SLOW-NEXT: addl $8, %esp
336; X86-SLOW-NEXT: popl %esi
337; X86-SLOW-NEXT: popl %edi
338; X86-SLOW-NEXT: popl %ebx
339; X86-SLOW-NEXT: popl %ebp
340; X86-SLOW-NEXT: retl
Simon Pilgrim96f79242018-11-16 17:48:52 +0000341;
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000342; X64-FAST-LABEL: var_shift_i64:
343; X64-FAST: # %bb.0:
344; X64-FAST-NEXT: movq %rdx, %rcx
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000345; X64-FAST-NEXT: movq %rdi, %rax
Simon Pilgrim180639a2018-12-05 11:12:12 +0000346; X64-FAST-NEXT: # kill: def $cl killed $cl killed $rcx
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000347; X64-FAST-NEXT: shldq %cl, %rsi, %rax
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000348; X64-FAST-NEXT: retq
349;
350; X64-SLOW-LABEL: var_shift_i64:
351; X64-SLOW: # %bb.0:
352; X64-SLOW-NEXT: movq %rsi, %rax
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000353; X64-SLOW-NEXT: movq %rdi, %rsi
354; X64-SLOW-NEXT: movl %edx, %ecx
355; X64-SLOW-NEXT: shlq %cl, %rsi
Simon Pilgrim180639a2018-12-05 11:12:12 +0000356; X64-SLOW-NEXT: andb $63, %dl
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000357; X64-SLOW-NEXT: movl %edx, %ecx
Simon Pilgrim180639a2018-12-05 11:12:12 +0000358; X64-SLOW-NEXT: negb %cl
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000359; X64-SLOW-NEXT: shrq %cl, %rax
360; X64-SLOW-NEXT: orq %rsi, %rax
Simon Pilgrim180639a2018-12-05 11:12:12 +0000361; X64-SLOW-NEXT: testb %dl, %dl
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000362; X64-SLOW-NEXT: cmoveq %rdi, %rax
363; X64-SLOW-NEXT: retq
Simon Pilgrim96f79242018-11-16 17:48:52 +0000364 %tmp = tail call i64 @llvm.fshl.i64(i64 %x, i64 %y, i64 %z)
365 ret i64 %tmp
366}
367
368;
369; Const Funnel Shift
370;
371
372define i8 @const_shift_i8(i8 %x, i8 %y) nounwind {
373; X86-LABEL: const_shift_i8:
374; X86: # %bb.0:
375; X86-NEXT: movb {{[0-9]+}}(%esp), %al
376; X86-NEXT: movb {{[0-9]+}}(%esp), %cl
377; X86-NEXT: shrb %cl
378; X86-NEXT: shlb $7, %al
379; X86-NEXT: orb %cl, %al
380; X86-NEXT: retl
381;
382; X64-LABEL: const_shift_i8:
383; X64: # %bb.0:
384; X64-NEXT: movl %edi, %eax
385; X64-NEXT: shrb %sil
386; X64-NEXT: shlb $7, %al
387; X64-NEXT: orb %sil, %al
388; X64-NEXT: # kill: def $al killed $al killed $eax
389; X64-NEXT: retq
390 %tmp = tail call i8 @llvm.fshl.i8(i8 %x, i8 %y, i8 7)
391 ret i8 %tmp
392}
393
394define i16 @const_shift_i16(i16 %x, i16 %y) nounwind {
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000395; X86-FAST-LABEL: const_shift_i16:
396; X86-FAST: # %bb.0:
397; X86-FAST-NEXT: movzwl {{[0-9]+}}(%esp), %ecx
398; X86-FAST-NEXT: movzwl {{[0-9]+}}(%esp), %eax
399; X86-FAST-NEXT: shldw $7, %cx, %ax
400; X86-FAST-NEXT: retl
Simon Pilgrim96f79242018-11-16 17:48:52 +0000401;
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000402; X86-SLOW-LABEL: const_shift_i16:
403; X86-SLOW: # %bb.0:
404; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %eax
405; X86-SLOW-NEXT: movzwl {{[0-9]+}}(%esp), %ecx
406; X86-SLOW-NEXT: shrl $9, %ecx
407; X86-SLOW-NEXT: shll $7, %eax
408; X86-SLOW-NEXT: orl %ecx, %eax
409; X86-SLOW-NEXT: # kill: def $ax killed $ax killed $eax
410; X86-SLOW-NEXT: retl
411;
412; X64-FAST-LABEL: const_shift_i16:
413; X64-FAST: # %bb.0:
414; X64-FAST-NEXT: movl %edi, %eax
415; X64-FAST-NEXT: shldw $7, %si, %ax
416; X64-FAST-NEXT: # kill: def $ax killed $ax killed $eax
417; X64-FAST-NEXT: retq
418;
419; X64-SLOW-LABEL: const_shift_i16:
420; X64-SLOW: # %bb.0:
421; X64-SLOW-NEXT: movzwl %si, %eax
422; X64-SLOW-NEXT: shll $7, %edi
423; X64-SLOW-NEXT: shrl $9, %eax
424; X64-SLOW-NEXT: orl %edi, %eax
425; X64-SLOW-NEXT: # kill: def $ax killed $ax killed $eax
426; X64-SLOW-NEXT: retq
Simon Pilgrim96f79242018-11-16 17:48:52 +0000427 %tmp = tail call i16 @llvm.fshl.i16(i16 %x, i16 %y, i16 7)
428 ret i16 %tmp
429}
430
431define i32 @const_shift_i32(i32 %x, i32 %y) nounwind {
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000432; X86-FAST-LABEL: const_shift_i32:
433; X86-FAST: # %bb.0:
434; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %ecx
435; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %eax
436; X86-FAST-NEXT: shldl $7, %ecx, %eax
437; X86-FAST-NEXT: retl
Simon Pilgrim96f79242018-11-16 17:48:52 +0000438;
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000439; X86-SLOW-LABEL: const_shift_i32:
440; X86-SLOW: # %bb.0:
441; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %eax
442; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %ecx
443; X86-SLOW-NEXT: shrl $25, %ecx
444; X86-SLOW-NEXT: shll $7, %eax
445; X86-SLOW-NEXT: orl %ecx, %eax
446; X86-SLOW-NEXT: retl
447;
448; X64-FAST-LABEL: const_shift_i32:
449; X64-FAST: # %bb.0:
450; X64-FAST-NEXT: movl %edi, %eax
451; X64-FAST-NEXT: shldl $7, %esi, %eax
452; X64-FAST-NEXT: retq
453;
454; X64-SLOW-LABEL: const_shift_i32:
455; X64-SLOW: # %bb.0:
456; X64-SLOW-NEXT: # kill: def $esi killed $esi def $rsi
457; X64-SLOW-NEXT: # kill: def $edi killed $edi def $rdi
458; X64-SLOW-NEXT: shrl $25, %esi
459; X64-SLOW-NEXT: shll $7, %edi
460; X64-SLOW-NEXT: leal (%rdi,%rsi), %eax
461; X64-SLOW-NEXT: retq
Simon Pilgrim96f79242018-11-16 17:48:52 +0000462 %tmp = tail call i32 @llvm.fshl.i32(i32 %x, i32 %y, i32 7)
463 ret i32 %tmp
464}
465
466define i64 @const_shift_i64(i64 %x, i64 %y) nounwind {
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000467; X86-FAST-LABEL: const_shift_i64:
468; X86-FAST: # %bb.0:
469; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %eax
470; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %ecx
471; X86-FAST-NEXT: movl {{[0-9]+}}(%esp), %edx
472; X86-FAST-NEXT: shrdl $25, %ecx, %eax
473; X86-FAST-NEXT: shldl $7, %ecx, %edx
474; X86-FAST-NEXT: retl
Simon Pilgrim96f79242018-11-16 17:48:52 +0000475;
Simon Pilgrimf6c2fbd2018-11-19 12:29:41 +0000476; X86-SLOW-LABEL: const_shift_i64:
477; X86-SLOW: # %bb.0:
478; X86-SLOW-NEXT: pushl %esi
479; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %ecx
480; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %edx
481; X86-SLOW-NEXT: movl {{[0-9]+}}(%esp), %esi
482; X86-SLOW-NEXT: shrl $25, %esi
483; X86-SLOW-NEXT: movl %ecx, %eax
484; X86-SLOW-NEXT: shll $7, %eax
485; X86-SLOW-NEXT: orl %esi, %eax
486; X86-SLOW-NEXT: shrl $25, %ecx
487; X86-SLOW-NEXT: shll $7, %edx
488; X86-SLOW-NEXT: orl %ecx, %edx
489; X86-SLOW-NEXT: popl %esi
490; X86-SLOW-NEXT: retl
491;
492; X64-FAST-LABEL: const_shift_i64:
493; X64-FAST: # %bb.0:
494; X64-FAST-NEXT: movq %rdi, %rax
495; X64-FAST-NEXT: shldq $7, %rsi, %rax
496; X64-FAST-NEXT: retq
497;
498; X64-SLOW-LABEL: const_shift_i64:
499; X64-SLOW: # %bb.0:
500; X64-SLOW-NEXT: shrq $57, %rsi
501; X64-SLOW-NEXT: shlq $7, %rdi
502; X64-SLOW-NEXT: leaq (%rdi,%rsi), %rax
503; X64-SLOW-NEXT: retq
Simon Pilgrim96f79242018-11-16 17:48:52 +0000504 %tmp = tail call i64 @llvm.fshl.i64(i64 %x, i64 %y, i64 7)
505 ret i64 %tmp
506}