内在向量元素类型(如 epi64x 或 pi32)的名称和含义是什么?
What are the names and meanings of the intrinsic vector element types, like epi64x or pi32?
intel intrinsic functions 的名称中内置了向量的子类型。例如,_mm_set1_ps
是 ps
,也就是 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
其他问题:
- 我错过了什么吗?
epiX
和piX
有什么区别?
- 为什么
pi64
不存在?
epi64
和epi64x
有什么区别?
** 我找到了 this,但在 C/++ 中似乎没有表示半精度(复数)值的标准方法。如果这有任何变化,请纠正我。
缺失的版本至少是si128和si64,用于位运算,[e]pu{8,16,32,64}
用于无符号运算
epi 和 pi 的不同之处在于 e
可能意味着 extended; epi 寄存器目标是 128 位 xmm 寄存器,而 pi 目标是 64 位 mmx 寄存器。
pi64不存在,因为原来的mmx指令集被限制为32位元素; si64 仍然可用。
使用 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 的压缩整数。
intel intrinsic functions 的名称中内置了向量的子类型。例如,_mm_set1_ps
是 ps
,也就是 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 |
其他问题:
- 我错过了什么吗?
epiX
和piX
有什么区别?- 为什么
pi64
不存在? epi64
和epi64x
有什么区别?
** 我找到了 this,但在 C/++ 中似乎没有表示半精度(复数)值的标准方法。如果这有任何变化,请纠正我。
缺失的版本至少是si128和si64,用于位运算,
[e]pu{8,16,32,64}
用于无符号运算epi 和 pi 的不同之处在于
e
可能意味着 extended; epi 寄存器目标是 128 位 xmm 寄存器,而 pi 目标是 64 位 mmx 寄存器。pi64不存在,因为原来的mmx指令集被限制为32位元素; si64 仍然可用。
使用 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 的压缩整数。