1

intel 内部函数的名称中包含向量的子类型。例如,_mm_set1_ps是一个ps,这是一个packed single-precision又名。一个float。尽管它们中的大多数含义很清楚,但它们的“全名”之类packed single-precision的功能描述并不总是很清楚。我创建了下表。不幸的是,有些条目丢失了。它们的价值是什么?表格下方的其他问题。

缩写 全名 C/++ 等价物
ps 打包单精度 漂浮
酸碱度 压缩半精度 没有任何**
PD 压缩双精度 双倍的
pch 压缩半精度复数 没有任何**
pi8 ??? int8_t
pi16 ??? int16_t
pi32 ??? int32_t
外延8 ??? int8_t
外延16 ??? int16_t
外延32 ??? int32_t
外延64 ??? int64_t
外延64x ??? int64_t

附加问题:

  1. 我错过了吗?
  2. epiX和 和有什么不一样piX
  3. 为什么不pi64存在?
  4. epi64和 和有什么不一样epi64x

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

4

1 回答 1

4
  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 的压缩整数。

于 2022-01-30T04:54:43.510 回答