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

Why do some of Intel's intrinsics take const immediates, while others are non-const?

Intel's intrinsic guide 似乎在与直接值进行神秘的区分。他们将一些标记为常量,而另一些则不是常量。实际上,这两种类型都需要是编译时常量,否则编译器会报错。我只是想知道为什么要区分?我缺少什么?

以下是英特尔所说的示例:

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

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

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

256 位版本的 AVX2 内在函数使用常量:__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 load/store 内在函数将使用 void* 而不是 __m128i*,这是另一个不错的变化。

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