為什么要需要FPU和MMX/SSE?
提供了SIMD環境(single instruction multi data),即單指令多數據。
內嵌浮點運算單元,64及128位寄存器等。甚至sin/cos等數學函數也囊括其中,
著名的xvid項目就是使用gcc編譯后使用MMX/SSE優化匯編的典型案例。
轉載請注明原創:http://www.shnenglu.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.shnenglu.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