SSE 是流化 SIMD 扩展的简称( Streaming SIMD Extension, SSE)。SSE 用于处理打包数据的 8 个 128 位 XMM 寄存器 (名为XMM0到XMM7)。SSE2 (Pentium 4 中引入)技术提供 4 种额外的打包带符号整数数据类型:
SSE 平台提供附加的指令,用于对 SSE 寄存器中的打包数据值执行并行的数学操作。这使处理器可以使用相同的时钟周期处理多得多的信息。
传送 SSE 整数
MOVDQA 和 MOVDQU 指令用于把 128 位数据传送到 XMM 寄存器中,或者在 XMM 寄存器之间传送数据。助记符的 A 和 U 分别代表对准和不对准,它们表示数据是如何存储在内存中的。如果对准 16 个字节边界的数据,就使用 A 选项;否则,就使用 U 选项。
MOVDQA 和 MOVDQU 的指令格式如下:movdqa source, destination 其中 source 和 destination 可以是 SSE 128 位寄存器或者 128 位的内存位置 (注意: 不能在两个内存位置之间传送数据)。当使用对准的数据时,SSE 指令执行得更快。另外,如果程序对未对准的数据使用 MOVDQA 指令,就会造成硬件异常。
下面程序演示把 128 位数据传送到 SSE 寄存器中:
.section .data
values1:
.int 1, -1, 0, 135246
values2:
.quad 1, -1
.section .text
.global _start
_start:
nop
movdqu values1, %xmm0
movdqu values2, %xmm1
movl $1, %eax
movl $0, %ebx
int $0x80 在 GDB 中观察 xmm0 和 xmm1 寄存器:(gdb) print $xmm0
$1 = {v4_float = {1.40129846e-45, -nan(0x7fffff), 0, 1.89520012e-40},
v2_double = {-nan(0xfffff00000001), 2.8699144274488922e-309}, v16_int8 = {1,
0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, 78, 16, 2, 0}, v8_int16 = {1, 0, -1,
-1, 0, 0, 4174, 2}, v4_int32 = {1, -1, 0, 135246}, v2_int64 = {
-4294967295, 580877146914816},
uint128 = 0x0002104e00000000ffffffff00000001}
(gdb) print $xmm1
$2 = {v4_float = {1.40129846e-45, 0, -nan(0x7fffff), -nan(0x7fffff)},
v2_double = {4.9406564584124654e-324, -nan(0xfffffffffffff)}, v16_int8 = {1,
0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1}, v8_int16 = {1, 0, 0,
0, -1, -1, -1, -1}, v4_int32 = {1, 0, -1, -1}, v2_int64 = {1, -1},
uint128 = 0xffffffffffffffff0000000000000001} |