xref: /llvm-project/llvm/test/CodeGen/X86/mul128.ll (revision 7b3bbd83c0c24087072ec5b22a76799ab31f87d5)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=X64
3; RUN: llc < %s -mtriple=i386-unknown | FileCheck %s --check-prefix=X86
4
5define i128 @foo(i128 %t, i128 %u) {
6; X64-LABEL: foo:
7; X64:       # %bb.0:
8; X64-NEXT:    movq %rdx, %r8
9; X64-NEXT:    movq %rdi, %rax
10; X64-NEXT:    imulq %rdi, %rcx
11; X64-NEXT:    mulq %rdx
12; X64-NEXT:    addq %rcx, %rdx
13; X64-NEXT:    imulq %rsi, %r8
14; X64-NEXT:    addq %r8, %rdx
15; X64-NEXT:    retq
16;
17; X86-LABEL: foo:
18; X86:       # %bb.0:
19; X86-NEXT:    pushl %ebp
20; X86-NEXT:    .cfi_def_cfa_offset 8
21; X86-NEXT:    pushl %ebx
22; X86-NEXT:    .cfi_def_cfa_offset 12
23; X86-NEXT:    pushl %edi
24; X86-NEXT:    .cfi_def_cfa_offset 16
25; X86-NEXT:    pushl %esi
26; X86-NEXT:    .cfi_def_cfa_offset 20
27; X86-NEXT:    subl $8, %esp
28; X86-NEXT:    .cfi_def_cfa_offset 28
29; X86-NEXT:    .cfi_offset %esi, -20
30; X86-NEXT:    .cfi_offset %edi, -16
31; X86-NEXT:    .cfi_offset %ebx, -12
32; X86-NEXT:    .cfi_offset %ebp, -8
33; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
34; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
35; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp
36; X86-NEXT:    imull %ecx, %ebp
37; X86-NEXT:    movl %eax, %esi
38; X86-NEXT:    mull %ecx
39; X86-NEXT:    movl %eax, %edi
40; X86-NEXT:    movl %edx, %ebx
41; X86-NEXT:    addl %ebp, %ebx
42; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
43; X86-NEXT:    imull %esi, %eax
44; X86-NEXT:    addl %eax, %ebx
45; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
46; X86-NEXT:    movl %eax, %esi
47; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
48; X86-NEXT:    imull %ecx, %esi
49; X86-NEXT:    movl {{[0-9]+}}(%esp), %ebp
50; X86-NEXT:    mull %ebp
51; X86-NEXT:    addl %esi, %edx
52; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
53; X86-NEXT:    imull %ebp, %esi
54; X86-NEXT:    addl %edx, %esi
55; X86-NEXT:    addl %edi, %eax
56; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
57; X86-NEXT:    adcl %ebx, %esi
58; X86-NEXT:    movl %ebp, %eax
59; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi
60; X86-NEXT:    mull %edi
61; X86-NEXT:    movl %edx, %ebx
62; X86-NEXT:    movl %eax, (%esp) # 4-byte Spill
63; X86-NEXT:    movl %ecx, %eax
64; X86-NEXT:    mull %edi
65; X86-NEXT:    movl %edx, %edi
66; X86-NEXT:    movl %eax, %ecx
67; X86-NEXT:    addl %ebx, %ecx
68; X86-NEXT:    adcl $0, %edi
69; X86-NEXT:    movl %ebp, %eax
70; X86-NEXT:    mull {{[0-9]+}}(%esp)
71; X86-NEXT:    movl %edx, %ebp
72; X86-NEXT:    movl %eax, %ebx
73; X86-NEXT:    addl %ecx, %ebx
74; X86-NEXT:    adcl %edi, %ebp
75; X86-NEXT:    setb %cl
76; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
77; X86-NEXT:    mull {{[0-9]+}}(%esp)
78; X86-NEXT:    addl %ebp, %eax
79; X86-NEXT:    movzbl %cl, %ecx
80; X86-NEXT:    adcl %ecx, %edx
81; X86-NEXT:    addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
82; X86-NEXT:    adcl %esi, %edx
83; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
84; X86-NEXT:    movl %ebx, 4(%ecx)
85; X86-NEXT:    movl (%esp), %esi # 4-byte Reload
86; X86-NEXT:    movl %esi, (%ecx)
87; X86-NEXT:    movl %eax, 8(%ecx)
88; X86-NEXT:    movl %edx, 12(%ecx)
89; X86-NEXT:    movl %ecx, %eax
90; X86-NEXT:    addl $8, %esp
91; X86-NEXT:    .cfi_def_cfa_offset 20
92; X86-NEXT:    popl %esi
93; X86-NEXT:    .cfi_def_cfa_offset 16
94; X86-NEXT:    popl %edi
95; X86-NEXT:    .cfi_def_cfa_offset 12
96; X86-NEXT:    popl %ebx
97; X86-NEXT:    .cfi_def_cfa_offset 8
98; X86-NEXT:    popl %ebp
99; X86-NEXT:    .cfi_def_cfa_offset 4
100; X86-NEXT:    retl $4
101  %k = mul i128 %t, %u
102  ret i128 %k
103}
104
105@aaa = external dso_local global i128
106@bbb = external dso_local global i128
107
108define void @PR13897() nounwind {
109; X64-LABEL: PR13897:
110; X64:       # %bb.0: # %"0x0"
111; X64-NEXT:    movq bbb(%rip), %rax
112; X64-NEXT:    movl %eax, %ecx
113; X64-NEXT:    shlq $32, %rax
114; X64-NEXT:    orq %rcx, %rax
115; X64-NEXT:    movq %rax, aaa+8(%rip)
116; X64-NEXT:    movq %rax, aaa(%rip)
117; X64-NEXT:    retq
118;
119; X86-LABEL: PR13897:
120; X86:       # %bb.0: # %"0x0"
121; X86-NEXT:    movl bbb, %eax
122; X86-NEXT:    movl %eax, aaa+12
123; X86-NEXT:    movl %eax, aaa+8
124; X86-NEXT:    movl %eax, aaa+4
125; X86-NEXT:    movl %eax, aaa
126; X86-NEXT:    retl
127"0x0":
128  %0 = load i128, ptr @bbb
129  %1 = and i128 %0, 4294967295
130  %2 = shl i128 %0, 96
131  %3 = mul i128 %1, 18446744078004518913
132  %4 = add i128 %3, %2
133  store i128 %4, ptr @aaa
134  ret void
135}
136