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

时间:2016-07-14 04:57:06

标签: c++ x86 intel intrinsics

Intel's intrinsic guide似乎正在对立即值进行神秘的区分。他们将一些标记为const而一些不标记为const。在实践中,两种类型无论是编译时间常数还是编译器都会抱怨。我只是想知道为什么这个区别?我错过了什么?

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

_mm_blend_epi16 (__m128i a, __m128i b, const int imm8)
_mm_srli_si128 (__m128i a, int imm8)

1 个答案:

答案 0 :(得分:5)

假设您认为const有所改进,那么英特尔的旧东西写得不如新东西好。

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

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

另请注意,他们对psrldq instruction_mm_srli_si128名称非常不满意,因为他们为其引入了新名称:_mm_bsrli_si128应该在新代码中首选,以使其更清晰它是一个字节移位,而不是128位宽的位移。它与_mm_srli_epi64有很大不同。遗憾的是,指令参考手册未提及bsrli名称。

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

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