MOVMSKB操作有什么用?

时间:2019-05-16 07:45:25

标签: assembly x86 intel sse instruction-set

我想问var ints = new int[] { 2, 4, 1, 10, 3, 7 }; var x = ints .Where(c => c / 3 > 0) <-- (1) .Select(s2 => s2 + ints .Where(c => c / 3 == 0) <-- (2) .Aggregate((f, s) => f - s)) .Sum(); 操作有什么用?

我尝试查找文档,但是找不到相关信息。

1 个答案:

答案 0 :(得分:1)

paper you're reading在下一句话中确切描述了其作用:

  

此指令创建一个16位   屏蔽16个有符号或无符号的最高有效位   寄存器中的8位整数,将[目标地址]的高位清零

这完全是{em> pmovmskb在XMM寄存器上所做的事情,因此很明显,这就是他们在谈论的指令。他们有意或无意地从助记符中删除了p(用于压缩整数)。

它们的工作方式图(不正确)用vpmovmskb reg, ymm1标记。使用YMM源,vpmovmskb生成32位掩码。

(尽管如果输入的YMM寄存器是通过VMM编码的指令(如vpxor xmm1, xmm2, xmm3通过XMM低位写入的,那么高16个字节将全部为零,因此它们将得到它们描述的结果出于不同的原因。)


其用例包括诸如strlenmemchr之类的搜索循环(其中lzcnt / tzcnt对于找到匹配或不匹配元素的元素非常有用) )。

或为pshufb掩码的查找表创建索引,例如用于左包装,或者作为将IPv4点分四进制字符串解析为整数的一部分。 Fastest way to get IPv4 address from string