Why does GCC store XMM registers into RAM then load them back instead of using them directly?
Liu Hao
ltpmouse@gmail.com
Tue May 2 07:01:00 GMT 2017
On 2017/5/2 14:41, Marc Glisse wrote:
> _mm_set_sd is not a NOP, it sets the upper part of the SSE register to
> 0, which is done with movq in recent versions but through the stack on
> older versions. In order to optimize that away, the compiler needs to
> know that the upper part of the registers is ignored (it isn't ignored
> by max, it is _mm_cvtsd_f64 afterwards that drops anything that depended
> on it). But the maxsd operation is largely opaque to the compiler for
> now (modeled in an unnaturally complicated way), so it does not notice
> it. Clang does a better job there... Feel free to file a bug report at
> https://gcc.gnu.org/bugzilla/ if you don't already see a similar one in
> the database.
>
Someone reported it: <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70708>
And GCC7 indeed produces better code, despite the fact that it could
have been even better: <https://godbolt.org/g/uBhRDN>
```assembly
my_fmax_1(double, double):
movq xmm1, xmm1
movq xmm0, xmm0
maxsd xmm0, xmm1
ret
my_fmax_2(double, double):
maxsd %xmm1, %xmm0
ret
```
Thank you all the same for the information. I am now keeping an eye on
PR70721.
--
Best regards,
ltpmouse
More information about the Gcc-help
mailing list