]> git.ipfire.org Git - thirdparty/gcc.git/commit
i386: return 256/512-bit vectors in registers for x86_64 MS ABI [PR89597]
authoroltolm <oleg.tolmatcev@gmail.com>
Tue, 19 May 2026 17:34:42 +0000 (19:34 +0200)
committerJonathan Yong <10walls@gmail.com>
Wed, 27 May 2026 13:16:06 +0000 (13:16 +0000)
commitae4efe523b80321fd885412fbc98e2102abc6178
tree4e3a8836c8225e1ad76d35e5b65ca169dccd97c9
parent8af2e8e49d6e5d33c01c2beaead4933bc286974c
i386: return 256/512-bit vectors in registers for x86_64 MS ABI [PR89597]

On x86_64 Windows targets using MS ABI, GCC classified 256-bit and
512-bit vector returns as memory returns.  That caused hidden sret
pointer returns where YMM0/ZMM0 returns are expected.

Teach MS ABI return classification to keep 32-byte and 64-byte vector
returns in registers when AVX/AVX512F is enabled, matching the return
register selection path.

Also extend function_value_ms_64 so 32-byte and 64-byte eligible vector
returns are mapped to the SSE register class (YMM0/ZMM0 lanes).

Add tests for x86_64-*-mingw* that verify 256-bit and 512-bit vector
returns use YMM0/ZMM0 codegen.

gcc:

PR target/89597
* config/i386/i386.cc (function_value_ms_64): Handle 32-byte and
64-byte vector returns in registers when supported.
(ix86_return_in_memory): Do not force 32-byte/64-byte eligible
vector returns to memory for MS ABI.

gcc/testsuite:

* gcc.target/i386/pr89597-1.c: New test.
* gcc.target/i386/pr89597-2.c: New test.

Signed-off-by: Oleg Tolmatcev <oleg.tolmatcev@gmail.com>
Signed-off-by: Jonathan Yong <10walls@gmail.com>
gcc/config/i386/i386.cc
gcc/testsuite/gcc.target/i386/pr89597-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr89597-2.c [new file with mode: 0644]