徐柳氮胶囊图片:PUNPCKLBW

来源:百度文库 编辑:中财网 时间:2024/05/10 11:44:02
 

PUNPCKLBW/PUNPCKLWD/PUNPCKLDQ/PUNPCKLQDQ -
扩展低位压缩数据

操作码

指令

说明

0F 60 /r

PUNPCKLBW mm, mm/m32

交叉组合 mmmm/m64 低位双字中的字节,将结果放入 mm

66 0F 60 /r

PUNPCKLBW xmm1, xmm2/m128

交叉组合 xmm1xmm2/m128 低位四字中的字节,将结果放入 xmm1

0F 61 /r

PUNPCKLWD mm, mm/m32

交叉组合 mmmm/m64 低位双字中的字,将结果放入 mm

66 0F 61 /r

PUNPCKLWD xmm1, xmm2/m128

交叉组合 xmm1xmm2/m128 低位四字中的字,将结果放入 xmm1

0F 62 /r

PUNPCKLDQ mm, mm/m32

交叉组合 mmmm/m64 的低位双字,将结果放入 mm

66 0F 62 /r

PUNPCKLDQ xmm1, xmm2/m128

交叉组合 xmm1xmm2/m128 低位四字中的双字,将结果放入 xmm1。

66 0F 6C /r

PUNPCKLQDQ xmm1, xmm2/m128

交叉组合 xmm1xmm2/m128 的低位四字,将结果放入 xmm1 寄存器。

说明

将目标操作数(第一个操作数)与源操作数(第二个操作数)的低位数据元素(字节、字或双字)展开并交叉组合,然后将结果放入目标操作数。(图 3-15 显示 64 位操作数中的字节扩展操作)。忽略高位数据元素。源操作数可以是 MMX™ 技术寄存器或 64 位内存位置,也可以是 XMM 寄存器或 128 位内存位置。目标操作数可以是 MMX 或 XMM 寄存器。如果源数据来自内存操作数,则从内存访问完整 64 位或 128 位操作数,但指令分别只使用高 32 位或 64 位。

图 3-15. PUNPCKLBW 指令操作

PUNPCKLBW 指令交叉组合源操作数与目标操作数的低位字节,PUNPCKLWD 指令交叉组合源操作数与目标操作数的低位字,PUNPCKLDQ 指令交叉组合源操作数与目标操作数的低位双字,PUNPCKLQDQ 指令交叉组合源操作数与目标操作数的低位四字。

如果源操作数为全零,则结果(存储在目标操作数中)包含目标操作数中原始值的低位数据元素的零扩展。例如,使用 PUNPCKLBW 指令时,将对低位字节进行零扩展(即扩展成无符号字);使用 PUNPCKLWD 指令时,则将对低位字进行零扩展(即扩展成无符号双字)。

操作

PUNPCKLBW instruction with 64-bit operands:
DEST[63..56] SRC[31..24];
DEST[55..48] DEST[31..24];
DEST[47..40] SRC[23..16];
DEST[39..32] DEST[23..16];
DEST[31..24] SRC[15..8];
DEST[23..16] DEST[15..8];
DEST[15..8] SRC[7..0];
DEST[7..0] DEST[7..0];

PUNPCKLWD instruction with 64-bit operands:
DEST[63..48] SRC[31..16];
DEST[47..32] DEST[31..16];
DEST[31..16] SRC[15..0];
DEST[15..0] DEST[15..0];

PUNPCKLDQ instruction with 64-bit operands:
DEST[63..32] SRC[31..0];
DEST[31..0] DEST[31..0];

PUNPCKLBW instruction with 128-bit operands:
DEST[7-0] DEST[7-0];
DEST[15-8] SRC[7-0];
DEST[23-16] DEST[15-8];
DEST[31-24] SRC[15-8];
DEST[39-32] DEST[23-16];
DEST[47-40] SRC[23-16];
DEST[55-48] DEST[31-24];
DEST[63-56] SRC[31-24];
DEST[71-64] DEST[39-32];
DEST[79-72] SRC[39-32];
DEST[87-80] DEST[47-40];
DEST[95-88] SRC[47-40];
DEST[103-96] DEST[55-48];
DEST[111-104] SRC[55-48];
DEST[119-112] DEST[63-56];
DEST[127-120] SRC[63-56];

PUNPCKLWD instruction with 128-bit operands:
DEST[15-0] DEST[15-0];
DEST[31-16] SRC[15-0];
DEST[47-32] DEST[31-16];
DEST[63-48] SRC[31-16];
DEST[79-64] DEST[47-32];
DEST[95-80] SRC[47-32];
DEST[111-96] DEST[63-48];
DEST[127-112] SRC[63-48];

PUNPCKLDQ instruction with 128-bit operands:
DEST[31-0] DEST[31-0];
DEST[63-32] SRC[31-0];
DEST[95-64] DEST[63-32];
DEST[127-96] SRC[63-32];
PUNPCKLQDQ
DEST[63-0] DEST[63-0];
DEST[127-64] SRC[63-0];

英特尔(R) C++ 编译器等价内部函数

PUNPCKLBW __m64 _mm_unpacklo_pi8 (__m64 m1, __m64 m2)

PUNPCKLBW __m128i _mm_unpacklo_epi8 (__m128i m1, __m128i m2)

PUNPCKLWD __m64 _mm_unpacklo_pi16 (__m64 m1, __m64 m2)

PUNPCKLWD __m128i _mm_unpacklo_epi16 (__m128i m1, __m128i m2)

PUNPCKLDQ __m64 _mm_unpacklo_pi32 (__m64 m1, __m64 m2)

PUNPCKLDQ __m128i _mm_unpacklo_epi32 (__m128i m1, __m128i m2)

PUNPCKLQDQ __m128i _mm_unpacklo_epi64 (__m128i m1, __m128i m2)

影响的标志

无。

保护模式异常

#GP(0) - 如果内存操作数有效地址超出 CS、DS、ES、FS 或 GS 段限制。

#SS(0) - 如果内存操作数有效地址超出 SS 段限制。

#UD - 如果 CR0 中的 EM 设置为 1。

#NM - 如果 CR0 中的 TS 设置为 1。

#MF - 如果存在未决的 x87 FPU 异常。

#PF(错误代码) - 如果发生页错误。

#AC(0) - 如果启用对齐检查并在当前特权级别为 3 时进行未对齐的内存引用。

实地址模式异常

#GP(0) - 如果操作数的任何部分出现在 0 到 FFFFH 的有效地址空间之外。

#UD - 如果 CR0 中的 EM 设置为 1。

#NM - 如果 CR0 中的 TS 设置为 1。

#MF - 如果存在未决的 x87 FPU 异常。

虚 8086 模式异常

与“实地址模式”中的异常相同

#PF(错误代码) - 页错误。

#AC(0) - 如果在启用对齐检查的情况下进行未对齐的内存引用。

数值异常

无。