c ++内联函数在GCC内联汇编中包装单个vmovups

c++ inline function wrapping single vmovups in GCC inline assembly

我正在尝试解决 clang 编译器中的一个明显错误,该错误使用 AVX 内在函数 _mm256_loadu_ps 会导致在汇编中输出不必要的指令。特别是,它首先对输入向量的前半部分执行 vmovups 并将其放入 xmm 寄存器,然后使用 vinsertf128 指令将后半部分与前半部分连接起来,这会稍微减慢程序速度。相反,我希望对编译器分配的 ymm 寄存器有一条 vmovups 指令。

我一直对 SSE/AVX 内在函数感到满意,但一旦我需要下降到内联汇编,我就迷路了。

我想要一个与以下功能相同的内联函数,但 vmovups 应该在内联汇编中。

inline __mm256 V8fLoadU(const float* pf)
{
    return _mm256_loadu_ps(pf);
}

这是我到目前为止尝试过的方法,但它不起作用(似乎将 *pf 单个浮点数移动到堆栈上,然后加载 space):

inline __mm256 V8fLoadU(const float* pf)
{
    __m256 m;
    __asm__("vmovups %1, %0" : "=x" (m) : "xm" (pf));
    return m;
}

提前致谢。

通过将指针作为输入参数传递,您加载的是指针的值而不是它指向的内容。您需要传递要加载的值。

__m256 V8fLoadU(const float* pf)
{
    __m256 m;
    __asm__("vmovups %1, %0" : "=x" (m) : "m" (*pf));
    return m;
}