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