[Bug target/91841] vector_size(8) passes MMX register without emms cleanup
ubizjak at gmail dot com
gcc-bugzilla@gcc.gnu.org
Fri Sep 20 13:45:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91841
Uroš Bizjak <ubizjak at gmail dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |RESOLVED
Resolution|--- |INVALID
--- Comment #1 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Matthias Kretz from comment #0)
> Test case `g++ -O2 -m32` (cf. https://godbolt.org/z/RDUZo9):
>
> #include <iostream>
>
> using T = unsigned short;
> using V [[gnu::vector_size(8)]] = T;
>
> [[gnu::noinline]] V f(V x) { return x; }
>
> int main() {
> volatile float a = 1.f;
> auto x = f(~V{});
> asm("" :: "X"(x));
> std::cout << a + 2.f;
> }
>
> The V parameter is passed via mm0 which leads to 1.f+2.f becoming -nan.
>
> If GCC cannot reliably insert emms, it should not (never!) transparently
> emit MMX code. Nowhere in this code did I ask for MMX... I understand that
> this would be an ABI break. But at least clang does not implement this ABI
> either.
Clang is wrong here. Please see [1], section 2.2.3, Parameter Passing and
Returning Values.
> Why is this relevant?
Because of [1]. GCC implements published ABI.
[1] https://www.uclibc.org/docs/psABI-i386.pdf
More information about the Gcc-bugs
mailing list