天天看點

使用MMX/SSE彙編指令集優化視訊開發1、彙編指令集2、MMX/SSE2指令集剖析

目前大部分的PC機采用的都是Intel或者AMD的CPU,其支援的多媒體彙編指令有:

MMX:多媒體擴充指令(MultiMedia eXtention),該指令由Intel在1996年為Pentium處理器開發,包括了57條多媒體指令,可以i一次處理多個資料。但是MMX指令不能與X86浮點運算指令同時執行,在某些場合使用受到一定限制。

SSE:SIMD擴充指令集(Streaming SIMD Extension),也稱作單指令多資料流擴充。其中的SIMD的含義為Single Instruction Multiple Data(單指令多資料)。該指令集有Intel為Pentium III研發,是為了提高處理浮點運算性能而開發的指令集,有70條指令,包括50條SIMD浮點運算指令用于提升3D圖形運算效率、12條MMX整數運算增強指令和8條優化記憶體中連續資料塊傳輸指令。這些指令有利于優化圖像處理、浮點運算、3D運算和多媒體處理等運算的性能。

3DNow!:3DNow!指令集由AMD開發,有21條擴充指令。3DNow!指令集主要針對三維模組化、坐标變換和效果渲染等3D資料處理。

SSE2:SSE2指令集是比SSE更加先進的指令集,共包含144條指令,由兩個部分組成:SSE主要負責處理浮點數,MMX主要負責處理整數計算。SSE2的寄存器容量是MMX的兩倍,寄存器存儲的資料也是MMX的兩倍。SSE2可以向下相容MMX,經由MMX進行優化的程式可以繼續由SSE2進行進一步的優化。

SSE3:SSE3是在SSE2的基礎上開發的,相比SSE2增加了13個SIMD指令,主要目的在于改進線程序同步和媒體、遊戲等特殊應用程式領域。其中定義了超線程性能增強作為其中的一部分,可以提升處理器的超線程處理能力,使得處理器更快地進行并行資料處理。

SSE4:SSE4是Intel自SSE2以來最大的改進,包括了從多媒體應用到高性能計算領域的應用,以及使用一些專用電路進行特定應用的加速。SSE4增加了47條指令,改進了整數型和浮點型計算、支援DWORD和QWORD操作、新的單精度FP操作、快速寄存器操作和面向寄存器的記憶體操作等。

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指令集從功能上可以分為8類:資料傳送指令、算術運算指令、比較運算指令、類型轉換指令、擴充壓縮資料指令、邏輯運算指令、移位運算指令、狀态清除指令。指令清單如下:

使用MMX/SSE彙編指令集優化視訊開發1、彙編指令集2、MMX/SSE2指令集剖析
使用MMX/SSE彙編指令集優化視訊開發1、彙編指令集2、MMX/SSE2指令集剖析

在以上指令中,除了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的計算結果如圖示顯示:

使用MMX/SSE彙編指令集優化視訊開發1、彙編指令集2、MMX/SSE2指令集剖析

3).比較指令:

PCMPEQB/PCMPEQW/PCMPEQD和PCMPGTB/PCMPGTW/PCMPGTD指令按照有符号類型資料比較源和目标操作數進行相等比較或大于比較。對于相等比較,如果一對資料元素相等,則目标操作數中的相應資料元素設定為全

1;否則設定為全 0。對于大于比較,如果目标操作數中的資料元素大于源操作數中相應的資料元素,則目标操作數中的相應資料元素設定為全 1;否則設定為全 0。

4).類型轉換指令:

PACKSSWB指令将有符号字轉換成為有符号的位元組;PACKSSDW将有符号的雙字轉換成為有符号的字;轉換過程都按照有符号飽和模式進行。

PACKUSWB指令将有符号的字轉換為無符号的位元組,轉換過程按照無符号飽和模式進行。

5).擴充壓縮資料指令:

PUNPCKHBW/PUNPCKHWD/PUNPCKHDQ指令和PUNPCKLBW/PUNPCKLWD/PUNPCKLDQ分别将源于目标操作數的高位資料和低位資料取出并交錯排入目标操作數中。PUNPCKHBW和PUNPCKLBW的示意圖如下:

使用MMX/SSE彙編指令集優化視訊開發1、彙編指令集2、MMX/SSE2指令集剖析

PUNPCKHBW操作示意圖

使用MMX/SSE彙編指令集優化視訊開發1、彙編指令集2、MMX/SSE2指令集剖析

PUNPCKLBW操作示意圖

6).邏輯運算指令:

PAND——邏輯按位與;PANDN——邏輯按位與非;POR——邏輯按位或;PXOR——邏輯按位或非;

7).位移指令:

位移指令有邏輯左移、邏輯右移和算數右移三種。

PSLLW/PSLLD/PSLLQ和PSRLW/PSRLD/PSRLQ實作邏輯左移和右移操作,并用0填充空出來的高位或低位。支援字型、雙字型和四字型資料;PSRAW/PSRAD實作算數右移操作,并将符号位拷貝到右移所空出的比特位上。

8).狀态清除指令:

EMMS指令用于将MMX狀态清空。該指令在一個MMX程式結束時執行。

除了8個MMX寄存器之外,CPU還有自己的通用寄存器EAX/EBX/ECX/EDX。這四個通用寄存器都是32位寄存器,可以直接通路,還可以按照16位和8位進行通路。如EAX可以使用AX獲得低16位,AX可以使用AH和AL分别擷取高8位和低8位。其餘的寄存器有ESI/EDI/ESP/EBP等。功能描述見下圖:

使用MMX/SSE彙編指令集優化視訊開發1、彙編指令集2、MMX/SSE2指令集剖析

1).LEA指令

LEA指令将源操作數的偏移位址傳遞給通用寄存器。如以下代碼:

該指令将[2400H]的偏移位址2400傳送給BX,執行後BX=2400H。

2).LDS指令

LDS指令将4位元組源記憶體的資料按照段位址和偏移位址傳送給鍊各個寄存器,其中低位址的2位元組作為偏移位址送給作為目标操作數的寄存器,高位址的2位元組作為段位址送到DS寄存器。如以下代碼:

該指令将低位址2130H、2131H的資料作為偏移位址送到DI中,2132H、2133H的資料作為段位址送到DS中。

使用MMX程式設計的方法主要有三種:

直接編寫彙程式設計式檔案,命名為*.asm;

使用C++嵌入彙編,在C++代碼中使用__asm{....}編寫彙程式設計式;

使用64位資料類型__m64和與MMX相關的C++函數實作。

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條指令,主要可以分為三組:

50條SIMD浮點運算指令:50條SIMD浮點運算指令是其主要部分,包括幾個部分:資料傳送指令、算數運算指令、比較指令、類型轉換指令、組合指令、狀态管理指令。

12條SIMD整數指令:為了增強MMX指令系統而新增。

8條高速緩沖存儲器優化指令:8條指令,為更好滴控制緩存操作,提供啊程式運作性能,專門針對Pentium III設計。

SSE2指令集主要包括針對128位和64位的打包雙精度浮點計算指令,記憶64位和128位的SIMD整數指令、MMX/SSE的128位擴充指令、高速緩存控制盒指令排序指令。

SSE2浮點計算指令:SSE2浮點運算指令分為多組,主要有SSE2的傳送指令、算術運算指令、邏輯運算指令、比較指令、組合指令和轉換指令等。

SSE2擴充指令:除雙精度浮點指令外,在原油的MMX和SSE基礎上補充了SIMD擴充整數指令、高速緩存控制和指令排序指令。

繼續閱讀