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

标签 c++ assembly clang inline avx

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

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

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

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

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

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;
}

关于c++内联函数在GCC内联汇编中包装单个vmovups,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29860866/

相关文章:

android - 如果我尝试使用 arm 数学汇编程序命令而不是 c,我会获得性能奖励吗

c++ - 在Eclipse IDE中运行C/C++ clang-format 插件需要做哪些设置?

c++ - SDL 2.0 按键重复和延迟

c++ - CreateWindowEx WS_POPUP 为什么要打边框?

c++ - BeagleBone -> HTML -> C++ 通信

c - GCC:禁止使用某些寄存器

c - .byte 在这个 asm 行中是什么意思?

linux - clang 可以在 Linux 上运行吗

c++ - 如何强制 clang 使用系统(ubuntu)STL header 而不是 clang 检查语义

c++ - 通过接受关闭在另一个线程中使用的套接字的风险是什么?