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