如何强制 GCC 在 xmm/ymm 寄存器中将 128 位/256 位结构作为函数参数传递



如何强制GCC在xmm/ymm寄存器中传递128位/256位结构作为函数参数?即。如果我的结构体是 256 位宽(下面的无符号长长结构体)

(我知道如果我使用内部函数来制作打包整数,gcc 足够聪明,可以将其放入 %ymm 寄存器中,但我可以用结构体做到这一点吗?

typedef struct {
   unsigned long long ull1;
   unsigned long long ull2;
   unsigned long long ull3;
   unsigned long long ull4;
} UnsignedLongLongStruct;
void func1( UnsignedLongLongStruct unsignedLongLongStruct ) {
....
}

TL;DR:似乎调用约定明确提到了要放置在 um regs 中的__m256和朋友。

在 X86-64 System V ABI 第 3.2.3 点中,可以检查参数的传递方式。我的解读是,只有__m256参数才会变成一个SSE和3个SSEUP 8字节块,这允许它们在ymm寄存器中传递。

这将使你的参数在内存中传递,这就是我们在 clang、gcc 和 icc 中看到的: 在 godbolt 上测试程序

为了将其作为寄存器传递,正如我阅读调用约定时,似乎您必须将其作为__m256(或其变体)传递。

调用约定在不同的平台和编译器中有点混乱。您应该按值将输入作为__m256传递给函数。

如果它是一个微不足道的函数,并且你想确保 GCC 内联它,你可以使用 always_inline 属性声明它以避免任何不必要的加载/存储:

inline __attribute__((always_inline)) __m256 foo(__m256 const input);

最新更新