in place shuffle
PSHUFB (with 64 bit operands)
PSHUFB mm1, mm2/m64
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
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