<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/131685>131685</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Does not emit __udivmoddi4
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
purplesyringa
</td>
</tr>
</table>
<pre>
Somewhat similarly to #46350, the following code is compiled suboptimally on i686 (and probably other 32-bit architectures):
```c
typedef unsigned long long u64;
struct div_mod {
u64 div, mod;
};
struct div_mod div_mod(u64 x, u64 y) {
struct div_mod out = {x / y, x % y};
return out;
}
```
GCC compiles this to:
```x86asm
div_mod:
push ebx
sub esp, 24
mov ebx, DWORD PTR [esp+32]
lea eax, [esp+8]
sub esp, 12
push eax
push DWORD PTR [esp+64]
push DWORD PTR [esp+64]
push DWORD PTR [esp+64]
push DWORD PTR [esp+64]
call __udivmoddi4
movq xmm0, QWORD PTR [esp+40]
mov DWORD PTR [ebx], eax
mov eax, ebx
mov DWORD PTR [ebx+4], edx
movq QWORD PTR [ebx+8], xmm0
add esp, 56
pop ebx
ret 4
```
But Clang emits
```x86asm
div_mod:
push ebp
push ebx
push edi
push esi
sub esp, 12
call .L0$pb
.L0$pb:
pop ebx
.Ltmp0:
add ebx, offset _GLOBAL_OFFSET_TABLE_+(.Ltmp0-.L0$pb)
mov ebp, dword ptr [esp + 36]
mov esi, dword ptr [esp + 48]
push esi
push dword ptr [esp + 48]
push dword ptr [esp + 48]
push ebp
call __udivdi3@PLT
add esp, 16
mov ecx, eax
mov edi, edx
imul esi, eax
mov ebx, dword ptr [esp + 44]
mul ebx
add edx, esi
mov esi, dword ptr [esp + 32]
mov dword ptr [esi + 4], edi
imul edi, ebx
add edi, edx
sub ebp, eax
mov edx, dword ptr [esp + 40]
sbb edx, edi
mov eax, esi
mov dword ptr [esi], ecx
mov dword ptr [esi + 8], ebp
mov dword ptr [esi + 12], edx
add esp, 12
pop esi
pop edi
pop ebx
pop ebp
ret 4
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzEVsuO6jgQ_RqzKTVKKg_CIgsel7tB6vtoaZbIiQ145MSZ2KHh70fOq0k60HNXg1A7KdcpVx2fqoZqLU455zEJ1iTYzmhlzqqMi6osJNe3UuQnOksUu8W_Vcbfz9SAFpmQtJQ3MAoIen7oBQ7BDZgzh6OSUr2L_ASpYhyEhlRlhZCcga4SVRiRUSlvoHIQYRQCwYjmDIpSJTSxdnPmJXj4kggDtEzPwvDUVCXXBJfEWxGn_oZO802JszK3gjN-hCqvS2EgVX5q_lShT7x1g9GmrFIDTFwOmWJAFtYOANbJWm0FmWKt_2L7CNiuBCMLvFqYfbgRXHZBRwhVGSDe1u5egeDO-m7APgZw60-yqZTcVGVuAR9p3FXb5PN9s-lI1WDOQoNRn5m5RiHVGXFWXb61B7SfotJnu_LkemfVVVKvXBc2Q_Tv9jJ1gQ6BG9j-9fprCz_efgEJ1rX_2kMSbO8QktMGQWtE7xe1bqPTXJzKj14nrBOHh_7w8P_dNaVS2vVwqJi4ZIoxUdOZqcs_1n7Nsrppfn4O5TvDUB31w1OTq_XCzYij_p4a1ocX_DASrv0uGrvep_nzs2fUetYVfMSmjN1fZxDe86aKUSYlN_Xqf9b3ujKwkTQ_Ac-E0f9N1x-CLr6UeW9lYsqqxVfq7O52vncI-kVCnFX_OGyzvu753mSFM9ztGWtaSh2Pmhs4fN-_rlf7w-tu9_vb2-Fttd5_OxBcE4yaIC_9WbicbNA6YfauSgaFKVtdAcE1eOG0smzNjzB-NN0DLU_d6x9hnztP3-WwoZjwiO_82L89VqAbtkJujOn1SbMwcaf99iOySt6R0yJHc3C6ktEsaAONZNiny5rMtPjDmxkP3A4zchZNTn1_i6kaWwIeJHjPTt8Yjc4eEfqEndF400nSc8AmOaBPCBoX25WZDm5rkpJukA119hTi4nBMPlAejmYAfPTL2NpU3L8OB1VvLb4anTMWe2zpLemMx-7CRwwcN4pm53jBvCRZUhow10swipyl6zHHTZAfaeQcvZmI0cHA8dwFInpONF8u3DANAmQuW9IQj8R3eEaFnEt5yeaqPM2E1hWPXc8No2AmacKlrn8_Iub8HepdgpapWRlb0EtSnTTxHSm00R9hjDCSx1vFNeTK1NN-8O9yVpUyPhtTaDs3cUdwdxLmXCXzVGUEdzZQu7wUpfqbp4bgrj5eE9y1-V1i_DcAAP__HRD0rA">