SSE4

SSE4 (Streaming SIMD Extensions 4)是Intel Core微架構和AMD K10中所使用的SIMD CPU指令集。它在2006年9月27日在英特爾開發者論壇上被宣佈，白皮書上的細節還較為模糊。隨後在北京的2007年春季英特爾開發者論壇上的演示文稿中提供了47個指令的更精確細節。SSE4與為前代英特爾64和IA-32架構微處理器編寫的軟體完全兼容。所有現有軟體均可正確運行，無需修改包含SSE4的微處理器，以及現有和新應用程式（包含SSE4）。

 SSE4子集 
英特爾SSE4包含54條指令。由Penryn提供的包含47條指令的子集，在英特爾文檔中稱為SSE4.1。此外，SSE4.2是由剩餘7條指令組成的第二個子集，首次在基於Nehalem的Core i7中提供。英特爾將開發人員的反饋信息稱為指令集開發中的重要角色。

從基於Barcelona的處理器開始，AMD推出了SSE4a指令集，其中有原有的4條SSE4指令和4條新的SSE指令。在支持SSE4.1的英特爾處理器中沒有發現這些指令并且AMD處理器僅在基於Bulldozer的 FX 處理器上開始支援英特爾的 SSE4.1和SSE4.2 (完整的 SSE4 指令集)。在使用SSE4a時，AMD還引入了未對齊的SSE特性，這意味著未對齊的加載指令在對齊的地址上與對齊版本一樣快。它還允許禁止訪問內存的非加載SSE操作的對齊檢查。英特爾後來在他們的Nehalem處理器中對未對齊的SSE進行了類似的速度改進，但是沒有在AVX之前引入非負載SSE指令的未對齊訪問。

 名稱混淆 
在Intel Core 2系列中引入的現在稱為SSSE3（補充流式SIMD擴展3）的部分在英特爾提出SSSE3名稱之前被媒體稱為SSE4。而在內部則把新的指令稱為Merom。 一些記者批評英特爾最初並沒有計畫給它們指定一個獨有的名稱。英特爾最終清除了混淆，並保留了SSE4名稱以用於下一個指令集擴展。

英特爾正在使用營銷術語HD Boost來指代SSE4。

 新的說明 
與之前SSE的所有迭代不同，SSE4包含執行不特定於多媒體應用的操作的指令。它具有許多指令，其操作由一個常量字段和一組將XMM0作為隱式第三操作數的指令決定。

enryn公司的單週期shuffle引擎啟用了其中的幾條指令。（隨機操作重新排序寄存器中的字節被稱爲shuffle。）

+指令描述MPSADBW計算絕對差的八個偏移和，每次四個（即：|x0−y0|+|x1−y1|+|x2−y2|+|x3−y3|, |x0−y1|+|x1−y2|+|x2−y3|+|x3−y4|, …, |x0−y7|+|x1−y8|+|x2−y9|+|x3−y10|）。這個操作對一些HD 編解碼器來說很重要。並且允許在少於七個週期內計算8×8塊的差異。三位直接運算元的一個位指示是否應從目標運算元中使用y0 .. y10或 y4 .. y14, 另外兩種方法是否應從源中使用x0..x3, x4..x7, x8..x11或x12..x15。PHMINPOSUW將目標的底部無符號16位字設置為源中最小的無符號16位字，將底部的下一個字設置為源中該字的索引。PMULDQ在兩組四個壓縮整數中的兩組中進行壓縮有符號乘法，第一個和第三個壓縮4，給出兩個打包的64位結果。PMULLD打包有符號乘法，四個打包的32位整數組相乘，得到4個打包的32位結果。DPPS；DPPDAOS（結構數組）數據的點積。這需要一個立即操作數，它由四個（或兩個DPPD）位組成，用於選擇輸入中的哪個條目進行乘法和累加，另外四個（或兩個DPPD）選擇是將0還是點積輸出的相應字段。BLENDPS；BLENDPD；
BLENDVPS；BLENDVPD；

PBLENDVB；PBLENDW基於（對於非V形式）立即操作數中的位以及（對於V形式）寄存器XMM0中的位的條件複製一個位置中的元素與另一個位置中的元素。PMINSB；PMAXSB；
PMINUW；PMAXUW；

PMINUD；PMAXUD；

PMINSD；PMAXSD不同整型操作數類型的最小/最大值壓縮。ROUNDPS；ROUNDSS；

ROUNDPD；ROUNDSD使用立即數操作數指定的四種舍入模式中的一種將浮點寄存器中的值整數到整數。INSERTPS；PINSRB；

PINSRD / PINSRQ；

EXTRACTPS；PEXTRB；

PEXTRD / PEXTRQNSERTPS和PINSR指令從x86寄存器或存儲器位置讀取8,16或32位，並將其插入由立即數操作數給定的目標寄存器中的字段。EXTRACTPS和PEXTR從源寄存器中讀取一個字段，並將其插入x86寄存器或記憶體位置。例如，PEXTRD eax，[xmm0]，1; EXTRACTPS [addr + 4 * eax]，xmm1，1將xmm1的第一個字段存儲在由xmm0的第一個字段給出的位址中。PMOVSXBW；PMOVZXBW；

PMOVSXBD；PMOVZXBD；

PMOVSXBQ；PMOVZXBQ；

PMOVSXWD；PMOVZXWD；

PMOVSXWQ ；PMOVZXWQ；

PMOVSXDQ；PMOVZXDQ打包標誌/零擴展到更廣泛的類型。PTEST這與TEST指令相似，因為它將Z標誌設置為其操作數之間的AND結果：如果DEST AND SRC等於0，則設置ZF。另外，如果（NOT DEST）AND SRC等於零。
這相當於如果沒有設置SRC掩碼的位，則設置Z標誌，如果設置了SRC掩碼的所有位，則設置C標誌。PCMPEQQ四字節（64位）相等比較。PACKUSDW將帶符號的DWORD轉換為飽和的無符號WORD。MOVNTDQA從寫入組合存儲區有效讀取到SSE寄存器; 這對於從連接到存儲器總線的外設檢索結果很有用。

 SSE4.2 
SSE4.2添加了STTNI（字符串和文本新指令），和每次對16個字節的兩個操作數執行字符搜索和比較的幾個新指令。這些設計（除其他外）旨在加快解析XML文檔。這也增加了一個CRC32指令來計算循環冗餘校驗，比如可以在某些數據傳輸協議使用。這些指令首先在基於Nehalem的Intel Core i7產品系列中實現，並完成SSE4指令集。支持通過CPUID.01H：ECX.SSE42 [bit20]標誌指示。

+指令描述CRC32使用多項式0x11EDC6F41（或沒有高位，0x1EDC6F41）累加CRC32C值。PCMPESTRI打包比較顯式長度字符串，返回索引。PCMPESTRM打包比較顯式長度字符串，返回掩碼。PCMPISTRI打包比較隱式長度字符串，返回索引。PCMPISTRM打包比較隱式長度字符串，返回掩碼。PCMPGTQ比較已打包簽名的64位數據。For Greater Than

 POPCNT和LZCNT 
這些指令在整數而不是SSE寄存器上運行，因為它們不是SIMD指令，而是同時出現的指令。雖然它們是由AMD通過SSE4a指令集引入的，但卻往往被視為單獨的擴展，並且帶有自己的專用CPUID位以指示對其的支援。Intel以Nehalem微體系架構和LZCNT開始，實現了從Haswell微架構開始的POPCNT 。AMD從Barcelona微體系架構開始實施。

AMD稱這一對高級位操作Advanced Bit Manipulation （ABM）指令。

+指令描述POPCNT漢明權重（計數位數設置為1）。支持通過CPUID.01H：ECX.POPCNT [位23]標誌指示。LZCNTFind First Set。支持通過CPUID.80000001H：ECX.ABM [位5]標誌指示。
除非輸入為0，否則lzcnt的結果等於bsr（位掃描反轉）。lzcnt產生32的結果，而bsr產生未定義的結果（並設置零標誌）。lzcnt的編碼與bsr的編碼相似，如果lzcnt在不支持它的CPU上執行，比如Haswell之前的Intel CPU，它將執行bsr操作，而不是產生無效的指令錯誤。

Trailing zeros可以使用現有的bsf指令進行計數。

 SSE4a 
AMD公司的Barcelona微體系架構中引入了SSE4a指令組。這些說明在英特爾處理器中不可用。支持通過CPUID.80000001H：ECX.SSE4A [Bit 6]標誌指示。
+指令描述EXTRQ / INSERTQ組合掩碼移位指令。MOVNTSD / MOVNTSS標量流存儲指令。

 支援的CPU 

 Intel
 Intel Core 2處理器（45納米，支援SSE4.1）
 Intel Core i3/i5/i7/i9（支援SSE4.1、SSE4.2）
 Intel Pentium和Intel Celeron（Sandy Bridge微架構和以後，支援SSE4.1、SSE4.2）
 AMD
 基於AMD K10的處理器（支持SSE4a）
 基於AMD 12h（AMD Llano）、AMD 14h（AMD Bobcat）的處理器（支持SSE4a）
 基於AMD 15h（AMD Bulldozer、AMD Piledriver、AMD Excavator、AMD Steamroller）的處理器（支持SSE4.1、SSE4.2和SSE4a）
 基於AMD 16h（AMD Jaguar、AMD Puma）的處理器（支持SSE4.1、SSE4.2和SSE4a）
 基於AMD Zen的處理器（支持SSE4.1、SSE4.2和SSE4a）
 VIA
 Nano處理器（支持SSE4.1）

 引用 

Category:SIMD计算
Category:X86指令