这些函数有什么区别吗?如果没有,为什么?
__m128 __mm_set1_ps(float a)
__m128 __mm_set_ps1(float a)
这两个描述在Intel Intrinsics Guide网站上完全相同。
非常感谢。__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一起)。
我之所以了解这个问题,是因为我最近在寻找一个严格别名安全的广播加载内在函数,就像你在汇编中使用vpbroadcastd
一样。(没有一个便携式的方法可以在任何地方高效编译;编译器对内在函数的支持是一堆脑残的悲观和缺失的内在函数,当你试图做任何复杂的事情时。也许再过几年,_mm_loadu_si32(void*)
将被广泛支持,以实现零扩展。)/ 结束离题怒斥。