_mm_set1_ps和_mm_set_ps1有什么区别?

4
这些函数有什么区别吗?如果没有,为什么?
__m128 __mm_set1_ps(float a)
__m128 __mm_set_ps1(float a)

这两个描述在Intel Intrinsics Guide网站上完全相同。

非常感谢。
1个回答

7

这两者没有任何区别。_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一起)。

我之所以了解这个问题,是因为我最近在寻找一个严格别名安全的广播加载内在函数,就像你在汇编中使用vpbroadcastd一样。(没有一个便携式的方法可以在任何地方高效编译;编译器对内在函数的支持是一堆脑残的悲观和缺失的内在函数,当你试图做任何复杂的事情时。也许再过几年,_mm_loadu_si32(void*)将被广泛支持,以实现零扩展。)/ 结束离题怒斥。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接