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

What are the names and meanings of the intrinsic vector element types, like epi64x or pi32?

intel intrinsic functions 的名称中内置了向量的子类型。例如,_mm_set1_psps,也就是 packed single-precision。一个float。尽管它们中的大多数的含义很清楚,但它们的“全名”如 packed single-precision 从功能描述中并不总是很清楚。我创建了以下 table。不幸的是,一些条目丢失了。它们的价值是什么? table.

下方的其他问题
abbreviation full name C/++ equivalent
ps packed single-precision float
ph packed half-precision None**
pd packed double-precision double
pch packed half-precision complex None**
pi8 ??? int8_t
pi16 ??? int16_t
pi32 ??? int32_t
epi8 ??? int8_t
epi16 ??? int16_t
epi32 ??? int32_t
epi64 ??? int64_t
epi64x ??? int64_t

其他问题:

  1. 我错过了什么吗?
  2. epiXpiX有什么区别?
  3. 为什么 pi64 不存在?
  4. epi64epi64x有什么区别?

** 我找到了 this,但在 C/++ 中似乎没有表示半精度(复数)值的标准方法。如果这有任何变化,请纠正我。

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

  2. epi 和 pi 的不同之处在于 e 可能意味着 extended; epi 寄存器目标是 128 位 xmm 寄存器,而 pi 目标是 64 位 mmx 寄存器。

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

  4. 使用 epi64x 而不是 epi64 的主要论点与 C 中缺少函数重载有关。需要为 __m128i _mm_set1_epi64(__m64) 提供 set/conversion 方法从 MMX 到 XMM 以及 __m128i _mm_set1_epi64x(int64_t) 使用整数。此外,在其他情况下,64x 后缀似乎是为需要 64 位架构的模式保留的,例如 movq 寄存器和 [=15 的低半部分之间=],它可以被多条指令模拟,对于像 __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 的压缩整数。