<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">