我正在尝试解决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;
}
提前致谢。
答案 0 :(得分:4)
通过将指针作为输入参数传递,您将加载指针的值而不是它指向的值。您需要传递要加载的值。
__m256 V8fLoadU(const float* pf)
{
__m256 m;
__asm__("vmovups %1, %0" : "=x" (m) : "m" (*pf));
return m;
}