Assembly 什么是SSE2程序集与Intrinsic的等价物?

Assembly 什么是SSE2程序集与Intrinsic的等价物?,assembly,sse,simd,intrinsics,sse2,Assembly,Sse,Simd,Intrinsics,Sse2,我正在使用Fasm(汇编),我正在寻找与这些本质指令等价的SSE2汇编指令: _mm_set1_epi8 _mm_cmpeq_epi8 _mm_movemask_epi8 我在哪里可以得到它们(网站,pdf…?请使用,但请注意,某些Intrinisic不映射到单个指令,例如。对于大多数内部指令,尽管描述中列出了相应的机器指令 您还可以使用非常有用的工具查看给定内部函数的生成代码,例如..而不是在内部函数文档中乱搞,首先查看英特尔的asm文档。或仅对指令条目进行HTML摘录,不包括简介和附录。e

我正在使用Fasm(汇编),我正在寻找与这些本质指令等价的SSE2汇编指令:

_mm_set1_epi8
_mm_cmpeq_epi8
_mm_movemask_epi8
我在哪里可以得到它们(网站,pdf…?

请使用,但请注意,某些Intrinisic不映射到单个指令,例如。对于大多数内部指令,尽管描述中列出了相应的机器指令


您还可以使用非常有用的工具查看给定内部函数的生成代码,例如..

而不是在内部函数文档中乱搞,首先查看英特尔的asm文档。或仅对指令条目进行HTML摘录,不包括简介和附录。e、 g

(Intel的asm手册条目在条目底部列出了该指令的内部函数。由于AVX512是主PDF的一部分,这些列表非常混乱,但如果您已经猜到了内部函数将使用什么指令并进行了查找,您仍然可以从另一个方向检查猜测/内存。 或者如果您搜索完整的PDF版本,您会找到内部名称,查找直接映射到一条指令的内部函数,如
\u mm\u cmpeq\u epi8
,而不是
set1

它比其内部文档更好/更详细(例如,操作部分始终存在,并且通常更具体)。此外,它还显示了操作数的顺序。这通常与内在的匹配,但我似乎记得有一个例子,它没有匹配,可能是一次洗牌。当然还有
vfmad132ps
vs.
vfmad213ps
vs.
vfmad231ps
,它们的不同之处在于加数或被乘数中的哪一个是目标,哪一个可以是内存

它还显示了哪个操作数可以是内存。例如,它并不总是最后一个操作数(因为最后一个操作数是以立即数字节编码的,而不是像非VEX版本那样隐式的xmm0)。另外,
pmovzxbd xmm1、dword[rdi]
和其他文件作为一个窄负载是有用的(它不需要对齐,因为它小于16个字节),但是从只提供
\uum128i
源代码的内部函数中,您永远不会知道这一点。使用
\u mm\u cvtsi32\u si128(int a)
后,编译器无法始终优化到内存操作数

这里的非凸形式是
PBLENDVB xmm1,xmm2/m128,
,隐式使用XMM0作为混合控制向量。内部函数也隐藏了这一点,因此如果您试图编写
pblendvb xmm1、xmm8、xmm7
,就会出现令人困惑的错误

还有一章介绍SIMD,其中有一些非常好的数据移动指令表,可用于不同类型的任务

有关更多链接,请参见


我发现asm助记符更容易记住;它们比较短,并且在命名上有一些奇怪的区别,比如shuffle和permute(大多数情况下,直到AVX…)。更重要的是,我倾向于从asm的角度考虑,然后编写内部函数,以使编译器能够高效编译

CPU延迟/吞吐量/执行端口信息都是助记符信息,而不是内在的(Agner Fog的表和),因此您必须知道这些名称才能了解真正低级别的性能细节,并检查编译器是否能很好地处理您的代码,查看
perf record
/
perf report
评测结果,也许可以找出为什么某个地方会出现热点

英特尔在其《intrinsics指南》中有吞吐量/延迟数字,但没有执行端口,因此您无法知道两条
throughtput=1
指令是否可以在同一周期内运行,因此它不是很有用。

另请参阅。对于每个内在函数,将列出汇编指令。