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

    <tr>
        <th>Summary</th>
        <td>
            Incorrect codegen for int128 parameters with x64-systemv calling conv
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          T0b1-iOS
      </td>
    </tr>
</table>

<pre>
    ## Description

When compiling C/C++ code that takes an __int128 as its sixth argument, llvm splits it into two 64bit ints that get passed in a register and on the stack. According to the SysV ABI __int128 should be treated like a struct of two 64bit ints and therefore be passed completely in memory in that case.

## Reproduction
[https://godbolt.org/z/o8MMMYdY6](https://godbolt.org/z/o8MMMYdY6)

Input C++:
```cpp
using uint128_t = unsigned __int128;

unsigned long long tmpfn(uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, uint128_t t) {
    return (t >> 64) & 0xFFFFFFFFFFFFFFFF;
}

unsigned long long tmpfn2(uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, uint128_t t) {
    return t & 0xFFFFFFFFFFFFFFFF;
}
```

Output from clang 15:
```assembly
tmpfn:
        mov     rax, qword ptr [rsp + 8]
        ret
tmpfn2:
        mov     rax, r9
        ret
```
        
Output from gcc 12:
```assembly
tmpfn:
        mov     rax, QWORD PTR [rsp+16]
        ret
tmpfn2:
        mov     rax, QWORD PTR [rsp+8]
        ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy1VNtymzAQ_Rp42YkHhAHzwEMcNzN5yKRNOs3kySOEwGoEopLwpV_fFdix6_SS6YURoMvq7Nld6RSq3OUeibDBghumRWeFar1g4QWX4_dxxVtgqumEFG0NVx65xneODWdLDnZFLVj6zA3QFpZL0dqQzIAaENaAEVu7AqrrvuGt9cgVSLluwHTSrQoLaK7AbhQk02IcmhGy5hY6agwvcRIoaF4LY7lGLyWoFo04GEvZ8wQuGVO6dOwcFs4_7MwnuJzfHOmYleplCQXy1ZxaBJXimSOssbpnFlR1TsK5QSzNK6W527gn41IhueVy53g1vFF66A2kGTV8cpq9fW7veadViY6OyY3nK2s740Voc42tVmWhpJ0oXePoK75qdnt7-1Q-JV688Mjs7eYkO6Vw03a9hX3N3P5xLQnGxrpunOmNy2A_JmxpwYsW0LdG1C1GfUikF81PsV_WpcK9w8c2XdUiXQeUTJdDzf-kP5LAYQZeuncK-Ghue90CenAU32HDqg1WJIFge332HAmni7cwJ_-fun071UORTpnf9dYVtNKqASYpEg_j12V1h7Up5G6cHotyMIL906j18Nd066h_2eAtgs5qwMOpTQfujs_c4ftuF0ZxAkp-h6qzn2w_C-6w_jrImjEIyT8J8cPj3f0C3n-834eIEYbJ30b4A9BfZO2Fvs_zMElmcZymZOqXeVRmUUZ9K6zk-U2LkqY5KpMT2RolGGUI9mLWUU0blCBtYCNQXrfJ9MLsUBybNSqQHHSaqXbt91rmZ7KB9n0xQRHDgZPi_e8C9ekzusOhMKbnBjtxFoShv0KWRVWypMrojNO0yGKesipgLCrKKaMV8SUtuDQ5Ru8R0vINDBDYxyz4IicBIWEYJkEQxiSasDQrsohWAU2jsEiYNw14Q4WcOB5Oz3ydD5SKvja4KFH2zXERq-4uLh_cIT7t7Urp_GNQhBfi7sEffOcD929Dsgdc">