PUNPCKLBW

来源:百度文库 编辑:神马文学网 时间:2024/10/04 17:41:30
PUNPCKLBW/PUNPCKLWD/PUNPCKLDQ/PUNPCKLQDQ -
扩展低位压缩数据
操作码
指令
说明
0F 60 /r
PUNPCKLBW mm, mm/m32
交叉组合 mm 与 mm/m64 低位双字中的字节,将结果放入 mm。
66 0F 60 /r
PUNPCKLBW xmm1, xmm2/m128
交叉组合 xmm1 与 xmm2/m128 低位四字中的字节,将结果放入 xmm1。
0F 61 /r
PUNPCKLWD mm, mm/m32
交叉组合 mm 与 mm/m64 低位双字中的字,将结果放入 mm。
66 0F 61 /r
PUNPCKLWD xmm1, xmm2/m128
交叉组合 xmm1 与 xmm2/m128 低位四字中的字,将结果放入 xmm1。
0F 62 /r
PUNPCKLDQ mm, mm/m32
交叉组合 mm 与 mm/m64 的低位双字,将结果放入 mm。
66 0F 62 /r
PUNPCKLDQ xmm1, xmm2/m128
交叉组合 xmm1 与 xmm2/m128 低位四字中的双字,将结果放入 xmm1。
66 0F 6C /r
PUNPCKLQDQ xmm1, xmm2/m128
交叉组合 xmm1 与 xmm2/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) - 如果在启用对齐检查的情况下进行未对齐的内存引用。
数值异常
无。