Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(7) - 混洗指令 & 解组合指令

SSE Shuffle and Unpack Instructions

SSE的混洗指令与解组合指令混洗shuffle或交错interleave单精度浮点操作数,并将结果保存到目标操作数。

指令

描述

SHUFPS

格式:xmm1, xmm3/m128, imm8

按照imm8的指示,从xmm1与xmm2/m128中选取单精度浮点数据元素,把选取结果保存到xmm1。源操作数与目的操作数可以是同一个寄存器。

 

指令操作:

  1. 定义一个选择函数Select4()

Select4(SRC, control) {
CASE (control[1:0]) OF
    0: TMP ßSRC[31:0];
    1: TMP ßSRC[63:32];
    2: TMP ßSRC[95:64];
    3: TMP ßSRC[127:96];
ESAC;
RETURN TMP
}

  1. SHFPS的操作

imm8的第0~1两个比特位决定选取源操作数的第几个数据元素并放置到目标操作数的第1个数据元素位置;第2~3两个比特位决定选取源操作数的第几个数据元素并放置到第2个数据元素位置,以此类推,一直枚举完imm8的最高第6~7比特位。参看下面的操作伪代码。这个操作相当于按imm8的指示,重新洗牌了源操作数中的数据元素顺序,结果保存在目标操作数中。

 

DEST[31:0] ßSelect4(SRC1[127:0], imm8[1:0]);
DEST[63:32] ßSelect4(SRC1[127:0], imm8[3:2]);
DEST[95:64] ßSelect4(SRC2[127:0], imm8[5:4]);
DEST[127:96] ßSelect4(SRC2[127:0], imm8[7:6]);

 

Intel C/C++ Compiler Intrinsic Equivalent
SHUFPS __m128 _mm_shuffle_ps (__m128 a, __m128 b, const int select);

 

UNPCKHPS

格式:UNPCKHPS xmm1, xmm2/m128

从xmm1与xmm2/m128中选取高两个单精度浮点数据元素,放置到目标寄存器xmm1中。

 

指令操作:

DEST[31:0] ßSRC1[95:64](xmm1第三个数据元素)
DEST[63:32] ßSRC2[95:64](xmm2第三个数据元素)
DEST[95:64] ßSRC1[127:96](xmm1第四个数据元素)
DEST[127:96] ßSRC2[127:96](xmm2第四个数据元素)

 

 

UNPCKLPS

格式:UNPCKLPS xmm1, xmm2/m128

从xmm1与xmm2/m128中选取低两个单精度浮点数据元素,放置到目标寄存器xmm1中。

 

指令操作:

DEST[31:0] ßSRC1[31:0] (xmm1的第一个数据元素)
DEST[63:32] ßSRC2[31:0] (xmm2的第一个数据元素)
DEST[95:64] ßSRC1[63:32] (xmm1的第二个数据元素)
DEST[127:96] ßSRC2[63:32] (xmm2的第二个数据元素)

 

 

Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(7) - 混洗指令 & 解组合指令

 

Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(7) - 混洗指令 & 解组合指令