VPSLLVD、VPSRAVD 指令如何工作?

问题描述 投票:0回答:1

正在学习MASM32,正在学习各种换档指令

我能理解标准的班次指令,如 SHL、SHR 等。

但我不清楚一些复杂的移位指令,如VPSLLVD、VPSRAVD等。

我的示例调试信息在 Visual Studio(小端)中如下所示。

我的考试项目是 x86.

vpsllvd ymm5, ymm0, ymm1    ; logical shift left
    ; YMM0 = 000011C8000000E9-FFFFDC80FFFE9BB8-0000116400000001-000204E30003672C 
    ; YMM1 = 000008AE00000384-0000005700000064-000000050000000A-00001E8100000BB8 
    ; YMM5 = 0000000000000000-0000000000000000-00022C8000000400-0000000000000000 

vpsravd ymm6, ymm0, ymm1    ; arimethic shift right
    ; YMM0 = 000011C8000000E9-FFFFDC80FFFE9BB8-0000116400000001-000204E30003672C 
    ; YMM1 = 000008AE00000384-0000005700000064-000000050000000A-00001E8100000BB8 
    ; YMM6 = 0000000000000000-FFFFFFFFFFFFFFFF-0000008B00000000-0000000000000000 


我找到了这些的移位算法,我试图理解这些移位指令的结果,但我还不能理解。

VPSLLVD (VEX.256 version) 

COUNT_0 := SRC2[31 : 0];
    (* Repeat Each COUNT_i for the 2nd through 7th dwords of SRC2*)
COUNT_7 := SRC2[255 : 224];
IF COUNT_0 < 32 THEN
DEST[31:0] := ZeroExtend(SRC1[31:0] << COUNT_0);
ELSE
DEST[31:0] := 0;
    (* Repeat shift operation for 2nd through 7th dwords *)
IF COUNT_7 < 32 THEN
DEST[255:224] := ZeroExtend(SRC1[255:224] << COUNT_7);
ELSE
DEST[255:224] := 0;
DEST[MAXVL-1:256] := 0;
VPSRAVD (VEX.256 version) 

COUNT_0 := SRC2[31 : 0];
    (* Repeat Each COUNT_i for the 2nd through 8th dwords of SRC2*)
COUNT_7 := SRC2[255 : 224];
DEST[31:0] := SignExtend(SRC1[31:0] >> COUNT_0);
    (* Repeat shift operation for 2nd through 7th dwords *)
DEST[255:224] := SignExtend(SRC1[255:224] >> COUNT_7);
DEST[MAXVL-1:256] := 0;

你能解释一下这些移位指令如何与我的示例调试信息一起工作吗?

谢谢。

x86 simd bit-shift avx2 masm32
1个回答
1
投票

第二个操作数的每个双字移位由第三个操作数的相应双字指定的量。它与您已经熟悉的简单移位指令相同。

在您的第一个示例中,大多数移位量都大于 32,因此这些双字中的结果为零。让我们看一下具有合理值的第三个块:

ymm0 = 00001164 00000001

转移:

ymm1 = 00000005 0000000A

所以结果是

(00001164 << 5) (00000001 << A) = 00022C80 00000400

对于右移,第一个块中的输入为正,因此它们变为零,第二个块为负,因此由于算术移位被签名,因此变为 -1 (

FFFFFFFF
)。第三块的结果是
(00001164 >> 5) (00000001 >> A) = 0000008B 00000000
.

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.