使用MMX/SSE汇编指令集优化视频开发
1、匯編指令集
 
目前大部分的PC機采用的都是Intel或者AMD的CPU,其支持的多媒體匯編指令有:
 
2、MMX/SSE2指令集剖析
 
2.1、媒體擴展指令MMX
Intel的MMX指令是Intel IA系列指令的擴展,使用了單指令多數據技術(SIMD),以并行方式處理多個數據元素。MMX擴展指令集新增了57條指令和一種64位的4字數據,作為成組的數據可供MMX指令操作。一個64位數據類型可以包含8個字節、4個字、兩個雙字或者一個4重字類型,這樣一條MMX指令即可以同時處理2/4/8個數據單元。為了適應這樣的數據,MMX增加了8個64位寄存器(MM0~MM7),僅有MMX指令可以按寄存器名稱直接訪問。
MMX針對8~32位數據元素的處理性能進行了改善,一個MMX指令可以處理8個字節,一個時鐘周期內完成兩條指令,即一個時鐘周期可以處理16個字節。此外,MMX技術為其他功能釋放了額外的處理器周期,更小的處理器占用率可以實現更高程度的并發。
一、MMX指令集簡介:
MMX指令集從功能上可以分為8類:數據傳送指令、算術運算指令、比較運算指令、類型轉換指令、擴展壓縮數據指令、邏輯運算指令、移位運算指令、狀態清除指令。指令列表如下:
 
在以上指令中,除了EMMS指令外,都涉及兩個操作數,即源操作數和目標操作數,指令中源操作數在右,目標操作數在左。目標操作數可作為第二個源操作數進行操作,指令結束后被運算結果所覆蓋
1)、數據轉移指令:
數據轉移指令實現MMX寄存器同內存單元之間,以及MMX寄存器同通用寄存器之間的雙向數據傳遞功能。
MOVD:轉移32位(4字節)數據;MOVQ:轉移64位(8字節)數據。
 
2)、算數運算指令:
算數運算指令對打包的數據類型實現加法、減法、乘法和乘加操作。
在介紹算術運算指令前,先簡要介紹一下所謂的“環繞模式”和“飽和模式”。所謂環繞模式,就是當一個數據單元的數據達到最大值(比如一個字節的值為255)時,如果繼續對其加1,那么該字節的數據將變為0,進位將被忽略。飽和模式則對數據的溢出進行了限制,根據有符號或者無符號類型,將運算后的結果限制在數據類型規定的范圍以內。
- PADDB/PADDW/PADDD和PSUBB/PSUBW/PSUBD指令分別在環繞模式下對源和目標操作數進行有符號或無符號的相加和相減操作。每一組的三個指令分別對應字節型、字形和雙字型數據。
- PADDSB/PADDSW和PSUBSB/PSUBSW指令分別在有符號飽和模式下進行相加和相減操作。兩個指令分別處理字節型和字型數據。
- PADDUSB/PADDUSW和PSUBUSB/PSUBUSW指令分別在無符號飽和模式下進行相加和相減操作。兩個指令分別處理字節型和字型數據。
- PMULHW和PMULLW指令執行源和目標操作數的乘法操作,并分別將乘積的高字和低字保存到目標操作數中。
- PMADDWD指令計算源和目標操作數有符號部分的乘積,并將產生的4個32位雙字的中間結果成對相加,獲得兩個32位雙字。
PMADDWD的計算結果如圖示顯示:
 
 
 
3).比較指令:
PCMPEQB/PCMPEQW/PCMPEQD和PCMPGTB/PCMPGTW/PCMPGTD指令按照有符號類型數據比較源和目標操作數進行相等比較或大于比較。對于相等比較,如果一對數據元素相等,則目標操作數中的相應數據元素設置為全 1;否則設置為全 0。對于大于比較,如果目標操作數中的數據元素大于源操作數中相應的數據元素,則目標操作數中的相應數據元素設置為全 1;否則設置為全 0。
 
 
4).類型轉換指令:
PACKSSWB指令將有符號字轉換成為有符號的字節;PACKSSDW將有符號的雙字轉換成為有符號的字;轉換過程都按照有符號飽和模式進行。
 
PACKUSWB指令將有符號的字轉換為無符號的字節,轉換過程按照無符號飽和模式進行。
 
5).擴展壓縮數據指令:
PUNPCKHBW/PUNPCKHWD/PUNPCKHDQ指令和PUNPCKLBW/PUNPCKLWD/PUNPCKLDQ分別將源于目標操作數的高位數據和低位數據取出并交錯排入目標操作數中。PUNPCKHBW和PUNPCKLBW的示意圖如下:
 
PUNPCKHBW操作示意圖
 
PUNPCKLBW操作示意圖
 
6).邏輯運算指令:
PAND——邏輯按位與;PANDN——邏輯按位與非;POR——邏輯按位或;PXOR——邏輯按位或非;
 
 
7).位移指令:
位移指令有邏輯左移、邏輯右移和算數右移三種。
PSLLW/PSLLD/PSLLQ和PSRLW/PSRLD/PSRLQ實現邏輯左移和右移操作,并用0填充空出來的高位或低位。支持字型、雙字型和四字型數據;PSRAW/PSRAD實現算數右移操作,并將符號位拷貝到右移所空出的比特位上。
 
 
8).狀態清除指令:
EMMS指令用于將MMX狀態清空。該指令在一個MMX程序結束時執行。
 
 
二、CPU寄存器
除了8個MMX寄存器之外,CPU還有自己的通用寄存器EAX/EBX/ECX/EDX。這四個通用寄存器都是32位寄存器,可以直接訪問,還可以按照16位和8位進行訪問。如EAX可以使用AX獲得低16位,AX可以使用AH和AL分別獲取高8位和低8位。其余的寄存器有ESI/EDI/ESP/EBP等。功能描述見下圖:
 
 
三、地址加載指令
1).LEA指令
LEA指令將源操作數的偏移地址傳遞給通用寄存器。如以下代碼:
LEA BX, [2400H]該指令將[2400H]的偏移地址2400傳送給BX,執行后BX=2400H。
2).LDS指令
LDS指令將4字節源內存的數據按照段地址和偏移地址傳送給鏈各個寄存器,其中低地址的2字節作為偏移地址送給作為目標操作數的寄存器,高地址的2字節作為段地址送到DS寄存器。如以下代碼:
LDS DI, [2130H]該指令將低地址2130H、2131H的數據作為偏移地址送到DI中,2132H、2133H的數據作為段地址送到DS中。
 
2.2、MMX程序設計
使用MMX編程的方法主要有三種:- 直接編寫匯編程序文件,命名為*.asm;
- 使用C++嵌入匯編,在C++代碼中使用__asm{....}編寫匯編程序;
- 使用64位數據類型__m64和與MMX相關的C++函數實現。
 
2.3、SSE/SSE2媒體擴展指令集
SSE和SSE2是基于MMX的新的匯編指令集,將寄存器的大小從64位擴展到128位,且增加了新的媒體處理匯編指令。
一、SSE/SSE2數據結構
SSE技術支持打包的單精度浮點數操作(Packed Single-Precision Floating-point),將4個獨立的32位單精度浮點數打包為一個128位數據。SSE提供了8個128位SIMD寄存器XMM0~XMM7,可以直接存取,但只能存放數據而不能用于尋址。此外SSE還提供了新的控制/狀態寄存器MXCSR。
SSE2指令包括原油的32位通用寄存器(EAX~EDX)、64位MMX寄存器(MM0~MM7)、128位XMM(XMM0~XMM7)和32位標識寄存器EFLAGS及浮點狀態/控制寄存器MCSR。此外還有兩種數據類型:128位的打包雙精度浮點數和4種128位SIMD整數。
- 128位打包雙精度浮點數:兩個64位雙精度浮點數打包成一個雙4字節數據;
- 128位打包整數:可以包含16個字節、8個字、4個雙字或2個四重字的整數;
二、SSE/SSE/2指令
SSE指令集包含70條指令,主要可以分為三組:
SSE2指令集主要包括針對128位和64位的打包雙精度浮點計算指令,記憶64位和128位的SIMD整數指令、MMX/SSE的128位擴展指令、高速緩存控制盒指令排序指令。
總結
以上是生活随笔為你收集整理的使用MMX/SSE汇编指令集优化视频开发的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Failed to open \EFI\
- 下一篇: MMX和SSE的运用
