为什么英特尔的一些内在函数采用const immediates,而另一些则是非const?

Tho*_*mas 3 c++ x86 intel intrinsics

英特尔的内在指南似乎与直接价值观有着神秘的区别.他们将一些标记为const而一些不标记为const.在实践中,两种类型无论是编译时间常数还是编译器都会抱怨.我只是想知道为什么这个区别?我错过了什么?

这是英特尔所说的一个例子:

_mm_blend_epi16 (__m128i a, __m128i b, const int imm8)
_mm_srli_si128 (__m128i a, int imm8)
Run Code Online (Sandbox Code Playgroud)

Pet*_*des 5

假设你考虑const改进,那么英特尔的旧东西写得不如他们的新东西.

注意blend_epi16是SSE4.1,而srli_si128SSE2.当他们为SSE4.1添加内在函数时,可能他们决定强调论证需要是编译时常量.

256位版本的AVX2内在函数使用const : __m256i _mm256_srli_si256 ( __m256i a, const int imm). 这基本上证实了他们还没有想到const,因为他们开始使用const相同的指令.

还要注意他们_mm_srli_si128psrldq指令的名称非常不满意,因为他们为它引入了一个新名称:_mm_bsrli_si128在新代码中应该首选,以使它更清晰,它是一个字节移位,而不是一个128位宽的位移.它与众不同_mm_srli_epi64.遗憾的是,指令参考手册没有提到bsrli名称.


AVX512加载/存储内在函数将void*代替使用__m128i*,这是另一个不错的变化.

所以英特尔基本上做的事情不同,因为旧的方式是次优的,不是因为他们必须这样做.