首页 > 解决方案 > 如何在函数中返回寄存器 YMM0/1 中的两个 256 位 YMM 值(不涉及内存)

问题描述

我的目标是在不使用内存的情况下返回一个 4x4 浮点矩阵作为函数的返回值。正如“x86 调用约定”的 Wiki 文章 https://en.wikipedia.org/wiki/X86_calling_conventions#System_V_AMD64_ABI所指出的,可以从使用 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

有没有办法强制 gccMat4在 YMM0 和 YMM1 中返回整个结构?

标签: gccassemblyx86-64avxcalling-convention

解决方案


推荐阅读