整数 shuffle

in place shuffle

PSHUFB (with 64 bit operands)

PSHUFB mm1, mm2/m64

 

for i = 0 to 7 {
if (SRC[(i * 8)+7] = 1 ) then
DEST[(i*8)+7...(i*8)+0] ← 0;
else
index[2..0] ← SRC[(i*8)+2 .. (i*8)+0];
DEST[(i*8)+7...(i*8)+0] ← DEST[(index*8+7)..(index*8+0)];
endif;

}

解释:每个src 寄存器是64bit=8byte, 每个byte的最高位存放是否shuffle, 如果是1,则dest对应byte 置零。

否则,该byte的低3byte对应了相应的移动位置。

128bit

for i = 0 to 15 {
if (SRC[(i * 8)+7] = 1 ) then
DEST[(i*8)+7..(i*8)+0] ← 0;
else
index[3..0] ← SRC[(i*8)+3 .. (i*8)+0];
DEST[(i*8)+7..(i*8)+0] ← DEST[(index*8+7)..(index*8+0)];
endif

}

类似,只是index变成了低四位。


2.  PSHUFD—Shuffle Packed Doublewords

PSHUFD xmm1, xmm2/m128, imm8

DEST[31:0]  (SRC >> (ORDER[1:0] * 32))[31:0];
DEST[63:32]  (SRC >> (ORDER[3:2] * 32))[31:0];
DEST[95:64]  (SRC >> (ORDER[5:4] * 32))[31:0];
DEST[127:96]  (SRC >> (ORDER[7:6] * 32))[31:0];
DEST[VLMAX-1:128] (Unmodified)

128bit

共 128/32=4 个位置,所以order需2bit, 

每个double word 需要 2bit

共需:4*2=8bit


3.PSHUFHW—Shuffle Packed High Words

PSHUFHW xmm1, xmm2/ m128, imm8

DEST[63:0]  SRC[63:0]
DEST[79:64]  (SRC >> (imm[1:0] *16))[79:64]
DEST[95:80]  (SRC >> (imm[3:2] * 16))[79:64]
DEST[111:96]  (SRC >> (imm[5:4] * 16))[79:64]
DEST[127:112]  (SRC >> (imm[7:6] * 16))[79:64]
DEST[VLMAX-1:128] (Unmodified)

低64bit 不变

高64bit 共 64/16=4 word

进行相应的shuffle


4.PSHUFLW—Shuffle Packed Low Words

类似于 PSHUFHW

5. PSHUFW—Shuffle Packed Words

PSHUFW mm1, mm2/m64, imm8




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值