为什么要需要FPU和MMX/SSE?
提供了SIMD环境(single instruction multi data),即单指令多数据。
内嵌浮点运算单元,64及128位寄存器等。甚至sin/cos等数学函数也囊括其中,
著名的xvid项目就是使用gcc编译后使用MMX/SSE优化汇编的典型案例。
转载请注明原创:http://www.cppblog.com/jinglexy,现在使用博客:http://blog.youkuaiyun.com/jinglexy
msn and mail: jinglexy at yahoo dot com dot cn 上海体育馆2007.4.18
FPU: 8个80位浮点寄存器(数据),16位状态寄存器,16位控制寄存器,16为标识寄存器。
使用FPU指令对这些寄存器进行操作,这些寄存器构成一个循环栈,st7栈底,st0栈顶,
当一个值被压入时,被存入st0,原来st0中的值被存入st7
MMX: 将8个FPU寄存器重命名为8个64位MMX寄存器,即mm0到mm7。
57条MMX指令,加快了整形浮点运算,但是对于复杂浮点运算无帮助
SSE: 8个128位寄存器(从xmm0到xmm7),MXSCR寄存器,EFLAGS寄存器,专有指令(复杂浮点运算)
SSE2: 寄存器和SSE相同,增加了5种数据类型(都是128位),专有指令
SSE3: 仅增加了几个新的指令
由于MMX使用的寄存器影射到FPU寄存器上,所以MMX指令执行前,需要保存FPU堆栈。
示例1,FPU寄存器及指令使用(下面所有程序都使用at&t风格汇编):
data1:
.byte 0x34, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
data2:
.byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.section .text
.globl _start
_start:
nop
fbld data1 压入st0
fimul data2 st0中的值和data2相乘,保存在st0中
fbstp data1 st0弹出到内存44
示例2, SSE寄存器及指令使用
.lcomm data 16
value1:
.float 12.34, 2345.543, -3493.2, 0.44901
value2:
.float -54439.234, 23231.4, 1.0098, 0.000003
.section .text
.globl _start
_start:
movups value1, %xmm0
movups value2, %xmm1
movups %xmm0, %xmm2
movups %xmm0, data
提供了SIMD环境(single instruction multi data),即单指令多数据。
内嵌浮点运算单元,64及128位寄存器等。甚至sin/cos等数学函数也囊括其中,
著名的xvid项目就是使用gcc编译后使用MMX/SSE优化汇编的典型案例。
转载请注明原创:http://www.cppblog.com/jinglexy,现在使用博客:http://blog.youkuaiyun.com/jinglexy
msn and mail: jinglexy at yahoo dot com dot cn 上海体育馆2007.4.18
FPU: 8个80位浮点寄存器(数据),16位状态寄存器,16位控制寄存器,16为标识寄存器。
使用FPU指令对这些寄存器进行操作,这些寄存器构成一个循环栈,st7栈底,st0栈顶,
当一个值被压入时,被存入st0,原来st0中的值被存入st7
MMX: 将8个FPU寄存器重命名为8个64位MMX寄存器,即mm0到mm7。
57条MMX指令,加快了整形浮点运算,但是对于复杂浮点运算无帮助
SSE: 8个128位寄存器(从xmm0到xmm7),MXSCR寄存器,EFLAGS寄存器,专有指令(复杂浮点运算)
SSE2: 寄存器和SSE相同,增加了5种数据类型(都是128位),专有指令
SSE3: 仅增加了几个新的指令
由于MMX使用的寄存器影射到FPU寄存器上,所以MMX指令执行前,需要保存FPU堆栈。
示例1,FPU寄存器及指令使用(下面所有程序都使用at&t风格汇编):
data1:
.byte 0x34, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
data2:
.byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
.section .text
.globl _start
_start:
nop
fbld data1 压入st0
fimul data2 st0中的值和data2相乘,保存在st0中
fbstp data1 st0弹出到内存44
示例2, SSE寄存器及指令使用
.lcomm data 16
value1:
.float 12.34, 2345.543, -3493.2, 0.44901
value2:
.float -54439.234, 23231.4, 1.0098, 0.000003
.section .text
.globl _start
_start:
movups value1, %xmm0
movups value2, %xmm1
movups %xmm0, %xmm2
movups %xmm0, data