<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/60625>60625</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
c++: converting uint32_t xvalue to rvalue reference to float does not work in this:
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
imzhuli
</td>
</tr>
</table>
<pre>
Please take a look at the following code, which tends to break float into uint parts for transfer, (not for calculation, so endian is not considered) , and to build it back.
The MergeFloat_Wrongly does not generate expected result as MergeFloat does:
inline void SplitFloat32(bool &sign_bit, uint &exponent, uint &mantissa, const float value)
{
float copy = value;
uint32_t *p = (uint32_t *)©
sign_bit = (*p & 0x80000000) != 0;
exponent = (*p & 0x7F800000) >> 23;
mantissa = (*p & 0x007FFFFF);
}
float MergeFloat(const bool sign_bit, const uint exponent, const uint mantissa)
{
// this works:
uint32_t Temp = uint32_t((sign_bit ? 0x80000000 : 0) | (exponent << 23) | mantissa);
return (float&)Temp;
}
float MergeFloat_Wrongly(const bool sign_bit, const uint exponent, const uint mantissa)
{
// THIS DOES NOT WORK, the compiler directly convert uint32 xvalue to float, which is expected to be loaded directly
auto f = (float&&)(uint32_t((sign_bit ? 0x80000000 : 0) | (exponent << 23) | mantissa));
return f;
}
///////// THE ASM IN MEMORY ////////
0x100003080 <+0>: pushq %rbp
0x100003081 <+1>: movq %rsp, %rbp
0x100003084 <+4>: movb %dil, %al
0x100003087 <+7>: andb $0x1, %al
0x100003089 <+9>: movb %al, -0x1(%rbp)
0x10000308c <+12>: movl %esi, -0x8(%rbp)
0x10000308f <+15>: movl %edx, -0xc(%rbp)
0x100003092 <+18>: movzbl -0x1(%rbp), %eax
0x100003096 <+22>: shll $0x1f, %eax
0x100003099 <+25>: movl -0x8(%rbp), %ecx
0x10000309c <+28>: shll $0x17, %ecx
0x10000309f <+31>: orl %ecx, %eax
0x1000030a1 <+33>: movl -0xc(%rbp), %ecx
0x1000030a4 <+36>: orl %ecx, %eax
-> 0x1000030a6 <+38>: cvtsi2ss %rax, %xmm0
0x1000030ab <+43>: movss %xmm0, -0x14(%rbp)
it seems it did a normal direct conversion from uint32(eax)->64(rax)->double(xmm0) with cvtsi2ss
Environment:
Apple clang version 14.0.0 (clang-1400.0.29.202)
Target: x86_64-apple-darwin22.2.0
(btw: g++ seems to have same issue)
I hope it's my understanding of c++ grammar that went wrong.
Anyway, thanks for any possible reply
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0V01v2zgQ_TX0ZRCDpmxZOvjgNDFaLNIsmgDFngJKGlvcUKRK0l_99QtKpCU3abeHXSNwFGrem5k35HDCrRU7hbgii1uyuJvwvau1WYnme72XYlLo6rz6UyK3CI6_InCQWr8Cd-BqhK2WUh-F2kGpKyTsAxxrUdbgUFUWnIbCIH-FrdTcgVBOw14oBy03zsJWG3CGK7tF46GEZUq7brnkstxL7oRW_o3VgKoSXIGw4G1Krayo0GBFWA7ehKuq87cXsgLhoODl65TQO0LX_fdzjfCAZocbH8zLV6PVTp6h0thT7lCh4Q4BTy2WDiswaPfSAbcjXGdPkvWYWSgpFMJBiwqeWilcZ5kwwrJCawmEpV7jl0I4H2mnAGEpnlqtUF2tNVw5YS33az5HF6Q7cLlHwvLgdnnbPwBAMCh1ewaS3AXLZGTguRP24vnXbWdDWDZe9Lws9QxXuOEpRh_BPRFLgZ4y2n_6Msy8AR1YYorvAJebbAAm9yS5B5Zc-Y9avAOmdLnxHx95hJDl3bgovSxD4QjLekG7kozr0S93FRiXZLQ8VGUoQJCHsA1hG3C1sHDU5nXYG1fSP2PTSx9XunyykbCbkZhAkjX0yiy7YzHS8QNJPnilwstxaBfxDLq9UR647VNPCct9CL8rVjwd_7VoV5o9f_z0BHeP90_w-fEZvj5--cMz-K5S6qYVEg1UwmDp5NnzHtC4IB-cul3uz3tIMPYdYYfj67sBgtS8wurCNNSG7z08bq5BqLQ7Dtn_WahxrQBiubY_q06v17s_8PzxHtZPD_DpMzzcPzx--Qt-an3xR08zH3xCM9rFyW5pdwLX0O5t_Q2AsIUp2vcAswCYBQA0-vANeoRt-yb-M-w8YOcjbNFjKyEDlsv3oMsAXUYoV1UPndPT7EfogMsDLn_rkncebzp4FoKOO_XaeRlzZoGl0Qff1BdoReDI_o1jGzkWY44uEKxOgaV8h-VCkbNIkQ0U3wv5NoVeDeSndwLJ08DCYjK2ljLouP01NIrJfsjhTf6BpTy9ySFKybKx91jH5Rvklf-oYRI3nzYSgobl6Zex87hvk-RN7OUvY79iiTs4SX8rght_qY3gUfskZl8enBXM2u7Q8Ehwahr6o3K8iIdnlIC1cLEPe3n-dguFGcWBRWysH40qUQEHpU3DZWiMocFaoRVsjW5Co_UdzceV-1RST24uf1Z6X0gkLOv953AUrr6kNPZ9rw7CaNX4OyLejuu2lQil5GoH0fFsPqVT6ttot34zm1M6pVOWTxlll3yeudmhJ4JTlr6k8xvuqW4qbo5CMTZlUxrbZla4ozfcEXZL2G1QwGmo-QHB8gZBWDserLrvT1DrFsFfdEsLzRn2qkJjHVeVn3T1FspAuDO8abgBV3MHR9_3j_7inIbhYK3OR37ubzWuXvuJl6sztNpaUUgEg608T6pVUuVJzie4mqXLRZ4s5nk2qVecLpblYpljmuZllZcZLfMiXfL5olqkVVZNxIpRllBGc5on2Syb5rPFNs2WdF4gXWCyJHOKDRdyKuWhmWqzm3QJr1KassVE8gKl7SZ_xhQeoxrM_yNgVh5zU-x3lsypFNbZgcUJJ3EVZOi2cn9Be30uQ89wS5v-yeAWDapyuLmH8dsPTyBUN0mRZD3ZG7mqnWu7gaq7wHbC1ftiWuqGsI2PJPy6aY3-G0tH2KaL3xK26fL7JwAA___mzp6b">