Gcc 如何在函数中返回寄存器YMM0/1中的两个256位YMM值(不涉及内存)

Gcc 如何在函数中返回寄存器YMM0/1中的两个256位YMM值(不涉及内存),gcc,assembly,x86-64,avx,calling-convention,Gcc,Assembly,X86 64,Avx,Calling Convention,我的目标是在不使用内存的情况下返回4x4浮点矩阵作为函数的返回值。 正如“x86调用约定”的Wiki文章所指出的 可以使用XMM0和XMM1从函数返回最多两个浮点值 我试过这个: struct Mat4 // just a simple struct for testing { __m256 m0, m1; }; Mat4 Foo(__m256 m0, __m256 m1, __m256 m2, __m256 m3) { return {m1, m2}; } 但gcc给我的结

我的目标是在不使用内存的情况下返回4x4浮点矩阵作为函数的返回值。 正如“x86调用约定”的Wiki文章所指出的 可以使用XMM0和XMM1从函数返回最多两个浮点值

我试过这个:

struct Mat4 // just a simple struct for testing
{
    __m256 m0, m1;
};

Mat4 Foo(__m256 m0, __m256 m1, __m256 m2, __m256 m3)
{
    return {m1, m2};
}
但gcc给我的结果是:

mov     %rdi,%rax
vmovaps %ymm1,(%rdi)
vmovaps %ymm2,0x20(%rdi)
retq 
我期待着这样的事情:

vmovaps %ymm1, %ymm0
vmovaps %ymm2, %ymm1
retq

有没有办法强迫gcc只在YMM0和YMM1中返回整个结构体
Mat4

x86-64 ABI只处理SSE2,因为所有64位CPU都支持SSE2。并非所有设备都有AVX,因此该协议不使用
ymm
寄存器。请注意,在内联过程中,编译器不受ABI限制,因此您的代码可能仍然有效。对于此类详细信息,您确实希望阅读,而不仅仅是Wikipedia(过度)简化的摘要。特别是第3.2.3节:如果对象的大小大于四个八字节,或者包含未对齐的字段,则它具有类内存“。你的对象是8个八字节,所以它总是会在内存中返回。@Jester好的,但是,似乎使用x86-64 ABI的gcc完全可以在YMM regs中传递256位参数,因此我认为在YMM regs中返回大于128位的值也是一样的…@Jester:您正在查看x86-64 SysV ABI的旧版本吗?当前版本为1.0。它已经为AVX(2009年)和AVX512(2015年)以及MPX之类的东西进行了更新。x86-64 ABI只处理SSE2,因为所有64位CPU都支持SSE2。并非所有设备都有AVX,因此该协议不使用
ymm
寄存器。请注意,在内联过程中,编译器不受ABI限制,因此您的代码可能仍然有效。对于此类详细信息,您确实希望阅读,而不仅仅是Wikipedia(过度)简化的摘要。特别是第3.2.3节:如果对象的大小大于四个八字节,或者包含未对齐的字段,则它具有类内存“。你的对象是8个八字节,所以它总是会在内存中返回。@Jester好的,但是,似乎使用x86-64 ABI的gcc完全可以在YMM regs中传递256位参数,因此我认为在YMM regs中返回大于128位的值也是一样的…@Jester:您正在查看x86-64 SysV ABI的旧版本吗?当前版本为1.0。它已经为AVX(2009年)和AVX512(2015年)以及MPX之类的东西进行了更新。措辞和澄清。