技術(shù)領(lǐng)域
本發(fā)明的各實施例一般涉及指令處理設(shè)備。更具體而言,本發(fā)明的各實施例涉及處理SHA-2安全散列算法的指令處理設(shè)備。
背景技術(shù):
SHA代表安全散列算法。它包括由國家安全局(NSA)設(shè)計且由國家標(biāo)準(zhǔn)和技術(shù)局(NIST)公布的五個散列函數(shù)。其中之一是SHA-2。SHA-2是一組安全散列函數(shù),包括由NSA開發(fā)的SHA 224、SHA 256、SHA 384和SHA 512,旨在提供比SHA-1更高級別的安全性。SHA 224和SHA 256是基于32位字長度的類似算法,產(chǎn)生224和256位的摘要(digest)。SHA 384和SHA 512基于64位字且產(chǎn)生384和512位的摘要。
SHA-2算法在計算上比SHA 1更復(fù)雜,依賴于進(jìn)位傳播加法(propagate addition)以及邏輯操作和循環(huán)移位(rotate)。用于一輪SHA-2操作的關(guān)鍵路徑包括四個連續(xù)的傳播加法,且加法器輸入由復(fù)雜邏輯和循環(huán)移位函數(shù)確定。圖1描述SHA-2算法的細(xì)節(jié)。A,B,C,D,E,F,G和H表示8個狀態(tài)字(對于SHA 224/256為32位,且對于SHA384/512為64位)。對于每次迭代執(zhí)行以下的操作:
對于SHA-512,按位的循環(huán)移位(bitwise rotation)使用不同的常數(shù)。在該示例中,給定的數(shù)用于SHA-256??稍谠撦嗞P(guān)鍵路徑之前執(zhí)行常數(shù)K加Wi消息輸入加法。SHA-2算法的消息調(diào)度函數(shù)也比SHA-1更復(fù)雜,依賴于先前的消息輸入的經(jīng)循環(huán)移位的復(fù)本以形成消息輸入:
對于i從16至63
s0:=(w[i-15]ROTR 7)XOR(w[i-15]ROTR 18)XOR(w[i-15]SHR 3)
s1:=(w[i-2]ROTR 17)XOR(w[i-2]ROTR 19)XOR(w[i-2]SHR 10)
w[i]:=w[i-16]+s0+w[i-7]+s1
其中ROTR(也用作“>>>”)指示按位的循環(huán)右移(right-rotate)操作符,SHR指示按位的向右移位(right-shift)操作符,且XOR指示按位的異或操作符。
對于SHA-256,如下地執(zhí)行每次迭代:
Σ0:=(a ROTR 2)XOR(a ROTR 13)XOR(a ROTR 22)
maj:=(a AND b)XOR(a AND c)XOR(b AND c)
t2:=Σ0+maj
Σ1:=(e ROTR 6)XOR(e ROTR 11)XOR(e ROTR 25)
ch:=(e AND f)XOR((NOT e)AND g)
t1:=h+Σ1+ch+k[i]+w[i]
h:=g
g:=f
f:=e
e:=d+t1
d:=c
c:=b
b:=a
a:=t1+t2
對于輪1至16,消息輸入w[i]是32位x16=512位數(shù)據(jù)塊。對于輪17至64的W[i]必須被導(dǎo)出。對于每一輪指定常數(shù)K,可在實際的輪迭代之前計算每輪的W[i]+K[i]值??稍贔ederal Information Processing Standard Publication(聯(lián)邦信息處理標(biāo)準(zhǔn)公布)出版的安全散列標(biāo)準(zhǔn)(FIPS PUB 180-3,2008年10月出版)中找到關(guān)于SHA-2規(guī)范的更詳細(xì)的信息。
使用標(biāo)準(zhǔn)指令的常規(guī)軟件方案需要單獨的指令用于實現(xiàn)諸如SHA256算法之類的SHA-2的輪和調(diào)度函數(shù)所需的每個加法和邏輯移位/循環(huán)移位指令。當(dāng)前的用于SHA256的行業(yè)基準(zhǔn)數(shù)據(jù)是每字節(jié)范圍15個循環(huán)。SHA256的標(biāo)準(zhǔn)之類實現(xiàn)的限制潛在地接近每字節(jié)范圍9個循環(huán)。缺少執(zhí)行以上操作的有效方式。
附圖說明
本發(fā)明的各實施例是作為示例說明的,而不僅限于各個附圖的圖形,在附圖中,類似的參考編號表示類似的元件。
圖1描述SHA-2算法的細(xì)節(jié)。
圖2是根據(jù)本發(fā)明的一個實施例的處理器或處理器核心的執(zhí)行流水線的框圖。
圖3是示出根據(jù)一個實施例的SHA-2操作的框圖。
圖4是示出根據(jù)一個實施例的SHA-256輪操作的過程的框圖。
圖5是示出根據(jù)一個實施例執(zhí)行SHA-2輪操作的方法的流程圖。
圖6是示出根據(jù)一個實施例執(zhí)行SHA-2消息調(diào)度操作的方法的流程圖。
圖7是示出根據(jù)另一個實施例執(zhí)行SHA-2消息調(diào)度操作的方法的流程圖。
圖8A-8C是示出根據(jù)一個實施例的SHA-256輪操作的過程的偽代碼。
圖9A示出根據(jù)本發(fā)明的一個實施例的示例性高級向量擴(kuò)展(AVX)指令格式。
圖9B示出根據(jù)本發(fā)明的另一個實施例的示例性高級向量擴(kuò)展(AVX)指令格式。
圖9C示出根據(jù)本發(fā)明的另一個實施例的示例性高級向量擴(kuò)展(AVX)指令格式。
圖10A是示出根據(jù)本發(fā)明的實施例的通用向量友好指令格式及其A類指令模板的方框圖。
圖10B是示出根據(jù)本發(fā)明的實施例的通用向量友好指令格式及其B類指令模板的方框圖。
圖11A是示出根據(jù)本發(fā)明的一個實施例的示例性專用向量友好指令格式的框圖。
圖11B是示出根據(jù)本發(fā)明的另一個實施例的通用向量友好指令格式的框圖。
圖11C是示出根據(jù)本發(fā)明的另一個實施例的通用向量友好指令格式的框圖。
圖11D是示出根據(jù)本發(fā)明的另一個實施例的通用向量友好指令格式的框圖。
圖12是根據(jù)本發(fā)明的一個實施例的寄存器架構(gòu)的框圖。
圖13A是示出根據(jù)本發(fā)明的各實施例的示例性有序流水線和示例性的寄存器重命名的無序發(fā)布/執(zhí)行流水線的框圖。
圖13B是示出根據(jù)本發(fā)明的實施例的有序架構(gòu)核的示例性實施例以及包括在處理器中的示例性寄存器重命名的無序發(fā)布/執(zhí)行架構(gòu)核兩者的方框圖。
圖14A是根據(jù)本發(fā)明的一個實施例的處理器核的框圖。
圖14B是根據(jù)本發(fā)明的另一個實施例的處理器核的框圖。
圖15是根據(jù)本發(fā)明的實施例的處理器的框圖。
圖16是根據(jù)本發(fā)明一個實施例的系統(tǒng)的框圖。
圖17是根據(jù)本發(fā)明的實施例的更具體的示例性系統(tǒng)的框圖。
圖18是根據(jù)本發(fā)明的另一個實施例的更具體的示例性系統(tǒng)的框圖。
圖19是根據(jù)本發(fā)明的實施例的SoC的框圖。
圖20是根據(jù)本發(fā)明的實施例的對比使用軟件指令變換器將源指令集中的二進(jìn)制指令變換成目標(biāo)指令集中的二進(jìn)制指令的框圖。
各實施例的描述
下面將參考下面所討論的細(xì)節(jié)來描述本發(fā)明的各實施例并各方面,各個附圖將示出各實施例。下面的描述和圖形只是本發(fā)明的說明,而不作為對本發(fā)明的限制。描述了很多具體細(xì)節(jié),以便全面地理解本發(fā)明的各實施例。然而,在某些實例中,沒有描述已知的或常規(guī)的細(xì)節(jié),以便提供對本發(fā)明的各實施例的簡潔的討論。
在本說明書中對“一個實施例”或“實施例”的引用意思指和該實施例一起描述的特定特征、結(jié)構(gòu)或特征可以被包括在本發(fā)明的至少一個實施例中。在本說明書中的不同位置出現(xiàn)短語“在一個實施例中”不一定都是指同一個實施例。
根據(jù)一些實施例中,新指令集架構(gòu)(ISA)用于響應(yīng)于單個指令(例如,單指令多數(shù)據(jù)或SIMD指令)執(zhí)行一輪或多輪上述的SHA-2操作,以提高SHA-2計算的效率。常規(guī)的系統(tǒng)需要利用多個指令來執(zhí)行一輪SHA-2輪操作。通過減少SHA-2輪函數(shù)所需的時間同時以流水線方式導(dǎo)出后續(xù)輪的消息輸入來優(yōu)化性能,使得執(zhí)行SHA-2算法的速度主要受到輪計算的影響。在一個實施例中,為了執(zhí)行256位(例如,SHA-256)輪操作,具有至少256位的寄存器用于存儲SHA-2狀態(tài)變量(例如,狀態(tài)變量A,B,C,D,E,F,G和H)和多個消息輸入(例如,至少四個消息輸入),使得一輪或多輪SHA-2輪散列操作可由諸如支持向量的處理器之類的處理器響應(yīng)于單個指令并行地執(zhí)行。此外,具有至少128位的寄存器用于基于先前的消息輸入為下一循環(huán)或迭代(例如,接下來的一輪或多輪)準(zhǔn)備多個消息輸入。
圖2是根據(jù)本發(fā)明的一個實施例的處理器或處理器核心的執(zhí)行流水線的框圖。參考圖2,處理器100可以表示任何類型的指令處理設(shè)備。例如,處理器100可以是通用處理器。處理器100可以是各種復(fù)雜指令集計算(CISC)處理器、各種精簡指令集計算(RISC)處理器、各種超長指令字(VLIW)處理器中的任何一種,其各種混合型,或完全其他類型的處理器。處理器100還可表示一個或多個處理器核。
處理器核可以用出于不同目的的不同方式在不同的處理器中實現(xiàn)。例如,這樣的核的實現(xiàn)可以包括:1)旨在用于通用計算的通用有序核;2)預(yù)期用于通用計算的高性能通用無序核;3)旨在主要用于圖形和/或科學(xué)(吞吐量)計算的專用核。不同處理器的實現(xiàn)可包括:包括預(yù)期用于通用計算的一個或多個通用有序核和/或預(yù)期用于通用計算的一個或多個通用無序核的中央處理器單元(CPU);以及2)包括主要預(yù)期用于圖形和/或科學(xué)(吞吐量)的一個或多個專用核的協(xié)處理器。這樣的不同處理器導(dǎo)致不同的計算機(jī)系統(tǒng)架構(gòu),其可包括:1)在與CPU分開的芯片上的協(xié)處理器;2)在與CPU相同的封裝中但分開的管芯上的協(xié)處理器;3)與CPU在相同管芯上的協(xié)處理器(在該情況下,這樣的協(xié)處理器有時被稱為諸如集成圖形和/或科學(xué)(吞吐量)邏輯等專用邏輯,或被稱為專用核);以及4)可以將所描述的CPU(有時被稱為應(yīng)用核或應(yīng)用處理器)、以上描述的協(xié)處理器和附加功能包括在同一管芯上的芯片上系統(tǒng)。接著描述示例性核架構(gòu),隨后描述示例性處理器和計算機(jī)架構(gòu)。
在一個實施例中,處理器100包括但不限于指令解碼器101和一個或多個執(zhí)行單元102。指令解碼器101用于接收和解碼來自指令獲取單元(未示出)的指令103。指令解碼器102可生成并輸出一個或多個微操作、微代碼、入口點、微指令、其他指令或其他控制信號,它們反映或來源于指令。指令解碼器102可以使用各種不同的機(jī)制來實現(xiàn)。合適的機(jī)制的示例包括,但不僅限于,微代碼只讀存儲器(ROM)、查找表、硬件實現(xiàn)、可編程邏輯陣列(PLA)、等等。
執(zhí)行單元102可包括算術(shù)邏輯單元或能夠基于指令執(zhí)行操作的另一類型的邏輯單元。作為指令解碼器102解碼指令的結(jié)果,執(zhí)行單元102可以接收一個或多個微操作、微代碼入口點、微指令、其他指令或其他控制信號,它們反映指令或來源于指令。執(zhí)行單元102可以作為指令指出一個或多個源操作數(shù)(SRC)的結(jié)果操作用于將結(jié)果存儲到由指令指出的寄存器集合的一個或多個目的地操作數(shù)(DEST)中。執(zhí)行單元102可以包括可操作以執(zhí)行指令或從指令導(dǎo)出的其他控制信號的電路或其他執(zhí)行邏輯(例如,與硬件和/或固件相結(jié)合的軟件),并相應(yīng)地執(zhí)行操作。執(zhí)行單元102可以表示諸如邏輯單元、算術(shù)邏輯單元(ALU)、算術(shù)單元、整數(shù)單元等等之類的任何類型的執(zhí)行單元。
源和目的地操作數(shù)中的某些或全部可以被存儲在寄存器集合或存儲器的寄存器中。寄存器集合可以是寄存器組的一部分,以及潛在地,諸如狀態(tài)寄存器、標(biāo)志寄存器等其他寄存器。寄存器可以是可以被用來存儲數(shù)據(jù)的存儲位置或設(shè)備。寄存器集合常常可以在物理上位于帶有執(zhí)行單元的管芯中。寄存器可以從處理器的外部或從編程器的角度可見。例如,指令可以指定存儲在寄存器中的操作數(shù)。各種不同類型的寄存器都是合適的,只要它們能夠存儲和提供如此處所描述的數(shù)據(jù)。寄存器可以被重命名,也可以不被重命名。合適的寄存器的示例包括但不僅限于專用物理寄存器、使用寄存器重命名的動態(tài)地分配的物理寄存器、專用和動態(tài)地分配的物理寄存器的組合,等等??闪磉x地,源和目的地操作數(shù)中的一個或多個可以存儲在存儲位置,而不是寄存器中,諸如,例如,系統(tǒng)存儲器中的位置。
返回參見圖2,根據(jù)一個實施例中,執(zhí)行單元102包括一個或多個SHA-2單元106,用以響應(yīng)于由指令解碼器101接收并提供的第一指令,利用諸如SHA-2狀態(tài)A至H之類的數(shù)據(jù)110、消息輸入以及存儲在一個或多個寄存器104中的相應(yīng)常數(shù)Wt和Kt,執(zhí)行一輪或多輪SHA-2輪操作。響應(yīng)于作為單指令多數(shù)據(jù)(SIMD)指令的單個指令執(zhí)行一輪或多輪SHA-2輪操作。SHA-2輪操作的輪數(shù)取決于處理器流水線的特定設(shè)計或配置(例如流水線等待時間要求),該處理器流水線可被配置成優(yōu)化處理器流水線的總體性能的適當(dāng)?shù)臄?shù)量。出于說明的目的,假設(shè)在單個SIMD循環(huán)中執(zhí)行兩輪SHA-2輪操作。將理解到,也可在單個SIMD循環(huán)中執(zhí)行更多或更少輪的SHA-2輪操作,只要諸如具有適當(dāng)尺寸的寄存器或存儲器之類的所需資源是可用的即可。
根據(jù)一個實施例,響應(yīng)于作為單指令多數(shù)據(jù)(SIMD)指令的單個指令執(zhí)行一輪或多輪SHA-2輪操作。在一個實施例中,第一指令包括兩個操作數(shù)。第一操作數(shù)表示源/目的地寄存器,用于存儲當(dāng)前的SHA-2狀態(tài)作為輸入以及下一SHA-2狀態(tài)作為一輪或多輪SHA-2輪操作的結(jié)果。第二操作數(shù)表示寄存器/存儲器,用于存儲用于輪操作的多個消息輸入和填補常數(shù)。在已經(jīng)執(zhí)行SHA-2輪操作之后,SHA-2狀態(tài)被更新并存儲回第一操作數(shù)指定的寄存器中。在一個實施例中,響應(yīng)于單個SIMD指令執(zhí)行一輪或多輪SHA-2輪操作,其中所涉及的寄存器具有至少256位,用以存儲用于SHA-256輪操作的SHA-2狀態(tài)變量和消息輸入(以及512位用于SHA-512輪操作)。
根據(jù)另一個實施例,響應(yīng)于第二指令,SHA-2單元106配置成執(zhí)行SHA-2消息調(diào)度操作以產(chǎn)生用于下一循環(huán)的多個消息輸入(例如,在下一SIMD指令循環(huán)中的一輪或多輪SHA-2輪操作)。在一個實施例中,取決于處理器流水線的特定設(shè)計或配置,可能需要兩個指令來準(zhǔn)備下一SIMD循環(huán)的消息輸入。在單個SIMD循環(huán)中支持至少兩輪SHA-2輪操作中,第一指令包括三個操作數(shù),用以存儲至少8個先前的消息輸入,并在執(zhí)行第一指令之后,生成中間結(jié)果并將其返回在操作數(shù)之一指定的寄存器中。第二指令獲取由第一指令生成的中間結(jié)果作為一個操作數(shù)中的輸入。第二指令的另一個操作數(shù)指定至少8個其它先前的消息輸入(例如組合的總共16個消息)。最終結(jié)果表示用于下一SIMD循環(huán)的4個消息輸入。在一個實施例中,在消息調(diào)度操作中涉及的寄存器具有至少128位。
根據(jù)一些實施例,本發(fā)明的實施例包括利用YMM SIMD寄存器的新指令和數(shù)據(jù)路徑,該寄存器具有256位且與來自加利福尼亞州圣克拉拉的英特爾公司的AVX處理器兼容,作為用于SHA-256狀態(tài)的256位的源/目的地操作數(shù)??蓪⑤^寬的寄存器(例如,512位或更寬的寄存器)用于執(zhí)行較寬位的SHA-2輪操作,諸如SHA-512輪操作。貫穿本申請,出于說明的目的描述SHA-2標(biāo)準(zhǔn)的SHA-256,然而,也適用于諸如SHA-2標(biāo)準(zhǔn)的SHA-512之類的其它操作。
根據(jù)一個實施例中,利用以3循環(huán)等待時間(例如,3個循環(huán)流水線)計算兩輪的新指令,可改進(jìn)SHA224/256操作。八個32位狀態(tài)變量A至H存儲在256位寄存器中,諸如英特爾AVX處理器的YMM寄存器。在單個SIMD循環(huán)中執(zhí)行至少兩輪SHA-256輪操作的新指令在本文中稱為SHA256RNDS2(例如,SHA-256 2輪)指令。SHA256RNDS2指令利用第一256位寄存器(例如,第一YMM寄存器)來包含狀態(tài)變量(例如,SHA-2狀態(tài)A到H)作為源/目的地寄存器,加上第二256位寄存器(例如,第二YMM寄存器),其包含兩個預(yù)先計算的消息輸入加輪常數(shù)值。為了導(dǎo)出消息輸入并在SHA-256輪迭代之前增加輪常數(shù),根據(jù)一個實施例,兩個消息調(diào)度指令(在本文中稱為MSG1SHA256和MSG2SHA256指令)被實現(xiàn)以加速復(fù)雜調(diào)度函數(shù),該函數(shù)包括循環(huán)移位(rotate)、移位(shift)、XOR和三個32位進(jìn)位傳播加法。
在一個實施例中,SHA256RNDS2指令需要3個循環(huán)以讀取來自YMM寄存器的狀態(tài)和K消息輸入,以執(zhí)行2輪SHA-256,并將更新的狀態(tài)寫回源/目的地YMM寄存器。在2輪SHA 256的3循環(huán)等待時間下,吞吐率是每循環(huán)2/3輪,或每512位塊96循環(huán),需要64輪處理。從被散列化的64字節(jié)數(shù)據(jù)塊的4字節(jié)分區(qū)提供用于輪1至16的消息輸入w[i]。利用復(fù)雜消息調(diào)度器,從輸入數(shù)據(jù)的64字節(jié)/16字導(dǎo)出用于輪17至64的w[i],對于每輪,每個消息字需要4次循環(huán)移位、2次移位、4次XOR和4次進(jìn)位傳播加法??扇缦露x操作:
對于i從16至63
w[i]:=w[i-16]+s0(w[i-15])+w[i-7]+s1(w[i-2])
其中函數(shù)s0可被定義為:
s0(x)=(x ROTR 7)XOR(x ROTR 18)XOR(x SHR 3)
并且其中函數(shù)s1可被定義為:
s1(x)=(x ROTR 17)XOR(x ROTR 19)XOR(x SHR 10)
在一個實施例中,SHA256RNDS2指令的格式可被如下定義:
SHA256RNDS2,YMM1,YMM2/m256
其中YMM1是源/目的地寄存器,用于存儲SHA-256狀態(tài)變量A,B,C,D,E,F,G和H。在2輪SHA256迭代之后,SHA256RNDS2指令用所得的新狀態(tài)更新目的地YMM1寄存器。YMM2是具有2個新消息輸入和預(yù)先相加的輪常數(shù)的源寄存器。用于輪0的輸入kw0被存儲在寄存器YMM2[31:00]中,且用于輪1的輸入kw1被存儲在寄存器YMM2[63:32]中,如圖3所示。注意參考圖3,在該示例中,SHA-2單元106對SHA-2狀態(tài)301和存儲在寄存器302中的KW之一計算兩輪SHA-256輪操作,其生成下一SHA-2狀態(tài)303。下一SHA-2狀態(tài)303可被存儲回源/目的地寄存器301。在該示例中,因為具有至少128位的寄存器302可存儲更多的KW,所以也可執(zhí)行另外的輪的SHA-2輪操作。類似地,如果寄存器302具有256位或512位,則可執(zhí)行更多的輪,只要可滿足流水線等待時間即可。
在一個實施例中,可如下地定義YMM1寄存器:
A=Y(jié)MM[255:224]
B=Y(jié)MM[223:192]
C=Y(jié)MM[191:160]
D=Y(jié)MM[159:128]
E=Y(jié)MM[127:96]
F=Y(jié)MM[95:64]
G=Y(jié)MM[63:32]
H=Y(jié)MM[31:00]
其中狀態(tài)變量A,B,C,D,E,F,G和H(對于輪n)←狀態(tài)變量A,B,C,D,E,F,G和H(對于輪n-2)對于2個SHA-256輪步進(jìn)。
為了跟上SHA256RNDS2指令,根據(jù)一個實施例,提供執(zhí)行SHA-256消息調(diào)度的兩個專用指令,在本文中稱為指令MSG1SHA256和MSG2SHA256。在一個實施例中,對于SHA-256輪操作的當(dāng)前輪i,指令MSG1SHA256基于先前計算的消息計算中間消息,如下:
Word0=s0(w[i-15])+w[i-16]
Word1=s0(w[i-14])+w[i-15]
Word2=s0(w[i-13])+w[i-14]
Word3=s0(w[i-12])+w[i-13]
在一個實施例中,對于SHA-256輪操作的當(dāng)前輪i,指令MSG2SHA256基于先前計算的消息和由指令MSG2SHA256產(chǎn)生的中間消息計算用于下一迭代的四個消息,如下:
w[i]=Word0Msg1+s1(w[i-2])+w[i-7]
w[i+1]=Word1Msg1+s1(w[i-1])+w[i-6]
w[i+2]=Word2Msg1+s1(w[i])+w[i-5]
w[i+3]=Word3Msg1+s1(w[i+1])+w[i-4]
其中例如在另一個流水線級中Word0Msg1,Word1Msg1,Word2Msg1和Word3Msg1由指令MSG1SHA256產(chǎn)生(例如,對應(yīng)于以上的Word0,Word1,Word2和Word 3)。
注意,w[i+2]和w[i+3]是基于w[i]和w[i+1]由指令MSG2SHA256計算的。因此,在w[i]和w[i+1]的計算完成之前計算w[i+2]和w[i+3]。如果這導(dǎo)致計算w[i+2]和w[i+3]所需的總時間超過為單個SIMD指令流水線分配的時間,則MSG2SHA256指令可被分成兩個單獨的指令,即,MSG2ASHA256和MSG2BSHA256。MSG2ASHA256將計算w[i]和w[i+1],而MSG2BSHA256將計算w[i+2]和w[i+3]。
在一個實施例中,指令MSG1SHA256可定義如下:
MSG1SHA256 XMM0,XMM1,XMM2
其中寄存器XMM0,XMM1和XMM2表示具有至少128位的寄存器,諸如可從因特爾AVX處理器族獲得的那些XMM寄存器。指令MSG1SHA256執(zhí)行接下來的四個SHA256消息輸入的中間計算。SHA-256調(diào)度消息輸入w用于輪16至63,如下:
w[i]:=w[i-16]+s0(w[i-15])+w[i-7]+s1(w[i-2])
在一個實施例中,輸入XMM2表示消息w(i-13),w(i-14),w(i-15)和w(i-16)。XMM2的格式的實施例可如下定義:
XMM2[127:96]=w(i-13)
XMM2[95:64]=w(i-14)
XMM2[63:32]=w(i-15)
XMM2[31:00]=w(i-16)
輸入XMM1表示消息w(i-9),w(i-10),w(i-11)和w(i-12)。XMM2的格式的實施例可如下定義:
XMM1[127:96]=w(i-9)
XMM1[95:64]=w(i-10)
XMM1[63:32]=w(i-11)
XMM1[31:00]=w(i-12)
輸出XMM0表示w(i-13)+s0(w(i-12)),w(i-14)+s0(w(i-13)),w(i-15)+s0(w(i-14))和w(i-16)+s0(w(i-15))。XMM0的格式的實施例可如下定義:
XMM0[127:96]=w(i-13)+s0(w[i-12])
XMM0[95:64]=w(i-14)+s0(w[i-13])
XMM0[63:32]=w(i-15)+s0(w[i-14])
XMM0[31:00]=w(i-16)+s0(w[i-15])
其中XMM0[127:96]表示用于確定w(i+3)的Msg1(i-13);XMM0[95:64]表示用于確定w(i+2)的Msg1(i-14);XMM0[63:32]表示用于確定w(i+1)的Msg1(i-15);以及XMM0[31:00]表示用于確定w(i)的Msg1(i-16)。
在一個實施例中,指令MSG2SHA256可定義如下:
MSG2SHA256XMM0,XMM1,XMM2
其中寄存器XMM0,XMM1和XMM2表示具有至少128位的寄存器,諸如可從因特爾AVX處理器族獲得的那些XMM寄存器。指令MSG2SHA256利用先前計算的MSG1SHA256指令的包含用于w(i-13)至w(i-16)的msg1值的XMM結(jié)果寄存器、保存消息輸入w(i-5)至w(i-8)的XMM寄存器和保存消息輸入w(i-1)至w(-4)的XMM寄存器來執(zhí)行用于接下來的四個SHA-256消息輸入的計算。
在一個實施例中,SHA-256調(diào)度消息輸入w用于輪16至63,如下:
w[i]:=w[i-16]+s0(w[i-15])+w[i-7]+s1(w[i-2])
w[i+1]:=msg1[i-15]+w[i-6]+s1(w(i-1))
其中中間結(jié)果msg[i-15]由指令MSG1SHA256例如在另一個流水線級中產(chǎn)生。消息w(i)和w(i+1)用于完成w(i+2)和w(i+3)的計算,例如具有其間的延遲,如下:
w[i+3]:=msg1[i-13]+w[i-4]+s1(w(i+1))
w[i+2]:=msg1[i-14]+w[i-5]+s1(w(i))
其中中間結(jié)果msg[i-13]和msg[i-14]由指令MSG1SHA256例如在另一個流水線級中產(chǎn)生。
在一個實施例中,指令MSG2SHA256的輸入包括三個具有至少128位的寄存器,諸如因特爾AVX處理器族的XMM寄存器。在一個實施例中,對于SHA-256輪操作的當(dāng)前輪i,輸入XMM2表示消息w(i-5),w(i-6),w(i-7)和w(i-8),如下:
XMM2[127:96]=w(i-5)
XMM2[95:64]=w(i-6)
XMM2[63:32]=w(i-7)
XMM2[31:00]=w(i-8)
在一個實施例中,對于SHA-256輪操作的當(dāng)前輪i,輸入XMM1表示消息w(i-1),w(i-2),w(i-3)和w(i-4),如下:
XMM1[127:96]=w(i-1)
XMM1[95:64]=w(i-2)
XMM1[63:32]=w(i-3)
XMM1[31:00]=w(i-4)
在一個實施例中,對于SHA-256輪操作的當(dāng)前輪i,輸入XMM0表示由MSG1SHA256指令產(chǎn)生的中間消息Msg1(i-13),Msg1(i-14),Msg1(i-15)和Msg1(i-16),如下:
XMM0[127:96]=w(i-13)AND s0(wi-12)
XMM0[95:64]=w(i-14)AND s0(wi-13)
XMM0[63:32]=w(i-15)AND s0(wi-14)
XMM0[31:00]=w(i-16)AND s0(wi-15)
在一個實施例中,對于SHA-256輪操作的當(dāng)前輪i,輸出XMM0表示消息w(i+3),w(i+2),w(i+1)和w(i),如下:
XMM0[127:96]=w(i+3)
XMM0[95:64]=w(i+2)
XMM0[63:32]=w(i+1)
XMM0[31:00]=w(i)
圖4是示出根據(jù)一個實施例的SHA-256輪操作的過程的框圖。參見圖4,利用處理器或處理器核的至少三個流水線級401-403定義過程的實施例。注意流水線級401-403可以或可以不是連續(xù)的流水線級,這取決于處理器的特定設(shè)計或配置。可將MSG1SHA256微代碼404,MSG2SHA256微代碼405和SHA256RNDS2微代碼406實現(xiàn)為圖1的SHA-2單元106的一部分。
根據(jù)一個實施例,響應(yīng)于指令MSG1SHA256,MSG1SHA256微代碼404執(zhí)行如上所述的SHA-256消息調(diào)度操作的第一部分。對于SHA-256輪操作的給定輪i,在流水線級401期間,MSG1SHA256微代碼404對先前生成的消息407-408執(zhí)行消息調(diào)度操作的第一部分并生成中間消息409。
根據(jù)一個實施例,響應(yīng)于指令MSG2SHA256,MSG2SHA256微代碼405執(zhí)行如上所述的SHA-256消息調(diào)度操作的第二部分。對于SHA-256輪操作的給定輪i,在流水線級402期間,MSG2SHA256微代碼405對先前生成的消息410-411和中間消息409執(zhí)行消息調(diào)度操作的第二部分并生成中間消息412。
根據(jù)一個實施例,響應(yīng)于指令SHA256RNDS2,SHA256RNDS2微代碼406執(zhí)行一輪如上所述的SHA-256輪操作。對于SHA-256輪操作的給定輪i,在流水線級403期間,SHA256RNDS2微代碼406對消息412和當(dāng)前的SHA-256狀態(tài)413執(zhí)行輪操作執(zhí)行,并生成用于下一輪或迭代的SHA-256狀態(tài)414。注意在該示例中,存儲在寄存器412中的w(i+3),w(i+2),w(i+1)和w(i)中的每一個具有32位。它可用于執(zhí)行至少兩輪SHA-256輪操作。如果寄存器412可存儲更多的消息輸入,則也可執(zhí)行更多輪的SHA-256輪操作,只要能滿足流水線等待時間要求即可。
圖5是示出根據(jù)一個實施例執(zhí)行SHA-2輪操作的方法的流程圖。方法500可以通過圖1的SHA-2單元106來執(zhí)行。參考圖5,在框501,接收指令(例如,SHA256RNDS2),其中該指令包括第一操作數(shù)(例如,YMM1)和第二操作數(shù)(例如,YMM2)。在框502,從第一操作數(shù)提取SHA-2狀態(tài)(例如,狀態(tài)A至H),并且從第二操作數(shù)提取至少一個消息輸入(例如,至少一個KW)。在框503,根據(jù)SHA-2規(guī)范對SHA-2狀態(tài)和消息輸入執(zhí)行SHA-2(例如,SHA-256輪)輪操作的至少一輪。在框504,在第一操作數(shù)指定的寄存器中基于SHA-2輪操作的至少一輪的結(jié)果更新SHA-2狀態(tài)。
圖6是示出根據(jù)一個實施例執(zhí)行SHA-2消息調(diào)度操作的方法的流程圖。方法600可由圖1的SHA-2單元106執(zhí)行,作為SHA-2消息調(diào)度操作的第一部分。參考圖6,在框601,接收指令(例如,MSG1SHA256),其中指令包括三個操作數(shù)(例如,XMM0,XMM1,XMM2),每個操作數(shù)標(biāo)識具有至少128位的寄存器。在框602,從第二和第三操作數(shù)(例如,XMM1和XMM2)提取多個消息輸入(例如,8個輸入)。在框603,基于消息輸入執(zhí)行SHA-2消息調(diào)度操作的第一部分。在框604生成中間結(jié)果并將其存儲在與第一操作數(shù)(例如XMM0)相關(guān)聯(lián)的寄存器中。
圖7是示出根據(jù)一個實施例執(zhí)行SHA-2消息調(diào)度操作的方法的流程圖。方法700可由圖1的SHA-2單元106執(zhí)行,作為消息調(diào)度操作的第二部分。參考圖7,在框701,接收指令(例如,MSG2SHA256),其中指令包括三個操作數(shù)(例如,XMM0,XMM1,XMM2),每個操作數(shù)標(biāo)識具有至少128位的寄存器。在框702,從第一操作數(shù)(例如,XMM0)獲取SHA-2調(diào)度操作的第一部分的中間結(jié)果,且從第二和第三操作數(shù)(例如,XMM1和XMM2)獲取多個消息輸入。在框703,基于中間結(jié)果和消息輸入執(zhí)行SHA-2消息調(diào)度操作的第二部分。在框704,生成SHA-2消息調(diào)度操作的最終結(jié)果并將其存儲在與第一操作數(shù)(例如,XMM0)相關(guān)聯(lián)的寄存器中。
圖8A-8C是示出根據(jù)一個實施例的SHA-256輪操作的過程的偽代碼。參考圖8A-8C,在該示例中,具有256位的YMM寄存器用于存儲消息輸入,其中每個消息輸入包括32位。YMM寄存器可實際存儲至少四個(高達(dá)八個)消息輸入,其中每個消息輸入具有32位。結(jié)果,對于每次迭代,可經(jīng)由指令SHA256RNDS2中的兩個執(zhí)行至少四輪SHA-256,如在圖8A的行801和802所示。注意XMM寄存器用于并行計算四個消息項。如果YMM寄存器用于一次4項,則不使用較高的128位。對于計算8個消息項,具有YMM寄存器的MSG1工作良好,但可將MSG2分成2或4個指令。如上所述,可在每次迭代中執(zhí)行更多或更少的輪,這取決于處理器或處理器核的特定配置。
本發(fā)明的實施例的示例包括處理器,其具有指令解碼器,用于接收第一指令以處理安全散列算法2(SHA-2)散列算法,所述第一指令具有用于存儲SHA-2狀態(tài)的第一操作數(shù)以及用于存儲多個消息和輪常數(shù)的第二操作數(shù);以及耦合到指令解碼器的執(zhí)行單元,用于響應(yīng)于第一指令對所述第一操作數(shù)指定的SHA-2狀態(tài)和所述第二操作數(shù)指定的多個消息和輪常數(shù)執(zhí)行一輪或多輪SHA-2散列算法。第一操作數(shù)指定具有至少256位或512位的第一寄存器以存儲用于分別執(zhí)行SHA-256輪操作或SHA-512輪操作的SHA-2狀態(tài)變量的數(shù)據(jù)。第二操作數(shù)指定具有至少64位或128位的第二寄存器或存儲器位置,以分別存儲用于SHA-256輪操作或SHA-512輪操作的至少兩個消息和輪常數(shù)。響應(yīng)于作為單指令多數(shù)據(jù)(SIMD)指令的第一指令,執(zhí)行SHA-2算法的至少兩輪。指令解碼器接收第二指令,且其中響應(yīng)于第二指令,執(zhí)行單元被配置成基于由第二指令指定的多個第一先前消息執(zhí)行消息調(diào)度操作的第一部分并生成中間結(jié)果。第二指令包括第三操作數(shù)、第四操作數(shù)和第五操作數(shù)。對于SHA-2輪操作的當(dāng)前輪i,第三操作數(shù)指定用于存儲消息w(i-13)、w(i-14)、w(i-15)和w(i-16)的寄存器。第四操作數(shù)指定用于存儲消息w(i-9)、w(i-10)、w(i-11)和w(i-12)的寄存器。中間結(jié)果被存儲在由第五操作數(shù)指定的寄存器中。中間結(jié)果包括w(i-3)+s0(w(i-12))、w(i-14)+s0(w(i-13))、w(i-15)+s0(w(i-14))、w(i-16)+s0(w(i-15)),其中函數(shù)s0(x)由s0(x)=(x ROTR 7)XOR(x ROTR 18)XOR(x ROTR 3)表示。指令解碼器接收第三指令,其中響應(yīng)于第三指令,所述執(zhí)行單元配置成對第三指令中指定的中間結(jié)果和第二先前消息執(zhí)行消息調(diào)度操作的第二部分并生成接下來的輸入消息,用于在SHA-2算法的一輪或多輪的接下來的迭代期間執(zhí)行SHA-2算法的一輪或多輪操作。第三指令包括第六操作數(shù)、第七操作數(shù)和第八操作數(shù),其中對于SHA-2輪操作的當(dāng)前輪i,第六操作數(shù)指定用于存儲消息w(i-5)、w(i-6)、w(i-7)和w(i-8)的寄存器。第七操作數(shù)指定用于存儲消息w(i-1)、w(i-2)、w(i-3)和w(i-4)的寄存器。接下來的輸入消息包括將要存儲在由第八操作數(shù)指定的寄存器中的w(i)、w(i+1)、w(i+2)和w(i+3)。
本發(fā)明的實施例的示例包括一種方法,包括:在指令解碼器處接收第一指令以處理安全散列算法2(SHA-2)散列算法,所述第一指令具有用于存儲SHA-2狀態(tài)的第一操作數(shù)以及用于存儲多個消息和輪常數(shù)的第二操作數(shù);以及響應(yīng)于第一指令,由耦合到指令解碼器的執(zhí)行單元對第一操作數(shù)指定的SHA-2狀態(tài)和第二操作數(shù)指定的多個消息和輪常數(shù)執(zhí)行一輪或多輪SHA-2散列算法。第一操作數(shù)指定具有至少256位或512位的第一寄存器以存儲用于分別執(zhí)行SHA-256輪操作或SHA-512輪操作的SHA-2狀態(tài)變量的數(shù)據(jù)。第二操作數(shù)指定具有至少64位或128位的第二寄存器或存儲器位置,以分別存儲用于SHA-256輪操作或SHA-512輪操作的至少兩個消息和輪常數(shù)。響應(yīng)于作為單指令多數(shù)據(jù)(SIMD)指令的第一指令,執(zhí)行SHA-2算法的至少兩輪。該方法還包括由指令解碼器接收第二指令,第二指令具有第三操作數(shù)、第四操作數(shù)和第五操作數(shù);響應(yīng)于第二指令,執(zhí)行單元基于由第二指令指定的多個第一先前消息執(zhí)行消息調(diào)度操作的第一部分;并生成中間結(jié)果。對于SHA-2輪操作的當(dāng)前輪i,第三操作數(shù)指定用于存儲消息w(i-13)、w(i-14)、w(i-15)和w(i-16)的寄存器,其中第四操作數(shù)指定用于存儲消息w(i-9)、w(i-10)、w(i-11)和w(i-12)的寄存器,且其中中間結(jié)果被存儲在由第五操作數(shù)指定的寄存器中。中間結(jié)果包括w(i-3)+s0(w(i-12))、w(i-14)+s0(w(i-13))、w(i-15)+s0(w(i-14))、w(i-16)+s0(w(i-15)),其中函數(shù)s0(x)由s0(x)=(x ROTR 7)XOR(x ROTR 18)XOR(x ROTR 3)表示。該方法還包括指令解碼器接收第三指令,該第三指令具有第六操作數(shù)、第七操作數(shù)和第八操作數(shù);響應(yīng)于第三指令,通過執(zhí)行來對第三指令中指定的中間結(jié)果和第二先前消息執(zhí)行消息調(diào)度操作的第二部分;并生成接下來的輸入消息,用于在SHA-2算法的一輪或多輪的接下來的迭代期間執(zhí)行SHA-2算法的一輪或多輪操作。對于SHA-2輪操作的當(dāng)前輪i,第六操作數(shù)指定用于存儲消息w(i-5)、w(i-6)、w(i-7)和w(i-8)的寄存器,其中第七操作數(shù)指定用于存儲消息w(i-1)、w(i-2)、w(i-3)和w(i-4)的寄存器,且其中接下來的輸入消息包括將要存儲在由第八操作數(shù)指定的寄存器中的w(i)、w(i+1)、w(i+2)和w(i+3)。本發(fā)明的實施例的示例還包括數(shù)據(jù)處理系統(tǒng),具有,互連;耦合互連的處理器,用于執(zhí)行上述方法;以及耦合到互連的動態(tài)隨機(jī)存取存儲器(DRAM)。
指令集,或指令集架構(gòu)(ISA)是涉及編程的計算機(jī)架構(gòu)的一部分,并可以包括原生數(shù)據(jù)類型、指令、寄存器架構(gòu)、尋址模式、存儲器架構(gòu)、中斷和異常處理、以及外部輸入和輸出(I/O)。在本文中術(shù)語指令一般指宏指令——即被提供給處理器(或指令轉(zhuǎn)換器,該指令轉(zhuǎn)換器(例如使用靜態(tài)二進(jìn)制變換、包括動態(tài)編譯的動態(tài)二進(jìn)制變換)變換、變形、仿真、或以其他方式將指令轉(zhuǎn)換成要由處理器處理的一個或多個指令)以用于執(zhí)行的指令——而不是微指令或微操作(micro-op)——它們是處理器的解碼器解碼宏指令的結(jié)果。
ISA與微架構(gòu)不同,微架構(gòu)是實現(xiàn)指令集的處理器的內(nèi)部設(shè)計。帶有不同的微架構(gòu)的處理器可以共享共同的指令集。例如,奔騰四(Pentium 4)處理器、酷睿(CoreTM)處理器、以及來自加利福尼亞州桑尼威爾(Sunnyvale)的超微半導(dǎo)體有限公司(Advanced Micro Devices,Inc.)的諸多處理器執(zhí)行幾乎相同版本的x86指令集(在更新的版本中加入了一些擴(kuò)展),但具有不同的內(nèi)部設(shè)計。例如,ISA的相同寄存器架構(gòu)在不同的微架構(gòu)中使用公知的技術(shù)以不同方法來實現(xiàn),公知的技術(shù)包括專用物理寄存器、使用寄存器重命名機(jī)制(例如,使用寄存器別名表(RAT)、重排序緩沖器(ROB)、以及引退寄存器組;使用多個寄存器映射和寄存器池)的一個或多個動態(tài)分配物理寄存器,等等。除非另行指出,術(shù)語寄存器架構(gòu)、寄存器組和寄存器在本文中用于指代對軟件/編程者可見的寄存器以及指令指定寄存器的方式。在需要特殊性的情況下,形容詞邏輯、架構(gòu)、或軟件可見的將用于表示寄存器架構(gòu)中的寄存器/寄存器組,而不同的形容詞將用于指定給定微架構(gòu)中的寄存器(例如,物理寄存器、重新排序緩沖器、引退寄存器、寄存器池)。
指令集包括一個或多個指令格式。給定指令格式定義各個字段(位的數(shù)量、位的位置)以指定要執(zhí)行的操作(操作碼)以及要對其執(zhí)行該操作的操作碼等。通過指令模板(或子格式)的定義來進(jìn)一步分解一些指令格式。例如,給定指令格式的指令模板可被定義為具有指令格式的字段(所包括的字段通常按照相同順序,但是至少一些字段具有不同的位位置,因為包括更少的字段)的不同子集,和/或被定義為具有不同解釋的給定字段。由此,ISA的每一指令使用給定指令格式(并且如果定義,則在該指令格式的指令模板的給定一個中)來表達(dá),并且包括用于指定操作和操作數(shù)的字段。例如,示例性ADD指令具有專用操作碼以及包括用于指定該操作碼的操作碼字段和用于選擇操作數(shù)的操作數(shù)字段(源1/目的地以及源2)的指令格式,并且該ADD指令在指令流中的出現(xiàn)將具有選擇專用操作數(shù)的操作數(shù)字段中的專用內(nèi)容。
科學(xué)、金融、自動向量化的通用、RMS(識別、挖掘以及合成)以及可視和多媒體應(yīng)用程序(例如,2D/3D圖形、圖像處理、視頻壓縮/解壓縮、語音識別算法和音頻操縱)常常需要對大量的數(shù)據(jù)項執(zhí)行相同操作(被稱為“數(shù)據(jù)并行性”)。單指令多數(shù)據(jù)(SIMD)是指使處理器對多個數(shù)據(jù)項執(zhí)行操作的一種指令。SIMD技術(shù)特別適于能夠在邏輯上將寄存器中的位分割為若干個固定尺寸的數(shù)據(jù)元素的處理器,其中每一個數(shù)據(jù)元素都表示單獨的值。例如,256位寄存器中的位可以作為四個單獨的64位打包的數(shù)據(jù)元素(四字(Q)尺寸的數(shù)據(jù)元素)、八個單獨的32位打包的數(shù)據(jù)元素(雙字(D)尺寸的數(shù)據(jù)元素)、十六單獨的16位打包的數(shù)據(jù)元素(字(W)尺寸的數(shù)據(jù)元素)、或三十二個單獨的8位數(shù)據(jù)元素(字節(jié)(B)尺寸的數(shù)據(jù)元素),被指定為要被操作的源操作數(shù)。這種類型的數(shù)據(jù)被稱為打包數(shù)據(jù)類型或向量數(shù)據(jù)類型,這種數(shù)據(jù)類型的操作數(shù)被稱為打包數(shù)據(jù)操作數(shù)或向量操作數(shù)。換句話說,打包數(shù)據(jù)項或向量指的是打包數(shù)據(jù)元素的序列,并且打包數(shù)據(jù)操作數(shù)或向量操作數(shù)是SIMD指令(也稱為打包數(shù)據(jù)指令或向量指令)的源操作數(shù)或目的地操作數(shù)。
作為示例,一種類型的SIMD指令指定要以縱向方式對兩個源向量操作數(shù)執(zhí)行的單個向量操作,以生成相同尺寸的、具有相同數(shù)量的數(shù)據(jù)元素、且有相同數(shù)據(jù)元素順序的目的地向量操作數(shù)(也稱為結(jié)果向量操作數(shù))。源向量操作數(shù)中的數(shù)據(jù)元素被稱為源數(shù)據(jù)元素,而目的地向量操作數(shù)中的數(shù)據(jù)元素被稱為目的地或結(jié)果數(shù)據(jù)元素。這些源向量操作數(shù)具有相同尺寸,并包含相同寬度的數(shù)據(jù)元素,因此它們包含相同數(shù)量的數(shù)據(jù)元素。兩個源向量操作數(shù)中的相同位位置中的源數(shù)據(jù)元素形成數(shù)據(jù)元素對(也稱為相對應(yīng)的數(shù)據(jù)元素;即,每個源操作數(shù)的數(shù)據(jù)元素位置0中的數(shù)據(jù)元素相對應(yīng),每個源操作數(shù)的數(shù)據(jù)元素位置1中的數(shù)據(jù)元素相對應(yīng),以此類推)。分別地對這些源數(shù)據(jù)元素對中的每一對執(zhí)行由該SIMD指令所指定的操作,以生成匹配數(shù)量的結(jié)果數(shù)據(jù)元素,如此,每一對源數(shù)據(jù)元素都具有對應(yīng)的結(jié)果數(shù)據(jù)元素。由于操作是縱向的,并且由于結(jié)果向量操作數(shù)尺寸相同、具有相同數(shù)量的數(shù)據(jù)元素、且結(jié)果數(shù)據(jù)元素與源向量操作數(shù)以相同數(shù)據(jù)元素順序來存儲,因此,結(jié)果數(shù)據(jù)元素與源向量操作數(shù)中的它們的對應(yīng)的源數(shù)據(jù)元素對處于結(jié)果向量操作數(shù)的相同位位置中。除此示例性類型的SIMD指令之外,還有各種其他類型的SIMD指令(例如,僅有一個或具有兩個以上的源向量操作數(shù)的SIMD指令;以水平方式操作的SIMD指令;生成不同尺寸的結(jié)果向量操作數(shù)的SIMD指令;具有不同尺寸的數(shù)據(jù)元素的SIMD指令;和/或具有不同的數(shù)據(jù)元素順序的SIMD指令)。應(yīng)該理解,術(shù)語目的地向量操作數(shù)(或目的地操作數(shù))被定義為執(zhí)行由指令所指定的操作的直接結(jié)果,包括將該目的地操作數(shù)存儲在某一位置(寄存器或在由該指令所指定的存儲器地址),以便它可以作為源操作數(shù)由另一指令訪問(由另一指令指定該同一個位置)。
諸如由具有包括x86、MMXTM、流式SIMD擴(kuò)展(SSE)、SSE2、SSE3、SSE4.1以及SSE4.2指令的指令集的CoreTM處理器使用的SIMD技術(shù)之類的SIMD技術(shù)在應(yīng)用性能方面實現(xiàn)了顯著的改善。已經(jīng)發(fā)布和/或公布了被稱為高級向量擴(kuò)展(AVX)(AVX1和AVX2)且使用向量擴(kuò)展(VEX)編碼方案的附加SIMD擴(kuò)展集(例如,參見2011年10月的64和IA-32架構(gòu)軟件開發(fā)者手冊,并且參見2011年6月的高級向量擴(kuò)展編程參考)。
本文中所描述的指令的實施例可以不同的格式體現(xiàn)。另外,在下文中詳述示例性系統(tǒng)、架構(gòu)、以及流水線。指令的實施例可在這些系統(tǒng)、架構(gòu)、以及流水線上執(zhí)行,但是不限于詳述的系統(tǒng)、架構(gòu)、以及流水線。
VEX編碼允許指令具有兩個以上操作數(shù),并且允許SIMD向量寄存器比128位長。VEX前綴的使用提供了三個操作數(shù)(或者更多)句法。例如,先前的兩操作數(shù)指令執(zhí)行改寫源操作數(shù)的操作(諸如A=A+B)。VEX前綴的使用使操作數(shù)執(zhí)行非破壞性操作,諸如A=B+C。
圖9A示出示例性AVX指令格式,包括VEX前綴2102、實操作碼字段2130、MoD R/M字節(jié)2140、SIB字節(jié)2150、位移字段2162以及IMM8 2172。圖9B示出來自圖9A的哪些字段構(gòu)成完整操作碼字段2174和基礎(chǔ)操作字段2142。圖9C示出來自圖9A的哪些字段構(gòu)成寄存器索引字段2144。
VEX前綴(字節(jié)0-2)2102以三字節(jié)形式進(jìn)行編碼。第一字節(jié)是格式字段2140(VEX字節(jié)0,位[7:0]),該格式字段2140包含明確的C4字節(jié)值(用于區(qū)分C4指令格式的唯一值)。第二-第三字節(jié)(VEX字節(jié)1-2)包括提供專用能力的多個位字段。具體地,REX字段2105(VEX字節(jié)1,位[7-5])由VEX.R位字段(VEX字節(jié)1,位[7]–R)、VEX.X位字段(VEX字節(jié)1,位[6]–X)以及VEX.B位字段(VEX字節(jié)1,位[5]–B)組成。這些指令的其他字段對如在本領(lǐng)域中已知的寄存器索引的較低三個位(rrr、xxx以及bbb)進(jìn)行編碼,由此可通過增加VEX.R、VEX.X以及VEX.B來形成Rrrr、Xxxx以及Bbbb。操作碼映射字段2115(VEX字節(jié)1,位[4:0]–mmmmm)包括對隱含的前導(dǎo)操作碼字節(jié)進(jìn)行編碼的內(nèi)容。W字段2164(VEX字節(jié)2,位[7]–W)由記號VEX.W表示,并且提供取決于該指令而不同的功能。VEX.vvvv 2120(VEX字節(jié)2,位[6:3]-vvvv)的作用可包括如下:1)VEX.vvvv編碼第一源寄存器操作數(shù)且對具有兩個或兩個以上源操作數(shù)的指令有效,第一源寄存器操作數(shù)以反轉(zhuǎn)(1補碼)形式被指定;2)VEX.vvvv編碼目的地寄存器操作數(shù),目的地寄存器操作數(shù)針對特定向量位移以1補碼的形式被指定;或者3)VEX.vvvv不編碼任何操作數(shù),保留該字段,并且應(yīng)當(dāng)包含1111b。如果VEX.L 2168尺寸字段(VEX字節(jié)2,位[2]-L)=0,則它指示128位向量;如果VEX.L=1,則它指示256位向量。前綴編碼字段2125(VEX字節(jié)2,位[1:0]-pp)提供了用于基礎(chǔ)操作字段的附加位。
實操作碼字段2130(字節(jié)3)還被稱為操作碼字節(jié)。操作碼的一部分在該字段中被指定。MOD R/M字段2140(字節(jié)4)包括MOD字段2142(位[7-6])、Reg字段2144(位[5-3])、以及R/M字段2146(位[2-0])。Reg字段2144的作用可包括如下:對目的地寄存器操作數(shù)或源寄存器操作數(shù)(Rrrr中的rrr)進(jìn)行編碼;或者被視為操作碼擴(kuò)展且不用于對任何指令操作數(shù)進(jìn)行編碼。R/M字段2146的作用可包括如下:對引用存儲器地址的指令操作數(shù)進(jìn)行編碼;或者對目的地寄存器操作數(shù)或源寄存器操作數(shù)進(jìn)行編碼。
比例、索引、基址(SIB)-比例字段2150(字節(jié)5)的內(nèi)容包括用于存儲器地址生成的SS1252(位[7-6])。先前已經(jīng)針對寄存器索引Xxxx和Bbbb參考了SIB.xxx 2154(位[5-3])和SIB.bbb 2156(位[2-0])的內(nèi)容。位移字段2162和立即數(shù)字段(IMM8)2172包含地址數(shù)據(jù)。
向量友好指令格式是適于向量指令(例如,存在專用于向量操作的特定字段)的指令格式。盡管描述了其中通過向量友好指令格式支持向量和標(biāo)量操作兩者的實施例,但是替代實施例僅使用通過向量友好指令格式的向量操作。
圖10A、圖10B是示出根據(jù)本發(fā)明的實施例的通用向量友好指令格式及其指令模板的框圖;圖10A是示出根據(jù)本發(fā)明的實施例的通用向量友好指令格式及其A類指令模板的框圖;而圖10B是示出根據(jù)本發(fā)明的實施例的通用向量友好指令格式及其B類指令模板的框圖。具體地,針對通用向量友好指令格式2200定義A類和B類指令模板,兩者包括無存儲器訪問2205的指令模板和存儲器訪問2220的指令模板。在向量友好指令格式的上下文中的術(shù)語“通用”指不束縛于任何專用指令集的指令格式。
盡管將描述其中向量友好指令格式支持以下情況的本發(fā)明的實施例,即64字節(jié)向量操作數(shù)長度(或尺寸)與32位(4字節(jié))或64位(8字節(jié))數(shù)據(jù)元素寬度(或尺寸)(并且由此,64字節(jié)向量由16雙字尺寸的元素或者替代地8四字尺寸的元素組成)、64字節(jié)向量操作數(shù)長度(或尺寸)與16位(2字節(jié))或8位(1字節(jié))數(shù)據(jù)元素寬度(或尺寸)、32字節(jié)向量操作數(shù)長度(或尺寸)與32位(4字節(jié))、64位(8字節(jié))、16位(2字節(jié))、或8位(1字節(jié))數(shù)據(jù)元素寬度(或尺寸)、以及16字節(jié)向量操作數(shù)長度(或尺寸)與32位(4字節(jié))、64位(8字節(jié))、16位(2字節(jié))、或8位(1字節(jié))數(shù)據(jù)元素寬度(或尺寸),但是替代實施例可支持更大、更小、和/或不同的向量操作數(shù)尺寸(例如,256字節(jié)向量操作數(shù))與更大、更小或不同的數(shù)據(jù)元素寬度(例如,128位(16字節(jié))數(shù)據(jù)元素寬度)。
圖10A中的A類指令模板包括:1)在無存儲器訪問2205的指令模板內(nèi),示出無存儲器訪問的完全舍入控制型操作2210的指令模板、以及無存儲器訪問的數(shù)據(jù)變換型操作2215的指令模板;以及2)在存儲器訪問2220的指令模板內(nèi),示出存儲器訪問的時效性2225的指令模板和存儲器訪問的非時效性2230的指令模板。圖10B中的B類指令模板包括:1)在無存儲器訪問2205的指令模板內(nèi),示出無存儲器訪問的寫掩碼控制的部分舍入控制型操作2212的指令模板以及無存儲器訪問的寫掩碼控制的vsize型操作2217的指令模板;以及2)在存儲器訪問2220的指令模板內(nèi),示出存儲器訪問的寫掩碼控制2227的指令模板。
通用向量友好指令格式2200包括以下列出的按照在圖10A和圖10B中示出的順序的如下字段。格式字段2240-該字段中的特定值(指令格式標(biāo)識符值)唯一地標(biāo)識向量友好指令格式,并且由此標(biāo)識指令在指令流中以向量友好指令格式出現(xiàn)。由此,該字段對于僅具有通用向量友好指令格式的指令集是不需要的,在這個意義上該字段是任選的?;A(chǔ)操作字段2242-其內(nèi)容區(qū)分不同的基礎(chǔ)操作。
寄存器索引字段2244-其內(nèi)容直接或者通過地址生成來指定源或目的地操作數(shù)在寄存器中或者在存儲器中的位置。這些字段包括足夠數(shù)量的位以從PxQ(例如,32x512、16x128、32x1024、64x1024)個寄存器組選擇N個寄存器。盡管在一個實施例中N可高達(dá)三個源和一個目的地寄存器,但是替代實施例可支持更多或更少的源和目的地寄存器(例如,可支持高達(dá)兩個源,其中這些源中的一個源還用作目的地,可支持高達(dá)三個源,其中這些源中的一個源還用作目的地,可支持高達(dá)兩個源和一個目的地)。
修飾符(modifier)字段2246-其內(nèi)容將指定存儲器訪問的以通用向量指令格式出現(xiàn)的指令與不指定存儲器訪問的以通用向量指令格式出現(xiàn)的指令區(qū)分開;即在無存儲器訪問2205的指令模板與存儲器訪問2220的指令模板之間進(jìn)行區(qū)分。存儲器訪問操作讀取和/或?qū)懭氲酱鎯ζ鲗哟?在一些情況下,使用寄存器中的值來指定源和/或目的地地址),而非存儲器訪問操作不這樣(例如,源和/或目的地是寄存器)。盡管在一個實施例中,該字段還在三種不同的方式之間選擇以執(zhí)行存儲器地址計算,但是替代實施例可支持更多、更少或不同的方式來執(zhí)行存儲器地址計算。
擴(kuò)充操作字段2250-其內(nèi)容區(qū)分除基礎(chǔ)操作以外還要執(zhí)行各種不同操作中的哪一個操作。該字段是針對上下文的。在本發(fā)明的一個實施例中,該字段被分成類字段2268、α字段2252、以及β字段2254。擴(kuò)充操作字段2250允許在單一指令而非2、3或4個指令中執(zhí)行多組共同的操作。比例字段2260-其內(nèi)容允許用于存儲器地址生成(例如,用于使用2比例*索引+基址的地址生成)的索引字段的內(nèi)容的按比例縮放。
位移字段2,262A-其內(nèi)容用作存儲器地址生成的一部分(例如,用于使用2比例*索引+基址+位移的地址生成)。位移因數(shù)字段2262B(注意,位移字段2262A直接在位移因數(shù)字段2262B上的并置指示使用一個或另一個)-其內(nèi)容用作地址生成的一部分,它指定通過存儲器訪問的尺寸(N)按比例縮放的位移因數(shù),其中N是存儲器訪問中的字節(jié)數(shù)量(例如,用于使用2比例*索引+基址+按比例縮放的位移的地址生成)。忽略冗余的低階位,并且因此將位移因數(shù)字段的內(nèi)容乘以存儲器操作數(shù)總尺寸(N)以生成在計算有效地址中使用的最終位移。N的值由處理器硬件在運行時基于完整操作碼字段2274(稍候在本文中描述)和數(shù)據(jù)操縱字段2254C確定。位移字段2262A和位移因數(shù)字段2262B可以不用于無存儲器訪問2205的指令模板和/或不同的實施例可實現(xiàn)兩者中的僅一個或不實現(xiàn)兩者中的任一個,在這個意義上位移字段2262A和位移因數(shù)字段2262B是任選的。
數(shù)據(jù)元素寬度字段2264-其內(nèi)容區(qū)分使用多個數(shù)據(jù)元素寬度中的哪一個(在一些實施例中用于所有指令,在其他實施例中只用于一些指令)。如果支持僅一個數(shù)據(jù)元素寬度和/或使用操作碼的某一方面來支持?jǐn)?shù)據(jù)元素寬度,則該字段是不需要的,在這個意義上該字段是任選的。
寫掩碼字段2270-其內(nèi)容在每一數(shù)據(jù)元素位置的基礎(chǔ)上控制目的地向量操作數(shù)中的數(shù)據(jù)元素位置是否反映基礎(chǔ)操作和擴(kuò)充操作的結(jié)果。A類指令模板支持合并-寫掩碼操作,而B類指令模板支持合并寫掩碼操作和歸零寫掩碼操作兩者。當(dāng)合并時,向量掩碼允許在執(zhí)行任何操作期間保護(hù)目的地中的任何元素集免于更新(由基礎(chǔ)操作和擴(kuò)充操作指定);在另一實施例中,保持其中對應(yīng)掩碼位具有0的目的地的每一元素的舊值。相反,當(dāng)歸零時,向量掩碼允許在執(zhí)行任何操作期間使目的地中的任何元素集歸零(由基礎(chǔ)操作和擴(kuò)充操作指定);在一個實施例中,目的地的元素在對應(yīng)掩碼位具有0值時被設(shè)為0。該功能的子集是控制執(zhí)行的操作的向量長度的能力(即,從第一個到最后一個要修改的元素的跨度),然而,被修改的元素不一定要是連續(xù)的。由此,寫掩碼字段2270允許部分向量操作,這包括加載、存儲、算術(shù)、邏輯等。盡管描述了其中寫掩碼字段2270的內(nèi)容選擇了多個寫掩碼寄存器中的包含要使用的寫掩碼的一個寫掩碼寄存器(并且由此寫掩碼字段2270的內(nèi)容間接地標(biāo)識了要執(zhí)行的掩碼操作)的本發(fā)明的實施例,但是替代實施例相反或另外允許掩碼寫字段2270的內(nèi)容直接地指定要執(zhí)行的掩碼操作。
立即數(shù)字段2272-其內(nèi)容允許對立即數(shù)的指定。該字段在實現(xiàn)不支持立即數(shù)的通用向量友好格式中不存在且在不使用立即數(shù)的指令中不存在,在這個意義上該字段是任選的。類字段2268-其內(nèi)容在不同類的指令之間進(jìn)行區(qū)分。參考圖10A和圖10B,該字段的內(nèi)容在A類和B類指令之間進(jìn)行選擇。在圖10A和圖10B中,圓角方形用于指示專用值存在于字段中(例如,在圖10A和圖10B中分別用于類字段2268的A類2268A和B類2268B)。
在A類非存儲器訪問2205的指令模板的情況下,α字段2252被解釋為其內(nèi)容區(qū)分要執(zhí)行不同擴(kuò)充操作類型中的哪一種(例如,針對無存儲器訪問的舍入型操作2210和無存儲器訪問的數(shù)據(jù)變換型操作2215的指令模板分別指定舍入2252A.1和數(shù)據(jù)變換2,52A.2)的RS字段2252A,而β字段2254區(qū)分要執(zhí)行指定類型的操作中的哪一種。在無存儲器訪問2205指令模板中,比例字段2260、位移字段2262A以及位移比例字段2262B不存在。
在無存儲器訪問的完全舍入控制型操作2210的指令模板中,β字段2254被解釋為其內(nèi)容提供靜態(tài)舍入的舍入控制字段2254A。盡管在本發(fā)明的所述實施例中舍入控制字段2254A包括抑制所有浮點異常(SAE)字段2256和舍入操作控制字段2258,但是替代實施例可支持、可將這些概念兩者都編碼成相同的字段或者僅具有這些概念/字段中的一個或另一個(例如,可僅有舍入操作控制字段2258)。
SAE字段2256-其內(nèi)容區(qū)分是否停用異常事件報告;當(dāng)SAE字段2256的內(nèi)容指示啟用抑制時,給定指令不報告任何種類的浮點異常標(biāo)志且不喚起任何浮點異常處理程序。
舍入操作控制字段2258-其內(nèi)容區(qū)分執(zhí)行一組舍入操作中的哪一個(例如,向上舍入、向下舍入、向零舍入、以及就近舍入)。由此,舍入操作控制字段2258允許在每一指令的基礎(chǔ)上改變舍入模式。在其中處理器包括用于指定舍入模式的控制寄存器的本發(fā)明的一個實施例中,舍入操作控制字段2250的內(nèi)容優(yōu)先于該寄存器值。
在無存儲器訪問的數(shù)據(jù)變換型操作2215的指令模板中,β字段2254被解釋為數(shù)據(jù)變換字段2254B,其內(nèi)容區(qū)分要執(zhí)行多個數(shù)據(jù)變換中的哪一個(例如,無數(shù)據(jù)變換、混合、廣播)。
在A類存儲器訪問2220的指令模板的情況下,α字段2252被解釋為驅(qū)逐提示字段2252B,其內(nèi)容區(qū)分要使用驅(qū)逐提示中的哪一個(在圖10A中,為存儲器訪問時間2225指令模板和存儲器訪問非時間2230的指令模板分別指定時間2252B.1和非時間2252B.2)、而β字段2254被解釋為數(shù)據(jù)操縱字段2254C,其內(nèi)容區(qū)分要執(zhí)行大量數(shù)據(jù)操縱操作(也稱為基元(primitive))中的哪一個(例如,無操縱、廣播、源的向上轉(zhuǎn)換、以及目的地的向下轉(zhuǎn)換)。存儲器訪問2220的指令模板包括比例字段2260、以及任選的位移字段2262A或位移比例字段2262B。
向量存儲器指令使用轉(zhuǎn)換支持來執(zhí)行來自存儲器的向量加載并將向量存儲到存儲器。如同尋常的向量指令,向量存儲器指令以數(shù)據(jù)元素式的方式與存儲器來回傳輸數(shù)據(jù),其中實際傳輸?shù)脑赜蛇x為寫掩碼的向量掩碼的內(nèi)容規(guī)定。
時效性的數(shù)據(jù)是可能足夠快地重新使用以從高速緩存受益的數(shù)據(jù)。然而,這是提示,且不同的處理器可以不同的方式實現(xiàn)它,包括完全忽略該提示。非時效性的數(shù)據(jù)是不可能足夠快地重新使用以從第一級高速緩存中的高速緩存受益且應(yīng)當(dāng)被給予驅(qū)逐優(yōu)先級的數(shù)據(jù)。然而,這是提示,且不同的處理器可以不同的方式實現(xiàn)它,包括完全忽略該提示。
在B類指令模板的情況下,α字段2252被解釋為寫掩碼控制(Z)字段2252C,其內(nèi)容區(qū)分由寫掩碼字段2270控制的寫掩碼操作應(yīng)當(dāng)是合并還是歸零。
在B類非存儲器訪問2205的指令模板的情況下,β字段2254的一部分被解釋為RL字段2257A,其內(nèi)容區(qū)分要執(zhí)行不同擴(kuò)充操作類型中的哪一種(例如,針對無存儲器訪問的寫掩碼控制部分舍入控制類型操作2212的指令模板和無存儲器訪問的寫掩碼控制VSIZE型操作2217的指令模板分別指定舍入2257A.1和向量長度(VSIZE)2257A.2),而β字段2254的其余部分區(qū)分要執(zhí)行指定類型的操作中的哪一種。在無存儲器訪問2205指令模板中,比例字段2260、位移字段2262A以及位移比例字段2262B不存在。
在無存儲器訪問的寫掩碼控制的部分舍入控制型操作2210的指令模板中,β字段2254的其余部分被解釋為舍入操作字段2259A,并且停用異常事件報告(給定指令不報告任何種類的浮點異常標(biāo)志且不喚起任何浮點異常處理程序)。
舍入操作控制字段2259A-正如舍入操作控制字段2258,其內(nèi)容區(qū)分執(zhí)行一組舍入操作中的哪一個(例如,向上舍入、向下舍入、向零舍入、以及就近舍入)。由此,舍入操作控制字段2259A允許在每一指令的基礎(chǔ)上改變舍入模式。在其中處理器包括用于指定舍入模式的控制寄存器的本發(fā)明的一個實施例中,舍入操作控制字段2250的內(nèi)容優(yōu)先于該寄存器值。
在無存儲器訪問的寫掩碼控制VSIZE型操作2217的指令模板中,β字段2254的其余部分被解釋為向量長度字段2259B,其內(nèi)容區(qū)分要執(zhí)行多個數(shù)據(jù)向量長度中的哪一個(例如,128字節(jié)、256字節(jié)、或512字節(jié))。
在B類存儲器訪問2220的指令模板的情況下,β字段2254的一部分被解釋為廣播字段2257B,其內(nèi)容區(qū)分是否要執(zhí)行廣播型數(shù)據(jù)操縱操作,而β字段2254的其余部分被解釋為向量長度字段2259B。存儲器訪問2220的指令模板包括比例字段2260、以及任選的位移字段2262A或位移比例字段2262B。
針對通用向量友好指令格式2200,示出完整操作碼字段2274包括格式字段2240、基礎(chǔ)操作字段2242以及數(shù)據(jù)元素寬度字段2264。盡管示出了其中完整操作碼字段2274包括所有這些字段的一個實施例,但是在不支持所有這些字段的實施例中,完整操作碼字段2274包括少于所有的這些字段。完整操作碼字段2274提供操作碼(opcode)。
擴(kuò)充操作字段2250、數(shù)據(jù)元素寬度字段2264以及寫掩碼字段2270允許在每一指令的基礎(chǔ)上以通用向量友好指令格式指定這些特征。寫掩碼字段和數(shù)據(jù)元素寬度字段的組合創(chuàng)建各種類型的指令,因為這些指令允許基于不同的數(shù)據(jù)元素寬度應(yīng)用該掩碼。
在A類和B類內(nèi)出現(xiàn)的各種指令模板在不同的情形下是有益的。在本發(fā)明的一些實施例中,不同處理器或者處理器內(nèi)的不同核可支持僅A類、僅B類、或者可支持兩類。舉例而言,旨在用于通用計算的高性能通用無序核可僅支持B類,旨在主要用于圖形和/或科學(xué)(吞吐量)計算的核可僅支持A類,并且旨在用于兩者的核可支持兩者(當(dāng)然,具有來自兩類的模板和指令的一些混合、但是并非來自兩類的所有模板和指令的核在本發(fā)明的范圍內(nèi))。同樣,單一處理器可包括多個核,所有核支持相同的類或者其中不同的核支持不同的類。舉例而言,在具有單獨的圖形和通用核的處理器中,圖形核中的旨在主要用于圖形和/或科學(xué)計算的一個核可僅支持A類,而通用核中的一個或多個可以是具有旨在用于通用計算的僅支持B類的無序執(zhí)行和寄存器重命名的高性能通用核。不具有單獨的圖形核的另一處理器可包括既支持A類又支持B類的一個或多個通用有序或無序核。當(dāng)然,在本發(fā)明的不同實施例中,來自一類的特征也可在其他類中實現(xiàn)。可使以高級語言撰寫的程序成為(例如,及時編譯或者統(tǒng)計編譯)各種不同的可執(zhí)行形式,包括:1)僅具有用于執(zhí)行的目標(biāo)處理器支持的類的指令的形式;或者2)具有使用所有類的指令的不同組合而編寫的替代例程且具有選擇這些例程以基于由當(dāng)前正在執(zhí)行代碼的處理器支持的指令而執(zhí)行的控制流代碼的形式。
圖11是示出根據(jù)本發(fā)明的實施例的示例性專用向量友好指令格式的框圖。圖11示出專用向量友好指令格式2300,其指定位置、尺寸、解釋和字段的次序、以及那些字段中的一些字段的值,在這個意義上向量友好指令格式800是專用的。專用向量友好指令格式2300可用于擴(kuò)展x86指令集,并且由此一些字段類似于在現(xiàn)有x86指令集及其擴(kuò)展(例如,AVX)中使用的那些字段或與之相同。該格式保持與具有擴(kuò)展的現(xiàn)有x86指令集的前綴編碼字段、實操作碼字節(jié)字段、MOD R/M字段、SIB字段、位移字段、以及立即數(shù)字段一致。示出來自圖10的字段,來自圖11的字段映射到來自圖7的字段。
應(yīng)當(dāng)理解,雖然出于說明的目的在通用向量友好指令格式2200的上下文中,本發(fā)明的實施例參考專用向量友好指令格式2300進(jìn)行了描述,但是本發(fā)明不限于專用向量友好指令格式2300,聲明的地方除外。例如,通用向量友好指令格式2200構(gòu)想各種字段的各種可能的尺寸,而專用向量友好指令格式2300被示為具有特定尺寸的字段。作為具體示例,盡管在專用向量友好指令格式2300中數(shù)據(jù)元素寬度字段2264被示為一位字段,但是本發(fā)明不限于此(即,通用向量友好指令格式2200構(gòu)想數(shù)據(jù)元素寬度字段2264的其他尺寸)。
通用向量友好指令格式2200包括以下列出的按照圖11A中示出的順序的如下字段。EVEX前綴(字節(jié)0-3)2302-以四字節(jié)形式進(jìn)行編碼。格式字段2240(EVEX字節(jié)0,位[7:0])-第一字節(jié)(EVEX字節(jié)0)是格式字段2240,并且它包含0x62(在本發(fā)明的一個實施例中用于區(qū)分向量友好指令格式的唯一值)。第二-第四字節(jié)(EVEX字節(jié)1-3)包括提供專用能力的多個位字段。
REX字段2305(EVEX字節(jié)1,位[7-5])-由EVEX.R位字段(EVEX字節(jié)1,位[7]–R)、EVEX.X位字段(EVEX字節(jié)1,位[6]–X)以及(2257BEX字節(jié)1,位[5]–B)組成。EVEX.R、EVEX.X和EVEX.B位字段提供與對應(yīng)VEX位字段相同的功能,并且使用1補碼的形式進(jìn)行編碼,即ZMM0被編碼為1111B,ZMM15被編碼為0000B。這些指令的其他字段對如在本領(lǐng)域中已知的寄存器索引的較低三個位(rrr、xxx、以及bbb)進(jìn)行編碼,由此可通過增加EVEX.R、EVEX.X以及EVEX.B來形成Rrrr、Xxxx以及Bbbb。
REX’字段2210-這是REX’字段2210的第一部分,并且是用于對擴(kuò)展的32個寄存器集合的較高16個或較低16個寄存器進(jìn)行編碼的EVEX.R’位字段(EVEX字節(jié)1,位[4]–R’)。在本發(fā)明的一個實施例中,該位與以下指示的其他位一起以位反轉(zhuǎn)的格式存儲以(在公知x86的32位模式下)與實操作碼字節(jié)是62的BOUND指令進(jìn)行區(qū)分,但是在MOD R/M字段(在下文中描述)中不接受MOD字段中的值11;本發(fā)明的替代實施例不以反轉(zhuǎn)的格式存儲該指示的位以及其他指示的位。值1用于對較低16個寄存器進(jìn)行編碼。換句話說,通過組合EVEX.R’、EVEX.R、以及來自其他字段的其他RRR來形成R’Rrrr。
操作碼映射字段2315(EVEX字節(jié)1,位[3:0]–mmmm)–其內(nèi)容對隱含的前導(dǎo)操作碼字節(jié)(0F、0F 38、或0F 3)進(jìn)行編碼。數(shù)據(jù)元素寬度字段2264 (EVEX字節(jié)2,位[7]–W)-由記號EVEX.W表示。EVEX.W用于定義數(shù)據(jù)類型(32位數(shù)據(jù)元素或64位數(shù)據(jù)元素)的粒度(尺寸)。EVEX.vvvv 2320(EVEX字節(jié)2,位[6:3]-vvvv)-EVEX.vvvv的作用可包括如下:1)EVEX.vvvv編碼第一源寄存器操作數(shù)且對具有兩個或兩個以上源操作數(shù)的指令有效,第一源寄存器操作數(shù)以反轉(zhuǎn)(1補碼)的形式被指定;2)EVEX.vvvv編碼目的地寄存器操作數(shù),目的地寄存器操作數(shù)針對特定向量位移以1補碼的形式被指定;或者3)EVEX.vvvv不編碼任何操作數(shù),保留該字段,并且應(yīng)當(dāng)包含1111b。由此,EVEX.vvvv字段2320對以反轉(zhuǎn)(1補碼)的形式存儲的第一源寄存器指定符的4個低階位進(jìn)行編碼。取決于該指令,額外不同的EVEX位字段用于將指定符尺寸擴(kuò)展到32個寄存器。EVEX.U 2268類字段(EVEX字節(jié)2,位[2]-U)-如果EVEX.U=0,則它指示A類或EVEX.U0;如果EVEX.U=1,則它指示B類或EVEX.U1。
前綴編碼字段2325(EVEX字節(jié)2,位[1:0]-pp)-提供了用于基礎(chǔ)操作字段的附加位。除了對以EVEX前綴格式的傳統(tǒng)SSE指令提供支持以外,這也具有壓縮SIMD前綴的益處(EVEX前綴只需要2位,而不是需要字節(jié)來表達(dá)SIMD前綴)。在一個實施例中,為了支持使用以傳統(tǒng)格式和以EVEX前綴格式的SIMD前綴(66H、F2H、F3H)的傳統(tǒng)SSE指令,將這些傳統(tǒng)SIMD前綴編碼成SIMD前綴編碼字段;并且在運行時在提供給解碼器的PLA之前被擴(kuò)展成傳統(tǒng)SIMD前綴(因此PLA可執(zhí)行傳統(tǒng)和EVEX格式的這些傳統(tǒng)指令,而無需修改)。雖然較新的指令可將EVEX前綴編碼字段的內(nèi)容直接作為操作碼擴(kuò)展,但是為了一致性,特定實施例以類似的方式擴(kuò)展,但允許由這些傳統(tǒng)SIMD前綴指定不同的含義。替代實施例可重新設(shè)計PLA以支持2位SIMD前綴編碼,并且由此不需要擴(kuò)展。
α字段2252(EVEX字節(jié)3,位[7]–EH,也稱為EVEX.EH、EVEX.rs、EVEX.RL、EVEX.寫掩碼控制、以及EVEX.N;也以α示出)-如先前所述,該字段是針對上下文的。β字段2254(EVEX字節(jié)3,位[6:4]-SSS,也稱為EVEX.s2-0、EVEX.r2-0、EVEX.rr1、EVEX.LL0、EVEX.LLB,還被示為具有βββ)-如先前所述,該字段是內(nèi)容專用的。
REX’字段2210-這是REX’字段的其余部分,并且是可用于對擴(kuò)展的32個寄存器集合的較高16個或較低16個寄存器進(jìn)行編碼的EVEX.V’位字段(EVEX字節(jié)3,位[3]–V’)。該位以位反轉(zhuǎn)的格式存儲。值1用于對較低16個寄存器進(jìn)行編碼。換句話說,通過組合EVEX.V’、EVEX.vvvv來形成V’VVVV。
寫掩碼字段2270(EVEX字節(jié)3,位[2:0]-kkk)-其內(nèi)容指定寫掩碼寄存器中的寄存器索引,如先前所述。在本發(fā)明的一個實施例中,特定值EVEX.kkk=000具有暗示沒有寫掩碼用于特定指令的特殊行為(這可以各種方式實現(xiàn),包括使用硬連線到所有的寫掩碼或者旁路掩碼硬件的硬件來實現(xiàn))。
實操作碼字段2330(字節(jié)4)還被稱為操作碼字節(jié)。操作碼的一部分在該字段中被指定。MOD R/M字段2340(字節(jié)5)包括MOD字段2342、Reg字段2344、以及R/M字段2346。如先前所述的,MOD字段2342的內(nèi)容將存儲器訪問和非存儲器訪問操作區(qū)分開。Reg字段2344的作用可被歸結(jié)為兩種情形:對目的地寄存器操作數(shù)或源寄存器操作數(shù)進(jìn)行編碼;或者被視為操作碼擴(kuò)展且不用于對任何指令操作數(shù)進(jìn)行編碼。R/M字段2346的作用可包括如下:對引用存儲器地址的指令操作數(shù)進(jìn)行編碼;或者對目的地寄存器操作數(shù)或源寄存器操作數(shù)進(jìn)行編碼。
比例、索引、基址(SIB)字節(jié)(字節(jié)6)-如先前所述的,比例字段2250的內(nèi)容用于存儲器地址生成。SIB.xxx 2354和SIB.bbb 2356-先前已經(jīng)針對寄存器索引Xxxx和Bbbb提及了這些字段的內(nèi)容。位移字段2,262A(字節(jié)7-10)-當(dāng)MOD字段2342包含10時,字節(jié)7-10是位移字段2,262A,并且它與傳統(tǒng)32位位移(disp32)一樣地工作,并且以字節(jié)粒度工作。
位移因數(shù)字段2,262B(字節(jié)7)-當(dāng)MOD字段2342包含01時,字節(jié)7是位移因數(shù)字段2,262B。該字段的位置與傳統(tǒng)x86指令集8位位移(disp8)的位置相同,它以字節(jié)粒度工作。由于disp8是符號擴(kuò)展的,因此它僅能在-128和127字節(jié)偏移量之間尋址;在64字節(jié)高速緩存行的方面,disp8使用可被設(shè)為僅四個真正有用的值-128、-64、0和64的8位;由于常常需要更大的范圍,所以使用disp32;然而,disp32需要4個字節(jié)。與disp8和disp32對比,位移因數(shù)字段2,262B是disp8的重新解釋;當(dāng)使用位移因數(shù)字段2,262B時,通過將位移因數(shù)字段的內(nèi)容乘以存儲器操作數(shù)訪問的尺寸(N)來確定實際位移。該類型的位移被稱為disp8*N。這減小了平均指令長度(單個字節(jié)用于位移,但具有大得多的范圍)。這種壓縮位移基于有效位移是存儲器訪問的粒度的倍數(shù)的假設(shè),并且由此地址偏移量的冗余低階位不需要被編碼。換句話說,位移因數(shù)字段2262B替代傳統(tǒng)x86指令集8位位移。由此,位移因數(shù)字段2262B 以與x86指令集8位位移相同的方式(因此在ModRM/SIB編碼規(guī)則中沒有變化)進(jìn)行編碼,唯一的不同在于,將disp8超載至disp8*N。換句話說,在編碼規(guī)則或編碼長度中沒有變化,而僅在通過硬件對位移值的解釋中有變化(這需要按存儲器操作數(shù)的尺寸按比例縮放位移量以獲得字節(jié)式地址偏移量)。立即數(shù)字段2272如先前所述地操作。
圖11B是示出根據(jù)本發(fā)明的實施例的構(gòu)成完整操作碼字段2274的具有專用向量友好指令格式2300的字段的框圖。具體地,完整操作碼字段2274包括格式字段2240、基礎(chǔ)操作字段2242、以及數(shù)據(jù)元素寬度(W)字段2264?;A(chǔ)操作字段2242包括前綴編碼字段2325、操作碼映射字段2315以及實操作碼字段2330。
圖11C是示出根據(jù)本發(fā)明的一個實施例的構(gòu)成寄存器索引字段2244的具有專用向量友好指令格式2300的字段的框圖。具體地,寄存器索引字段2244包括REX字段2305、REX’字段2310、MODR/M.reg字段2344、MODR/M.r/m字段2346、VVVV字段2320、xxx字段2354以及bbb字段2356。
圖11D是示出根據(jù)本發(fā)明的一個實施例的構(gòu)成擴(kuò)充操作字段2250的具有專用向量友好指令格式2300的字段的框圖。當(dāng)類(U)字段2268包含0時,它表明EVEX.U0(A類2268A);當(dāng)它包含1時,它表明EVEX.U1(B類2268B)。當(dāng)U=0且MOD字段2342包含11(表明無存儲器訪問操作)時,α字段2252(EVEX字節(jié)3,位[7]–EH)被解釋為rs字段2,252A。當(dāng)rs字段2252A包含1(舍入2252A.1)時,β字段2254(EVEX字節(jié)3,位[6:4]–SSS)被解釋為舍入控制字段2254A。舍入控制字段2254A包括一位SAE字段2256和兩位舍入操作字段2258。當(dāng)rs字段2252A包含0(數(shù)據(jù)變換2252A.2)時,β字段2254(EVEX字節(jié)3,位[6:4]–SSS)被解釋為三位數(shù)據(jù)變換字段2254B。當(dāng)U=0且MOD字段2342包含00、01或10(表達(dá)存儲器存取操作)時,α字段2252(EVEX字節(jié)3,位[7]–EH)被解釋為驅(qū)逐提示(EH)字段2252B且β字段2254(EVEX字節(jié)3,位[6:4]–SSS)被解釋為三位數(shù)據(jù)操縱字段2254C。
當(dāng)U=1時,α字段2252(EVEX字節(jié)3,位[7]–EH)被解釋為寫掩碼控制(Z)字段2252C。當(dāng)U=1且MOD字段2342包含11(表明無存儲器訪問操作)時,β字段2254的一部分(EVEX字節(jié)3,位[4]–S0)被解釋為RL字段2257A;當(dāng)它包含1(舍入2257A.1)時,β字段2254的其余部分(EVEX字節(jié)3,位[6-5]–S2-1)被解釋為舍入操作字段2259A,而當(dāng)RL字段2257A包含0(VSIZE 2257.A2)時,β字段2254的其余部分(EVEX字節(jié)3,位[6-5]-S2-1)被解釋為向量長度字段2259B(EVEX字節(jié)3,位[6-5]–L1-0)。當(dāng)U=1且MOD字段2342包含00、01或10(表明存儲器訪問操作)時,β字段2254(EVEX字節(jié)3,位[6:4]–SSS)被解釋為向量長度字段2259B(EVEX字節(jié)3,位[6-5]–L1-0)和廣播字段2257B(EVEX字節(jié)3,位[4]–B)。
圖12是根據(jù)本發(fā)明的一個實施例的寄存器架構(gòu)2400的框圖。在所示出的實施例中,有32個512位寬的向量寄存器2410;這些寄存器被引用為zmm0到zmm31。較低的16zmm寄存器的較低階256個位覆蓋在寄存器ymm0-16上。較低的16zmm寄存器的較低階128個位(ymm寄存器的較低階128個位)覆蓋在寄存器xmm0-15上。專用向量友好指令格式2300對這些覆蓋的寄存器組操作,如在以下表格中所示的。
換句話說,向量長度字段2259B在最大長度與一個或多個其他較短長度之間進(jìn)行選擇,其中每一這種較短長度是前一長度的一半,并且不具有向量長度字段2259B的指令模板在最大向量長度上操作。此外,在一個實施例中,專用向量友好指令格式2300的B類指令模板對打包或標(biāo)量單/雙精度浮點數(shù)據(jù)以及打包或標(biāo)量整數(shù)數(shù)據(jù)操作。標(biāo)量操作是對zmm/ymm/xmm寄存器中的最低階數(shù)據(jù)元素位置執(zhí)行的操作;取決于本實施例,較高階數(shù)據(jù)元素位置保持與在指令之前相同或者歸零。
寫掩碼寄存器2415-在所示的實施例中,存在8個寫掩碼寄存器(k0至k7),每一寫掩碼寄存器的尺寸是64位。在替代實施例中,寫掩碼寄存器2415的尺寸是16位。如先前所述的,在本發(fā)明的一個實施例中,向量掩碼寄存器k0無法用作寫掩碼;當(dāng)正常指示k0的編碼用作寫掩碼時,它選擇硬連線的寫掩碼0xFFFF,從而有效地停用該指令的寫掩碼操作。
通用寄存器2425——在所示出的實施例中,有十六個64位通用寄存器,這些寄存器與現(xiàn)有的x86尋址模式一起使用來尋址存儲器操作數(shù)。這些寄存器通過名稱RAX、RBX、RCX、RDX、RBP、RSI、RDI、RSP以及R8到R15來引用。
標(biāo)量浮點堆棧寄存器組(x87堆棧)2445,在其上面重疊了MMX打包整數(shù)平坦寄存器組2450——在所示出的實施例中,x87堆棧是用于使用x87指令集擴(kuò)展來對32/64/80位浮點數(shù)據(jù)執(zhí)行標(biāo)量浮點操作的八元素堆棧;而使用MMX寄存器來對64位打包整數(shù)數(shù)據(jù)執(zhí)行操作,以及為在MMX和XMM寄存器之間執(zhí)行的一些操作保存操作數(shù)。
本發(fā)明的替代實施例可以使用較寬的或較窄的寄存器。另外,本發(fā)明的替代實施例可以使用更多、更少或不同的寄存器組和寄存器。
處理器核可以用出于不同目的的不同方式在不同的處理器中實現(xiàn)。例如,這樣的核的實現(xiàn)可以包括:1)旨在用于通用計算的通用有序核;2)預(yù)期用于通用計算的高性能通用無序核;3)旨在主要用于圖形和/或科學(xué)(吞吐量)計算的專用核。不同處理器的實現(xiàn)可包括:1)包括旨在用于通用計算的一個或多個通用有序核和/或旨在用于通用計算的一個或多個通用無序核的CPU;以及2)包括旨在主要用于圖形和/或科學(xué)(吞吐量)的一個或多個專用核的協(xié)處理器。這樣的不同處理器導(dǎo)致不同的計算機(jī)系統(tǒng)架構(gòu),其可包括:1)在與CPU分開的芯片上的協(xié)處理器;2)在與CPU相同的封裝中但分開的管芯上的協(xié)處理器;3)與CPU在相同管芯上的協(xié)處理器(在該情況下,這樣的協(xié)處理器有時被稱為諸如集成圖形和/或科學(xué)(吞吐量)邏輯等專用邏輯,或被稱為專用核);以及4)可以將所描述的CPU(有時被稱為應(yīng)用核或應(yīng)用處理器)、以上描述的協(xié)處理器和附加功能包括在同一管芯上的芯片上系統(tǒng)。接著描述示例性核架構(gòu),隨后描述示例性處理器和計算機(jī)架構(gòu)。
圖13A是示出根據(jù)本發(fā)明的各實施例的示例性有序流水線和示例性的寄存器重命名的無序發(fā)布/執(zhí)行流水線的框圖。圖13B是示出根據(jù)本發(fā)明的實施例的有序架構(gòu)核的示例性實施例以及包括在處理器中的示例性寄存器重命名的無序發(fā)布/執(zhí)行架構(gòu)核兩者的方框圖。實線框示出了有序流水線和有序核,而可選增加的虛線框示出了寄存器重命名的無序發(fā)布/執(zhí)行流水線和核。給定有序方面是無序方面的子集的情況下,將描述無序方面。
在圖13A中,處理器流水線2500包括取出級2502、長度解碼級2504、解碼級2506、分配級2508、重命名級2510、調(diào)度(也稱為分派或發(fā)布)級2512、寄存器讀取/存儲器讀取級2514、執(zhí)行級2516、寫回/存儲器寫入級2518、異常處理級2522和提交級2524。
圖13B示出了包括耦合到執(zhí)行引擎單元2550的前端單元2530的處理器核2590,且執(zhí)行引擎單元和前端單元兩者都耦合到存儲器單元2570。核2590可以是精簡指令集計算(RISC)核、復(fù)雜指令集計算(CISC)核、超長指令字(VLIW)核或混合或替代核類型。作為又一選項,核2590可以是專用核,諸如例如網(wǎng)絡(luò)或通信核、壓縮引擎、協(xié)處理器核、通用計算圖形處理器單元(GPGPU)核、或圖形核等等。
前端單元2530包括耦合到指令高速緩存單元2534的分支預(yù)測單元2532,該指令高速緩存單元耦合到指令轉(zhuǎn)換后備緩沖器(TLB)2536,該指令轉(zhuǎn)換后備緩沖器耦合到指令取出單元2538,指令取出單元耦合到解碼單元2540。解碼單元2540(或解碼器)可解碼指令,并生成從原始指令解碼出的、或以其他方式反映原始指令的、或從原始指令導(dǎo)出的一個或多個微操作、微代碼進(jìn)入點、微指令、其他指令、或其他控制信號作為輸出。解碼單元2540可使用各種不同的機(jī)制來實現(xiàn)。合適的機(jī)制的示例包括但不限于查找表、硬件實現(xiàn)、可編程邏輯陣列(PLA)、微代碼只讀存儲器(ROM)等。在一個實施例中,核2590包括(例如,在解碼單元2540中或否則在前端單元2530內(nèi)的)用于存儲某些宏指令的微代碼的微代碼ROM或其他介質(zhì)。解碼單元2540耦合至執(zhí)行引擎單元2550中的重命名/分配器單元2552。
執(zhí)行引擎單元2550包括重命名/分配器單元2552,該重命名/分配器單元耦合至引退單元2554和一個或多個調(diào)度器單元2556的集合。調(diào)度器單元2556表示任何數(shù)目的不同調(diào)度器,包括預(yù)留站、中央指令窗等。調(diào)度器單元2556耦合到物理寄存器組單元2558。每個物理寄存器組單元2558表示一個或多個物理寄存器組,其中不同的物理寄存器組存儲一種或多種不同的數(shù)據(jù)類型,諸如標(biāo)量整數(shù)、標(biāo)量浮點、壓縮整數(shù)、壓縮浮點、向量整數(shù)、向量浮點、狀態(tài)(例如,作為要執(zhí)行的下一指令的地址的指令指針)等。
在一個實施例中,物理寄存器組單元2558包括向量寄存器單元、寫掩碼寄存器單元和標(biāo)量寄存器單元。這些寄存器單元可以提供架構(gòu)向量寄存器、向量掩碼寄存器、和通用寄存器。物理寄存器組單元2558與引退單元2554重疊以示出可以用來實現(xiàn)寄存器重命名和無序執(zhí)行的各種方式(例如,使用重新排序緩沖器和引退寄存器組;使用將來的文件、歷史緩沖器和引退寄存器組;使用寄存器映射和寄存器池等等)。引退單元2554和物理寄存器組單元2558耦合到執(zhí)行群集2560。
執(zhí)行群集2560包括一個或多個執(zhí)行單元2562的集合和一個或多個存儲器訪問單元2564的集合。執(zhí)行單元2562可以對各種類型的數(shù)據(jù)(例如,標(biāo)量浮點、打包整數(shù)、打包浮點、向量整型、向量浮點)執(zhí)行各種操作(例如,移位、加法、減法、乘法)。盡管一些實施例可以包括專用于特定功能或功能集合的多個執(zhí)行單元,但其他實施例可包括全部執(zhí)行所有功能的僅一個執(zhí)行單元或多個執(zhí)行單元。
調(diào)度器單元2556、物理寄存器組單元2558和執(zhí)行群集2560被示為可能有多個,因為某些實施例為某些類型的數(shù)據(jù)/操作創(chuàng)建分開的流水線(例如,標(biāo)量整型流水線、標(biāo)量浮點/打包整型/打包浮點/向量整型/向量浮點流水線,和/或各自具有其自己的調(diào)度器單元、物理寄存器組單元和/或執(zhí)行群集的存儲器訪問流水線——以及在分開的存儲器訪問流水線的情況下,實現(xiàn)其中僅該流水線的執(zhí)行群集具有存儲器訪問單元2564的某些實施例)。還應(yīng)當(dāng)理解,在使用分開的流水線的情況下,這些流水線中的一個或多個可以為無序發(fā)布/執(zhí)行,并且其余流水線可以為有序發(fā)布/執(zhí)行。
存儲器訪問單元2564的集合耦合到存儲器單元2570,該存儲器單元包括耦合到數(shù)據(jù)高速緩存單元2574的數(shù)據(jù)TLB單元2572,其中數(shù)據(jù)高速緩存單元耦合到二級(L2)高速緩存單元2576。在一個示例性實施例中,存儲器訪問單元2564可包括加載單元、存儲地址單元和存儲數(shù)據(jù)單元,其中的每一個均耦合至存儲器單元2570中的數(shù)據(jù)TLB單元2572。指令高速緩存單元2534還耦合到存儲器單元2570中的二級(L2)高速緩存單元2576。L2高速緩存單元2576耦合到一個或多個其他級的高速緩存,并最終耦合到主存儲器。
作為示例,示例性寄存器重命名的、無序發(fā)布/執(zhí)行核架構(gòu)可以如下實現(xiàn)流水線2500:1)指令取出2538執(zhí)行取出和長度解碼級2502和2504;2)解碼單元2540執(zhí)行解碼級2506;3)重命名/分配器單元2552執(zhí)行分配級2508和重命名級2510;4)調(diào)度器單元2556執(zhí)行調(diào)度級2512;5)物理寄存器組單元2558和存儲器單元2570執(zhí)行寄存器讀取/存儲器讀取級2514;執(zhí)行群集2560執(zhí)行執(zhí)行級2516;6)存儲器單元2570和物理寄存器組單元2558執(zhí)行寫回/存儲器寫入級2518;7)各單元可牽涉到異常處理級2522;以及8)引退單元2554和物理寄存器組單元2558執(zhí)行提交級2524。
核2590可支持一個或多個指令集(例如,x86指令集(具有與較新版本一起添加的一些擴(kuò)展);加利福尼亞州桑尼維爾市的MIPS技術(shù)公司的MIPS指令集;加利福尼州桑尼維爾市的ARM控股的ARM指令集(具有諸如NEON等可選附加擴(kuò)展)),其中包括本文中描述的各指令。在一個實施例中,核2590包括用于支持打包數(shù)據(jù)指令集擴(kuò)展(例如,AVX1、AVX2和/或先前描述的一些形式的一般向量友好指令格式(U=0和/或U=1))的邏輯,從而允許很多多媒體應(yīng)用使用的操作能夠使用打包數(shù)據(jù)來執(zhí)行。
應(yīng)當(dāng)理解,核可支持多線程化(執(zhí)行兩個或更多個并行的操作或線程的集合),并且可以按各種方式來完成該多線程化,此各種方式包括時分多線程化、同步多線程化(其中單個物理核為物理核正在同步多線程化的各線程中的每一個線程提供邏輯核)、或其組合(例如,時分取出和解碼以及此后諸如用超線程化技術(shù)來同步多線程化)。
盡管在無序執(zhí)行的上下文中描述了寄存器重命名,但應(yīng)當(dāng)理解,可以在有序架構(gòu)中使用寄存器重命名。盡管所示出的處理器的實施例還包括分開的指令和數(shù)據(jù)高速緩存單元2534/2574以及共享L2高速緩存單元2576,但替代實施例可以具有用于指令和數(shù)據(jù)兩者的單個內(nèi)部高速緩存,諸如例如一級(L1)內(nèi)部高速緩存或多個級別的內(nèi)部高速緩存。在一些實施例中,該系統(tǒng)可包括內(nèi)部高速緩存和在核和/或處理器外部的外部高速緩存的組合?;蛘撸懈咚倬彺娑伎梢栽诤撕?或處理器的外部。
圖14A和圖14B示出更具體的示例性有序核架構(gòu)的框圖,該核可以是芯片中的若干邏輯塊(包括具有相同類型和/或不同類型的其他核)中的一個。根據(jù)應(yīng)用,這些邏輯塊通過高帶寬的互連網(wǎng)絡(luò)(例如,環(huán)形網(wǎng)絡(luò))與一些固定的功能邏輯、存儲器I/O接口和其它必要的I/O邏輯通信。
圖14A是根據(jù)本發(fā)明的各實施例的單個處理器核以及它與管芯上互連網(wǎng)絡(luò)2602的連接及其二級(L2)高速緩存的本地子集2604的框圖。在一個實施例中,指令解碼器2600支持具有打包數(shù)據(jù)指令集擴(kuò)展的x86指令集。L1高速緩存2606允許對進(jìn)入標(biāo)量和向量單元中的高速緩存存儲器的低等待時間訪問。盡管在一個實施例中(為了簡化設(shè)計),標(biāo)量單元2608和向量單元2610使用分開的寄存器集合(分別為標(biāo)量寄存器2612和向量寄存器2614),并且在這些寄存器之間轉(zhuǎn)移的數(shù)據(jù)被寫入到存儲器并隨后從一級(L1)高速緩存2606讀回,但是本發(fā)明的替代實施例可以使用不同的方法(例如使用單個寄存器集合或包括允許數(shù)據(jù)在這兩個寄存器組之間傳輸而無需被寫入和讀回的通信路徑)。
L2高速緩存的本地子集2604是全局L2高速緩存的一部分,該全局L2高速緩存被劃分成多個分開的本地子集,即每個處理器核一個本地子集。每個處理器核具有到其自己的L2高速緩存2604的本地子集的直接訪問路徑。被處理器核讀出的數(shù)據(jù)被存儲在其L2高速緩存子集2604中,并且可以與其他處理器核訪問其自己的本地L2高速緩存子集并行地被快速訪問。被處理器核寫入的數(shù)據(jù)被存儲在其自己的L2高速緩存子集2604中,并在必要的情況下從其它子集清除。環(huán)形網(wǎng)絡(luò)確保共享數(shù)據(jù)的一致性。環(huán)形網(wǎng)絡(luò)是雙向的,以允許諸如處理器核、L2高速緩存和其它邏輯塊之類的代理在芯片內(nèi)彼此通信。每個環(huán)形數(shù)據(jù)路徑為每個方向1012位寬。
圖14B是根據(jù)本發(fā)明的各實施例的圖14A中的處理器核的一部分的展開圖。圖14B包括L1高速緩存2604的L1數(shù)據(jù)高速緩存2606A部分,以及關(guān)于向量單元2610和向量寄存器2614的更多細(xì)節(jié)。具體地說,向量單元2610是16寬向量處理單元(VPU)(見16寬ALU 2628),該單元執(zhí)行整型、單精度浮點以及雙精度浮點指令中的一個或多個。該VPU通過混合單元2620支持對寄存器輸入的混合、通過數(shù)值轉(zhuǎn)換單元2622A-B支持?jǐn)?shù)值轉(zhuǎn)換、并通過復(fù)制單元2624支持對存儲器輸入的復(fù)制。寫掩碼寄存器2626允許斷言所得的向量寫入。
圖15是根據(jù)本發(fā)明的實施例的處理器2700的框圖,該處理器可具有一個以上的核,可具有集成的存儲器控制器,且可具有集成的圖形。圖15的實線框示出了處理器2700,處理器2700具有單個核心2702A、系統(tǒng)代理(agent)2710、一組一個或多個總線控制器單元2716,而可選附加的虛線框示出了替代的處理器2700,其具有多個核心2702A-N、系統(tǒng)代理單元2710中的一組一個或多個集成存儲器控制器單元2714以及專用邏輯2708。
因此,處理器2700的不同實現(xiàn)可包括:1)CPU,其中專用邏輯2708是集成圖形和/或科學(xué)(吞吐量)邏輯(其可包括一個或多個核),并且核2702A-N是一個或多個通用核(例如,通用的有序核、通用的無序核、這兩者的組合);2)協(xié)處理器,其中核2702A-N是旨在主要用于圖形和/或科學(xué)(吞吐量)的多個專用核;以及3)協(xié)處理器,其中核2702A-N是多個通用有序核。因此,處理器2700可以是通用處理器、協(xié)處理器或?qū)S锰幚砥?,諸如例如網(wǎng)絡(luò)或通信處理器、壓縮引擎、圖形處理器、GPGPU(通用圖形處理單元)、高吞吐量的集成眾核(MIC)協(xié)處理器(包括30個或更多核)、或嵌入式處理器等。該處理器可以被實現(xiàn)在一個或多個芯片上。處理器2700可以是一個或多個襯底的一部分,和/或可以使用諸如例如BiCMOS、CMOS或NMOS等的多個加工技術(shù)中的任何一個技術(shù)將處理器1200實現(xiàn)在一個或多個襯底上。
存儲器層次結(jié)構(gòu)包括在各核內(nèi)的一個或多個級別的高速緩存、一個或多個共享高速緩存單元2706的集合、以及耦合至集成存儲器控制器單元2714的集合的外部存儲器(未示出)。該共享高速緩存單元2706的集合可以包括一個或多個中間級高速緩存,諸如二級(L2)、三級(L3)、四級(L4)或其他級別的高速緩存、末級高速緩存(LLC)、和/或其組合。盡管在一個實施例中,基于環(huán)的互連單元2712將集成圖形邏輯2708、共享高速緩存單元2706的集合以及系統(tǒng)代理單元2710/集成存儲器控制器單元2714互連,但替代實施例可使用任何數(shù)量的公知技術(shù)來將這些單元互連。在一個實施例中,可以維護(hù)一個或多個高速緩存單元2706和核2702-A-N之間的一致性(coherency)。
在一些實施例中,核2702A-N中的一個或多個核能夠多線程化。系統(tǒng)代理2710包括協(xié)調(diào)和操作核2702A-N的那些組件。系統(tǒng)代理單元2710可包括例如功率控制單元(PCU)和顯示單元。PCU可以是或包括用于調(diào)整核2702A-N和集成圖形邏輯2708的功率狀態(tài)所需的邏輯和組件。顯示單元用于驅(qū)動一個或多個外部連接的顯示器。
核2702A-N在架構(gòu)指令集方面可以是同構(gòu)的或異構(gòu)的;即,這些核2702A-N中的兩個或更多個核可能能夠執(zhí)行相同的指令集,而其他核可能能夠執(zhí)行該指令集的僅僅子集或不同的指令集。
圖16至圖20是示例性計算機(jī)架構(gòu)的框圖。本領(lǐng)域已知的對膝上型設(shè)備、臺式機(jī)、手持PC、個人數(shù)字助理、工程工作站、服務(wù)器、網(wǎng)絡(luò)設(shè)備、網(wǎng)絡(luò)集線器、交換機(jī)、嵌入式處理器、數(shù)字信號處理器(DSP)、圖形設(shè)備、視頻游戲設(shè)備、機(jī)頂盒、微控制器、蜂窩電話、便攜式媒體播放器、手持設(shè)備以及各種其他電子設(shè)備的其他系統(tǒng)設(shè)計和配置也是合適的。一般地,能夠包含本文中所公開的處理器和/或其它執(zhí)行邏輯的多個系統(tǒng)和電子設(shè)備一般都是合適的。
現(xiàn)在參考圖16,所示出的是根據(jù)本發(fā)明一實施例的系統(tǒng)2800的框圖。系統(tǒng)2800可以包括一個或多個處理器2810、2815,這些處理器耦合到控制器中樞2820。在一個實施例中,控制器中樞2820包括圖形存儲器控制器中樞(GMCH)2890和輸入/輸出中樞(IOH)2850(其可以在分開的芯片上);GMCH 2890包括存儲器和圖形控制器,存儲器2840和協(xié)處理器2845耦合到該存儲器和圖形控制器;IOH 2850將輸入/輸出(I/O)設(shè)備2860耦合到GMCH2890?;蛘撸鎯ζ骱蛨D形控制中的一個或兩個集成在處理器內(nèi)(如本文所述),存儲器2840和協(xié)處理器2845直接耦合到處理器2810和在單個芯片中具有IOH2850的控制器中樞2820。
附加處理器2815的任選性質(zhì)用虛線表示在圖16中。每一處理器2810、2815可包括本文中描述的處理核中的一個或多個,并且可以是處理器2700的某一版本。
存儲器2840可以是例如動態(tài)隨機(jī)存取存儲器(DRAM)、相變存儲器(PCM)或這兩者的組合。對于至少一個實施例,控制器中樞2820經(jīng)由諸如前端總線(FSB)之類的多分支總線、諸如快速通道互連(QPI)之類的點對點接口、或者類似的連接2895與處理器2810、2815進(jìn)行通信。
在一個實施例中,協(xié)處理器2845是專用處理器,諸如例如高吞吐量MIC處理器、網(wǎng)絡(luò)或通信處理器、壓縮引擎、圖形處理器、GPGPU、或嵌入式處理器等等。在一個實施例中,控制器中樞2820可以包括集成圖形加速器。
按照包括體系結(jié)構(gòu)、微體系結(jié)構(gòu)、熱、功耗特征等等優(yōu)點的度量譜,物理資源2810、2815之間存在各種差別。
在一個實施例中,處理器2810執(zhí)行控制一般類型的數(shù)據(jù)處理操作的指令。協(xié)處理器指令可嵌入在這些指令中。處理器2810將這些協(xié)處理器指令識別為應(yīng)當(dāng)由附連的協(xié)處理器2845執(zhí)行的類型。因此,處理器2810在協(xié)處理器總線或者其他互連上將這些協(xié)處理器指令(或者表示協(xié)處理器指令的控制信號)發(fā)布到協(xié)處理器2845。協(xié)處理器2845接受并執(zhí)行所接收的協(xié)處理器指令。
現(xiàn)在參考圖17,示出了根據(jù)本發(fā)明的一個實施例的第一更專用的示例性系統(tǒng)2900的方框圖。如圖17所示,多處理器系統(tǒng)2900是點對點互連系統(tǒng),并包括經(jīng)由點對點互連2950耦合的第一處理器2970和第二處理器2980。處理器2970和2980中的每一個都可以是處理器2700的某一版本。在本發(fā)明的一個實施例中,處理器2970和2980分別是處理器2810和2815,而協(xié)處理器2938是協(xié)處理器2845。在另一實施例中,處理器2970和2980分別是處理器2810和協(xié)處理器2845。
處理器2970和2980被示為分別包括集成存儲器控制器(IMC)單元2972和2982。處理器2970還包括作為其總線控制器單元的一部分的點對點(P-P)接口2976和2978;類似地,第二處理器2980包括點對點接口2986和2988。處理器2970、2980可以使用點對點(P-P)電路2978、2988經(jīng)由P-P接口2950來交換信息。如圖17所示,IMC 2972和2982將各處理器耦合至相應(yīng)的存儲器,即存儲器2932和存儲器2934,這些存儲器可以是本地附連至相應(yīng)的處理器的主存儲器的部分。
處理器2970、2980可各自經(jīng)由使用點對點接口電路2976、2994、2986、2998的各個P-P接口2952、2954與芯片組2990交換信息。芯片組2990可以可選地經(jīng)由高性能接口2939與協(xié)處理器2938交換信息。在一個實施例中,協(xié)處理器2938是專用處理器,諸如例如高吞吐量MIC處理器、網(wǎng)絡(luò)或通信處理器、壓縮引擎、圖形處理器、GPGPU、或嵌入式處理器等等。
共享高速緩存(未示出)可以被包括在任一處理器之內(nèi),或被包括在兩個處理器外部但仍經(jīng)由P-P互連與這些處理器連接,從而如果將某處理器置于低功率模式時,可將任一處理器或兩個處理器的本地高速緩存信息存儲在該共享高速緩存中。芯片組2990可經(jīng)由接口2996耦合至第一總線2916。在一個實施例中,第一總線2916可以是外圍組件互連(PCI)總線,或諸如PCI Express總線或其它第三代I/O互連總線之類的總線,但本發(fā)明的范圍并不受此限制。
如圖17所示,各種I/O設(shè)備2914可以連同總線橋2918耦合到第一總線2916,總線橋?qū)⒌谝豢偩€2916耦合至第二總線2920。在一個實施例中,諸如協(xié)處理器、高吞吐量MIC處理器、GPGPU的處理器、加速器(諸如例如圖形加速器或數(shù)字信號處理器(DSP)單元)、現(xiàn)場可編程門陣列或任何其他處理器的一個或多個附加處理器2915耦合到第一總線2916。在一個實施例中,第二總線2920可以是低引腳計數(shù)(LPC)總線。各種設(shè)備可以被耦合至第二總線2920,在一個實施例中這些設(shè)備包括例如鍵盤/鼠標(biāo)2922、通信設(shè)備2927以及諸如可包括指令/代碼和數(shù)據(jù)2930的盤驅(qū)動器或其它大容量存儲設(shè)備的存儲單元2928。此外,音頻I/O 2924可以被耦合至第二總線2920。注意,其它架構(gòu)是可能的。例如,代替圖17的點對點架構(gòu),系統(tǒng)可以實現(xiàn)多分支總線或其它這類架構(gòu)。
現(xiàn)在參考圖18,示出了根據(jù)本發(fā)明的一個實施例的更專用的第二示例性系統(tǒng)3000的方框圖。圖18和19中的類似元件使用類似附圖標(biāo)記,且在圖18中省略了圖17的某些方面以避免混淆圖18的其它方面。圖18示出處理器2970、2980可分別包括集成存儲器和I/O控制邏輯(“CL”)2972和2982。因此,CL 2972、2982包括集成存儲器控制器單元并包括I/O控制邏輯。圖18不僅示出存儲器2932、2934耦合至CL 2972、2982,而且還示出I/O設(shè)備3014也耦合至控制邏輯2972、2982。傳統(tǒng)I/O設(shè)備3015被耦合至芯片組2990。
現(xiàn)在參照圖19,所示出的是根據(jù)本發(fā)明一個實施例的SoC 3100的框圖。在圖15中,相似的部件具有同樣的附圖標(biāo)記。另外,虛線框是更先進(jìn)的SoC的可選特征。在圖19中,互連單元3102被耦合至:應(yīng)用處理器3110,該應(yīng)用處理器包括一個或多個核202A-N的集合以及共享高速緩存單元2706;系統(tǒng)代理單元2710;總線控制器單元2716;集成存儲器控制器單元2714;一組或一個或多個協(xié)處理器3120,其可包括集成圖形邏輯、圖像處理器、音頻處理器和視頻處理器;靜態(tài)隨機(jī)存取存儲器(SRAM)單元3130;直接存儲器存取(DMA)單元3132;以及用于耦合至一個或多個外部顯示器的顯示單元3140。在一個實施例中,協(xié)處理器3120包括專用處理器,諸如例如網(wǎng)絡(luò)或通信處理器、壓縮引擎、GPGPU、高吞吐量MIC處理器、或嵌入式處理器等等。
本文公開的機(jī)制的各實施例可以被實現(xiàn)在硬件、軟件、固件或這些實現(xiàn)方法的組合中。本發(fā)明的實施例可實現(xiàn)為在可編程系統(tǒng)上執(zhí)行的計算機(jī)程序或程序代碼,該可編程系統(tǒng)包括至少一個處理器、存儲系統(tǒng)(包括易失性和非易失性存儲器和/或存儲元件)、至少一個輸入設(shè)備以及至少一個輸出設(shè)備。
可將程序代碼(諸如圖17中示出的代碼2930)應(yīng)用于輸入指令,以執(zhí)行本文描述的各功能并生成輸出信息??梢园匆阎绞綄⑤敵鲂畔?yīng)用于一個或多個輸出設(shè)備。為了本申請的目的,處理系統(tǒng)包括具有諸如例如數(shù)字信號處理器(DSP)、微控制器、專用集成電路(ASIC)或微處理器之類的處理器的任何系統(tǒng)。
程序代碼可以用高級程序化語言或面向?qū)ο蟮木幊陶Z言來實現(xiàn),以便與處理系統(tǒng)通信。在需要時,也可用匯編語言或機(jī)器語言來實現(xiàn)程序代碼。事實上,本文中描述的機(jī)制不限于任何特定編程語言的范圍。在任一情形下,該語言可以是編譯語言或解釋語言。
至少一個實施例的一個或多個方面可以由存儲在機(jī)器可讀介質(zhì)上的表示性指令來實現(xiàn),指令表示處理器中的各種邏輯,指令在被機(jī)器讀取時使得該機(jī)器制作用于執(zhí)行本文所述的技術(shù)的邏輯。被稱為“IP核”的這些表示可以被存儲在有形的機(jī)器可讀介質(zhì)上,并被提供給多個客戶或生產(chǎn)設(shè)施以加載到實際制造該邏輯或處理器的制造機(jī)器中。
這樣的機(jī)器可讀存儲介質(zhì)可以包括但不限于通過機(jī)器或設(shè)備制造或形成的物品的非瞬態(tài)的有形安排,其包括存儲介質(zhì),諸如:硬盤;任何其它類型的盤,包括軟盤、光盤、緊致盤只讀存儲器(CD-ROM)、緊致盤可重寫(CD-RW)以及磁光盤;半導(dǎo)體器件,例如只讀存儲器(ROM)、諸如動態(tài)隨機(jī)存取存儲器(DRAM)和靜態(tài)隨機(jī)存取存儲器(SRAM)之類的隨機(jī)存取存儲器(RAM)、可擦除可編程只讀存儲器(EPROM)、閃存、電可擦除可編程只讀存儲器(EEPROM);相變存儲器(PCM);磁卡或光卡;或適于存儲電子指令的任何其它類型的介質(zhì)。
因此,本發(fā)明的各實施例還包括非瞬態(tài)的有形機(jī)器可讀介質(zhì),該介質(zhì)包含指令或包含設(shè)計數(shù)據(jù),諸如硬件描述語言(HDL),它定義本文中描述的結(jié)構(gòu)、電路、裝置、處理器和/或系統(tǒng)特征。這些實施例也被稱為程序產(chǎn)品。
在一些情況下,指令轉(zhuǎn)換器可用來將指令從源指令集轉(zhuǎn)換至目標(biāo)指令集。例如,指令轉(zhuǎn)換器可以變換(例如使用靜態(tài)二進(jìn)制變換、包括動態(tài)編譯的動態(tài)二進(jìn)制變換)、變形、仿真或以其它方式將指令轉(zhuǎn)換成將由核來處理的一個或多個其它指令。指令轉(zhuǎn)換器可以用軟件、硬件、固件、或其組合實現(xiàn)。指令轉(zhuǎn)換器可以在處理器上、在處理器外、或者部分在處理器上且部分在處理器外。
圖20是根據(jù)本發(fā)明的實施例的對比使用軟件指令變換器將源指令集中的二進(jìn)制指令變換成目標(biāo)指令集中的二進(jìn)制指令的框圖。在所示的實施例中,指令轉(zhuǎn)換器是軟件指令轉(zhuǎn)換器,但作為替代,該指令轉(zhuǎn)換器可以用軟件、固件、硬件或其各種組合來實現(xiàn)。圖20示出可以使用x86編譯器3204來編譯利用高級語言3202的程序,以生成可以由具有至少一個x86指令集核的處理器3216原生執(zhí)行的x86二進(jìn)制代碼3206。具有至少一個x86指令集核的處理器3216表示任何處理器,這些處理器能通過兼容地執(zhí)行或以其他方式處理以下內(nèi)容來執(zhí)行與具有至少一個x86指令集核的英特爾處理器基本相同的功能:1)英特爾x86指令集核的指令集的本質(zhì)部分,或2)目標(biāo)為在具有至少一個x86指令集核的英特爾處理器上運行的應(yīng)用或其它程序的目標(biāo)代碼版本,以便取得與具有至少一個x86指令集核的英特爾處理器基本相同的結(jié)果。x86編譯器3204表示用于生成x86二進(jìn)制代碼3206(例如,目標(biāo)代碼)的編譯器,該二進(jìn)制代碼3206可通過或不通過附加的鏈接處理在具有至少一個x86指令集核的處理器3216上執(zhí)行。類似地,圖20示出可以使用替代的指令集編譯器3208來編譯利用高級語言3202的程序,以生成可以由不具有至少一個x86指令集核的處理器3214(例如具有執(zhí)行加利福尼亞州桑尼維爾市的MIPS技術(shù)公司的MIPS指令集、和/或執(zhí)行加利福尼亞州桑尼維爾市的ARM控股公司的ARM指令集的核的處理器)原生執(zhí)行的替代指令集二進(jìn)制代碼3210。指令轉(zhuǎn)換器3212被用來將x86二進(jìn)制代碼3206轉(zhuǎn)換成可以由不具有x86指令集核的處理器3214原生執(zhí)行的代碼。該轉(zhuǎn)換后的代碼不大可能與替代性指令集二進(jìn)制代碼3210相同,因為能夠這樣做的指令轉(zhuǎn)換器難以制造;然而,轉(zhuǎn)換后的代碼將完成一般操作并由來自替代指令集的指令構(gòu)成。因此,指令轉(zhuǎn)換器3212通過仿真、模擬或任何其它過程來表示允許不具有x86指令集處理器或核的處理器或其它電子設(shè)備執(zhí)行x86二進(jìn)制代碼3206的軟件、固件、硬件或其組合。
前面的詳細(xì)描述的某些部分以算法、和/或?qū)τ嬎銠C(jī)存儲器內(nèi)的數(shù)據(jù)位的操作的符號表示法的形式存在。這些算法描述和表示法是那些精通數(shù)據(jù)處理技術(shù)的人所使用的最有效地將他們的工作的實質(zhì)傳遞到精通技術(shù)的其他人的方式。算法,這里一般是指導(dǎo)致所希望的結(jié)果的操作的獨立的序列。操作是那些需要對物理量進(jìn)行物理操縱的操作。
然而,應(yīng)該記住,所有這些和/或類似的術(shù)語將與適當(dāng)?shù)奈锢砹筷P(guān)聯(lián),僅僅是應(yīng)用于這些量的方便的標(biāo)記。除非特別聲明,從上文的討論中顯而易見地看出,應(yīng)該理解,在整個本說明書中,利用諸如在下面的權(quán)利要求中所闡述的術(shù)語的討論,引用了計算機(jī)系統(tǒng),和/或類似的電子計算設(shè)備的動作和/或進(jìn)程,它們操縱和/或轉(zhuǎn)換表示為計算機(jī)系統(tǒng)的寄存器和存儲器內(nèi)的物理(電子)量的數(shù)據(jù),將這些數(shù)據(jù)轉(zhuǎn)換為類似地表示為計算機(jī)系統(tǒng)存儲器或寄存器和/或其他這樣的信息存儲器、傳輸和/或顯示設(shè)備內(nèi)的物理量的其他數(shù)據(jù)。
圖形所示出的技術(shù)可以使用在一個或多個電子設(shè)備上存儲和執(zhí)行的代碼和數(shù)據(jù)來實現(xiàn)。這樣的電子設(shè)備使用計算機(jī)可讀介質(zhì),諸如非瞬時的計算機(jī)可讀取的存儲介質(zhì)(例如,磁盤;光盤;隨機(jī)存取存儲器;只讀存儲器;閃存設(shè)備;相變存儲器)和瞬時的計算機(jī)可讀取的傳輸介質(zhì)(例如,電氣,光學(xué),聲音或其他形式的傳播的信號——諸如載波,紅外信號、數(shù)字信號等等),存儲和傳遞(內(nèi)部和/或與其他電子設(shè)備,通過網(wǎng)絡(luò))代碼和數(shù)據(jù)。
前面的圖形中所描繪的進(jìn)程或方法可以通過包括硬件(例如,電路、專用邏輯等等)、固件、軟件(例如,在非瞬時的計算機(jī)可讀介質(zhì)上實現(xiàn)),或兩者的組合的處理邏輯來執(zhí)行。雖然上文是利用某些順序操作來描述進(jìn)程或方法的,但是,應(yīng)該理解,所描述的某些操作可以以不同的順序來執(zhí)行。此外,某些操作也可以并行地而并非按順序執(zhí)行。
在前述的說明書中,參考其特定示例性實施例描述了本發(fā)明的各實施例。顯然,在不偏離如下面的權(quán)利要求所闡述的本發(fā)明的更廣泛的精神和范圍的情況下,可以作出各種修改。相應(yīng)地,說明書和附圖應(yīng)被視為說明性的,而不是限制性的。