Как вернуть два 256-битных значения YMM в регистр YMM0 / 1 в функции (без памяти) - PullRequest
1 голос
/ 13 февраля 2020

Моя цель - вернуть матрицу 4x4 с плавающей запятой в качестве возвращаемого значения функции без использования памяти. Как указано в статье Wiki «Соглашения о вызовах x86» 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};
}

Но g cc дает мне это в результате:

mov     %rdi,%rax
vmovaps %ymm1,(%rdi)
vmovaps %ymm2,0x20(%rdi)
retq 

Я ожидал что-то вроде этого:

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

Есть ли Можно ли заставить g cc вернуть всю структуру Mat4 всего за YMM0 и YMM1?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...