xref: /llvm-project/llvm/test/CodeGen/X86/shift-i256.ll (revision 3e0a76b1fd10d2f5f36d34a91b525c1d29685185)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i686--        | FileCheck %s
3; RUN: llc < %s -mtriple=x86_64-- -O0 | FileCheck %s -check-prefixes=CHECK-X64,CHECK-X64-O0
4; RUN: llc < %s -mtriple=x86_64-- -O2 | FileCheck %s -check-prefixes=CHECK-X64,CHECK-X64-O2
5
6; CHECK-LABEL: shift1
7define void @shift1(i256 %x, i256 %a, ptr nocapture %r) nounwind readnone {
8; CHECK-LABEL: shift1:
9; CHECK:       # %bb.0: # %entry
10; CHECK-NEXT:    pushl %ebp
11; CHECK-NEXT:    movl %esp, %ebp
12; CHECK-NEXT:    pushl %ebx
13; CHECK-NEXT:    pushl %edi
14; CHECK-NEXT:    pushl %esi
15; CHECK-NEXT:    andl $-16, %esp
16; CHECK-NEXT:    subl $112, %esp
17; CHECK-NEXT:    movl 40(%ebp), %ecx
18; CHECK-NEXT:    movl 8(%ebp), %eax
19; CHECK-NEXT:    movl 12(%ebp), %edx
20; CHECK-NEXT:    movl 16(%ebp), %esi
21; CHECK-NEXT:    movl 32(%ebp), %edi
22; CHECK-NEXT:    movl %edi, {{[0-9]+}}(%esp)
23; CHECK-NEXT:    movl 28(%ebp), %edi
24; CHECK-NEXT:    movl %edi, {{[0-9]+}}(%esp)
25; CHECK-NEXT:    movl 24(%ebp), %edi
26; CHECK-NEXT:    movl %edi, {{[0-9]+}}(%esp)
27; CHECK-NEXT:    movl 20(%ebp), %edi
28; CHECK-NEXT:    movl %edi, {{[0-9]+}}(%esp)
29; CHECK-NEXT:    movl 36(%ebp), %edi
30; CHECK-NEXT:    movl %edi, {{[0-9]+}}(%esp)
31; CHECK-NEXT:    movl %esi, {{[0-9]+}}(%esp)
32; CHECK-NEXT:    movl %edx, {{[0-9]+}}(%esp)
33; CHECK-NEXT:    movl %eax, {{[0-9]+}}(%esp)
34; CHECK-NEXT:    sarl $31, %edi
35; CHECK-NEXT:    movl %edi, {{[0-9]+}}(%esp)
36; CHECK-NEXT:    movl %edi, {{[0-9]+}}(%esp)
37; CHECK-NEXT:    movl %edi, {{[0-9]+}}(%esp)
38; CHECK-NEXT:    movl %edi, {{[0-9]+}}(%esp)
39; CHECK-NEXT:    movl %edi, {{[0-9]+}}(%esp)
40; CHECK-NEXT:    movl %edi, {{[0-9]+}}(%esp)
41; CHECK-NEXT:    movl %edi, {{[0-9]+}}(%esp)
42; CHECK-NEXT:    movl %edi, {{[0-9]+}}(%esp)
43; CHECK-NEXT:    movl %ecx, %eax
44; CHECK-NEXT:    shrb $5, %al
45; CHECK-NEXT:    movzbl %al, %eax
46; CHECK-NEXT:    movl 40(%esp,%eax,4), %edx
47; CHECK-NEXT:    movl 36(%esp,%eax,4), %esi
48; CHECK-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
49; CHECK-NEXT:    shrdl %cl, %edx, %esi
50; CHECK-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
51; CHECK-NEXT:    movl 44(%esp,%eax,4), %esi
52; CHECK-NEXT:    shrdl %cl, %esi, %edx
53; CHECK-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
54; CHECK-NEXT:    movl 48(%esp,%eax,4), %ebx
55; CHECK-NEXT:    shrdl %cl, %ebx, %esi
56; CHECK-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
57; CHECK-NEXT:    movl 52(%esp,%eax,4), %esi
58; CHECK-NEXT:    shrdl %cl, %esi, %ebx
59; CHECK-NEXT:    movl 56(%esp,%eax,4), %edx
60; CHECK-NEXT:    shrdl %cl, %edx, %esi
61; CHECK-NEXT:    movl 32(%esp,%eax,4), %edi
62; CHECK-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
63; CHECK-NEXT:    movl 60(%esp,%eax,4), %eax
64; CHECK-NEXT:    shrdl %cl, %eax, %edx
65; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
66; CHECK-NEXT:    shrdl %cl, %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
67; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
68; CHECK-NEXT:    sarl %cl, %eax
69; CHECK-NEXT:    movl 72(%ebp), %ecx
70; CHECK-NEXT:    movl %eax, 28(%ecx)
71; CHECK-NEXT:    movl %edx, 24(%ecx)
72; CHECK-NEXT:    movl %esi, 20(%ecx)
73; CHECK-NEXT:    movl %ebx, 16(%ecx)
74; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
75; CHECK-NEXT:    movl %eax, 12(%ecx)
76; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
77; CHECK-NEXT:    movl %eax, 8(%ecx)
78; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
79; CHECK-NEXT:    movl %eax, 4(%ecx)
80; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
81; CHECK-NEXT:    movl %eax, (%ecx)
82; CHECK-NEXT:    leal -12(%ebp), %esp
83; CHECK-NEXT:    popl %esi
84; CHECK-NEXT:    popl %edi
85; CHECK-NEXT:    popl %ebx
86; CHECK-NEXT:    popl %ebp
87; CHECK-NEXT:    retl
88;
89; CHECK-X64-O0-LABEL: shift1:
90; CHECK-X64-O0:       # %bb.0: # %entry
91; CHECK-X64-O0-NEXT:    movq {{[0-9]+}}(%rsp), %rax
92; CHECK-X64-O0-NEXT:    movq {{[0-9]+}}(%rsp), %rax
93; CHECK-X64-O0-NEXT:    movq {{[0-9]+}}(%rsp), %rax
94; CHECK-X64-O0-NEXT:    movq %rdi, -{{[0-9]+}}(%rsp)
95; CHECK-X64-O0-NEXT:    movq %rsi, -{{[0-9]+}}(%rsp)
96; CHECK-X64-O0-NEXT:    movq %rdx, -{{[0-9]+}}(%rsp)
97; CHECK-X64-O0-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
98; CHECK-X64-O0-NEXT:    sarq $63, %rcx
99; CHECK-X64-O0-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
100; CHECK-X64-O0-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
101; CHECK-X64-O0-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
102; CHECK-X64-O0-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
103; CHECK-X64-O0-NEXT:    movb %r8b, %cl
104; CHECK-X64-O0-NEXT:    movb %cl, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
105; CHECK-X64-O0-NEXT:    movb %cl, %dl
106; CHECK-X64-O0-NEXT:    shrb $6, %dl
107; CHECK-X64-O0-NEXT:    movzbl %dl, %edx
108; CHECK-X64-O0-NEXT:    movl %edx, %edi
109; CHECK-X64-O0-NEXT:    movq -56(%rsp,%rdi,8), %rsi
110; CHECK-X64-O0-NEXT:    movq -72(%rsp,%rdi,8), %r8
111; CHECK-X64-O0-NEXT:    movq -64(%rsp,%rdi,8), %r9
112; CHECK-X64-O0-NEXT:    movq %r9, %rdx
113; CHECK-X64-O0-NEXT:    shrdq %cl, %rsi, %rdx
114; CHECK-X64-O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %cl # 1-byte Reload
115; CHECK-X64-O0-NEXT:    movq -48(%rsp,%rdi,8), %rdi
116; CHECK-X64-O0-NEXT:    shrdq %cl, %rdi, %rsi
117; CHECK-X64-O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %cl # 1-byte Reload
118; CHECK-X64-O0-NEXT:    shrdq %cl, %r9, %r8
119; CHECK-X64-O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %cl # 1-byte Reload
120; CHECK-X64-O0-NEXT:    movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
121; CHECK-X64-O0-NEXT:    sarq %cl, %rdi
122; CHECK-X64-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
123; CHECK-X64-O0-NEXT:    movq %rdi, 24(%rax)
124; CHECK-X64-O0-NEXT:    movq %rsi, 16(%rax)
125; CHECK-X64-O0-NEXT:    movq %rdx, 8(%rax)
126; CHECK-X64-O0-NEXT:    movq %rcx, (%rax)
127; CHECK-X64-O0-NEXT:    retq
128;
129; CHECK-X64-O2-LABEL: shift1:
130; CHECK-X64-O2:       # %bb.0: # %entry
131; CHECK-X64-O2-NEXT:    movq {{[0-9]+}}(%rsp), %rax
132; CHECK-X64-O2-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
133; CHECK-X64-O2-NEXT:    movq %rdx, -{{[0-9]+}}(%rsp)
134; CHECK-X64-O2-NEXT:    movq %rsi, -{{[0-9]+}}(%rsp)
135; CHECK-X64-O2-NEXT:    movq %rdi, -{{[0-9]+}}(%rsp)
136; CHECK-X64-O2-NEXT:    sarq $63, %rcx
137; CHECK-X64-O2-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
138; CHECK-X64-O2-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
139; CHECK-X64-O2-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
140; CHECK-X64-O2-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
141; CHECK-X64-O2-NEXT:    movl %r8d, %ecx
142; CHECK-X64-O2-NEXT:    shrb $6, %cl
143; CHECK-X64-O2-NEXT:    movzbl %cl, %edx
144; CHECK-X64-O2-NEXT:    movq -56(%rsp,%rdx,8), %rsi
145; CHECK-X64-O2-NEXT:    movq -72(%rsp,%rdx,8), %rdi
146; CHECK-X64-O2-NEXT:    movq -64(%rsp,%rdx,8), %r9
147; CHECK-X64-O2-NEXT:    movq %r9, %r10
148; CHECK-X64-O2-NEXT:    movl %r8d, %ecx
149; CHECK-X64-O2-NEXT:    shrdq %cl, %rsi, %r10
150; CHECK-X64-O2-NEXT:    movq -48(%rsp,%rdx,8), %rdx
151; CHECK-X64-O2-NEXT:    shrdq %cl, %rdx, %rsi
152; CHECK-X64-O2-NEXT:    shrdq %cl, %r9, %rdi
153; CHECK-X64-O2-NEXT:    sarq %cl, %rdx
154; CHECK-X64-O2-NEXT:    movq %rdx, 24(%rax)
155; CHECK-X64-O2-NEXT:    movq %rsi, 16(%rax)
156; CHECK-X64-O2-NEXT:    movq %r10, 8(%rax)
157; CHECK-X64-O2-NEXT:    movq %rdi, (%rax)
158; CHECK-X64-O2-NEXT:    retq
159entry:
160	%0 = ashr i256 %x, %a
161	store i256 %0, ptr %r
162        ret void
163}
164
165define i256 @shift2(i256 %c) nounwind
166; CHECK-LABEL: shift2:
167; CHECK:       # %bb.0:
168; CHECK-NEXT:    pushl %ebp
169; CHECK-NEXT:    movl %esp, %ebp
170; CHECK-NEXT:    pushl %ebx
171; CHECK-NEXT:    pushl %edi
172; CHECK-NEXT:    pushl %esi
173; CHECK-NEXT:    andl $-16, %esp
174; CHECK-NEXT:    subl $112, %esp
175; CHECK-NEXT:    movl 12(%ebp), %ecx
176; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
177; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
178; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
179; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
180; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
181; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
182; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
183; CHECK-NEXT:    movl $1, {{[0-9]+}}(%esp)
184; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
185; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
186; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
187; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
188; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
189; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
190; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
191; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
192; CHECK-NEXT:    movl %ecx, %eax
193; CHECK-NEXT:    shrb $3, %al
194; CHECK-NEXT:    andb $28, %al
195; CHECK-NEXT:    negb %al
196; CHECK-NEXT:    movsbl %al, %eax
197; CHECK-NEXT:    movl 68(%esp,%eax), %esi
198; CHECK-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
199; CHECK-NEXT:    movl 72(%esp,%eax), %edx
200; CHECK-NEXT:    movl %edx, %edi
201; CHECK-NEXT:    shldl %cl, %esi, %edi
202; CHECK-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
203; CHECK-NEXT:    movl 76(%esp,%eax), %esi
204; CHECK-NEXT:    movl %esi, %edi
205; CHECK-NEXT:    shldl %cl, %edx, %edi
206; CHECK-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
207; CHECK-NEXT:    movl 80(%esp,%eax), %edx
208; CHECK-NEXT:    movl %edx, %edi
209; CHECK-NEXT:    shldl %cl, %esi, %edi
210; CHECK-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
211; CHECK-NEXT:    movl 84(%esp,%eax), %esi
212; CHECK-NEXT:    movl %esi, %ebx
213; CHECK-NEXT:    shldl %cl, %edx, %ebx
214; CHECK-NEXT:    movl 88(%esp,%eax), %edi
215; CHECK-NEXT:    movl %edi, %edx
216; CHECK-NEXT:    shldl %cl, %esi, %edx
217; CHECK-NEXT:    movl 64(%esp,%eax), %esi
218; CHECK-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
219; CHECK-NEXT:    movl 92(%esp,%eax), %esi
220; CHECK-NEXT:    shldl %cl, %edi, %esi
221; CHECK-NEXT:    movl 8(%ebp), %eax
222; CHECK-NEXT:    movl %esi, 28(%eax)
223; CHECK-NEXT:    movl %edx, 24(%eax)
224; CHECK-NEXT:    movl %ebx, 20(%eax)
225; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
226; CHECK-NEXT:    movl %edx, 16(%eax)
227; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
228; CHECK-NEXT:    movl %edx, 12(%eax)
229; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
230; CHECK-NEXT:    movl %edx, 8(%eax)
231; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
232; CHECK-NEXT:    movl %edi, %edx
233; CHECK-NEXT:    shll %cl, %edx
234; CHECK-NEXT:    # kill: def $cl killed $cl killed $ecx
235; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
236; CHECK-NEXT:    shldl %cl, %edi, %esi
237; CHECK-NEXT:    movl %esi, 4(%eax)
238; CHECK-NEXT:    movl %edx, (%eax)
239; CHECK-NEXT:    leal -12(%ebp), %esp
240; CHECK-NEXT:    popl %esi
241; CHECK-NEXT:    popl %edi
242; CHECK-NEXT:    popl %ebx
243; CHECK-NEXT:    popl %ebp
244; CHECK-NEXT:    retl $4
245;
246; CHECK-X64-O0-LABEL: shift2:
247; CHECK-X64-O0:       # %bb.0:
248; CHECK-X64-O0-NEXT:    movq %rdi, %rax
249; CHECK-X64-O0-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
250; CHECK-X64-O0-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
251; CHECK-X64-O0-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
252; CHECK-X64-O0-NEXT:    movq $1, -{{[0-9]+}}(%rsp)
253; CHECK-X64-O0-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
254; CHECK-X64-O0-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
255; CHECK-X64-O0-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
256; CHECK-X64-O0-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
257; CHECK-X64-O0-NEXT:    movb %sil, %cl
258; CHECK-X64-O0-NEXT:    movb %cl, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
259; CHECK-X64-O0-NEXT:    movb %cl, %dl
260; CHECK-X64-O0-NEXT:    shrb $3, %dl
261; CHECK-X64-O0-NEXT:    andb $24, %dl
262; CHECK-X64-O0-NEXT:    negb %dl
263; CHECK-X64-O0-NEXT:    movsbq %dl, %r8
264; CHECK-X64-O0-NEXT:    movq -40(%rsp,%r8), %r9
265; CHECK-X64-O0-NEXT:    movq -32(%rsp,%r8), %rdx
266; CHECK-X64-O0-NEXT:    movq -24(%rsp,%r8), %r10
267; CHECK-X64-O0-NEXT:    movq %r10, %rsi
268; CHECK-X64-O0-NEXT:    shldq %cl, %rdx, %rsi
269; CHECK-X64-O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %cl # 1-byte Reload
270; CHECK-X64-O0-NEXT:    movq -16(%rsp,%r8), %r8
271; CHECK-X64-O0-NEXT:    shldq %cl, %r10, %r8
272; CHECK-X64-O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %cl # 1-byte Reload
273; CHECK-X64-O0-NEXT:    movq %r9, %r10
274; CHECK-X64-O0-NEXT:    shlq %cl, %r10
275; CHECK-X64-O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %cl # 1-byte Reload
276; CHECK-X64-O0-NEXT:    movq %r10, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
277; CHECK-X64-O0-NEXT:    shldq %cl, %r9, %rdx
278; CHECK-X64-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
279; CHECK-X64-O0-NEXT:    movq %r8, 24(%rdi)
280; CHECK-X64-O0-NEXT:    movq %rsi, 16(%rdi)
281; CHECK-X64-O0-NEXT:    movq %rdx, 8(%rdi)
282; CHECK-X64-O0-NEXT:    movq %rcx, (%rdi)
283; CHECK-X64-O0-NEXT:    retq
284;
285; CHECK-X64-O2-LABEL: shift2:
286; CHECK-X64-O2:       # %bb.0:
287; CHECK-X64-O2-NEXT:    movq %rsi, %rcx
288; CHECK-X64-O2-NEXT:    movq %rdi, %rax
289; CHECK-X64-O2-NEXT:    xorps %xmm0, %xmm0
290; CHECK-X64-O2-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
291; CHECK-X64-O2-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
292; CHECK-X64-O2-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)
293; CHECK-X64-O2-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
294; CHECK-X64-O2-NEXT:    movq $1, -{{[0-9]+}}(%rsp)
295; CHECK-X64-O2-NEXT:    movl %ecx, %edx
296; CHECK-X64-O2-NEXT:    shrb $3, %dl
297; CHECK-X64-O2-NEXT:    andb $24, %dl
298; CHECK-X64-O2-NEXT:    negb %dl
299; CHECK-X64-O2-NEXT:    movsbq %dl, %rdx
300; CHECK-X64-O2-NEXT:    movq -40(%rsp,%rdx), %rsi
301; CHECK-X64-O2-NEXT:    movq -32(%rsp,%rdx), %rdi
302; CHECK-X64-O2-NEXT:    movq -24(%rsp,%rdx), %r8
303; CHECK-X64-O2-NEXT:    movq %r8, %r9
304; CHECK-X64-O2-NEXT:    shldq %cl, %rdi, %r9
305; CHECK-X64-O2-NEXT:    movq -16(%rsp,%rdx), %rdx
306; CHECK-X64-O2-NEXT:    shldq %cl, %r8, %rdx
307; CHECK-X64-O2-NEXT:    movq %rsi, %r8
308; CHECK-X64-O2-NEXT:    shlq %cl, %r8
309; CHECK-X64-O2-NEXT:    # kill: def $cl killed $cl killed $rcx
310; CHECK-X64-O2-NEXT:    shldq %cl, %rsi, %rdi
311; CHECK-X64-O2-NEXT:    movq %rdx, 24(%rax)
312; CHECK-X64-O2-NEXT:    movq %r9, 16(%rax)
313; CHECK-X64-O2-NEXT:    movq %rdi, 8(%rax)
314; CHECK-X64-O2-NEXT:    movq %r8, (%rax)
315; CHECK-X64-O2-NEXT:    retq
316{
317  %b = shl i256 1, %c  ; %c must not be a constant
318  ; Special case when %c is 0:
319  ret i256 %b
320}
321;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
322; CHECK-X64: {{.*}}
323