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

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

本文关键字:常量 非常 函数 为什么 英特尔      更新时间:2023-10-16

英特尔的内在指南似乎正在用直接值进行神秘的区分。他们给一些贴上常量标签,有些贴上常量标签。在实际操作中这两种类型无论需要编译时常量还是编译器都会抱怨。我只是想知道为什么会有这种区别?我错过了什么?

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

_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内部函数使用const:__m256i _mm256_srli_si256 ( __m256i a, const int imm)。 这基本上证实了他们只是还没有想到const,因为他们开始使用const进行相同的指令。

另请注意,他们对psrldq指令的_mm_srli_si128名称非常不满意,以至于他们为其引入了一个新名称:_mm_bsrli_si128应该在新代码中首选,以使其更清楚地表明它是一个字节移位,而不是 128 位宽的位移。 这与_mm_srli_epi64有很大不同. 不幸的是,说明参考手册没有提到bsrli名称。


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

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