Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 解压缩位字段(与movmskb相反)_Assembly_Bit Manipulation_Sse_Sse2 - Fatal编程技术网

Assembly 解压缩位字段(与movmskb相反)

Assembly 解压缩位字段(与movmskb相反),assembly,bit-manipulation,sse,sse2,Assembly,Bit Manipulation,Sse,Sse2,MOVMSKB在将字节字段打包为位方面做得非常好。 然而,我想做相反的事情。 我有一个16位的位字段,我想把它放入XMM寄存器。 每位1字节字段。 最好是一个设置位设置每个字节字段的MSB 0x80,但我可以使用一个设置位在字节字段中生成0xFF结果 我在上看到了以下选项: 但是,此代码仅适用于MMX寄存器,不能用于XMM寄存器,因为pshufw不允许这样做 我知道我可以使用PSHUFB,但是那是SSSE3,我希望有SSE2代码,因为它需要在任何AMD64系统上工作 有没有办法做到这一点是纯粹的

MOVMSKB在将字节字段打包为位方面做得非常好。 然而,我想做相反的事情。 我有一个16位的位字段,我想把它放入XMM寄存器。 每位1字节字段。 最好是一个设置位设置每个字节字段的MSB 0x80,但我可以使用一个设置位在字节字段中生成0xFF结果

我在上看到了以下选项:

但是,此代码仅适用于MMX寄存器,不能用于XMM寄存器,因为pshufw不允许这样做

我知道我可以使用PSHUFB,但是那是SSSE3,我希望有SSE2代码,因为它需要在任何AMD64系统上工作

有没有办法做到这一点是纯粹的SSE2代码? 请不要使用内部函数,只需使用纯intel x64代码即可

幸运的是pshufd是SSE2,您只需再次将其解压缩。我认为这应该是可行的:

movd xmm0, eax
punpcklbw xmm0, xmm0
punpcklbw xmm0, xmm0
pshufd xmm0, xmm0, 0x50
pand xmm0, [mask]
pcmpeqb xmm0, [mask]
约翰说:

如果你是从一个单词开始,第一个解包会给你一个dword,让你可以像这样缩短它:

movd xmm0, eax
punpcklbw xmm0, xmm0
pshufd xmm0, xmm0, 0x00
pand xmm0, [mask]
pcmpeqb xmm0, [mask]
但是,此代码不应该工作。示例:假设输入为0x00FF字,即我们希望设置低8字节

punpcklbw xmm0, xmm0    ; 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF
pshufd xmm0, xmm0, 0x00 ; 00 00 FF FF 00 00 FF FF 00 00 FF FF 00 00 FF FF
pand xmm0, [mask]       ; 00 00 02 01 00 00 02 01 00 00 02 01 00 00 02 01
pcmpeqb xmm0, [mask]    ; 00 00 FF FF 00 00 FF FF 00 00 FF FF 00 00 FF FF
这是错误的结果,因为我们想要00 00 00 00 FF FF FF FF FF FF。当然,它确实会给您8个设置字节,而不是对应于位的8。

幸运的是,pshufd是SSE2,您只需要再次解包。我认为这应该是可行的:

movd xmm0, eax
punpcklbw xmm0, xmm0
punpcklbw xmm0, xmm0
pshufd xmm0, xmm0, 0x50
pand xmm0, [mask]
pcmpeqb xmm0, [mask]
约翰说:

如果你是从一个单词开始,第一个解包会给你一个dword,让你可以像这样缩短它:

movd xmm0, eax
punpcklbw xmm0, xmm0
pshufd xmm0, xmm0, 0x00
pand xmm0, [mask]
pcmpeqb xmm0, [mask]
但是,此代码不应该工作。示例:假设输入为0x00FF字,即我们希望设置低8字节

punpcklbw xmm0, xmm0    ; 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF
pshufd xmm0, xmm0, 0x00 ; 00 00 FF FF 00 00 FF FF 00 00 FF FF 00 00 FF FF
pand xmm0, [mask]       ; 00 00 02 01 00 00 02 01 00 00 02 01 00 00 02 01
pcmpeqb xmm0, [mask]    ; 00 00 FF FF 00 00 FF FF 00 00 FF FF 00 00 FF FF

这是错误的结果,因为我们想要00 00 00 00 FF FF FF FF FF FF。当然,它会给你8个设置字节,但不是对应于位的8。

是的,它可以用SHUFPS短接,但我不确定整数和浮点sse指令的混合是否不会引起惩罚。我模模糊糊地回忆起在SSE指令中生成非规范化单体的惩罚。不,你的SHUFPS版本是错误的。SHUFPS也像PSHUFD一样洗牌DWORD,所以需要额外的解包。我从一个单词开始,所以第一次解包给我一个dword。@Johan请参阅更新。你不同意吗?另外,SHUFPS的意义是什么,它与PSHUFD的作用完全相同,因此您可以离开PSHUFD.Bummer,忽略了这一点,但是短版本可能仍然有用,如果您能够处理位的混合,完全同意SHUFPS的无用性。它确实给了你一个结果,你可以用它来处理,代价是额外的复杂性。是的,它可以用SHUFPS来缩短,但我不确定整数和浮点sse指令的混合是否不会引起惩罚。我模模糊糊地回忆起在SSE指令中生成非规范化单体的惩罚。不,你的SHUFPS版本是错误的。SHUFPS也像PSHUFD一样洗牌DWORD,所以需要额外的解包。我从一个单词开始,所以第一次解包给我一个dword。@Johan请参阅更新。你不同意吗?另外,SHUFPS的意义是什么,它与PSHUFD的作用完全相同,因此您可以离开PSHUFD.Bummer,忽略了这一点,但是短版本可能仍然有用,如果您能够处理位的混合,完全同意SHUFPS的无用性。它确实给了你一个结果,你可以用它来咳嗽,但代价是额外的复杂性。对于那些对SSSE3和AVX2的32位解决方案有兴趣的人来说,SSSE3只是一个简单的SHUFB。对于那些对SSSE3和AVX2的32位解决方案有兴趣的人来说,它的本质是。@Zboson,SSSE3只是一个简单的SHUFB。对于那些对SSSE3和AVX2的32位解决方案有兴趣的人来说,@Zboson,SSSE3只是一个简单的SHUFB。