<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/127723>127723</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Libcalls for Windows without SSE should return `i128` on the stack
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          tgross35
      </td>
    </tr>
</table>

<pre>
    The following:

```llvm
attributes #0 = { "target-features"="-mmx,-sse,+soft-float" }

define void @do_div(ptr %xptr, ptr %yptr, ptr %rptr) #0 {
  %x = load i128, ptr %xptr
  %y = load i128, ptr %yptr
  %res = udiv i128 %x, %y
  store i128 %res, ptr %rptr
 ret void
}
```

Generates:

```asm
do_div: # @do_div
        push    rsi
        sub     rsp, 64
        mov rsi, r8
        mov     rax, qword ptr [rcx]
        mov     rcx, qword ptr [rcx + 8]
        mov     r8, qword ptr [rdx]
        mov     rdx, qword ptr [rdx + 8]
        mov     qword ptr [rsp + 56], rcx
        mov qword ptr [rsp + 48], rax
        mov     qword ptr [rsp + 32], r8
 mov     qword ptr [rsp + 40], rdx
        lea     rcx, [rsp + 48]
 lea     rdx, [rsp + 32]
        call    __udivti3
        mov     qword ptr [rsi], rax
        mov     qword ptr [rsi + 8], rdx
        add     rsp, 64
        pop     rsi
        ret
```

Link: https://llvm.godbolt.org/z/bcao4bdj1

In `do_div`, LLVM seems to expect `__udivti3` to takes its arguments indirectly but return in a register pair `(rax, rdx)`. This doesn't seem correct; nothing in the Windows calling convention suggests that values larger than 64 bits are ever returned in registers. Instead, `i128` should be returned in a stack slot if sse is not available.

`i128` is usually returned in xmm0, and the default is to both pass and return `i128` in registers, so this seems like it may just be fallback behavior.

There is more at https://github.com/rust-lang/compiler-builtins/issues/758, specifically this comment https://github.com/rust-lang/compiler-builtins/issues/758#issuecomment-2667130322.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVkFv4zYT_TX0ZWCDoWzZOvgQx58_LJCedtEeF5Q4krihRJUzcuL--oKUvXHiZIsCNQQIJN88vjecoaWJbNMjbsVqJ1b7mR659WHLTfBE2WpWenPafmsRau-cf7Z9I7J7IdOTy-lx7tgJea-Zgy1HRgKhMgki24NY70AoxTo0yPMaNY8BSSglsr1Qat51L0I9zIlQqAehduRrntfOaxZKgVjvp60M1rZHOHprQCyl8d-NPQq1GTiAUKuXgYNQD3Aent4OQxoWZ1HrnZD3kKKSQue1AXunNlcRie-MOn2KOl2hQjSd7WE09phwiSaCIzChiH3An2spC28lynsIyMlkdD15v-R4ysP_scegGen2EDTFMzhnJruPbq9SFQVMv2GkNr4D2atZGkuYZocoK19erXX-mNDqAcLm3XyK0cnon88-mMnQaheqF7HafwSuPgSDUDvYfBKyuY0wn9GbD-jNL-nfYmlI2FUewdFx9fIu5kP8cnPB6_f4T_fI1CUmZfWX2KW8YM01v0N9ndUbQfL-FWLeQ6b9X8kq7Vx8f_8eq5ht9s9G7L9xbV9P4caINubT-hv8ALcVG5Bv--PR9k-x-FvmIfWIOgh1iPfTovGm9I4XPjRCHf4S6lBW2i9L8-Nuiv3Sg8gv_ZLLKOPx8fffgBA7AvaALwNWHEGvGcplXGH9hASWCXRoxg57JrC9sQErdicoR45yx9CD7UFDwMYSY4BB2wBpr825idIpFSKXC_jWWgLjkXqh1pxkQOVD5BTZDnrPre2byMgtwh-2N_6Z0iHG6cr3R-zZ-h5obBokJuBWMxy1G5HAxRs5xKke8iWUk3gEPGI4i0UTyS9iaQFfemLUJpVRLtNtmEug1o_OQIlvwjQQ6-oJyHkGWwMRgqWoGvRRW6dLh4ufV9iFyxKMNGrnTm_IXrounYfuTTJrsNaj4whnD6XnFgZNlNbPib4mvTIRWcgDx9xOB-vsE4Jl6PQJfozE0UitnSuj-hJbfbQ-nJV-azEkG128yjW_q7PGcjuWi8p3Qh3CSDx3uo_VVvlusA7DvBytY9uTUAdLNMb_gMN6le43GrCyta2S-aSv8l0spf9ukywNz7Rzlefru0xmSi1mZpuZIiv0DLd366woVKaybNZudaHXy6WUZb4qlnm2qtZFfbeURb4xmK_lema3SqqVVHeFlFKqYoFFXVeZyYoyy3VRSLGU2GnrFqkJfWhmScT2Tq3XKps5XaKj9PGhVI_PkFbj98FqPwvbGDQvx4bEUjpLTK80bNnh9tGWMWMEtQ8_e-DZcutHhq9f_3epztuq8FPfpCqdjcFtf5Hm9IEzveZD8D9iC14l9-zluFV_BwAA__9i2Msc">