Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / shift-i256.ll
blob0e4e706669300c317f76c040180d8c731278efaf
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
6 ; CHECK-LABEL: shift1
7 define 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:    pushl %ebx
12 ; CHECK-NEXT:    pushl %edi
13 ; CHECK-NEXT:    pushl %esi
14 ; CHECK-NEXT:    subl $92, %esp
15 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx
16 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax
17 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %edx
18 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %edi
19 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ebx
20 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ebp
21 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %esi
22 ; CHECK-NEXT:    movl %esi, {{[0-9]+}}(%esp)
23 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %esi
24 ; CHECK-NEXT:    movl %esi, {{[0-9]+}}(%esp)
25 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %esi
26 ; CHECK-NEXT:    movl %esi, {{[0-9]+}}(%esp)
27 ; CHECK-NEXT:    movl %ebp, {{[0-9]+}}(%esp)
28 ; CHECK-NEXT:    movl %ebx, {{[0-9]+}}(%esp)
29 ; CHECK-NEXT:    movl %edi, {{[0-9]+}}(%esp)
30 ; CHECK-NEXT:    movl %edx, {{[0-9]+}}(%esp)
31 ; CHECK-NEXT:    movl %eax, {{[0-9]+}}(%esp)
32 ; CHECK-NEXT:    sarl $31, %esi
33 ; CHECK-NEXT:    movl %esi, {{[0-9]+}}(%esp)
34 ; CHECK-NEXT:    movl %esi, {{[0-9]+}}(%esp)
35 ; CHECK-NEXT:    movl %esi, {{[0-9]+}}(%esp)
36 ; CHECK-NEXT:    movl %esi, {{[0-9]+}}(%esp)
37 ; CHECK-NEXT:    movl %esi, {{[0-9]+}}(%esp)
38 ; CHECK-NEXT:    movl %esi, {{[0-9]+}}(%esp)
39 ; CHECK-NEXT:    movl %esi, {{[0-9]+}}(%esp)
40 ; CHECK-NEXT:    movl %esi, {{[0-9]+}}(%esp)
41 ; CHECK-NEXT:    movl %ecx, %eax
42 ; CHECK-NEXT:    andb $7, %al
43 ; CHECK-NEXT:    shrb $3, %cl
44 ; CHECK-NEXT:    movzbl %cl, %ebp
45 ; CHECK-NEXT:    movl 32(%esp,%ebp), %esi
46 ; CHECK-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
47 ; CHECK-NEXT:    movl %eax, %ecx
48 ; CHECK-NEXT:    shrl %cl, %esi
49 ; CHECK-NEXT:    movl %eax, %edx
50 ; CHECK-NEXT:    notb %dl
51 ; CHECK-NEXT:    movl 36(%esp,%ebp), %ecx
52 ; CHECK-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
53 ; CHECK-NEXT:    leal (%ecx,%ecx), %edi
54 ; CHECK-NEXT:    movl %edx, %ecx
55 ; CHECK-NEXT:    shll %cl, %edi
56 ; CHECK-NEXT:    orl %esi, %edi
57 ; CHECK-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
58 ; CHECK-NEXT:    movl 40(%esp,%ebp), %esi
59 ; CHECK-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
60 ; CHECK-NEXT:    movl %eax, %ecx
61 ; CHECK-NEXT:    shrl %cl, %esi
62 ; CHECK-NEXT:    movl 44(%esp,%ebp), %ecx
63 ; CHECK-NEXT:    movl %ecx, (%esp) # 4-byte Spill
64 ; CHECK-NEXT:    leal (%ecx,%ecx), %edi
65 ; CHECK-NEXT:    movl %edx, %ecx
66 ; CHECK-NEXT:    shll %cl, %edi
67 ; CHECK-NEXT:    orl %esi, %edi
68 ; CHECK-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
69 ; CHECK-NEXT:    movl 48(%esp,%ebp), %ebx
70 ; CHECK-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
71 ; CHECK-NEXT:    movl %eax, %ecx
72 ; CHECK-NEXT:    shrl %cl, %ebx
73 ; CHECK-NEXT:    movl 52(%esp,%ebp), %edi
74 ; CHECK-NEXT:    leal (%edi,%edi), %esi
75 ; CHECK-NEXT:    movl %edx, %ecx
76 ; CHECK-NEXT:    shll %cl, %esi
77 ; CHECK-NEXT:    orl %ebx, %esi
78 ; CHECK-NEXT:    movl %eax, %ecx
79 ; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
80 ; CHECK-NEXT:    shrdl %cl, %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
81 ; CHECK-NEXT:    movl %eax, %ecx
82 ; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
83 ; CHECK-NEXT:    shrdl %cl, %edx, (%esp) # 4-byte Folded Spill
84 ; CHECK-NEXT:    movl 28(%esp,%ebp), %edx
85 ; CHECK-NEXT:    movl 56(%esp,%ebp), %ebx
86 ; CHECK-NEXT:    shrdl %cl, %ebx, %edi
87 ; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
88 ; CHECK-NEXT:    shrdl %cl, %ebp, %edx
89 ; CHECK-NEXT:    sarl %cl, %ebx
90 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax
91 ; CHECK-NEXT:    movl %ebx, 28(%eax)
92 ; CHECK-NEXT:    movl %edi, 24(%eax)
93 ; CHECK-NEXT:    movl (%esp), %ecx # 4-byte Reload
94 ; CHECK-NEXT:    movl %ecx, 16(%eax)
95 ; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
96 ; CHECK-NEXT:    movl %ecx, 8(%eax)
97 ; CHECK-NEXT:    movl %edx, (%eax)
98 ; CHECK-NEXT:    movl %esi, 20(%eax)
99 ; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
100 ; CHECK-NEXT:    movl %ecx, 12(%eax)
101 ; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
102 ; CHECK-NEXT:    movl %ecx, 4(%eax)
103 ; CHECK-NEXT:    addl $92, %esp
104 ; CHECK-NEXT:    popl %esi
105 ; CHECK-NEXT:    popl %edi
106 ; CHECK-NEXT:    popl %ebx
107 ; CHECK-NEXT:    popl %ebp
108 ; CHECK-NEXT:    retl
110 ; CHECK-X64-O0-LABEL: shift1:
111 ; CHECK-X64-O0:       # %bb.0: # %entry
112 ; CHECK-X64-O0-NEXT:    movq {{[0-9]+}}(%rsp), %rax
113 ; CHECK-X64-O0-NEXT:    movq {{[0-9]+}}(%rsp), %rax
114 ; CHECK-X64-O0-NEXT:    movq {{[0-9]+}}(%rsp), %rax
115 ; CHECK-X64-O0-NEXT:    movq %rdi, -{{[0-9]+}}(%rsp)
116 ; CHECK-X64-O0-NEXT:    movq %rsi, -{{[0-9]+}}(%rsp)
117 ; CHECK-X64-O0-NEXT:    movq %rdx, -{{[0-9]+}}(%rsp)
118 ; CHECK-X64-O0-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
119 ; CHECK-X64-O0-NEXT:    sarq $63, %rcx
120 ; CHECK-X64-O0-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
121 ; CHECK-X64-O0-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
122 ; CHECK-X64-O0-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
123 ; CHECK-X64-O0-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
124 ; CHECK-X64-O0-NEXT:    movb %r8b, %dl
125 ; CHECK-X64-O0-NEXT:    movb %dl, %cl
126 ; CHECK-X64-O0-NEXT:    andb $7, %cl
127 ; CHECK-X64-O0-NEXT:    movb %cl, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
128 ; CHECK-X64-O0-NEXT:    shrb $3, %dl
129 ; CHECK-X64-O0-NEXT:    movzbl %dl, %edx
130 ; CHECK-X64-O0-NEXT:    movl %edx, %edi
131 ; CHECK-X64-O0-NEXT:    movq -64(%rsp,%rdi), %rdx
132 ; CHECK-X64-O0-NEXT:    movq -56(%rsp,%rdi), %r8
133 ; CHECK-X64-O0-NEXT:    movq %r8, %r9
134 ; CHECK-X64-O0-NEXT:    shrq %cl, %r9
135 ; CHECK-X64-O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %cl # 1-byte Reload
136 ; CHECK-X64-O0-NEXT:    notb %cl
137 ; CHECK-X64-O0-NEXT:    movq -48(%rsp,%rdi), %rsi
138 ; CHECK-X64-O0-NEXT:    movq %rsi, %r10
139 ; CHECK-X64-O0-NEXT:    addq %r10, %r10
140 ; CHECK-X64-O0-NEXT:    shlq %cl, %r10
141 ; CHECK-X64-O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %cl # 1-byte Reload
142 ; CHECK-X64-O0-NEXT:    orq %r10, %r9
143 ; CHECK-X64-O0-NEXT:    movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
144 ; CHECK-X64-O0-NEXT:    movq -40(%rsp,%rdi), %rdi
145 ; CHECK-X64-O0-NEXT:    shrdq %cl, %rdi, %rsi
146 ; CHECK-X64-O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %cl # 1-byte Reload
147 ; CHECK-X64-O0-NEXT:    shrdq %cl, %r8, %rdx
148 ; CHECK-X64-O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %cl # 1-byte Reload
149 ; CHECK-X64-O0-NEXT:    sarq %cl, %rdi
150 ; CHECK-X64-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
151 ; CHECK-X64-O0-NEXT:    movq %rdi, 24(%rax)
152 ; CHECK-X64-O0-NEXT:    movq %rsi, 16(%rax)
153 ; CHECK-X64-O0-NEXT:    movq %rdx, (%rax)
154 ; CHECK-X64-O0-NEXT:    movq %rcx, 8(%rax)
155 ; CHECK-X64-O0-NEXT:    retq
157 ; CHECK-X64-O2-LABEL: shift1:
158 ; CHECK-X64-O2:       # %bb.0: # %entry
159 ; CHECK-X64-O2-NEXT:    movq {{[0-9]+}}(%rsp), %r9
160 ; CHECK-X64-O2-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
161 ; CHECK-X64-O2-NEXT:    movq %rdx, -{{[0-9]+}}(%rsp)
162 ; CHECK-X64-O2-NEXT:    movq %rsi, -{{[0-9]+}}(%rsp)
163 ; CHECK-X64-O2-NEXT:    movq %rdi, -{{[0-9]+}}(%rsp)
164 ; CHECK-X64-O2-NEXT:    sarq $63, %rcx
165 ; CHECK-X64-O2-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
166 ; CHECK-X64-O2-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
167 ; CHECK-X64-O2-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
168 ; CHECK-X64-O2-NEXT:    movq %rcx, -{{[0-9]+}}(%rsp)
169 ; CHECK-X64-O2-NEXT:    movl %r8d, %eax
170 ; CHECK-X64-O2-NEXT:    andb $7, %al
171 ; CHECK-X64-O2-NEXT:    shrb $3, %r8b
172 ; CHECK-X64-O2-NEXT:    movzbl %r8b, %edx
173 ; CHECK-X64-O2-NEXT:    movq -64(%rsp,%rdx), %rsi
174 ; CHECK-X64-O2-NEXT:    movq -56(%rsp,%rdx), %rdi
175 ; CHECK-X64-O2-NEXT:    movq %rdi, %r8
176 ; CHECK-X64-O2-NEXT:    movl %eax, %ecx
177 ; CHECK-X64-O2-NEXT:    shrq %cl, %r8
178 ; CHECK-X64-O2-NEXT:    notb %cl
179 ; CHECK-X64-O2-NEXT:    movq -48(%rsp,%rdx), %r10
180 ; CHECK-X64-O2-NEXT:    leaq (%r10,%r10), %r11
181 ; CHECK-X64-O2-NEXT:    shlq %cl, %r11
182 ; CHECK-X64-O2-NEXT:    orq %r8, %r11
183 ; CHECK-X64-O2-NEXT:    movq -40(%rsp,%rdx), %rdx
184 ; CHECK-X64-O2-NEXT:    movl %eax, %ecx
185 ; CHECK-X64-O2-NEXT:    shrdq %cl, %rdx, %r10
186 ; CHECK-X64-O2-NEXT:    shrdq %cl, %rdi, %rsi
187 ; CHECK-X64-O2-NEXT:    sarq %cl, %rdx
188 ; CHECK-X64-O2-NEXT:    movq %rdx, 24(%r9)
189 ; CHECK-X64-O2-NEXT:    movq %r10, 16(%r9)
190 ; CHECK-X64-O2-NEXT:    movq %rsi, (%r9)
191 ; CHECK-X64-O2-NEXT:    movq %r11, 8(%r9)
192 ; CHECK-X64-O2-NEXT:    retq
193 entry:
194         %0 = ashr i256 %x, %a
195         store i256 %0, ptr %r
196         ret void
199 define i256 @shift2(i256 %c) nounwind
200 ; CHECK-LABEL: shift2:
201 ; CHECK:       # %bb.0:
202 ; CHECK-NEXT:    pushl %ebp
203 ; CHECK-NEXT:    pushl %ebx
204 ; CHECK-NEXT:    pushl %edi
205 ; CHECK-NEXT:    pushl %esi
206 ; CHECK-NEXT:    subl $92, %esp
207 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax
208 ; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
209 ; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
210 ; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
211 ; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
212 ; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
213 ; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
214 ; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
215 ; CHECK-NEXT:    movl $1, {{[0-9]+}}(%esp)
216 ; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
217 ; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
218 ; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
219 ; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
220 ; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
221 ; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
222 ; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
223 ; CHECK-NEXT:    movl $0, {{[0-9]+}}(%esp)
224 ; CHECK-NEXT:    movb %al, %ch
225 ; CHECK-NEXT:    andb $7, %ch
226 ; CHECK-NEXT:    shrb $3, %al
227 ; CHECK-NEXT:    negb %al
228 ; CHECK-NEXT:    movsbl %al, %eax
229 ; CHECK-NEXT:    movl 68(%esp,%eax), %edx
230 ; CHECK-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
231 ; CHECK-NEXT:    movb %ch, %cl
232 ; CHECK-NEXT:    shll %cl, %edx
233 ; CHECK-NEXT:    notb %cl
234 ; CHECK-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill
235 ; CHECK-NEXT:    movl 64(%esp,%eax), %ebp
236 ; CHECK-NEXT:    movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
237 ; CHECK-NEXT:    shrl %ebp
238 ; CHECK-NEXT:    shrl %cl, %ebp
239 ; CHECK-NEXT:    orl %edx, %ebp
240 ; CHECK-NEXT:    movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
241 ; CHECK-NEXT:    movl 76(%esp,%eax), %edx
242 ; CHECK-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
243 ; CHECK-NEXT:    movb %ch, %cl
244 ; CHECK-NEXT:    shll %cl, %edx
245 ; CHECK-NEXT:    movl 72(%esp,%eax), %ebx
246 ; CHECK-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
247 ; CHECK-NEXT:    shrl %ebx
248 ; CHECK-NEXT:    movb {{[-0-9]+}}(%e{{[sb]}}p), %cl # 1-byte Reload
249 ; CHECK-NEXT:    shrl %cl, %ebx
250 ; CHECK-NEXT:    orl %edx, %ebx
251 ; CHECK-NEXT:    movl 84(%esp,%eax), %esi
252 ; CHECK-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
253 ; CHECK-NEXT:    movb %ch, %cl
254 ; CHECK-NEXT:    shll %cl, %esi
255 ; CHECK-NEXT:    movl 80(%esp,%eax), %edi
256 ; CHECK-NEXT:    movl %edi, %edx
257 ; CHECK-NEXT:    shrl %edx
258 ; CHECK-NEXT:    movb {{[-0-9]+}}(%e{{[sb]}}p), %cl # 1-byte Reload
259 ; CHECK-NEXT:    shrl %cl, %edx
260 ; CHECK-NEXT:    orl %esi, %edx
261 ; CHECK-NEXT:    movb %ch, %cl
262 ; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
263 ; CHECK-NEXT:    shldl %cl, %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
264 ; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
265 ; CHECK-NEXT:    shldl %cl, %esi, %edi
266 ; CHECK-NEXT:    movl 60(%esp,%eax), %ebp
267 ; CHECK-NEXT:    movl 88(%esp,%eax), %esi
268 ; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
269 ; CHECK-NEXT:    shldl %cl, %eax, %esi
270 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax
271 ; CHECK-NEXT:    movl %esi, 28(%eax)
272 ; CHECK-NEXT:    movl %edi, 20(%eax)
273 ; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
274 ; CHECK-NEXT:    movl %esi, 12(%eax)
275 ; CHECK-NEXT:    movl %ebp, %esi
276 ; CHECK-NEXT:    shll %cl, %esi
277 ; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
278 ; CHECK-NEXT:    shldl %cl, %ebp, %edi
279 ; CHECK-NEXT:    movl %edi, 4(%eax)
280 ; CHECK-NEXT:    movl %esi, (%eax)
281 ; CHECK-NEXT:    movl %edx, 24(%eax)
282 ; CHECK-NEXT:    movl %ebx, 16(%eax)
283 ; CHECK-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
284 ; CHECK-NEXT:    movl %ecx, 8(%eax)
285 ; CHECK-NEXT:    addl $92, %esp
286 ; CHECK-NEXT:    popl %esi
287 ; CHECK-NEXT:    popl %edi
288 ; CHECK-NEXT:    popl %ebx
289 ; CHECK-NEXT:    popl %ebp
290 ; CHECK-NEXT:    retl $4
292 ; CHECK-X64-O0-LABEL: shift2:
293 ; CHECK-X64-O0:       # %bb.0:
294 ; CHECK-X64-O0-NEXT:    movq %rdi, %rax
295 ; CHECK-X64-O0-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
296 ; CHECK-X64-O0-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
297 ; CHECK-X64-O0-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
298 ; CHECK-X64-O0-NEXT:    movq $1, -{{[0-9]+}}(%rsp)
299 ; CHECK-X64-O0-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
300 ; CHECK-X64-O0-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
301 ; CHECK-X64-O0-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
302 ; CHECK-X64-O0-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
303 ; CHECK-X64-O0-NEXT:    movb %sil, %dl
304 ; CHECK-X64-O0-NEXT:    movb %dl, %cl
305 ; CHECK-X64-O0-NEXT:    andb $7, %cl
306 ; CHECK-X64-O0-NEXT:    movb %cl, {{[-0-9]+}}(%r{{[sb]}}p) # 1-byte Spill
307 ; CHECK-X64-O0-NEXT:    shrb $3, %dl
308 ; CHECK-X64-O0-NEXT:    negb %dl
309 ; CHECK-X64-O0-NEXT:    movsbq %dl, %rdx
310 ; CHECK-X64-O0-NEXT:    movq -16(%rsp,%rdx), %rsi
311 ; CHECK-X64-O0-NEXT:    movq %rsi, %r10
312 ; CHECK-X64-O0-NEXT:    shlq %cl, %r10
313 ; CHECK-X64-O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %cl # 1-byte Reload
314 ; CHECK-X64-O0-NEXT:    notb %cl
315 ; CHECK-X64-O0-NEXT:    movq -32(%rsp,%rdx), %r9
316 ; CHECK-X64-O0-NEXT:    movq -24(%rsp,%rdx), %r8
317 ; CHECK-X64-O0-NEXT:    movq %r8, %r11
318 ; CHECK-X64-O0-NEXT:    shrq %r11
319 ; CHECK-X64-O0-NEXT:    shrq %cl, %r11
320 ; CHECK-X64-O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %cl # 1-byte Reload
321 ; CHECK-X64-O0-NEXT:    orq %r11, %r10
322 ; CHECK-X64-O0-NEXT:    movq %r10, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
323 ; CHECK-X64-O0-NEXT:    movq -8(%rsp,%rdx), %rdx
324 ; CHECK-X64-O0-NEXT:    shldq %cl, %rsi, %rdx
325 ; CHECK-X64-O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %cl # 1-byte Reload
326 ; CHECK-X64-O0-NEXT:    movq %r9, %rsi
327 ; CHECK-X64-O0-NEXT:    shlq %cl, %rsi
328 ; CHECK-X64-O0-NEXT:    movb {{[-0-9]+}}(%r{{[sb]}}p), %cl # 1-byte Reload
329 ; CHECK-X64-O0-NEXT:    shldq %cl, %r9, %r8
330 ; CHECK-X64-O0-NEXT:    movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
331 ; CHECK-X64-O0-NEXT:    movq %r8, 8(%rdi)
332 ; CHECK-X64-O0-NEXT:    movq %rsi, (%rdi)
333 ; CHECK-X64-O0-NEXT:    movq %rdx, 24(%rdi)
334 ; CHECK-X64-O0-NEXT:    movq %rcx, 16(%rdi)
335 ; CHECK-X64-O0-NEXT:    retq
337 ; CHECK-X64-O2-LABEL: shift2:
338 ; CHECK-X64-O2:       # %bb.0:
339 ; CHECK-X64-O2-NEXT:    movq %rdi, %rax
340 ; CHECK-X64-O2-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
341 ; CHECK-X64-O2-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
342 ; CHECK-X64-O2-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
343 ; CHECK-X64-O2-NEXT:    movq $1, -{{[0-9]+}}(%rsp)
344 ; CHECK-X64-O2-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
345 ; CHECK-X64-O2-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
346 ; CHECK-X64-O2-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
347 ; CHECK-X64-O2-NEXT:    movq $0, -{{[0-9]+}}(%rsp)
348 ; CHECK-X64-O2-NEXT:    movl %esi, %edx
349 ; CHECK-X64-O2-NEXT:    andb $7, %dl
350 ; CHECK-X64-O2-NEXT:    shrb $3, %sil
351 ; CHECK-X64-O2-NEXT:    negb %sil
352 ; CHECK-X64-O2-NEXT:    movsbq %sil, %rsi
353 ; CHECK-X64-O2-NEXT:    movq -16(%rsp,%rsi), %rdi
354 ; CHECK-X64-O2-NEXT:    movq %rdi, %r8
355 ; CHECK-X64-O2-NEXT:    movl %edx, %ecx
356 ; CHECK-X64-O2-NEXT:    shlq %cl, %r8
357 ; CHECK-X64-O2-NEXT:    notb %cl
358 ; CHECK-X64-O2-NEXT:    movq -32(%rsp,%rsi), %r9
359 ; CHECK-X64-O2-NEXT:    movq -24(%rsp,%rsi), %r10
360 ; CHECK-X64-O2-NEXT:    movq %r10, %r11
361 ; CHECK-X64-O2-NEXT:    shrq %r11
362 ; CHECK-X64-O2-NEXT:    shrq %cl, %r11
363 ; CHECK-X64-O2-NEXT:    orq %r8, %r11
364 ; CHECK-X64-O2-NEXT:    movq -8(%rsp,%rsi), %rsi
365 ; CHECK-X64-O2-NEXT:    movl %edx, %ecx
366 ; CHECK-X64-O2-NEXT:    shldq %cl, %rdi, %rsi
367 ; CHECK-X64-O2-NEXT:    movq %r9, %rdi
368 ; CHECK-X64-O2-NEXT:    shlq %cl, %rdi
369 ; CHECK-X64-O2-NEXT:    shldq %cl, %r9, %r10
370 ; CHECK-X64-O2-NEXT:    movq %rsi, 24(%rax)
371 ; CHECK-X64-O2-NEXT:    movq %r10, 8(%rax)
372 ; CHECK-X64-O2-NEXT:    movq %rdi, (%rax)
373 ; CHECK-X64-O2-NEXT:    movq %r11, 16(%rax)
374 ; CHECK-X64-O2-NEXT:    retq
376   %b = shl i256 1, %c  ; %c must not be a constant
377   ; Special case when %c is 0:
378   ret i256 %b
380 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
381 ; CHECK-X64: {{.*}}