高级特性:
SIMD single instruction multiple data
单指令多数据
SIMD扩展 Streaming SIMD Extension (SSE)
流化扩展第二实现 SSE2
第三 SSE3
MMX 对整数执行SIMD操作
64位打包字节,字,双字整数,
MMx 0-7 映射到FPU寄存器R0-7
使用FSAVE,FXSAVE指令将FPU寄存器保存到内存中,防止和浮点指令混淆。
SSE主要对浮点数执行SIMD操作。128位打包的单精度浮点数据。
8个128位寄存器XMM0-7
SSE2 128位打包整型,浮点型。
SSE3 在SSE2基础上添加了更多指令。
CPUID指令检测是否支持SIMD
EDX 23(位) 支持MMX
EDX 25 支持SSE
EDX 26 SSE2
ECX 0 SSE3
使用MMX指令
步骤:
从整数值创建打包整数值。
把打包整数值加载到MMX寄存器中。
对打包整数值执行MMX数学操作。
从MMX寄存器获得结果,存放到内存位置中。
.section .data
packedvalue1:
.byte 10 , 20 , -30 , 40 , 50 , 60 , -70 , 80
packedvalue2:
.short 10 , 20 , 30 , 40
packedvalue3:
.int 10 , 20
.section .text
.globl _start
_start:
movq packedvalue1 , %mm0
movq packedvalue2 , %mm1
movq packedvalue3 , %mm2
movq可以把数据从mmx寄存器传送到64位内存中。
处理溢出:
环绕运算 溢出截断
带符号饱和运算
无符号饱和运算 溢出取最大 最小值
PADDB 使用环绕的打包字节整数加法
PADDW
PADDD
PADDSB 使用带符号饱和的打包字节整数加法
PADDSW
PADDUSB
PADDUSW
PSUBB
....
PSUBUSW
PADDSB source , destination
PADDSB %mm1 , %mm0
MMX乘法
PMULL 把每对打包字整数相乘,把结果的低16位存放在目标寄存器。
PMULH 把高16位存放到目标寄存器中
无符号:
PMULLUW PMULLHUW
MMX逻辑和移位指令
PAND
PANDN 对目标操作数执行非(NOT)操作,然后对源和目的操作数执行逻辑与操作。
POR
PXOR
PSLL 逻辑左移,用0填充
PSRA 逻辑右移,0填充
MMX比较指令
PCMPEQB 比较打包字节整数值的相等性
PCMPEQW
PCMPEQD
PCMPGTB
PCMPGTW
PCMPGTD
满足条件各位全设为1,否则全部位0
SSE指令
movaps 把4个对准的单精度浮点型传送到XMM或者内存
movups 不对准
movss
AT&T学习笔记汇编之高级特性
原文:http://blog.csdn.net/u011185633/article/details/44858735