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

    <tr>
        <th>Summary</th>
        <td>
            [x86] Could use `cqo` for sign-extending to 128 bits
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:X86,
            missed-optimization
      </td>
    </tr>

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

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

<pre>
    Instead of sign-extending to 128 bits with a combination of `movsx` and `sar`, do a combination of `movsx` and `cqo`, like GCC does:

https://godbolt.org/z/xKb3jfKq7
```c++
#include <cstdint>

// clang-format off
using u8   = uint8_t;     using i8   = int8_t;
using u16 = uint16_t;    using i16  = int16_t;
using u32  = uint32_t;    using i32  = int32_t;
using u64  = uint64_t;    using i64  = int64_t;
using u128 = __uint128_t; using i128 = __int128_t;
// clang-format on

auto i8_to_i128(i8 x) -> i128 { return x; }
auto i16_to_i128(i16 x) -> i128 { return x; }
auto i32_to_i128(i32 x) -> i128 { return x; }
auto i64_to_i128(i64 x) -> i128 { return x; }
```

LLVM assembly:
```asm
i8_to_i128(signed char):
        movsxd  rax, edi
 sar     dil, 7
        movsx   rdx, dil
 ret

i16_to_i128(short):
        movsxd  rax, edi
        mov     ecx, eax
        shr     ecx, 15
        movsx   rdx, cx
 ret

i32_to_i128(int):
        movsxd  rax, edi
        mov     ecx, eax
        sar     ecx, 31
        movsxd  rdx, ecx
 ret

i64_to_i128(long):
        mov     rax, rdi
        mov     rdx, rdi
        sar     rdx, 63
        ret
```

GCC assembly:
```asm
"i8_to_i128(signed char)":
        movsx   rax, dil
 cqo
        ret
"i16_to_i128(short)":
        movsx   rax, di
 cqo
        ret
"i32_to_i128(int)":
        movsx   rax, edi
 cqo
        ret
"i64_to_i128(long)":
        mov     rax, rdi
 cqo
        ret
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyslkGPozgThn-NuZTSMmUw5MAhnUw-ferZ62pvkcEm8TTgHmx6mfn1KwMJSZbO9EgbISHy1lN-XS5jhLX62CiVkfiZxLtAdO5k2uylVuJVN0Fu5I_s_411SkgwJfjgleqdaqRujuAMhJhCrp2Fv7U7gYDC1LluhNOm8QDhtDbvtiecgmikf7aiJZwS3II0nwKK72YCKv2q4H9bTypL2IZQf52cexuecE9wfzQyN5V7Mu2R4P4nwX3_krNv5cv3xIdzOl4FwWd_0Q1Bppui6qQCwraFdVI3jrAvY_IxKRSVaI6r0rS1cGDKktBNZ30JuhQACNtBpxuXHhxhz-B_o6rP6kWcwZBfuJBfwIkL-YWbxBlkOI_I8J48q7M4kzyaSR7dk2d1Fq_MYjpoh8PgF6eZnt1e1Cvxo-I1Y2FF5wzo9ODMwfMEU51CT3ANK8K-TDmTZ2iV69oGej8cSXYX0pdlRkP-O6wvzMwy_B3Wl2ZmefQ59tJ34-S_fv3zDxDWqjqvfkyNfI4QtiZ0c1OZYY9KKE6iJbge42H6DbtFArSi91tESe1FK9pBlbry_yb3AAC0cgB8BN14y6O128Lak2ndJ8ecxeGuilEU_ZVoT-21GMYfGyv6W1-3i9b8p67EjSsWLmUdXal7Wzf9UJnmuORruE--2kVfU_pb8exrEjm70iYHt33l340P24ogPuosxIWSztanXvEv5H8ZQfygc36Z81HKpUX_RUL1OOPiei2kXFiyxZTn-gYyY3LN1iJQWZjEGNMk4jQ4ZTmjPInyJGGRwDWPFBZpXJYlLWVOuQgDnSH14WEUxiyJ6FMiQyVoyJI1F4JKJBFVtdDVU1W91_5gC7S1ncrCKOUxBpXIVWWHExwxF8WraiRhm79S7ueFW4JYa2uVXJk3p2v9czhsvRbvgjbzSVd5d7QkopW2zs7DOO2q4dOgTzmJd7A1XSWhs2o-lqE07YPPgqBrq-zugNbu1OVPhakJ7v1Q02311ppvqnAE98P0LMH9NMP3DP8JAAD__wQwbdY">