_mm_set1_ps 和 _mm_set_ps1 有什么区别?

What is the difference between _mm_set1_ps and _mm_set_ps1?

这些功能有什么区别吗?如果不是,为什么?

__m128 __mm_set1_ps(float a)
__m128 __mm_set_ps1(float a)

Intel Intrinsics Guide 网站上的两种描述相同。 谢谢。

差异为零。 _mm_set1_ps 是地道的,使用它。

例如clang 的 xmmintrin.h 根据 set1_ps:

定义 set_ps1
static __inline__ __m128 __DEFAULT_FN_ATTRS
_mm_set_ps1(float __w)
{
    return _mm_set1_ps(__w);
}

历史猜测

我的猜测是英特尔在 SSE1 的早期还没有确定命名方案,并在以后切换到 _mm_set1_ 类型。但如果他们已经记录在案 _mm_set_ps1,他们将无法收回。

注意没有_mm_set_epi321_mm_set_ep81(幸好)!因此 _mm_set1_ps 是惯用的并且遵循与其他广播内在函数相同的模式,而 _mm_set_ps1 是不寻常的并且会让人类读者感到惊讶。但是,有 _mm_set_pd1_mm_load_pd1,并且大概是同时引入的(与 SSE2)。

我只知道它是因为前几天我在寻找一个可以执行严格别名安全广播负载的内在函数时偶然发现了它,就像在 asm 中使用 vpbroadcastd 一样。 (没有一个可以在任何地方高效编译的可移植的;编译器对内在函数的支持是脑残的悲观主义和当你尝试做任何复杂的事情时缺少内在函数的混合体。也许再过几年 _mm_loadu_si32(void*) 到零扩展将会至少得到广泛支持..)/结束话题咆哮。