PUNPCKLBW
来源:百度文库 编辑:神马文学网 时间:2024/10/04 19:22:56
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) - 如果在启用对齐检查的情况下进行未对齐的内存引用。
数值异常
无。
扩展低位压缩数据
操作码
指令
说明
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]
DEST[55..48]
DEST[47..40]
DEST[39..32]
DEST[31..24]
DEST[23..16]
DEST[15..8]
DEST[7..0]
PUNPCKLWD instruction with 64-bit operands:
DEST[63..48]
DEST[47..32]
DEST[31..16]
DEST[15..0]
PUNPCKLDQ instruction with 64-bit operands:
DEST[63..32]
DEST[31..0]
PUNPCKLBW instruction with 128-bit operands:
DEST[7-0]
DEST[15-8]
DEST[23-16]
DEST[31-24]
DEST[39-32]
DEST[47-40]
DEST[55-48]
DEST[63-56]
DEST[71-64]
DEST[79-72]
DEST[87-80]
DEST[95-88]
DEST[103-96]
DEST[111-104]
DEST[119-112]
DEST[127-120]
PUNPCKLWD instruction with 128-bit operands:
DEST[15-0]
DEST[31-16]
DEST[47-32]
DEST[63-48]
DEST[79-64]
DEST[95-80]
DEST[111-96]
DEST[127-112]
PUNPCKLDQ instruction with 128-bit operands:
DEST[31-0]
DEST[63-32]
DEST[95-64]
DEST[127-96]
PUNPCKLQDQ
DEST[63-0]
DEST[127-64]
英特尔(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) - 如果在启用对齐检查的情况下进行未对齐的内存引用。
数值异常
无。