Bro*_*her 5 sse intel intrinsics sse2 mmx
英特尔内在函数的名称中内置了向量的子类型。例如,_mm_set1_ps
是 a ps
,即packed single-precision
aka。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 |
附加问题:
epiX
和 和有什么区别piX
?pi64
存在?epi64
和 和有什么区别epi64x
?** 我发现了这个,但似乎没有标准方法来表示 C/++ 中的半精度(复数)值。如果这有任何改变,请纠正我。
缺少的版本至少是 si128 和 si64,用于按位运算和[e]pu{8,16,32,64}
无符号运算。
epi 和 pi 的不同之处可能在于扩展的e
含义;epi寄存器目标是128位xmm寄存器,而pi目标是64位mmx寄存器。
pi64不存在,因为原始的mmx指令集仅限于32位元素;si64 仍然可用。
使用 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 的压缩整数。
归档时间: |
|
查看次数: |
1178 次 |
最近记录: |