内在向量元素类型(如 epi64x 或 pi32)的名称和含义是什么?

Bro*_*her 5 sse intel intrinsics sse2 mmx

英特尔内在函数的名称中内置了向量的子类型。例如,_mm_set1_ps是 a ps,即packed single-precisionaka。A float。尽管它们中的大多数的含义是明确的,但它们的“全名”packed single-precision从功能描述中并不总是清晰的。我创建了下表。不幸的是,有些条目丢失了。它们有何价值?其他问题见表下方。

缩写 全名 C/++ 等效项
附注 压缩单精度 漂浮
酸碱度 压缩半精度 没有任何**
PD 压缩双精度 双倍的
个人电脑 压缩半精度复数 没有任何**
pi8 ??? int8_t
PI16 ??? int16_t
pi32 ??? int32_t
Epi8 ??? int8_t
表观16 ??? int16_t
表观32 ??? int32_t
表观64 ??? int64_t
外延64x ??? int64_t

附加问题:

  1. 我有错过任何吗?
  2. epiX和 和有什么区别piX
  3. 为什么不pi64存在?
  4. epi64和 和有什么区别epi64x

** 我发现了这个,但似乎没有标准方法来表示 C/++ 中的半精度(复数)值。如果这有任何改变,请纠正我。

Aki*_*nen 9

  1. 缺少的版本至少是 si128 和 si64,用于按位运算和[e]pu{8,16,32,64}无符号运算。

  2. epi 和 pi 的不同之处可能在于扩展的e含义;epi寄存器目标是128位xmm寄存器,而pi目标是64位mmx寄存器。

  3. pi64不存在,因为原始的mmx指令集仅限于32位元素;si64 仍然可用。

  4. 使用 epi64x 而不是 epi64 的主要论点与 C 中缺乏函数重载有关。需要提供__m128i _mm_set1_epi64(__m64)从 MMX 移动到 XMM 以及处理__m128i _mm_set1_epi64x(int64_t)整数的设置/转换方法。此外,在其余情况下,64x后缀似乎是为需要 64 位架构的模式保留的,例如在movq寄存器和 的下半部分之间__m128i,可以通过多条指令来模拟,以及类似的东西__int64 _mm_cvtsd_si64x (__m128d a),它将转换为双精度到 64 位寄存器目标(不是直接到内存)。

我推测,“si64”和“si128”表示宽度为 64/128_ 的标量整数,请注意存在_mm_add_si64(这不是原始的 SSE 内在函数,而是 SSE2 内在函数扩展原始 MMX 指令集并使用 MMX 寄存器) 。是si64,不是pi64,因为只涉及一个与整个寄存器大小相同的元素。

最后,piN 表示针对 MMX (__m64) 的元素大小为 N 的压缩整数,epiN 表示针对 XMM (__m128i) 的元素大小为 N 的压缩整数。