[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / mul-i256.ll
blobdf64b9054afddbdef08245f3ec335164b64311a7
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i386-unknown | FileCheck %s --check-prefix=X32
3 ; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=X64
5 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
7 define void @test(i256* %a, i256* %b, i256* %out) #0 {
8 ; X32-LABEL: test:
9 ; X32:       # %bb.0: # %entry
10 ; X32-NEXT:    pushl %ebp
11 ; X32-NEXT:    .cfi_def_cfa_offset 8
12 ; X32-NEXT:    pushl %ebx
13 ; X32-NEXT:    .cfi_def_cfa_offset 12
14 ; X32-NEXT:    pushl %edi
15 ; X32-NEXT:    .cfi_def_cfa_offset 16
16 ; X32-NEXT:    pushl %esi
17 ; X32-NEXT:    .cfi_def_cfa_offset 20
18 ; X32-NEXT:    subl $88, %esp
19 ; X32-NEXT:    .cfi_def_cfa_offset 108
20 ; X32-NEXT:    .cfi_offset %esi, -20
21 ; X32-NEXT:    .cfi_offset %edi, -16
22 ; X32-NEXT:    .cfi_offset %ebx, -12
23 ; X32-NEXT:    .cfi_offset %ebp, -8
24 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
25 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
26 ; X32-NEXT:    movl 12(%ecx), %ebp
27 ; X32-NEXT:    movl 8(%ecx), %edi
28 ; X32-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
29 ; X32-NEXT:    movl (%eax), %ebx
30 ; X32-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
31 ; X32-NEXT:    movl %edi, %eax
32 ; X32-NEXT:    mull %ebx
33 ; X32-NEXT:    movl %edx, %ecx
34 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
35 ; X32-NEXT:    movl %ebp, %eax
36 ; X32-NEXT:    movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
37 ; X32-NEXT:    mull %ebx
38 ; X32-NEXT:    movl %edx, %esi
39 ; X32-NEXT:    movl %eax, %ebx
40 ; X32-NEXT:    addl %ecx, %ebx
41 ; X32-NEXT:    adcl $0, %esi
42 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax
43 ; X32-NEXT:    movl 4(%eax), %ecx
44 ; X32-NEXT:    movl %edi, %eax
45 ; X32-NEXT:    mull %ecx
46 ; X32-NEXT:    movl %ecx, %edi
47 ; X32-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
48 ; X32-NEXT:    movl %edx, %ecx
49 ; X32-NEXT:    addl %ebx, %eax
50 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
51 ; X32-NEXT:    adcl %esi, %ecx
52 ; X32-NEXT:    setb {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
53 ; X32-NEXT:    movl %ebp, %eax
54 ; X32-NEXT:    mull %edi
55 ; X32-NEXT:    movl %edx, %ebx
56 ; X32-NEXT:    movl %eax, %edi
57 ; X32-NEXT:    addl %ecx, %edi
58 ; X32-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 1-byte Folded Reload
59 ; X32-NEXT:    adcl %eax, %ebx
60 ; X32-NEXT:    xorl %edx, %edx
61 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
62 ; X32-NEXT:    movl %ecx, %eax
63 ; X32-NEXT:    mull %edx
64 ; X32-NEXT:    movl %edx, %ebp
65 ; X32-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
66 ; X32-NEXT:    movl %eax, %esi
67 ; X32-NEXT:    movl %eax, (%esp) # 4-byte Spill
68 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
69 ; X32-NEXT:    xorl %edx, %edx
70 ; X32-NEXT:    mull %edx
71 ; X32-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
72 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
73 ; X32-NEXT:    addl %esi, %eax
74 ; X32-NEXT:    adcl %ebp, %edx
75 ; X32-NEXT:    addl %edi, %eax
76 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
77 ; X32-NEXT:    adcl %ebx, %edx
78 ; X32-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
79 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %esi
80 ; X32-NEXT:    movl (%esi), %ebp
81 ; X32-NEXT:    movl %ebp, %eax
82 ; X32-NEXT:    movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
83 ; X32-NEXT:    mull %ecx
84 ; X32-NEXT:    movl %ecx, %edi
85 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
86 ; X32-NEXT:    movl %edx, %ecx
87 ; X32-NEXT:    movl 4(%esi), %esi
88 ; X32-NEXT:    movl %esi, %eax
89 ; X32-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
90 ; X32-NEXT:    mull %edi
91 ; X32-NEXT:    movl %edx, %edi
92 ; X32-NEXT:    movl %eax, %ebx
93 ; X32-NEXT:    addl %ecx, %ebx
94 ; X32-NEXT:    adcl $0, %edi
95 ; X32-NEXT:    movl %ebp, %eax
96 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
97 ; X32-NEXT:    mull %ebp
98 ; X32-NEXT:    movl %edx, %ecx
99 ; X32-NEXT:    addl %ebx, %eax
100 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
101 ; X32-NEXT:    adcl %edi, %ecx
102 ; X32-NEXT:    setb %bl
103 ; X32-NEXT:    movl %esi, %eax
104 ; X32-NEXT:    mull %ebp
105 ; X32-NEXT:    movl %edx, %edi
106 ; X32-NEXT:    movl %eax, %ebp
107 ; X32-NEXT:    addl %ecx, %ebp
108 ; X32-NEXT:    movzbl %bl, %eax
109 ; X32-NEXT:    adcl %eax, %edi
110 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
111 ; X32-NEXT:    movl %esi, %eax
112 ; X32-NEXT:    xorl %edx, %edx
113 ; X32-NEXT:    mull %edx
114 ; X32-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
115 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
116 ; X32-NEXT:    movl (%esp), %ecx # 4-byte Reload
117 ; X32-NEXT:    addl %eax, %ecx
118 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
119 ; X32-NEXT:    adcl %edx, %eax
120 ; X32-NEXT:    addl %ebp, %ecx
121 ; X32-NEXT:    adcl %edi, %eax
122 ; X32-NEXT:    addl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
123 ; X32-NEXT:    movl %ecx, (%esp) # 4-byte Spill
124 ; X32-NEXT:    adcl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
125 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
126 ; X32-NEXT:    adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
127 ; X32-NEXT:    adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
128 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %edi
129 ; X32-NEXT:    movl 8(%edi), %ebx
130 ; X32-NEXT:    movl %esi, %eax
131 ; X32-NEXT:    movl %esi, %ecx
132 ; X32-NEXT:    mull %ebx
133 ; X32-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
134 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
135 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
136 ; X32-NEXT:    mull %ebx
137 ; X32-NEXT:    movl %edx, %ebp
138 ; X32-NEXT:    movl %eax, %esi
139 ; X32-NEXT:    addl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
140 ; X32-NEXT:    adcl $0, %ebp
141 ; X32-NEXT:    movl 12(%edi), %edi
142 ; X32-NEXT:    movl %ecx, %eax
143 ; X32-NEXT:    mull %edi
144 ; X32-NEXT:    movl %edi, %ecx
145 ; X32-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
146 ; X32-NEXT:    movl %edx, %edi
147 ; X32-NEXT:    addl %esi, %eax
148 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
149 ; X32-NEXT:    adcl %ebp, %edi
150 ; X32-NEXT:    setb {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
151 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
152 ; X32-NEXT:    mull %ecx
153 ; X32-NEXT:    movl %edx, %esi
154 ; X32-NEXT:    movl %eax, %ebp
155 ; X32-NEXT:    addl %edi, %ebp
156 ; X32-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 1-byte Folded Reload
157 ; X32-NEXT:    adcl %eax, %esi
158 ; X32-NEXT:    movl %ebx, %edi
159 ; X32-NEXT:    movl %ebx, %eax
160 ; X32-NEXT:    xorl %ecx, %ecx
161 ; X32-NEXT:    mull %ecx
162 ; X32-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
163 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
164 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
165 ; X32-NEXT:    addl %eax, %ebx
166 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
167 ; X32-NEXT:    adcl %edx, %eax
168 ; X32-NEXT:    addl %ebp, %ebx
169 ; X32-NEXT:    adcl %esi, %eax
170 ; X32-NEXT:    movl (%esp), %ecx # 4-byte Reload
171 ; X32-NEXT:    addl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
172 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
173 ; X32-NEXT:    adcl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
174 ; X32-NEXT:    adcl $0, %ebx
175 ; X32-NEXT:    adcl $0, %eax
176 ; X32-NEXT:    addl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
177 ; X32-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
178 ; X32-NEXT:    adcl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
179 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
180 ; X32-NEXT:    setb (%esp) # 1-byte Folded Spill
181 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
182 ; X32-NEXT:    movl %esi, %eax
183 ; X32-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
184 ; X32-NEXT:    mull %edi
185 ; X32-NEXT:    movl %edx, %ebx
186 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
187 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
188 ; X32-NEXT:    movl %ecx, %eax
189 ; X32-NEXT:    mull %edi
190 ; X32-NEXT:    movl %edx, %edi
191 ; X32-NEXT:    movl %eax, %ebp
192 ; X32-NEXT:    addl %ebx, %ebp
193 ; X32-NEXT:    adcl $0, %edi
194 ; X32-NEXT:    movl %esi, %eax
195 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
196 ; X32-NEXT:    mull %ebx
197 ; X32-NEXT:    movl %edx, %esi
198 ; X32-NEXT:    addl %ebp, %eax
199 ; X32-NEXT:    movl %eax, %ebp
200 ; X32-NEXT:    adcl %edi, %esi
201 ; X32-NEXT:    setb {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
202 ; X32-NEXT:    movl %ecx, %eax
203 ; X32-NEXT:    mull %ebx
204 ; X32-NEXT:    addl %esi, %eax
205 ; X32-NEXT:    movzbl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 1-byte Folded Reload
206 ; X32-NEXT:    adcl %esi, %edx
207 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
208 ; X32-NEXT:    addl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
209 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
210 ; X32-NEXT:    adcl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
211 ; X32-NEXT:    addl %eax, %esi
212 ; X32-NEXT:    adcl %edx, %ecx
213 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
214 ; X32-NEXT:    addl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
215 ; X32-NEXT:    adcl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Folded Reload
216 ; X32-NEXT:    movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
217 ; X32-NEXT:    movzbl (%esp), %eax # 1-byte Folded Reload
218 ; X32-NEXT:    adcl %eax, %esi
219 ; X32-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
220 ; X32-NEXT:    adcl $0, %ecx
221 ; X32-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
222 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
223 ; X32-NEXT:    movl 16(%ecx), %esi
224 ; X32-NEXT:    imull %esi, %ebx
225 ; X32-NEXT:    movl %esi, %eax
226 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
227 ; X32-NEXT:    mull %edi
228 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
229 ; X32-NEXT:    addl %ebx, %edx
230 ; X32-NEXT:    movl 20(%ecx), %eax
231 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
232 ; X32-NEXT:    imull %eax, %edi
233 ; X32-NEXT:    addl %edx, %edi
234 ; X32-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
235 ; X32-NEXT:    movl 24(%ecx), %eax
236 ; X32-NEXT:    movl %ecx, %ebp
237 ; X32-NEXT:    movl %eax, %edi
238 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
239 ; X32-NEXT:    imull %ecx, %edi
240 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
241 ; X32-NEXT:    mull %ebx
242 ; X32-NEXT:    movl %eax, (%esp) # 4-byte Spill
243 ; X32-NEXT:    addl %edi, %edx
244 ; X32-NEXT:    movl 28(%ebp), %ebp
245 ; X32-NEXT:    imull %ebx, %ebp
246 ; X32-NEXT:    addl %edx, %ebp
247 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
248 ; X32-NEXT:    addl %edx, (%esp) # 4-byte Folded Spill
249 ; X32-NEXT:    adcl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Folded Reload
250 ; X32-NEXT:    movl %ebx, %eax
251 ; X32-NEXT:    mull %esi
252 ; X32-NEXT:    movl %edx, %ebx
253 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
254 ; X32-NEXT:    movl %ecx, %eax
255 ; X32-NEXT:    mull %esi
256 ; X32-NEXT:    movl %edx, %ecx
257 ; X32-NEXT:    movl %eax, %edi
258 ; X32-NEXT:    addl %ebx, %edi
259 ; X32-NEXT:    adcl $0, %ecx
260 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
261 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
262 ; X32-NEXT:    mull %ebx
263 ; X32-NEXT:    movl %edx, %esi
264 ; X32-NEXT:    addl %edi, %eax
265 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
266 ; X32-NEXT:    adcl %ecx, %esi
267 ; X32-NEXT:    setb %cl
268 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
269 ; X32-NEXT:    mull %ebx
270 ; X32-NEXT:    addl %esi, %eax
271 ; X32-NEXT:    movzbl %cl, %ecx
272 ; X32-NEXT:    adcl %ecx, %edx
273 ; X32-NEXT:    addl (%esp), %eax # 4-byte Folded Reload
274 ; X32-NEXT:    movl %eax, (%esp) # 4-byte Spill
275 ; X32-NEXT:    adcl %ebp, %edx
276 ; X32-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
277 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %ebx
278 ; X32-NEXT:    movl 28(%ebx), %ecx
279 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
280 ; X32-NEXT:    imull %esi, %ecx
281 ; X32-NEXT:    movl 24(%ebx), %edi
282 ; X32-NEXT:    movl %esi, %eax
283 ; X32-NEXT:    mull %edi
284 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
285 ; X32-NEXT:    addl %ecx, %edx
286 ; X32-NEXT:    imull {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
287 ; X32-NEXT:    addl %edx, %edi
288 ; X32-NEXT:    movl 16(%ebx), %ebp
289 ; X32-NEXT:    movl 20(%ebx), %ebx
290 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
291 ; X32-NEXT:    movl %eax, %ecx
292 ; X32-NEXT:    imull %ebx, %ecx
293 ; X32-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
294 ; X32-NEXT:    mull %ebp
295 ; X32-NEXT:    addl %ecx, %edx
296 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
297 ; X32-NEXT:    imull %ebp, %ecx
298 ; X32-NEXT:    addl %edx, %ecx
299 ; X32-NEXT:    addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
300 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
301 ; X32-NEXT:    adcl %edi, %ecx
302 ; X32-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
303 ; X32-NEXT:    movl %ebp, %eax
304 ; X32-NEXT:    mull %esi
305 ; X32-NEXT:    movl %edx, %edi
306 ; X32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
307 ; X32-NEXT:    movl %ebx, %eax
308 ; X32-NEXT:    mull %esi
309 ; X32-NEXT:    movl %edx, %ecx
310 ; X32-NEXT:    movl %eax, %ebx
311 ; X32-NEXT:    addl %edi, %ebx
312 ; X32-NEXT:    adcl $0, %ecx
313 ; X32-NEXT:    movl %ebp, %eax
314 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
315 ; X32-NEXT:    mull %ebp
316 ; X32-NEXT:    movl %edx, %edi
317 ; X32-NEXT:    movl %eax, %esi
318 ; X32-NEXT:    addl %ebx, %esi
319 ; X32-NEXT:    adcl %ecx, %edi
320 ; X32-NEXT:    setb %cl
321 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
322 ; X32-NEXT:    mull %ebp
323 ; X32-NEXT:    addl %edi, %eax
324 ; X32-NEXT:    movzbl %cl, %ecx
325 ; X32-NEXT:    adcl %ecx, %edx
326 ; X32-NEXT:    addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
327 ; X32-NEXT:    adcl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
328 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
329 ; X32-NEXT:    addl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
330 ; X32-NEXT:    adcl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
331 ; X32-NEXT:    adcl (%esp), %eax # 4-byte Folded Reload
332 ; X32-NEXT:    adcl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
333 ; X32-NEXT:    addl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
334 ; X32-NEXT:    movl %ecx, %ebx
335 ; X32-NEXT:    adcl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
336 ; X32-NEXT:    adcl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
337 ; X32-NEXT:    adcl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
338 ; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
339 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
340 ; X32-NEXT:    movl %edi, (%ecx)
341 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
342 ; X32-NEXT:    movl %edi, 4(%ecx)
343 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
344 ; X32-NEXT:    movl %edi, 8(%ecx)
345 ; X32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
346 ; X32-NEXT:    movl %edi, 12(%ecx)
347 ; X32-NEXT:    movl %ebx, 16(%ecx)
348 ; X32-NEXT:    movl %esi, 20(%ecx)
349 ; X32-NEXT:    movl %eax, 24(%ecx)
350 ; X32-NEXT:    movl %edx, 28(%ecx)
351 ; X32-NEXT:    addl $88, %esp
352 ; X32-NEXT:    .cfi_def_cfa_offset 20
353 ; X32-NEXT:    popl %esi
354 ; X32-NEXT:    .cfi_def_cfa_offset 16
355 ; X32-NEXT:    popl %edi
356 ; X32-NEXT:    .cfi_def_cfa_offset 12
357 ; X32-NEXT:    popl %ebx
358 ; X32-NEXT:    .cfi_def_cfa_offset 8
359 ; X32-NEXT:    popl %ebp
360 ; X32-NEXT:    .cfi_def_cfa_offset 4
361 ; X32-NEXT:    retl
363 ; X64-LABEL: test:
364 ; X64:       # %bb.0: # %entry
365 ; X64-NEXT:    pushq %r15
366 ; X64-NEXT:    .cfi_def_cfa_offset 16
367 ; X64-NEXT:    pushq %r14
368 ; X64-NEXT:    .cfi_def_cfa_offset 24
369 ; X64-NEXT:    pushq %rbx
370 ; X64-NEXT:    .cfi_def_cfa_offset 32
371 ; X64-NEXT:    .cfi_offset %rbx, -32
372 ; X64-NEXT:    .cfi_offset %r14, -24
373 ; X64-NEXT:    .cfi_offset %r15, -16
374 ; X64-NEXT:    movq %rdx, %r9
375 ; X64-NEXT:    movq (%rdi), %r11
376 ; X64-NEXT:    movq 8(%rdi), %r8
377 ; X64-NEXT:    movq 16(%rdi), %rbx
378 ; X64-NEXT:    movq 16(%rsi), %r10
379 ; X64-NEXT:    movq (%rsi), %rcx
380 ; X64-NEXT:    movq 8(%rsi), %r15
381 ; X64-NEXT:    movq 24(%rdi), %rdi
382 ; X64-NEXT:    imulq %rcx, %rdi
383 ; X64-NEXT:    movq %rcx, %rax
384 ; X64-NEXT:    mulq %rbx
385 ; X64-NEXT:    movq %rax, %r14
386 ; X64-NEXT:    addq %rdi, %rdx
387 ; X64-NEXT:    imulq %r15, %rbx
388 ; X64-NEXT:    addq %rdx, %rbx
389 ; X64-NEXT:    movq %r10, %rdi
390 ; X64-NEXT:    imulq %r8, %rdi
391 ; X64-NEXT:    movq %r10, %rax
392 ; X64-NEXT:    mulq %r11
393 ; X64-NEXT:    movq %rax, %r10
394 ; X64-NEXT:    addq %rdi, %rdx
395 ; X64-NEXT:    movq 24(%rsi), %rdi
396 ; X64-NEXT:    imulq %r11, %rdi
397 ; X64-NEXT:    addq %rdx, %rdi
398 ; X64-NEXT:    addq %r14, %r10
399 ; X64-NEXT:    adcq %rbx, %rdi
400 ; X64-NEXT:    movq %r11, %rax
401 ; X64-NEXT:    mulq %rcx
402 ; X64-NEXT:    movq %rdx, %rsi
403 ; X64-NEXT:    movq %rax, %r14
404 ; X64-NEXT:    movq %r8, %rax
405 ; X64-NEXT:    mulq %rcx
406 ; X64-NEXT:    movq %rdx, %rcx
407 ; X64-NEXT:    movq %rax, %rbx
408 ; X64-NEXT:    addq %rsi, %rbx
409 ; X64-NEXT:    adcq $0, %rcx
410 ; X64-NEXT:    movq %r11, %rax
411 ; X64-NEXT:    mulq %r15
412 ; X64-NEXT:    movq %rdx, %rsi
413 ; X64-NEXT:    movq %rax, %r11
414 ; X64-NEXT:    addq %rbx, %r11
415 ; X64-NEXT:    adcq %rcx, %rsi
416 ; X64-NEXT:    setb %al
417 ; X64-NEXT:    movzbl %al, %ecx
418 ; X64-NEXT:    movq %r8, %rax
419 ; X64-NEXT:    mulq %r15
420 ; X64-NEXT:    addq %rsi, %rax
421 ; X64-NEXT:    adcq %rcx, %rdx
422 ; X64-NEXT:    addq %r10, %rax
423 ; X64-NEXT:    adcq %rdi, %rdx
424 ; X64-NEXT:    movq %r14, (%r9)
425 ; X64-NEXT:    movq %r11, 8(%r9)
426 ; X64-NEXT:    movq %rax, 16(%r9)
427 ; X64-NEXT:    movq %rdx, 24(%r9)
428 ; X64-NEXT:    popq %rbx
429 ; X64-NEXT:    .cfi_def_cfa_offset 24
430 ; X64-NEXT:    popq %r14
431 ; X64-NEXT:    .cfi_def_cfa_offset 16
432 ; X64-NEXT:    popq %r15
433 ; X64-NEXT:    .cfi_def_cfa_offset 8
434 ; X64-NEXT:    retq
435 entry:
436   %av = load i256, i256* %a
437   %bv = load i256, i256* %b
438   %r = mul i256 %av, %bv
439   store i256 %r, i256* %out
440   ret void
443 attributes #0 = { norecurse nounwind uwtable }