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

时间:2015-04-25 04:03:35

标签: c++ assembly clang inline avx

我正在尝试解决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单个浮动移动到堆栈上,然后加载该空间):

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

提前致谢。

1 个答案:

答案 0 :(得分:4)

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

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