@@ -99,3 +99,68 @@ define i128 @foo(i128 %t, i128 %u) {
99
99
%k = mul i128 %t , %u
100
100
ret i128 %k
101
101
}
102
+
103
+ @aaa = external global i128
104
+ @bbb = external global i128
105
+
106
+ define void @PR13897 () nounwind {
107
+ ; X64-LABEL: PR13897:
108
+ ; X64: # %bb.0: # %"0x0"
109
+ ; X64-NEXT: movl {{.*}}(%rip), %ecx
110
+ ; X64-NEXT: movabsq $4294967297, %rdx # imm = 0x100000001
111
+ ; X64-NEXT: movq %rcx, %rax
112
+ ; X64-NEXT: mulq %rdx
113
+ ; X64-NEXT: addq %rcx, %rdx
114
+ ; X64-NEXT: shlq $32, %rcx
115
+ ; X64-NEXT: addq %rcx, %rdx
116
+ ; X64-NEXT: movq %rax, {{.*}}(%rip)
117
+ ; X64-NEXT: movq %rdx, aaa+{{.*}}(%rip)
118
+ ; X64-NEXT: retq
119
+ ;
120
+ ; X86-LABEL: PR13897:
121
+ ; X86: # %bb.0: # %"0x0"
122
+ ; X86-NEXT: pushl %ebp
123
+ ; X86-NEXT: pushl %ebx
124
+ ; X86-NEXT: pushl %edi
125
+ ; X86-NEXT: pushl %esi
126
+ ; X86-NEXT: pushl %eax
127
+ ; X86-NEXT: movl bbb, %eax
128
+ ; X86-NEXT: movl %eax, (%esp) # 4-byte Spill
129
+ ; X86-NEXT: movl $1, %ebx
130
+ ; X86-NEXT: mull %ebx
131
+ ; X86-NEXT: movl %edx, %esi
132
+ ; X86-NEXT: movl %eax, %edi
133
+ ; X86-NEXT: xorl %eax, %eax
134
+ ; X86-NEXT: mull %ebx
135
+ ; X86-NEXT: movl %eax, %ebx
136
+ ; X86-NEXT: addl %esi, %ebx
137
+ ; X86-NEXT: movl %edx, %ebp
138
+ ; X86-NEXT: adcl $0, %ebp
139
+ ; X86-NEXT: addl %edi, %ebx
140
+ ; X86-NEXT: adcl %esi, %ebp
141
+ ; X86-NEXT: setb %cl
142
+ ; X86-NEXT: addl %eax, %ebp
143
+ ; X86-NEXT: movzbl %cl, %eax
144
+ ; X86-NEXT: adcl %edx, %eax
145
+ ; X86-NEXT: addl %edi, %ebp
146
+ ; X86-NEXT: adcl %esi, %eax
147
+ ; X86-NEXT: addl (%esp), %eax # 4-byte Folded Reload
148
+ ; X86-NEXT: movl %edi, aaa
149
+ ; X86-NEXT: movl %ebx, aaa+4
150
+ ; X86-NEXT: movl %ebp, aaa+8
151
+ ; X86-NEXT: movl %eax, aaa+12
152
+ ; X86-NEXT: addl $4, %esp
153
+ ; X86-NEXT: popl %esi
154
+ ; X86-NEXT: popl %edi
155
+ ; X86-NEXT: popl %ebx
156
+ ; X86-NEXT: popl %ebp
157
+ ; X86-NEXT: retl
158
+ "0x0" :
159
+ %0 = load i128 , i128* @bbb
160
+ %1 = and i128 %0 , 4294967295
161
+ %2 = shl i128 %0 , 96
162
+ %3 = mul i128 %1 , 18446744078004518913
163
+ %4 = add i128 %3 , %2
164
+ store i128 %4 , i128* @aaa
165
+ ret void
166
+ }
0 commit comments