当为 x64 编译时,以下函数使用 XMM0 寄存器进行参数传递:
void foo (double const scalar)
{
__m256d vector = _mm256_broadcast_sd(&scalar);
}
在汇编中,vbroadcastsd
操作码可以采用寄存器操作数。等效的内在函数似乎只接受指向内存操作数的指针。有没有办法保证编译器会优化这样的负载以避免存储到内存?
我认为没有人可以保证它,但假设您至少启用了一些优化,如果任何现代编译器没有删除不必要的指针间接,我会非常失望......我当然看到了编译器有更复杂的问题想出了如何简化。
我认为您没有查看生成的代码来确定它的作用(因为您的问题的措辞会有所不同)。
如果您担心堆栈上的参数传递,那么您的函数可能太短或太重要而最终被称为单独的函数。采用
__forceinline
使用 Visual C++ 或
__attribute__((always_inline))
与 g++。