本發(fā)明的領(lǐng)域一般涉及計算機處理器架構(gòu),更具體地涉及推測執(zhí)行。
背景技術(shù):
對包括可能的交叉迭代的依賴性的循環(huán)進行向量化眾所周知是困難的。這種類型的示例性循環(huán)是:
for(i=0;i<n;i++){
a[i]=b[c[i]];
}
對這個循環(huán)的不成熟的(并且不正確的)向量化將是:
然而,如果生成向量化版本的循環(huán)的編譯器不能在先獲悉關(guān)于a、b和c的地址或?qū)R性,則上述向量化是不安全的。
附圖說明
在所附附圖中以示例方式而非限制方式說明本發(fā)明,在附圖中,類似的參考標(biāo)號指示類似的元件,其中:
圖1是能夠在硬件中執(zhí)行數(shù)據(jù)推測擴展(dsx)的處理器核的示例性框圖的實施例;
圖2示出根據(jù)實施例的推測指令執(zhí)行的示例;
圖3示出dsx跟蹤硬件的詳細(xì)實施例;
圖4示出dsx跟蹤硬件執(zhí)行的dsx錯誤推測檢測的示例性方法;
圖5(a)-(b)示出dsx跟蹤硬件執(zhí)行的dsx錯誤推測檢測的示例性方法;
圖6示出對用于開始dsx的指令的執(zhí)行的實施例;
圖7示出ybegin指令格式的一些示例性實施例;
圖8示出對諸如ybegin指令的指令的執(zhí)行的詳細(xì)實施例;
圖9示出顯示對諸如ybegin指令的指令的執(zhí)行的偽代碼的示例;
圖10示出對用于開始dsx的指令的執(zhí)行的實施例;
圖11示出ybeginwithstride指令格式的一些示例性實施例;
圖12示出對諸如ybeginwithstride指令的指令的執(zhí)行的詳細(xì)實施例;
圖13示出對用于繼續(xù)dsx而不結(jié)束它的指令的執(zhí)行的實施例;
圖14示出ycontinue指令格式的一些示例性實施例;
圖15示出對諸如ycontinue指令的指令的執(zhí)行的詳細(xì)實施例;
圖16示出顯示對諸如ycontinue指令的指令的執(zhí)行的偽代碼的示例;
圖17示出對用于中止dsx的指令的執(zhí)行的實施例;
圖18示出yabort指令格式的一些示例性實施例;
圖19示出對諸如yabort指令的指令的執(zhí)行的詳細(xì)實施例;
圖20示出顯示對諸如yabort指令的指令的執(zhí)行的偽代碼的示例;
圖21示出對用于測試dsx的狀態(tài)的指令的執(zhí)行的實施例;
圖22示出ytest指令格式的一些示例性實施例;
圖23示出顯示對諸如ytest指令的指令的執(zhí)行的偽代碼的示例;
圖24示出對用于結(jié)束dsx的指令的執(zhí)行的實施例;
圖25示出yend指令格式的一些示例性實施例;
圖26示出對諸如yend指令的指令的執(zhí)行的詳細(xì)實施例;
圖27示出顯示對諸如yend指令的指令的執(zhí)行的偽代碼的示例;
圖28a-28b是示出根據(jù)本發(fā)明的實施例的通用向量友好指令格式及其指令模板的框圖;
圖29a-d示出專用向量友好指令格式2900,其指定位置、尺寸、解釋和字段的次序以及那些字段中的一些字段的值,在這個意義上向量友好指令格式2900是專用的。
圖30是根據(jù)本發(fā)明的一個實施例的寄存器架構(gòu)的框圖;
圖31a是示出根據(jù)本發(fā)明的實施例的示例性有序流水線以及示例性寄存器重命名的亂序發(fā)布/執(zhí)行流水線兩者的框圖;
圖31b是示出根據(jù)本發(fā)明的實施例的要包括在處理器中的有序架構(gòu)核的示例性實施例和示例性的寄存器重命名的亂序發(fā)布/執(zhí)行架構(gòu)核的框圖;
圖32a-b示出更具體的示例性有序核架構(gòu)的框圖,該核將是芯片中的若干邏輯塊之一(包括相同類型和/或不同類型的其他核);
圖33是根據(jù)本發(fā)明的實施例的可具有超過一個的核、可具有集成存儲器控制器、并且可具有集成圖形器件的處理器的框圖;
圖34示出根據(jù)本發(fā)明的實施例的系統(tǒng)的框圖;
圖35示出根據(jù)本發(fā)明的實施例的第一更具體的示例性系統(tǒng)的框圖;
圖36示出根據(jù)本發(fā)明的實施例的第二更具體的示例性系統(tǒng)的框圖;
圖37示出根據(jù)本發(fā)明的實施例的soc的框圖;
圖38是根據(jù)本發(fā)明的實施例的對照使用軟件指令轉(zhuǎn)換器將源指令集中的二進制指令轉(zhuǎn)換成目標(biāo)指令集中的二進制指令的框圖。
具體實施方式
在以下描述中,陳述了多個具體細(xì)節(jié)。然而,應(yīng)當(dāng)理解,可不通過這些具體細(xì)節(jié)來實施本發(fā)明的實施例。在其他實例中,公知的電路、結(jié)構(gòu)和技術(shù)未被詳細(xì)示出,以免混淆對本描述的理解。
說明書中對“一個實施例”、“實施例”、“示例實施例”等等的引用表明所描述的實施例可以包括特定的特征、結(jié)構(gòu)或特性,但是每個實施例不一定都包括該特定的特征、結(jié)構(gòu)或特性。此外,這樣的短語不一定是指同一個實施例。此外,當(dāng)結(jié)合實施例描述特定的特征、結(jié)構(gòu)或特性時,認(rèn)為結(jié)合無論是否被明確描述的其他實施例而影響此類特征、結(jié)構(gòu)或特性是在本領(lǐng)域技術(shù)人員的知識范圍之內(nèi)的。
貫穿本說明書,詳述了被稱為數(shù)據(jù)推測擴展(dsx)的推測執(zhí)行的技術(shù)。本說明書中包括dsx硬件和支持dsx的新指令。
dsx本質(zhì)上類似于受限制的事務(wù)性存儲器(rtm)的實現(xiàn)方式,但是更簡單。例如,dsx區(qū)域不需要隱含的柵欄。相反,保持正常的加載/存儲排序規(guī)則。此外,dsx區(qū)域不在處理器中設(shè)置用于加載的強制原子行為的任何配置,而在rtm中,原子地處理對事務(wù)的加載和存儲(當(dāng)完成事務(wù)時提交)。此外,加載不被緩沖,因為它們在rtm中。然而,當(dāng)不再需要推測時,立即緩沖和提交存儲。取決于實施例,可以將這些存儲緩沖在專用推測執(zhí)行存儲中或在共享寄存器或存儲器位置中。在一些實施例中,推測向量化只在單個線程上發(fā)生,這意味著不需要阻止來自其他線程的干擾。
在先前詳述的向量化的循環(huán)中,出于安全將需要有動態(tài)檢查。例如,保證在給定的向量迭代中寫入a不與在標(biāo)量循環(huán)中的在稍后的迭代中被讀取的b或c中的元素重疊。下文的實施例詳述通過對推測的使用來處理向量化情形。推測版本指示應(yīng)當(dāng)推測地執(zhí)行每個循環(huán)迭代(例如,使用下文詳述的指令),并且硬件應(yīng)當(dāng)幫助執(zhí)行地址檢查。代替僅依賴于硬件負(fù)責(zé)地址檢查(其要求非常昂貴的硬件),詳細(xì)的方法使用軟件來提供信息以輔助硬件,實現(xiàn)更便宜的硬件方案而不影響執(zhí)行時間或?qū)幊唐骰蚓幾g器施加過多負(fù)擔(dān)。
不幸的是,在向量化情況下,可能存在排序違反?;乜瓷衔脑斒龅臉?biāo)量循環(huán)示例:
for(i=0;i<n;i++){
a[i]=b[c[i]];
}
在這個循環(huán)的前四個迭代期間,下列存儲器操作將按照下列順序發(fā)生:
讀取c[0]
讀取b[c[0]]
寫入a[0]
讀取c[1]
讀取b[c[1]]
寫入a[1]
讀取c[2]
讀取b[c[2]]
寫入a[2]
讀取c[3]
讀取b[c[3]]
寫入a[3]
訪問到相同數(shù)組之間的距離(按操作的數(shù)量)是三,并且這也是當(dāng)它被向量化時(成為simd)循環(huán)中的推測存儲器指令的數(shù)量。這個距離被稱為“跨度”。它也是循環(huán)中的存儲器指令的數(shù)量,當(dāng)循環(huán)被向量化時,在存儲器指令上將執(zhí)行地址檢查。在一些實施例中,在循環(huán)開始處經(jīng)由特殊指令將這個跨度傳遞到地址跟蹤硬件(下文詳述)。在一些實施例中,這個指令還清除地址跟蹤硬件。
本文中詳述了在諸如向量化循環(huán)執(zhí)行的情形中在dsx中使用的新指令(dsx存儲器指令)。每個dsx存儲器指令(諸如加載、存儲、聚集和分散)包括在dsx期間使用的指示dsx執(zhí)行內(nèi)的位置(例如,被執(zhí)行的循環(huán)中的位置)的操作數(shù)。在一些實施例中,操作數(shù)是立即數(shù)(例如,8位立即數(shù)),在立即數(shù)中具有被編碼的順序的數(shù)值。在其他實施例中,操作數(shù)是存儲被編碼的順序的數(shù)值的寄存器或存儲器位置。
此外,在一些實施例中,這些指令具有與其正常對應(yīng)指令不同的操作碼。這些指令可以是標(biāo)量的或超標(biāo)量的(例如,simd或mimd)。以下示出這些指令中的一些的示例,其中操作碼的助記符包括“s”(下文加下劃線)以指示其是推測版本,并且imm8是用于指示執(zhí)行的位置(例如,被執(zhí)行的循環(huán)中的位置)的立即數(shù)操作數(shù):
vmovsdqa32zmm1{k1}{z},mv,imm8//推測simd加載
vmovsxmm1,m32,imm8//推測標(biāo)量加載
vscattersdpsvm32z{k1},zmm1,imm8//推測分散
當(dāng)然,其他指令還可以利用詳述的操作數(shù)和操作碼助記符(和基本操作碼)變化,諸如邏輯的(and、or、xor等等)和數(shù)據(jù)操縱(加、減等等)指令。
在上述標(biāo)量示例的向量版本(假設(shè)simd寬度的四個緊縮數(shù)據(jù)元素)中,存儲器操作的順序是:
讀取c[0]、c[1]、c[2]、c[3]
讀取b[c[0]]、b[c[1]]、b[c[2]]、b[c[3]]
寫入a[0]、a[1]、a[2]、a[3]
如果例如b[c[1]]與a[0]重疊,則這個順序可能導(dǎo)致不正確的執(zhí)行。在原始標(biāo)量順序中,對b[c[1]]的讀取在對a[0]的寫入之后發(fā)生,但是在向量化執(zhí)行中,其在之前發(fā)生。
為可能導(dǎo)致不正確的執(zhí)行的循環(huán)中的操作使用推測存儲器指令幫助解決這個問題。如將詳述的,每個推測存儲器指令通知dsx跟蹤硬件(下文詳述)它在循環(huán)主體內(nèi)的位置:
for(i=0;i<n;i+=simd_width){
zmm0=vmovsdqu32&c[i],0//告訴地址跟蹤器這是指令0
k1=kxnork1,k1
zmm1=vgathersddb,zmm0,k1,1//告訴地址跟蹤器這是指令1
vmovsdqu&a[i],zmm1,2//告訴地址跟蹤器這是指令2
}
可以將每個推測存儲器操作提供的循環(huán)位置信息與跨度組合來重構(gòu)標(biāo)量存儲器操作。隨著推測存儲器指令執(zhí)行,dsx硬件跟蹤器為每個元素計算標(biāo)識符(id)(id=序列號+跨度*simd操作內(nèi)的元素數(shù)量)。硬件跟蹤器使用序列號、計算出的id以及每個緊縮數(shù)據(jù)元素的地址和大小來確定是否存在排序違反(即,如果元素與另一個元素重疊并且被亂序地讀取或?qū)懭?。
展開包括每個向量存儲器指令的各個存儲器操作、為每次展開累加跨度、并且將所得的數(shù)字分配為“ids”產(chǎn)生:
讀取c[0]//id=0
讀取c[1]//id=3
讀取c[2]//id=6
讀取c[3]//id=9
讀取b[c[0]]//id=1
讀取b[c[1]]//id=4
讀取b[c[2]]//id=7
讀取b[c[3]]//id=10
寫入a[0]//id=2
寫入a[1]//id=5
寫入a[2]//id=8
寫入a[3]//id=11
按照id將上述各個存儲器操作排序?qū)⒅貥?gòu)原始標(biāo)量存儲器排序。
圖1是能夠在硬件中執(zhí)行數(shù)據(jù)推測擴展(dsx)的處理器核的示例性框圖的實施例。
處理器核106可包括取出單元102用來取出指令以供核106執(zhí)行。例如,可以從l1高速緩存或存儲器取出指令。核106還可包括用于解碼被取出的指令(包括下文詳述的指令)的解碼單元104。例如,解碼單元104可將被取出的指令解碼為多個微操作(微op)。
此外,核106可包括調(diào)度單元107。調(diào)度單元107可執(zhí)行與存儲(例如,從解碼單元104接收的)經(jīng)解碼的指令相關(guān)聯(lián)的多種操作直到指令準(zhǔn)備好以供分派,例如,直到來自經(jīng)解碼的指令的操作數(shù)的所有源值都變得可用。在一個實施例中,調(diào)度單元107可將經(jīng)解碼的指令調(diào)度和/或發(fā)布(或分派)至一個或多個執(zhí)行單元108以供執(zhí)行。執(zhí)行單元108可包括存儲器執(zhí)行單元、整數(shù)執(zhí)行單元、浮點執(zhí)行單元或其他執(zhí)行單元。引退單元110在被執(zhí)行的指令被提交后可使被執(zhí)行的指令引退。在實施例中,引退這些被執(zhí)行的指令會導(dǎo)致:通過對這些指令的執(zhí)行,提交處理器狀態(tài);解除分配由這些指令使用的物理寄存器,等等。
存儲器排序緩沖器(mob)118可包括加載緩沖器、存儲緩沖器和用于存儲還未加載或?qū)懟氐街鞔鎯ζ鞯拇龥Q存儲器操作的邏輯。在一些實施例中,mob118或與其類似的電路存儲對dsx區(qū)域的推測存儲(寫入)。在多個實施例中,核可包括本地高速緩存,例如,可包括一個或多個高速緩存行124(例如高速緩存行0到w,并且由高速緩存電路139管理)的私有高速緩存(例如,高速緩存116)。在一個實施例中,高速緩存116的每個行可包括用于在核106上執(zhí)行的每個線程的dsx讀取位126和/或dsx寫入位128。位126和128可被置位或清除以指示通過dsx存儲器訪問請求對相應(yīng)的高速緩存行的(加載和/或存儲)訪問。注意,雖然在圖1的實施例中,每個高速緩存行124示出為具有各自的位126和128,但其他配置也是可能的。例如,dsx讀取位126(或dsx寫入位128)可與高速緩存116的選擇部分(例如,高速緩存116的高速緩存塊或其他部分)對應(yīng)。而且,位126和/或128可存儲在除高速緩存116之外的位置。
為了輔助執(zhí)行dsx操作,核106可以包括dsx嵌套計數(shù)器130,用于存儲對應(yīng)于已經(jīng)遇到的不具有匹配的dsx結(jié)束的dsx開始的數(shù)量的值。計數(shù)器130可被實現(xiàn)為任何類型的存儲設(shè)備(例如,硬件寄存器)或存儲在存儲器(例如,系統(tǒng)存儲器或高速緩存116)中的變量。核106還可包括用于更新存儲在計數(shù)器130中的值的dsx嵌套計數(shù)器電路132。核106可包括用于對核106的多個組件的狀態(tài)進行檢查點操作(或存儲)的dsx檢查點電路134,和用于通過使用其存儲的或存儲在諸如寄存器140的另一位置中的回退地址(例如,在給定dsx中止時)來恢復(fù)核106的多個組件的狀態(tài)的dsx恢復(fù)電路136。此外,核106可包括對應(yīng)于多個dsx存儲器訪問請求的一個或多個附加的寄存器140,例如,dsx狀態(tài)和控制寄存器(dsxsr)用來存儲對dsx是否活動的指示、dsx指令指針(dsxxip)(例如,可以為指向?qū)?yīng)的dsx的開始處(或緊鄰在前)的指令的指令指針)、和/或dsx堆棧指針(dsxsp)(例如,可以為指向存儲核106的一個或多個組件的多個狀態(tài)的堆棧的頭部的堆棧指針)。這些指針還可以是msr150。
dsx地址跟蹤硬件152(有時簡單地稱為dsx跟蹤硬件)跟蹤推測存儲器訪問并且檢測dsx中的排序違反。具體而言,該跟蹤硬件152包括地址跟蹤器,其吸收信息來重構(gòu)并且然后實施原始標(biāo)量存儲器順序。典型地,輸入是循環(huán)主體中需要被跟蹤的推測存儲器指令的數(shù)量,以及這些指令中的每一個的一些信息,例如:(1)序列號,(2)指令訪問的地址,以及(3)指令引起讀取存儲器還是寫入存儲器。如果兩個推測存儲器指令訪問存儲器的重疊的部分,則硬件跟蹤器152使用該信息來確定存儲器操作的原始標(biāo)量順序是否已經(jīng)被改變。如果是,并且如果二者中的一個操作是寫,則硬件觸發(fā)錯誤推測。雖然圖1在其上示出dsx跟蹤硬件152,但是在一些實施例中該硬件是其他核組件的一部分。
圖2示出根據(jù)實施例的推測指令執(zhí)行的示例。在201處,取出推測指令。例如,取出諸如上文詳述的推測存儲器指令。在一些實施例中,該指令包括指示其推測本質(zhì)的操作碼和用于指示dsx中的排序的操作數(shù)。排序操作數(shù)可以是立即數(shù)值或寄存器/存儲器位置。
在203處解碼取出的推測指令。
在205處作出對經(jīng)解碼的推測指令是否是dsx的一部分的確定。例如,上文詳述的dsx狀態(tài)和控制寄存器(dsxsr)中指示了dsx嗎?當(dāng)dsx不活動時,指令要么變成無操作(nop),要么根據(jù)實施例在207處被執(zhí)行為正常的非推測指令。
當(dāng)dsx活動時,在209處推測地執(zhí)行(例如,不提交)推測指令并且更新dsx跟蹤硬件。
圖3示出dsx地址跟蹤硬件的詳細(xì)實施例。該硬件跟蹤推測存儲器實例。典型地,被dsx跟蹤硬件分析的元素(例如,simd元素)被分成稱為塊(chunk)的部分,塊的大小不超過“b”字節(jié)。
移位電路301對塊的地址(諸如開始地址)進行移位。在大多數(shù)實施例中,移位電路301執(zhí)行右移。典型地,右移log2b。被移位的地址經(jīng)受散列函數(shù)單元電路303執(zhí)行的散列函數(shù)。
散列函數(shù)的輸出是到散列表305的索引。如上所述,散列表305包括多個桶(bucket)307。在一些實施例中,散列表305是布魯姆(bloom)過濾器。散列表305用于檢測錯誤推測,并且用于記錄被推測地訪問的數(shù)據(jù)的地址、訪問類型、序列號和id號。散列表305包括n個“集合”,其中每個集合包括m個條目309。每個條目309保存有效位、先前執(zhí)行的推測存儲器指令的元素的序列號、id號和訪問類型。在一些實施例中,每個條目309還包括對應(yīng)的地址(圖中示為虛線框)。當(dāng)dsx啟動指令(例如,下文詳述的ybegin和變型)時,清除所有有效位,并且置位“推測活動”標(biāo)志,并且當(dāng)指令結(jié)束dsx時,清除推測活動標(biāo)志。
沖突檢查電路311針對被測試元素(或其塊)315對每個條目309檢查沖突。在一些實施例中,當(dāng)條目309是有效的并且至少以下情況之一時存在沖突:i)條目309中的訪問類型是寫入或ii)被測試訪問類型是寫入,以及以下情況之一:i)條目309中的序列號小于被測試元素315的序列號,并且條目309中的id號大于被測試元素315的id號,或ii)條目309中的序列號大于被測試元素315的序列號,并且條目309中的id號小于被測試元素315的id號。
換言之,在以下情況中存在沖突:
(條目是有效的)and((條目中的訪問類型==寫入)or(被測試訪問類型==寫入))and(((條目中的seq#<被測試seq#)and(條目中的id#>被測試id#))or((條目中的seq#>被測試seq#)and(條目中的id#<被測試id#)))
注意,在大多數(shù)實施例中,不存在對地址重疊的測試。這個重疊是通過命中散列表中的條目而隱含的。當(dāng)不存在地址重疊時,命中可以發(fā)生,因為來自散列函數(shù)和/或來自檢查的重疊過于粗粒度(即,b過大)。然而,當(dāng)存在地址重疊時將會有命中。因此保證了正確性,但是可能存在假肯定值(false-positive)(即,當(dāng)不存在錯誤推測時硬件可以檢測錯誤推測)。在實施例中,將塊地址存儲在每個條目309中,并且應(yīng)用用于測試錯誤推測的附加條件(即,將其與上述條件進行邏輯地and操作),其中條目309中的地址等于被測試元素315中的地址。
or門313(或等價物)對沖突檢查的結(jié)果進行邏輯地or操作。當(dāng)or操作的結(jié)果是1,則錯誤推測可能已經(jīng)發(fā)生,并且or門313通過其輸出指示錯誤推測可能已經(jīng)發(fā)生。
這個實施例的總存儲是m*n個條目。這意味著它可能跟蹤高達(dá)m*n個被推測地訪問的數(shù)據(jù)元素。然而在實踐中,循環(huán)可能對n個集合中的一些比對n個集合中的其他具有更多訪問。如果任何集合中的空間用盡,則在一些實施例中,觸發(fā)錯誤推測來保證正確性。增加m緩和這個問題,但是可能迫使存在沖突檢查硬件的更多副本。為了同時執(zhí)行全部m個沖突檢查(如在一些實施例中完成的),存在沖突檢查邏輯的m個副本。
以某種方式選擇b、n、m和散列函數(shù),允許結(jié)構(gòu)以與l1數(shù)據(jù)高速緩存非常類似的方式被組織。具體而言,令b作為高速緩存行的大小,n作為l1數(shù)據(jù)高速緩存中的集合的數(shù)量,m作為l1數(shù)據(jù)高速緩存的相關(guān)聯(lián)性,并且令散列函數(shù)作為地址的最低有效位(在右移之后)。這個結(jié)構(gòu)將具有與l1數(shù)據(jù)高速緩存相同數(shù)量的條目和相同的組織,這可以簡化其實現(xiàn)方式。
最后,注意替代實施例使用單獨的布魯姆過濾器用于讀取和寫入,以避免必須存儲訪問類型信息,并且避免在沖突檢查期間必須檢查訪問類型。相反,對于讀取,實施例只針對“寫入”過濾器執(zhí)行沖突檢查,并且如果不存在錯誤推測,則將元素插入“讀取”過濾器。類似地,對于寫入,實施例針對“讀取”和“寫入”過濾器兩者執(zhí)行沖突檢查,并且如果不存在錯誤推測,則將元素插入“寫入”過濾器。
圖4示出dsx跟蹤硬件執(zhí)行的dsx錯誤推測檢測的示例性方法。在401處,開始dsx或提交先前的推測迭代。例如,執(zhí)行ybegin指令。對該指令的執(zhí)行清除條目309中的有效位并且在狀態(tài)寄存器(諸如之前詳述的dsx狀態(tài)寄存器)中置位推測活動標(biāo)志(如果還未置位)。在dsx開始并且提供被測試數(shù)據(jù)元素之后執(zhí)行推測存儲器指令。
在403處,來自推測存儲器指令的被測試數(shù)據(jù)元素被分成不超過b字節(jié)的塊。以b字節(jié)的粒度訪問散列表(即,丟棄地址的低位)。如果元素足夠大并且/或者不是對齊的,則它們可以跨越b字節(jié)邊界,并且如果是,則元素被分成多個塊。
對每個塊執(zhí)行下列(405-421)操作。將塊的開始地址右移log2b。在407處將被移位的地址散列以生成索引值。
使用索引值,在409處作出對散列表的對應(yīng)集合的查找并且在411處讀出集合的所有條目。
對于每個讀出的條目,在413處針對被測試元素(諸如上述被測試元素)執(zhí)行沖突檢查。在415處對所有沖突檢查執(zhí)行or操作。如果在417處任何檢查指示沖突(使得or為1),則在419處作出對錯誤推測的指示。此時通常中止dsx。如果不存在錯誤推測,則在421處發(fā)現(xiàn)集合中的無效條目,并且使用被測試并且被標(biāo)記為有效的元素的信息來填充無效條目。如果不存在無效條目,則觸發(fā)錯誤推測。
圖5(a)-(b)示出由dsx跟蹤硬件執(zhí)行的dsx錯誤推測檢測的示例性方法。在501處,開始dsx或提交先前的推測迭代。例如,執(zhí)行ybegin指令。
在503處,對該指令的執(zhí)行通過清除條目309中的有效位來重置跟蹤硬件并且在狀態(tài)寄存器(諸如之前詳述的dsx狀態(tài)寄存器)中置位推測活動標(biāo)志(如果還未置位)。
在505處,執(zhí)行推測存儲器指令。上文詳述了這些指令的示例。在507處將作為來自推測指令的被測試元素編號(e)的計數(shù)器置位為零,并且在509處計算id(id=序列號+跨度*e)。
在511處作出對任何先前寫入是否與計數(shù)器值e重疊的確定。這充當(dāng)針對先前存儲(寫入)的依賴性檢查。對于重疊的寫入,在513處執(zhí)行沖突檢查。在一些實施例中,該沖突檢查查明是否:i)條目309中的序列號小于被測試元素315的序列號,并且條目309中的id號大于被測試元素315的id號,或ii)條目309中的序列號大于被測試元素315的序列號,并且條目309中的id號小于被測試元素315的id號。
如果存在沖突,則在515處觸發(fā)錯誤推測。如果否,或者如果不存在重疊的先前寫入,則在517處作出對推測存儲器指令是否是寫入的確定。
如果是,則在519處作出對任何先前讀取是否與計數(shù)器值e重疊的確定。這充當(dāng)針對先前加載(讀取)的依賴性檢查。對于重疊的讀取,在521處執(zhí)行沖突檢查。在一些實施例中,該沖突檢查查明是否:i)條目309中的序列號小于被測試元素315的序列號,并且條目309中的id號大于被測試元素315的id號,或ii)條目309中的序列號大于被測試元素315的序列號,并且條目309中的id號小于被測試元素315的id號。
如果存在沖突,則在523處觸發(fā)錯誤推測。如果否,或者如果不存在重疊的先前讀取,則在525處遞增計數(shù)器e。
在526處作出對計數(shù)器e是否等于推測存儲器指令中的元素的數(shù)量的確定。換言之,已經(jīng)評估了所有元素嗎?如果否,則在509處計算另一個id。如果是,則在527處硬件等待要執(zhí)行的另一個指令。當(dāng)下一指令是另一個推測存儲器指令時,則在507處重置計數(shù)器。當(dāng)下一指令是ybegin時,則在503處重置硬件等等。當(dāng)下一指令是yend,則在529處禁用dsx。
ybegin指令
圖6示出對用于開始dsx的指令的執(zhí)行的實施例。如本文中將詳述的,該指令被稱為“ybegin”并且用于表示dsx區(qū)域的開始。當(dāng)然,該指令可以被稱為另一個名稱。在一些實施例中,對諸如中央處理單元(cpu)、圖形處理單元(gpu)、加速處理單元(apu)、數(shù)字信號處理器(dsp)等等的硬件設(shè)備的一個或多個硬件核實現(xiàn)該執(zhí)行。在其他實施例中,對該指令的執(zhí)行是仿真。
在601處,接收/取出ybegin指令。例如,將指令從存儲器取出到指令高速緩存中或從指令高速緩存取出。被取出的指令可以采取下文詳述的若干形式之一。
圖7示出ybegin指令格式的一些示例性實施例。在實施例中,ybegin指令包括操作碼(ybegin)和用于提供用于回退地址的位移的單個操作數(shù),回退地址是程序執(zhí)行為了處理錯誤推測而應(yīng)該跳轉(zhuǎn)到的地方,如701所示。本質(zhì)上,位移值是回退地址的一部分。在一些實施例中,該位移值作為立即數(shù)操作數(shù)被提供。在其他實施例中,將該位移值存儲在寄存器或存儲器位置操作數(shù)中。取決于ybegin實現(xiàn)方式,使用dsx狀態(tài)寄存器、嵌套計數(shù)寄存器和/或rtm狀態(tài)寄存器的隱含操作數(shù)。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器,不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器)中的標(biāo)志、等等。
在另一個實施例中,ybegin指令不僅包括操作碼和位移操作數(shù),還包括用于dsx狀態(tài)的顯式操作數(shù),諸如dsx狀態(tài)寄存器,如703所示。取決于ybegin實現(xiàn)方式,使用嵌套計數(shù)寄存器和/或rtm狀態(tài)寄存器的隱含操作數(shù)。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器,不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器)中的標(biāo)志、等等。
在另一個實施例中,ybegin指令不僅包括操作碼和位移操作數(shù),還包括用于dsx嵌套計數(shù)的顯式操作數(shù),諸如dsx嵌套計數(shù)寄存器,如705所示。如之前詳述的,dsx嵌套計數(shù)可以是專用寄存器、不專用于dsx嵌套計數(shù)的寄存器(諸如總體狀態(tài)寄存器)中的標(biāo)志。取決于ybegin實現(xiàn)方式,使用dsx狀態(tài)寄存器和/或rtm狀態(tài)寄存器的隱含操作數(shù)。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器,不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器)中的標(biāo)志、等等。
在另一個實施例中,ybegin指令不僅包括操作碼和位移操作數(shù),還包括諸如dsx狀態(tài)寄存器的用于dsx狀態(tài)的顯式操作數(shù)和諸如dsx嵌套計數(shù)寄存器的用于dsx嵌套計數(shù)的顯式操作數(shù),如707所示。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器等等)中的標(biāo)志,并且dsx嵌套計數(shù)可以是專用寄存器、不專用于dsx嵌套計數(shù)的寄存器(諸如總體狀態(tài)寄存器)中的標(biāo)志。取決于ybegin實現(xiàn)方式,使用rtm狀態(tài)寄存器的隱含操作數(shù)。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器)中的標(biāo)志等等。
在另一個實施例中,ybegin指令不僅包括操作碼和位移操作數(shù),還包括諸如dsx狀態(tài)寄存器的用于dsx狀態(tài)的顯式操作數(shù)、諸如dsx嵌套計數(shù)寄存器的用于dsx嵌套計數(shù)的顯式操作數(shù)和用于rtm狀態(tài)的顯式操作數(shù),如709所示。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器等等)中的標(biāo)志,并且dsx嵌套計數(shù)可以是專用寄存器、不專用于dsx嵌套計數(shù)的寄存器(諸如總體狀態(tài)寄存器)中的標(biāo)志。
當(dāng)然,ybegin的其他變型是可能的。例如,代替提供位移值,指令包括在立即數(shù)、寄存器或存儲器位置中的回退地址本身。
返回圖6,在603處解碼被取出/接收的ybegin指令。在一些實施例中,由諸如后文詳述的那些硬件解碼器解碼指令。在一些實施例中,將指令解碼為微操作(微op)。例如,一些基于cisc的機器通常使用從宏指令導(dǎo)出的微操作。在其他實施例中,解碼是諸如及時編譯的軟件例程的一部分。
在605處,檢索與經(jīng)解碼的指令相關(guān)聯(lián)的任何操作數(shù)。例如,檢索來自dsx寄存器、dsx嵌套計數(shù)寄存器和/或rtm狀態(tài)寄存器中的一個或多個的數(shù)據(jù)。
在607處執(zhí)行經(jīng)解碼的ybegin指令。在其中將指令解碼為微操作的實施例中,執(zhí)行這些微操作。對經(jīng)解碼的指令的執(zhí)行使得硬件進行會被執(zhí)行的下列動作中的一個或多個:1)確定rtm事務(wù)是活動的并且繼續(xù)該事務(wù);2)使用與ybegin指令的指令指針相加的位移值來計算回退地址;3)遞增dsx嵌套計數(shù);4)中止;5)將dsx狀態(tài)設(shè)置為活動的;和/或6)重置dsx跟蹤硬件。
典型地,根據(jù)ybegin指令的實例,如果不存在活動的rtm事務(wù),則將dsx狀態(tài)設(shè)置為活動的,遞增dsx嵌套計數(shù)(如果計數(shù)小于最大值),重置dsx跟蹤硬件(例如,如上文詳述的),并且使用位移值計算回退地址以開始dsx區(qū)域。如之前詳述的,通常將dsx的狀態(tài)存儲在諸如寄存器的可訪問位置中,諸如上文參照圖1討論的dsx狀態(tài)和控制寄存器(dsxsr)。然而,可以利用諸如非專用控制/狀態(tài)寄存器(諸如flags寄存器)中的dsx狀態(tài)標(biāo)志的其他手段。先前還描述了對dsx跟蹤硬件的重置。如之前詳述的,通常將dsx的狀態(tài)存儲在諸如寄存器的可訪問位置中,諸如上文參照圖1討論的dsx狀態(tài)和控制寄存器(dsxsr)。然而,可以利用諸如非專用控制/狀態(tài)寄存器(諸如flags寄存器)中的dsx狀態(tài)標(biāo)志的其他手段。可以由核的硬件檢查這個寄存器以確定dsx是否確實發(fā)生。
如果存在一些原因dsx不能開始,則其他可能的動作中的一個或多個發(fā)生。例如,在支持rtm的處理器的一些實施例中,如果rtm事務(wù)是活動的,則一開始dsx不應(yīng)當(dāng)是活動的,并且繼續(xù)rtm。如果一開始對dsx的建立有錯誤(嵌套計數(shù)不正確),則中止將發(fā)生。此外,在一些實施例中,如果不存在dsx,則生成錯誤并且執(zhí)行無操作(nop)。無論執(zhí)行哪個動作,在大多數(shù)實施例中,在該動作之后重置dsx狀態(tài)(如果它被設(shè)置了)以指示不存在待決dsx。
圖8示出對諸如ybegin指令的指令的執(zhí)行的詳細(xì)實施例。例如,在一些實施例中,這個流程是圖6的框607。在一些實施例中,對諸如中央處理單元(cpu)、圖形處理單元(gpu)、加速處理單元(apu)、數(shù)字信號處理器(dsp)等等的硬件設(shè)備的一個或多個硬件核實現(xiàn)該執(zhí)行。在其他實施例中,對該指令的執(zhí)行是仿真。
在一些實施例中,例如在支持rtm事務(wù)的處理器中,在801處作出對rtm事務(wù)是否正在發(fā)生的確定。例如,在支持rtm的處理器的一些實施例中,如果rtm事務(wù)是活動的,則一開始dsx不應(yīng)當(dāng)是活動的。在該實例中,rtm事務(wù)中有錯誤,并且應(yīng)當(dāng)激活其結(jié)束程序。典型地,將rtm事務(wù)狀態(tài)存儲在諸如rtm控制和狀態(tài)寄存器的寄存器中。處理器的硬件評估該寄存器的內(nèi)容以確定rtm事務(wù)是否正在發(fā)生。當(dāng)rtm事務(wù)正在發(fā)生時,在803處rtm事務(wù)繼續(xù)處理。
當(dāng)沒有rtm事務(wù)正在發(fā)生時,或rtm不被支持時,在805處作出對當(dāng)前dsx嵌套計數(shù)是否小于最大嵌套計數(shù)的確定。在一些實施例中,ybegin指令提供用于存儲當(dāng)前嵌套計數(shù)的嵌套計數(shù)寄存器作為操作數(shù)。替代地,硬件中可以存在專用嵌套計數(shù)寄存器以用于存儲當(dāng)前嵌套計數(shù)。最大嵌套計數(shù)是無須對應(yīng)dsx結(jié)束(例如,經(jīng)由yend指令)的情況下可以發(fā)生的dsx開始(例如,經(jīng)由ybegin指令)的最大數(shù)量。
當(dāng)當(dāng)前dsx嵌套計數(shù)大于最大值時,在807處發(fā)生中止。在一些實施例中,中止通過使用諸如dsx恢復(fù)電路135的恢復(fù)電路來觸發(fā)回滾。在其他實施例中,如下文詳述的執(zhí)行yabort指令,其不僅執(zhí)行到回退地址的回滾,還丟棄推測地存儲的寫入并且重置當(dāng)前嵌套計數(shù)并且將dsx狀態(tài)設(shè)置為不活動的。如上文詳述的,通常將dsx狀態(tài)存儲在控制寄存器中,諸如圖1中示出的dsx狀態(tài)和控制寄存器(dsxsr)。然而,可以利用諸如非專用控制/狀態(tài)寄存器(諸如flags寄存器)中的dsx狀態(tài)標(biāo)志的其他手段。
當(dāng)當(dāng)前嵌套計數(shù)不大于最大值時,在809處遞增當(dāng)前dsx嵌套計數(shù)。
在811處作出對當(dāng)前dsx嵌套計數(shù)是否等于一的確定。當(dāng)?shù)扔谝粫r,在一些實施例中,在813處通過將ybegin指令提供的位移值與跟隨ybegin指令的指令的地址相加來計算回退地址。在其中ybegin指令提供了回退地址的實施例中,則該計算不是必須的。
在815處,將dsx狀態(tài)設(shè)置為活動的(如果需要)并且重置dsx跟蹤硬件(例如,如上文詳述的)。例如,如之前詳述的,通常將dsx的狀態(tài)存儲在諸如寄存器的可訪問位置中,諸如上文參照圖1討論的dsx狀態(tài)和控制寄存器(dsxsr)。然而,可以利用諸如非專用控制/狀態(tài)寄存器(諸如flags寄存器)中的dsx狀態(tài)標(biāo)志的其他手段??梢杂珊说挠布z查這個寄存器以確定dsx是否確實發(fā)生。
圖9示出顯示對諸如ybegin指令的指令的執(zhí)行的偽代碼的示例。
ybeginwithstride指令
圖10示出對用于開始dsx的指令的執(zhí)行的實施例。如本文中將詳述的,該指令被稱為“ybeginwithstride”并且用于表示dsx區(qū)域的開始。當(dāng)然,該指令可以被稱為另一個名稱。在一些實施例中,對諸如中央處理單元(cpu)、圖形處理單元(gpu)、加速處理單元(apu)、數(shù)字信號處理器(dsp)等等的硬件設(shè)備的一個或多個硬件核實現(xiàn)該執(zhí)行。在其他實施例中,對該指令的執(zhí)行是仿真。
在1001處,接收/取出ybeginwithstride指令。例如,將指令從存儲器取出到指令高速緩存中或從指令高速緩存取出。被取出的指令可以采取下文詳述的若干形式之一。
圖11示出ybeginwithstride指令格式的一些示例性實施例。在實施例中,ybeginwithstride指令包括操作碼(ybeginwithstride)和用于提供用于回退地址的位移的操作數(shù)(回退地址是程序執(zhí)行為了處理錯誤推測而應(yīng)該跳轉(zhuǎn)到的地方)和跨度值操作數(shù),如1101所示。本質(zhì)上,位移是回退地址的一部分。在一些實施例中,位移作為立即數(shù)操作數(shù)被提供。在其他實施例中,將位移值存儲在寄存器或存儲器位置操作數(shù)中。在一些實施例中,跨度作為立即數(shù)操作數(shù)被提供。在其他實施例中,將跨度存儲在寄存器或存儲器位置操作數(shù)中。取決于ybeginwithstride實現(xiàn)方式,使用dsx狀態(tài)寄存器、嵌套計數(shù)寄存器和/或rtm狀態(tài)寄存器的隱含操作數(shù)。
在另一個實施例中,ybeginwithstride指令不僅包括操作碼和位移操作數(shù)和跨度值操作數(shù),還包括用于dsx狀態(tài)的顯式操作數(shù),諸如dsx狀態(tài)寄存器,如1103所示。在一些實施例中,位移作為立即數(shù)操作數(shù)被提供。在其他實施例中,將位移值存儲在寄存器或存儲器位置操作數(shù)中。在一些實施例中,跨度作為立即數(shù)操作數(shù)被提供。在其他實施例中,將跨度存儲在寄存器或存儲器位置操作數(shù)中。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器)中的標(biāo)志、等等。取決于ybeginwithstride實現(xiàn)方式,使用嵌套計數(shù)寄存器和/或rtm狀態(tài)寄存器的隱含操作數(shù)。
在另一個實施例中,ybeginwithstride指令不僅包括操作碼和位移操作數(shù)和跨度值操作數(shù),和跨度值操作數(shù),還包括用于dsx嵌套計數(shù)的顯式操作數(shù),諸如dsx嵌套計數(shù)寄存器,如1105所示。在一些實施例中,位移作為立即數(shù)操作數(shù)被提供。在其他實施例中,將位移值存儲在寄存器或存儲器位置操作數(shù)中。在一些實施例中,跨度作為立即數(shù)操作數(shù)被提供。在其他實施例中,將跨度存儲在寄存器或存儲器位置操作數(shù)中。如之前詳述的,dsx嵌套計數(shù)可以是專用寄存器、不專用于dsx嵌套計數(shù)的寄存器(諸如總體狀態(tài)寄存器)中的標(biāo)志。取決于ybeginwithstride實現(xiàn)方式,使用dsx狀態(tài)寄存器和/或rtm狀態(tài)寄存器的隱含操作數(shù)。
在另一個實施例中,ybeginwithstride指令不僅包括操作碼、位移操作數(shù)和跨度值操作數(shù),還包括諸如dsx狀態(tài)寄存器的用于dsx狀態(tài)的顯式操作數(shù)和諸如dsx嵌套計數(shù)寄存器的用于dsx嵌套計數(shù)的顯式操作數(shù),如1107所示。在一些實施例中,位移作為立即數(shù)操作數(shù)被提供。在其他實施例中,將位移值存儲在寄存器或存儲器位置操作數(shù)中。在一些實施例中,跨度作為立即數(shù)操作數(shù)被提供。在其他實施例中,將跨度存儲在寄存器或存儲器位置操作數(shù)中。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器等等)中的標(biāo)志,并且dsx嵌套計數(shù)可以是專用寄存器、不專用于dsx嵌套計數(shù)的寄存器(諸如總體狀態(tài)寄存器)中的標(biāo)志。取決于ybeginwithstride實現(xiàn)方式,使用rtm狀態(tài)寄存器的隱含操作數(shù)。
在另一個實施例中,ybeginwithstride指令不僅包括操作碼、位移操作數(shù)和跨度值操作數(shù),還包括諸如dsx狀態(tài)寄存器的用于dsx狀態(tài)的顯式操作數(shù)和諸如dsx嵌套計數(shù)寄存器的用于dsx嵌套計數(shù)的顯式操作數(shù)以及rtm狀態(tài)寄存器,如409所示。在一些實施例中,位移作為立即數(shù)操作數(shù)被提供。在其他實施例中,將位移值存儲在寄存器或存儲器位置操作數(shù)中。在一些實施例中,跨度作為立即數(shù)操作數(shù)被提供。在其他實施例中,將跨度存儲在寄存器或存儲器位置操作數(shù)中。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器等等)中的標(biāo)志,并且dsx嵌套計數(shù)可以是專用寄存器、不專用于dsx嵌套計數(shù)的寄存器(諸如總體狀態(tài)寄存器)中的標(biāo)志。
當(dāng)然,ybeginwithstride的其他變型是可能的。例如,代替提供位移值,指令包括本身在立即數(shù)、寄存器或存儲器位置中的回退地址。
返回圖10,在1003處解碼被取出/接收的ybeginwithstride指令。在一些實施例中,由諸如后文詳述的那些硬件解碼器解碼指令。在一些實施例中,將指令解碼為微操作(微op)。例如,一些基于cisc的機器通常使用從宏指令導(dǎo)出的微操作。在其他實施例中,解碼是諸如及時編譯的軟件例程的一部分。
在1005處,檢索與經(jīng)解碼的ybeginwithstride指令相關(guān)聯(lián)的任何操作數(shù)。例如,檢索來自dsx寄存器、dsx嵌套計數(shù)寄存器和/或rtm狀態(tài)寄存器中的一個或多個的數(shù)據(jù)。
在1007處執(zhí)行經(jīng)解碼的ybeginwithstride指令。在其中將指令解碼為微操作的實施例中,執(zhí)行這些微操作。對經(jīng)解碼的指令的執(zhí)行使得硬件進行會被執(zhí)行的下列動作中的一個或多個:1)確定rtm事務(wù)是活動的并且開始該事務(wù);2)使用與ybeginwithstride指令的指令指針相加的位移值來計算回退地址;3)遞增dsx嵌套計數(shù);4)中止;5)將dsx狀態(tài)設(shè)置為活動的;6)重置dsx跟蹤硬件和/或7)將跨度值提供給dsx硬件跟蹤器。
典型地,一旦出現(xiàn)ybeginwithstride指令的第一實例,如果不存在活動的rtm事務(wù),則將dsx狀態(tài)設(shè)置為活動的,重置dsx跟蹤硬件(例如,如上文詳述的使用提供的跨度值),并且使用位移值計算回退地址以開始dsx區(qū)域。如之前詳述的,通常將dsx的狀態(tài)存儲在諸如寄存器的可訪問位置中,諸如上文參照圖1討論的dsx狀態(tài)和控制寄存器(dsxsr)。然而,可以利用諸如非專用控制/狀態(tài)寄存器(諸如flags寄存器)中的dsx狀態(tài)標(biāo)志的其他手段。先前還描述了對dsx跟蹤硬件的重置。
典型地,一旦出現(xiàn)ybeginwithstride指令的實例,如果不存在活動的rtm事務(wù),則將dsx狀態(tài)設(shè)置為活動的,遞增dsx嵌套計數(shù)(如果計數(shù)小于最大值),重置dsx跟蹤硬件(例如,如上文詳述的使用提供的跨度),并且使用位移值計算回退地址以開始dsx區(qū)域。如之前詳述的,通常將dsx的狀態(tài)存儲在諸如寄存器的可訪問位置中,諸如上文參照圖1討論的dsx狀態(tài)和控制寄存器(dsxsr)。然而,可以利用諸如非專用控制/狀態(tài)寄存器(諸如flags寄存器)中的dsx狀態(tài)標(biāo)志的其他手段。先前還描述了對dsx跟蹤硬件的重置。如之前詳述的,通常將dsx的狀態(tài)存儲在諸如寄存器的可訪問位置中,諸如上文參照圖1討論的dsx狀態(tài)和控制寄存器(dsxsr)。然而,可以利用諸如非專用控制/狀態(tài)寄存器(諸如flags寄存器)中的dsx狀態(tài)標(biāo)志的其他手段。可以由核的硬件檢查這個寄存器以確定dsx是否確實發(fā)生。
如果存在一些原因dsx不能開始,則其他可能的動作中的一個或多個發(fā)生。例如,在支持rtm的處理器的一些實施例中,如果rtm事務(wù)是活動的,則一開始dsx不應(yīng)當(dāng)是活動的,并且繼續(xù)rtm。如果一開始對dsx的建立有錯誤(嵌套計數(shù)不正確),則中止將發(fā)生。此外,在一些實施例中,如果不存在dsx,則生成錯誤并且執(zhí)行無操作(nop)。無論執(zhí)行哪個動作,在大多數(shù)實施例中,在該動作之后重置dsx狀態(tài)(如果它被設(shè)置了)以指示不存在待決dsx。
圖12示出對諸如ybeginwithstride指令的指令的執(zhí)行的詳細(xì)實施例。例如,在一些實施例中,這個流程是圖10的框1007。在一些實施例中,對諸如中央處理單元(cpu)、圖形處理單元(gpu)、加速處理單元(apu)、數(shù)字信號處理器(dsp)等等的硬件設(shè)備的一個或多個硬件核實現(xiàn)該執(zhí)行。在其他實施例中,對該指令的執(zhí)行是仿真。
在一些實施例中,例如在支持rtm事務(wù)的處理器中,在1201處作出對rtm事務(wù)是否正在發(fā)生的確定。例如,在支持rtm的處理器的一些實施例中,如果rtm事務(wù)是活動的,則一開始dsx不應(yīng)當(dāng)是活動的。在該實例中,rtm事務(wù)中有錯誤,并且應(yīng)當(dāng)激活其結(jié)束程序。典型地,將rtm事務(wù)狀態(tài)存儲在諸如rtm控制和狀態(tài)寄存器的寄存器中。處理器的硬件評估該寄存器的內(nèi)容以確定rtm事務(wù)是否正在發(fā)生。當(dāng)rtm事務(wù)正在發(fā)生時,在1203處rtm事務(wù)繼續(xù)處理。
當(dāng)沒有rtm事務(wù)正在發(fā)生時,或rtm不被支持時,在1205處作出對當(dāng)前dsx嵌套計數(shù)是否小于最大嵌套計數(shù)的確定。在一些實施例中,ybeginwithstride指令提供用于存儲當(dāng)前嵌套計數(shù)的嵌套計數(shù)寄存器作為操作數(shù)。替代地,硬件中可以存在專用嵌套計數(shù)寄存器以用于存儲當(dāng)前嵌套計數(shù)。最大嵌套計數(shù)是無須對應(yīng)dsx結(jié)束(例如,經(jīng)由yend指令)的情況下可以發(fā)生的dsx開始(例如,經(jīng)由ybegin指令)的最大數(shù)量。
當(dāng)當(dāng)前嵌套計數(shù)大于最大值時,在1207處發(fā)生中止。在一些實施例中,中止觸發(fā)回滾。在其他實施例中,如下文詳述的執(zhí)行yabort,其不僅執(zhí)行到回退地址的回滾,還丟棄推測地存儲的寫入并且重置當(dāng)前嵌套計數(shù)并且將dsx狀態(tài)設(shè)置為不活動的。如上文詳述的,通常將dsx狀態(tài)存儲在控制寄存器中,諸如圖1中示出的dsx狀態(tài)和控制寄存器(dsxsr)。然而,可以利用諸如非專用控制/狀態(tài)寄存器(諸如flags寄存器)中的dsx狀態(tài)標(biāo)志的其他手段。
當(dāng)當(dāng)前嵌套計數(shù)不大于最大值時,在1209處遞增當(dāng)前dsx嵌套計數(shù)。
在1211處作出對當(dāng)前dsx嵌套計數(shù)是否等于一的確定。當(dāng)?shù)扔谝粫r,在一些實施例中,在1213處通過將ybeginwithstride指令提供的位移值與跟隨ybeginwithstride指令的指令的地址相加來計算回退地址。在其中ybeginwithstride指令提供了回退地址的實施例中,則該計算不是必須的。
在1215處,將dsx狀態(tài)設(shè)置為活動的(如果其需要是)并且重置dsx跟蹤硬件(例如,如上文詳述的包括使用提供的跨度值)。例如,如之前詳述的,通常將dsx的狀態(tài)存儲在諸如寄存器的可訪問位置中,諸如上文參照圖1討論的dsx狀態(tài)和控制寄存器(dsxsr)。然而,可以利用諸如非專用控制/狀態(tài)寄存器(諸如flags寄存器)中的dsx狀態(tài)標(biāo)志的其他手段??梢杂珊说挠布z查這個寄存器以確定dsx是否確實發(fā)生。
ycontinue指令
隨著dsx到達(dá)末尾(例如,循環(huán)的迭代已經(jīng)運行了其過程)而沒有任何問題,在一些實施例中,執(zhí)行指令(yend)以指示推測區(qū)域的結(jié)束,如下文詳述的。簡言之,對這個指令的執(zhí)行引起了對當(dāng)前推測狀態(tài)(還未被寫入的所有寫入)的提交以及從當(dāng)前推測區(qū)域的退出,如下文將討論的。然后通過調(diào)用另一個ybegin可以開始循環(huán)的另一個迭代。
然而,在一些實施例中,當(dāng)不再需要推測時(例如,當(dāng)存儲之間不存在沖突時),通過使用繼續(xù)指令以提交當(dāng)前循環(huán)迭代,可獲得對ybegin、yend、ybegin等等的此循環(huán)的優(yōu)化。繼續(xù)指令還開始新推測循環(huán)迭代而不需要調(diào)用ybegin。
圖13示出對用于繼續(xù)dsx而不結(jié)束它的指令的執(zhí)行的實施例。如本文中將詳述的,該指令被稱為“ycontinue”并且用于表示事務(wù)的結(jié)束。當(dāng)然,該指令可以被稱為另一個名稱。
在一些實施例中,對諸如中央處理單元(cpu)、圖形處理單元(gpu)、加速處理單元(apu)、數(shù)字信號處理器(dsp)等等的硬件設(shè)備的一個或多個硬件核實現(xiàn)該執(zhí)行。在其他實施例中,對該指令的執(zhí)行是仿真。
在1301處,接收/取出ycontinue指令。例如,將指令從存儲器取出到指令高速緩存中或從指令高速緩存取出。被取出的指令可以采取若干形式之一。
圖14示出ycontinue指令格式的一些示例性實施例。在實施例中,ycontinue指令包括操作碼(ycontinue),但是沒有顯式操作數(shù),如1401所示。取決于ycontinue實現(xiàn)方式,dsx狀態(tài)寄存器和嵌套計數(shù)寄存器的隱含操作數(shù)。如之前詳述的,dsx嵌套計數(shù)可以是專用寄存器,寄存器中的標(biāo)志不專用于dsx嵌套計數(shù)(諸如總體狀態(tài)寄存器)等等。此外,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器)中的標(biāo)志、等等。
在另一個實施例中,ycontinue指令不僅包括操作碼,還包括用于dsx狀態(tài)的顯式操作數(shù),諸如dsx狀態(tài)寄存器,如1403所示。取決于ycontinue實現(xiàn)方式,使用嵌套計數(shù)寄存器的隱含操作數(shù)。如之前詳述的,dsx嵌套計數(shù)可以是專用寄存器、不專用于dsx嵌套計數(shù)的寄存器(諸如總體狀態(tài)寄存器)中的標(biāo)志、等等。此外,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器)中的標(biāo)志、等等。
在另一個實施例中,ycontinue指令不僅包括操作碼,還包括用于dsx嵌套計數(shù)的顯式操作數(shù),諸如dsx嵌套計數(shù)寄存器,如1405所示。取決于ycontinue實現(xiàn)方式,使用dsx狀態(tài)寄存器的隱含操作數(shù)。如之前詳述的,dsx嵌套計數(shù)可以是專用寄存器、不專用于dsx嵌套計數(shù)的寄存器(諸如總體狀態(tài)寄存器)中的標(biāo)志、等等。此外,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器)中的標(biāo)志、等等。
在另一個實施例中,ycontinue指令不僅包括操作碼,還包括諸如dsx狀態(tài)寄存器的用于dsx狀態(tài)的顯式操作數(shù)和諸如dsx嵌套計數(shù)寄存器的用于dsx嵌套計數(shù)的顯式操作數(shù),如1407所示。如之前詳述的,dsx嵌套計數(shù)可以是專用寄存器、不專用于dsx嵌套計數(shù)的寄存器(諸如總體狀態(tài)寄存器)中的標(biāo)志、等等。此外,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器)中的標(biāo)志、等等。
返回圖13,在1303處解碼被取出/接收的ycontinue指令。在一些實施例中,由諸如后文詳述的那些硬件解碼器解碼指令。在一些實施例中,將指令解碼為微操作(微op)。例如,一些基于cisc的機器通常使用從宏指令導(dǎo)出的微操作。在其他實施例中,解碼是諸如及時編譯的軟件例程的一部分。
在1305處,檢索與經(jīng)解碼的ycontinue指令相關(guān)聯(lián)的任何操作數(shù)。例如,檢索來自dsx寄存器和dsx嵌套計數(shù)寄存器中的一個或多個的數(shù)據(jù)。
在1307處執(zhí)行經(jīng)解碼的ycontinue指令。在其中將指令解碼為微操作的實施例中,執(zhí)行這些微操作。對經(jīng)解碼的指令的執(zhí)行使得硬件進行會被執(zhí)行的下列動作中的一個或多個:1)確定由于不再需要推測而使得與dsx相關(guān)聯(lián)的推測寫入會被提交,并且提交它們,并且開始新推測循環(huán)迭代(諸如新dsx區(qū)域);和/或2)無操作。
可以由之前詳述的dsx檢查硬件執(zhí)行這些動作中的第一個(使推測寫入終結(jié)并且開始新推測循環(huán)迭代)。在這個動作中,提交與dsx的循環(huán)迭代相關(guān)聯(lián)的所有推測寫入(存儲使得它們在dsx外部是可訪問的),但是與yend指令不同,dsx狀態(tài)不設(shè)置為指示dsx不存在。例如,提交與dsx相關(guān)聯(lián)的所有寫入(諸如存儲在高速緩存、寄存器或存儲器中的),使得它們被終結(jié)并且在dsx外部是可見的。典型地,dsx提交將不發(fā)生,除非dsx嵌套計數(shù)是一。否則,在一些實施例中,然后執(zhí)行nop。
在一些實施例中,如果dsx不是活動的,則可以執(zhí)行nop。
圖15示出對諸如ycontinue指令的指令的執(zhí)行的詳細(xì)實施例。例如,在一些實施例中,這個流程是圖13的框1307。在一些實施例中,對諸如中央處理單元(cpu)、圖形處理單元(gpu)、加速處理單元(apu)、數(shù)字信號處理器(dsp)等等的硬件設(shè)備的一個或多個硬件核實現(xiàn)該執(zhí)行。在其他實施例中,對該指令的執(zhí)行是仿真。
在1501處作出對dsx是否活動的確定。如上文詳述的,通常將dsx狀態(tài)存儲在控制寄存器中,諸如圖1中示出的dsx狀態(tài)和控制寄存器(dsxsr)。然而,可以利用諸如非專用控制/狀態(tài)寄存器(諸如flags寄存器)中的dsx狀態(tài)標(biāo)志的其他手段。無論狀態(tài)被存儲在何處,由處理器的硬件檢查位置以確定dsx是否確實發(fā)生。
當(dāng)沒有dsx發(fā)生時,在1503處執(zhí)行無op。
當(dāng)dsx發(fā)生時,在1505處作出對dsx嵌套計數(shù)是否等于一的確定。如上文詳述的,通常將dsx嵌套計數(shù)存儲在嵌套計數(shù)寄存器中。當(dāng)dsx嵌套計數(shù)不是一時,在507處執(zhí)行nop。當(dāng)dsx嵌套計數(shù)是一時,在1509處完成提交和dsx重新開始。當(dāng)提交和dsx重新開始發(fā)生時,在一些實施例中,下列操作中的一個或多個發(fā)生:1)重置dsx跟蹤硬件(例如,如上文詳述的),2)計算回退地址,以及3)作出對先前推測區(qū)域的被推測地執(zhí)行的指令(寫入)的提交。
圖16示出顯示對諸如ycontinue指令的指令的執(zhí)行的偽代碼的示例。
ybort指令
有時,在dsx內(nèi),存在需要dsx中止的問題(諸如錯誤推測)。圖17示出對用于中止dsx的指令的執(zhí)行的實施例。如本文中將詳述的,這個指令被稱為“yabort”。當(dāng)然,該指令可以被稱為另一個名稱。在一些實施例中,對諸如中央處理單元(cpu)、圖形處理單元(gpu)、加速處理單元(apu)、數(shù)字信號處理器(dsp)等等的硬件設(shè)備的一個或多個硬件核實現(xiàn)該執(zhí)行。在其他實施例中,對該指令的執(zhí)行是仿真。
在1701處,接收/取出yabort指令。例如,將指令從存儲器取出到指令高速緩存中或從指令高速緩存取出。被取出的指令可以采取下文詳述的若干形式之一。
圖18示出yabort指令格式的一些示例性實施例。在實施例中,yabort指令只包括操作碼(yabort),如1801所示。取決于yabort實現(xiàn)方式,使用dsx狀態(tài)寄存器和/或rtm狀態(tài)寄存器的隱含操作數(shù)。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器)中的標(biāo)志、等等。
在另一個實施例中,yabort指令不僅包括操作碼,還包括dsx狀態(tài)寄存器的顯式操作數(shù),諸如dsx狀態(tài)寄存器,如1803所示。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器)中的標(biāo)志、等等。取決于yabort實現(xiàn)方式,使用rtm狀態(tài)寄存器的隱含操作數(shù)。
在另一個實施例中,yabort指令不僅包括操作碼,還包括諸如dsx狀態(tài)寄存器的dsx狀態(tài)寄存器的顯式操作數(shù)和rtm狀態(tài)寄存器的顯示操作數(shù),如1805所示。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器)中的標(biāo)志、等等。
返回圖17,在1703處解碼被取出/接收的yabort指令。在一些實施例中,由諸如后文詳述的那些硬件解碼器解碼指令。在一些實施例中,將指令解碼為微操作(微op)。例如,一些基于cisc的機器通常使用從宏指令導(dǎo)出的微操作。在其他實施例中,解碼是諸如及時編譯的軟件例程的一部分。
在1705處,檢索與經(jīng)解碼的yabort指令相關(guān)聯(lián)的任何操作數(shù)。例如,檢索來自dsx寄存器和/或rtm狀態(tài)寄存器中的一個或多個的數(shù)據(jù)。
在1707處執(zhí)行經(jīng)解碼的yabort指令。在其中將指令解碼為微操作的實施例中,執(zhí)行這些微操作。對經(jīng)解碼的指令的執(zhí)行使得硬件進行會被執(zhí)行的下列動作中的一個或多個:1)確定rtm事務(wù)是活動的并且中止rtm事務(wù);2)確定dsx是不活動的并且執(zhí)行無操作;和/或3)通過重置任何dsx嵌套計數(shù)、丟棄所有被推測地執(zhí)行的寫入、將dsx狀態(tài)設(shè)置為不活動的并且將執(zhí)行回滾到回退地址來中止dsx。
關(guān)于第一個動作,通常將rtm狀態(tài)存儲在rtm狀態(tài)和控制寄存器中。當(dāng)這個寄存器指示rtm事務(wù)正在發(fā)生時,不應(yīng)當(dāng)執(zhí)行yabort指令。由此,rtm事務(wù)存在問題并且其應(yīng)當(dāng)中止。
關(guān)于第二個和第三個動作,如之前詳述的,通常將dsx的狀態(tài)存儲在諸如寄存器的可訪問位置中,諸如上文參照圖1討論的dsx狀態(tài)和控制寄存器(dsxsr)。然而,可以利用諸如非專用控制/狀態(tài)寄存器(諸如flags寄存器)中的dsx狀態(tài)標(biāo)志的其他手段。可以由核的硬件檢查這個寄存器以確定dsx是否確實發(fā)生。當(dāng)這個寄存器指示無dsx時,則將沒有理由執(zhí)行yabort指令,并且由此執(zhí)行無操作(或類似的操作)。當(dāng)這個寄存器指示有dsx時,則dsx中止處理發(fā)生,包括重置dsx跟蹤硬件、丟棄所有存儲的被推測地執(zhí)行的寫入、并且將dsx狀態(tài)重置為不活動的并且回滾執(zhí)行。
圖19示出對諸如yabort指令的指令的執(zhí)行的詳細(xì)實施例。例如,在一些實施例中,這個流程是圖17的框1707。在一些實施例中,對諸如中央處理單元(cpu)、圖形處理單元(gpu)、加速處理單元(apu)、數(shù)字信號處理器(dsp)等等的硬件設(shè)備的一個或多個硬件核實現(xiàn)該執(zhí)行。在其他實施例中,對該指令的執(zhí)行是仿真。
在一些實施例中,例如在支持rtm事務(wù)的處理器中,在1901處作出對rtm事務(wù)是否正在發(fā)生的確定。例如,在支持rtm的處理器的一些實施例中,如果rtm事務(wù)是活動的,則一開始dsx不應(yīng)當(dāng)是活動的。在該實例中,rtm事務(wù)中有錯誤,并且應(yīng)當(dāng)激活其結(jié)束程序。典型地,將rtm事務(wù)狀態(tài)存儲在諸如rtm控制和狀態(tài)寄存器的寄存器中。處理器的硬件評估該寄存器的內(nèi)容以確定rtm事務(wù)是否正在發(fā)生。當(dāng)rtm事務(wù)正在發(fā)生時,rtm事務(wù)繼續(xù)進行1903。
當(dāng)沒有rtm事務(wù)發(fā)生時,或rtm不被支持時,在1905處作出對dsx是否活動的確定。通常將dsx的狀態(tài)存儲在諸如上文參照圖1討論的dsx狀態(tài)和控制寄存器(dsxsr)的可訪問位置中。然而,可以利用諸如非專用控制/狀態(tài)寄存器(諸如flags寄存器)中的dsx狀態(tài)標(biāo)志的其他手段??梢杂珊说挠布z查這個寄存器以確定dsx是否發(fā)生。
當(dāng)這個寄存器指示無dsx時,則在1907處執(zhí)行nop。當(dāng)這個寄存器指示有dsx時,則在1909處dsx中止處理發(fā)生,包括重置dsx跟蹤硬件、丟棄所有存儲的被推測地執(zhí)行的寫入、并且將dsx狀態(tài)重置為不活動的并且回滾執(zhí)行。
圖20示出顯示對諸如yabort指令的指令的執(zhí)行的偽代碼的示例。
ytest指令
通常在開始新dsx推測區(qū)域之前軟件需要知道dsx是否是活動的。圖21示出對用于測試dsx的狀態(tài)的指令的執(zhí)行的實施例。如本文中將詳述的,這個指令被稱為“ytest”并且用于通過對標(biāo)志的使用提供對dsx活動的指示。當(dāng)然,該指令可以被稱為另一個名稱。
在一些實施例中,對諸如中央處理單元(cpu)、圖形處理單元(gpu)、加速處理單元(apu)、數(shù)字信號處理器(dsp)等等的硬件設(shè)備的一個或多個硬件核實現(xiàn)該執(zhí)行。在其他實施例中,對該指令的執(zhí)行是仿真。
在2101處,接收/取出ytest指令。例如,將指令從存儲器取出到指令高速緩存中或從指令高速緩存取出。被取出的指令可以采取若干形式之一。圖22示出ytest指令格式的一些示例性實施例。在實施例中,ytest指令包括操作碼(ytest),但是沒有顯式操作數(shù),如2201所示。使用dsx狀態(tài)寄存器和標(biāo)志寄存器的隱含操作數(shù)。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器)中的標(biāo)志、等等。示例性標(biāo)志寄存器包括eflags寄存器。具體而言,標(biāo)志寄存器用于存儲零標(biāo)志(zf)。
在另一個實施例中,ytest指令不僅包括操作碼,還包括用于dsx狀態(tài)的顯式操作數(shù),諸如dsx狀態(tài)寄存器,如2203所示。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器)中的標(biāo)志、等等。使用標(biāo)志寄存器的隱含操作數(shù)。示例性標(biāo)志寄存器包括eflags寄存器。具體而言,標(biāo)志寄存器用于存儲零標(biāo)志(zf)。
在另一個實施例中,ytest指令不僅包括操作碼,還包括標(biāo)志寄存器的顯式操作數(shù),如2205所示。示例性標(biāo)志寄存器包括eflags寄存器。具體而言,標(biāo)志寄存器用于存儲零標(biāo)志(zf)。使用dsx狀態(tài)寄存器的隱含操作數(shù)。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器)中的標(biāo)志、等等。
在另一個實施例中,ytest指令不僅包括操作碼,還包括諸如dsx狀態(tài)寄存器的用于dsx狀態(tài)的顯式操作數(shù)和標(biāo)志寄存器的顯式操作數(shù),如2207所示。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器)中的標(biāo)志、等等。使用標(biāo)志寄存器的隱含操作數(shù)。示例性標(biāo)志寄存器包括eflags寄存器。具體而言,標(biāo)志寄存器用于存儲零標(biāo)志(zf)。
返回圖21,在2103處解碼被取出/接收的ytest指令。在一些實施例中,由諸如后文詳述的那些硬件解碼器解碼指令。在一些實施例中,將指令解碼為微操作(微op)。例如,一些基于cisc的機器通常使用從宏指令導(dǎo)出的微操作。在其他實施例中,解碼是諸如及時編譯的軟件例程的一部分。
在2105處,檢索與經(jīng)解碼的ytest指令相關(guān)聯(lián)的任何操作數(shù)。例如,檢索來自dsx狀態(tài)寄存器的數(shù)據(jù)。
在2107處執(zhí)行經(jīng)解碼的ytest指令。在其中將指令解碼為微操作的實施例中,執(zhí)行這些微操作。對經(jīng)解碼的指令的執(zhí)行使得硬件進行會被執(zhí)行的下列動作中的一個或多個:1)確定dsx狀態(tài)寄存器指示dsx是活動的,并且如果是則將標(biāo)志寄存器中的零標(biāo)志設(shè)置為0;或2)確定dsx狀態(tài)寄存器指示dsx是不活動的,并且如果是則將標(biāo)志寄存器中的零標(biāo)志設(shè)置為1。當(dāng)然,雖然零標(biāo)志用于顯示dsx活動狀態(tài),但是取決于實施例使用其他標(biāo)志。
圖23示出顯示對諸如ytest指令的指令的執(zhí)行的偽代碼的示例。
yend指令
隨著dsx結(jié)束(例如,循環(huán)的迭代已經(jīng)運行了其過程)而沒有任何問題,在一些實施例中,執(zhí)行指令以指示推測區(qū)域的結(jié)束。簡言之,對這個指令的執(zhí)行引起了對當(dāng)前推測狀態(tài)(還未被寫入的所有寫入)的提交以及從當(dāng)前推測區(qū)域的退出。
圖24示出對用于結(jié)束dsx的指令的執(zhí)行的實施例。如本文中將詳述的,該指令被稱為“yend”并且用于表示dsx的結(jié)束。當(dāng)然,該指令可以被稱為另一個名稱。
在一些實施例中,對諸如中央處理單元(cpu)、圖形處理單元(gpu)、加速處理單元(apu)、數(shù)字信號處理器(dsp)等等的硬件設(shè)備的一個或多個硬件核實現(xiàn)該執(zhí)行。在其他實施例中,對該指令的執(zhí)行是仿真。
在2401處,接收/取出yend指令。例如,將指令從存儲器取出到指令高速緩存中或從指令高速緩存取出。被取出的指令可以采取若干形式之一。圖25示出yend指令格式的一些示例性實施例。在實施例中,yend指令包括操作碼(yend),但是沒有顯式操作數(shù),如2501所示。取決于yend實現(xiàn)方式,使用用于dsx狀態(tài)、嵌套計數(shù)和/或rtm狀態(tài)的隱含寄存器操作數(shù)。
在另一個實施例中,yend指令不僅包括操作碼,還包括用于dsx狀態(tài)的顯式操作數(shù),諸如dsx狀態(tài)寄存器,如2503所示。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器)中的標(biāo)志、等等。取決于yend實現(xiàn)方式,使用用于嵌套計數(shù)和/或rtm狀態(tài)的隱含寄存器操作數(shù)。
在另一個實施例中,yend指令不僅包括操作碼,還包括用于dsx嵌套計數(shù)的顯式操作數(shù),諸如dsx嵌套計數(shù)寄存器,如2505所示。如之前詳述的,dsx嵌套計數(shù)可以是專用寄存器、不專用于dsx嵌套計數(shù)的寄存器(諸如總體狀態(tài)寄存器)中的標(biāo)志。取決于yend實現(xiàn)方式,使用用于dsx狀態(tài)和/或rtm狀態(tài)的隱含寄存器操作數(shù)。
在另一個實施例中,yend指令不僅包括操作碼,還包括諸如dsx狀態(tài)寄存器的用于dsx狀態(tài)的顯式操作數(shù)和諸如dsx嵌套計數(shù)寄存器的用于dsx嵌套計數(shù)的顯式操作數(shù),如2507所示。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器等等)中的標(biāo)志,并且dsx嵌套計數(shù)可以是專用寄存器、不專用于dsx嵌套計數(shù)的寄存器(諸如總體狀態(tài)寄存器)中的標(biāo)志。取決于yend實現(xiàn)方式,使用rtm狀態(tài)寄存器的隱含操作數(shù)。
在另一個實施例中,yend指令不僅包括操作碼,還包括諸如dsx狀態(tài)寄存器的用于dsx狀態(tài)的顯式操作數(shù)、諸如dsx嵌套計數(shù)寄存器的用于dsx嵌套計數(shù)的顯式操作數(shù)和用于rtm狀態(tài)的顯式操作數(shù),如2509所示。如之前詳述的,dsx狀態(tài)寄存器可以是專用寄存器、不專用于dsx狀態(tài)的寄存器(諸如像標(biāo)志寄存器的總體狀態(tài)寄存器等等)中的標(biāo)志,并且dsx嵌套計數(shù)可以是專用寄存器,寄存器中的標(biāo)志不專用于dsx嵌套計數(shù)(諸如總體狀態(tài)寄存器)。
返回圖24,在2403處解碼被取出/接收的yend指令。在一些實施例中,由諸如后文詳述的那些硬件解碼器解碼指令。在一些實施例中,將指令解碼為微操作(微op)。例如,一些基于cisc的機器通常使用從宏指令導(dǎo)出的微操作。在其他實施例中,解碼是諸如及時編譯的軟件例程的一部分。
在2405處,檢索與經(jīng)解碼的yend指令相關(guān)聯(lián)的任何操作數(shù)。例如,檢索來自dsx寄存器、dsx嵌套計數(shù)寄存器和/或rtm狀態(tài)寄存器中的一個或多個的數(shù)據(jù)。
在2407處執(zhí)行經(jīng)解碼的yend指令。在其中將指令解碼為微操作的實施例中,執(zhí)行這些微操作。對經(jīng)解碼的指令的執(zhí)行使得硬件進行會被執(zhí)行的下列動作中的一個或多個:1)使得與dsx相關(guān)聯(lián)的推測寫入終結(jié)(提交它們);2)通知錯誤(諸如一般保護錯誤)并且執(zhí)行無操作;3)中止dsx;和/或4)結(jié)束rtm事務(wù)。
這些動作中的第一個(使得推測寫入終結(jié))使得與dsx相關(guān)聯(lián)的所有推測寫入被提交(存儲使得它們在dsx外部是可訪問的),并且在dsx狀態(tài)寄存器中將dsx狀態(tài)設(shè)置為指示dsx不存在。例如,提交與dsx相關(guān)聯(lián)的所有寫入(諸如存儲在高速緩存、寄存器或存儲器中的),使得它們被結(jié)束并且在dsx外部是可見的。典型地,不能終結(jié)dsx,除非該推測的嵌套計數(shù)是零。如果嵌套計數(shù)大于零,則在一些實施例中執(zhí)行nop。
如果存在一些原因不可終結(jié)dsx,則其他三個可能的動作中的一個或多個發(fā)生。例如,在支持rtm的處理器的一些實施例中,如果rtm事務(wù)是活動的,則一開始dsx不應(yīng)當(dāng)是活動的。在該實例中,rtm事務(wù)中有錯誤,并且應(yīng)當(dāng)激活其結(jié)束程序,如上述第四個動作指示的。
在一些實施例中,如果不存在dsx,則生成錯誤并且執(zhí)行無操作(nop)。例如,如之前詳述的,通常將dsx的狀態(tài)存儲在諸如寄存器的可訪問位置中,諸如上文參照圖1討論的dsx狀態(tài)和控制寄存器(dsxsr)。然而,可以利用諸如非專用控制/狀態(tài)寄存器(諸如flags寄存器)中的dsx狀態(tài)標(biāo)志的其他手段??梢杂珊说挠布z查這個寄存器以確定dsx是否確實發(fā)生。
在一些實施例中,如果在對事務(wù)的提交中有失敗,則實現(xiàn)中斷程序。例如,在支持rtm的處理器的一些實施例中,激活rtm中斷程序。
無論執(zhí)行哪個動作,在大多數(shù)實施例中,在該動作之后重置dsx狀態(tài)(如果它被設(shè)置了)以指示不存在待決dsx。
圖26示出對諸如yend指令的指令的執(zhí)行的詳細(xì)實施例。例如,在一些實施例中,這個流程是圖24的框2407。在一些實施例中,對諸如中央處理單元(cpu)、圖形處理單元(gpu)、加速處理單元(apu)、數(shù)字信號處理器(dsp)等等的硬件設(shè)備的一個或多個硬件核實現(xiàn)該執(zhí)行。在其他實施例中,對該指令的執(zhí)行是仿真。
在一些實施例中,例如在支持rtm事務(wù)的處理器中,在2601處作出對rtm事務(wù)是否正在發(fā)生的確定。例如,在支持rtm的處理器的一些實施例中,如果rtm事務(wù)是活動的,則一開始dsx不應(yīng)當(dāng)是活動的。在該實例中,rtm事務(wù)中有錯誤,并且應(yīng)當(dāng)激活其結(jié)束程序。典型地,將rtm事務(wù)狀態(tài)存儲在諸如rtm控制和狀態(tài)寄存器的寄存器中。處理器的硬件評估該寄存器的內(nèi)容以確定rtm事務(wù)是否正在發(fā)生。
當(dāng)rtm事務(wù)正在發(fā)生時,在2603處作出結(jié)束這個rtm事務(wù)的調(diào)用。例如,調(diào)用并執(zhí)行用于結(jié)束rtm事務(wù)的指令。此類指令的示例是xend。
當(dāng)沒有rtm事務(wù)發(fā)生時,在2605處作出對dsx是否活動的確定。如上文詳述的,通常將dsx狀態(tài)存儲在控制寄存器中,諸如圖1中示出的dsx狀態(tài)和控制寄存器(dsxsr)。然而,可以利用諸如非專用控制/狀態(tài)寄存器(諸如flags寄存器)中的dsx狀態(tài)標(biāo)志的其他手段。無論狀態(tài)被存儲在何處,由處理器的硬件檢查位置以確定dsx是否確實發(fā)生。
當(dāng)沒有dsx發(fā)生時,在2607處生成錯誤。例如,生成一般保護錯誤。此外,在一些實施例中,執(zhí)行無操作(nop)。
當(dāng)dsx發(fā)生時,在2609處遞減dsx嵌套計數(shù)。例如,遞減諸如上文詳述的存儲在dsx嵌套計數(shù)寄存器中的存儲的dsx嵌套計數(shù)。
在2611處作出對dsx嵌套計數(shù)是否等于零的確定。如上文詳述的,通常將dsx嵌套計數(shù)存儲在寄存器中。當(dāng)dsx嵌套計數(shù)不是零時,在一些實施例中執(zhí)行nop。當(dāng)dsx嵌套計數(shù)是零時,在2615處終結(jié)并提交當(dāng)前dsx的推測狀態(tài)。
在2617處作出對提交是否成功的確定。例如,存儲中有錯誤嗎?如果否,則在2621處中止dsx。當(dāng)提交是成功的時,在2619處設(shè)置dsx狀態(tài)指示(諸如存儲在dsx狀態(tài)和控制寄存器中)以指示沒有活動的dsx。在一些實施例中,對這個指示的設(shè)置在錯誤的生成2607或?qū)sx的中止2621之后發(fā)生。
圖27示出顯示對諸如yend指令的指令的執(zhí)行的偽代碼的示例。
下文討論了用于執(zhí)行上述指令的指令格式和執(zhí)行資源的實施例。
指令集包括一個或多個指令格式。給定指令格式定義各種字段(位的數(shù)量、位的位置)以指定將要執(zhí)行的操作(操作碼)以及將對其執(zhí)行該操作的操作數(shù),等等。通過指令模板(或子格式)的定義來進一步分解一些指令格式。例如,可將給定指令格式的指令模板定義為具有指令格式字段(所包括的字段通常按照相同順序,但是至少一些字段具有不同的位的位置,因為更少的字段被包括)的不同子集,和/或定義為具有以不同方式進行解釋的給定字段。如此,isa的每一條指令使用給定的指令格式來表達(dá)(并且如果經(jīng)定義,則按照該指令格式的指令模板中的給定指令模板),并包括用于指定操作和操作數(shù)的字段。例如,示例性add(加法)指令具有特定的操作碼和指令格式(包括用于指定該操作碼的操作碼字段和用于選擇操作數(shù)(源1/目的地以及源2)的操作數(shù)字段),并且該add指令在指令流中出現(xiàn)將使得在選擇特定操作數(shù)的操作數(shù)字段中具有特定的內(nèi)容。已發(fā)布和/或出版了被稱為高級向量擴展(avx)(avx1和avx2)并使用向量擴展(vex)編碼方案的simd擴展集(例如,參見2011年10月的《
示例性指令格式
本文中所描述的指令的實施例可以不同的格式體現(xiàn)。另外,在下文中詳述示例性系統(tǒng)、架構(gòu)、以及流水線。指令的實施例可在這些系統(tǒng)、架構(gòu)、以及流水線上執(zhí)行,但是不限于詳述的系統(tǒng)、架構(gòu)、以及流水線。
通用向量友好指令格式
向量友好指令格式是適于向量指令(例如,存在專用于向量操作的特定字段)的指令格式。盡管描述了其中通過向量友好指令格式支持向量和標(biāo)量運算兩者的實施例,但是替代實施例僅使用通過向量友好指令格式的向量運算。
圖28a-28b是示出根據(jù)本發(fā)明的各實施例的通用向量友好指令格式及其指令模板的框圖。圖28a是示出根據(jù)本發(fā)明的實施例的通用向量友好指令格式及其a類指令模板的框圖;而圖28b是示出根據(jù)本發(fā)明的實施例的通用向量友好指令格式及其b類指令模板的框圖。具體而言,為通用向量友好指令格式2800定義了a類和b類指令模板,這兩類指令模板都包括無存儲器訪問2805指令模板和存儲器訪問2820指令模板。在向量友好指令格式的上下文中的術(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ù)元素寬度)。
圖28a中的a類指令模板包括:1)在無存儲器訪問2805的指令模板內(nèi),示出無存儲器訪問的完全舍入控制型操作2810的指令模板以及無存儲器訪問的數(shù)據(jù)變換型操作2815的指令模板;以及2)在存儲器訪問2820的指令模板內(nèi),示出存儲器訪問的時效性的2825的指令模板和存儲器訪問的非時效性的2830的指令模板。圖28b中的b類指令模板包括:1)在無存儲器訪問2805的指令模板內(nèi),示出無存儲器訪問的寫掩碼控制的部分舍入控制型操作2812的指令模板以及無存儲器訪問的寫掩碼控制的vsize型操作2817的指令模板;以及2)在存儲器訪問2820的指令模板內(nèi),示出存儲器訪問的寫掩碼控制2827的指令模板。
通用向量友好指令格式2800包括下文中按照圖28a-28b中所示出的順序列出的下列字段。
格式字段2840——該字段中的特定值(指令格式標(biāo)識符值)唯一地標(biāo)識向量友好指令格式,并且由此標(biāo)識指令在指令流中以向量友好指令格式出現(xiàn)。由此,該字段對于僅具有通用向量友好指令格式的指令集是不需要的,在這個意義上該字段是任選的。
基礎(chǔ)操作字段2842——其內(nèi)容區(qū)分不同的基礎(chǔ)操作。
寄存器索引字段2844——其內(nèi)容直接或者通過地址生成來指定源和目的地操作數(shù)在寄存器中或者在存儲器中的位置。這些字段包括足夠數(shù)量的位以從pxq(例如,32x512、16x128、32x1024、64x1024)個寄存器堆中選擇n個寄存器。盡管在一個實施例中n可高達(dá)三個源和一個目的地寄存器,但是替代實施例可支持更多或更少的源和目的地寄存器(例如,可支持高達(dá)兩個源,其中這些源中的一個源還用作目的地,可支持高達(dá)三個源,其中這些源中的一個源還用作目的地,可支持高達(dá)兩個源和一個目的地)。
修飾符(modifier)字段2846——其內(nèi)容將指定存儲器訪問的以通用向量指令格式出現(xiàn)的指令與不指定存儲器訪問的以通用向量指令格式出現(xiàn)的指令區(qū)分開;即在無存儲器訪問2805的指令模板與存儲器訪問2820的指令模板之間進行區(qū)分。存儲器訪問操作讀取和/或?qū)懭氲酱鎯ζ鲗哟?在一些情況下,使用寄存器中的值來指定源和/或目的地地址),而非存儲器訪問操作不這樣(例如,源和/或目的地是寄存器)。盡管在一個實施例中,該字段還在三種不同的方式之間選擇以執(zhí)行存儲器地址計算,但是替代實施例可支持更多、更少或不同的方式來執(zhí)行存儲器地址計算。
擴充操作字段2850——其內(nèi)容區(qū)分除基礎(chǔ)操作以外還要執(zhí)行各種不同操作中的哪一個操作。該字段是針對上下文的。在本發(fā)明的一個實施例中,此字段被劃分為類字段2868、α字段2852以及β字段2854。擴充操作字段2850允許在單條指令而非2條、3條或4條指令中執(zhí)行多組共同的操作。
比例字段2860-其內(nèi)容允許用于存儲器地址生成(例如,用于使用2比例*索引+基址的地址生成)的索引字段的內(nèi)容按比例縮放。
位移字段2862a-其內(nèi)容用作存儲器地址生成的部分(例如,用于使用2比例*索引+基址+位移的地址生成)。
位移因數(shù)字段2862b(注意,位移字段2862a直接在位移因數(shù)字段2862b上的并置指示使用一個或另一個)-其內(nèi)容用作地址生成的一部分,它指定通過存儲器訪問的大小(n)按比例縮放的位移因數(shù),其中n是存儲器訪問中的字節(jié)數(shù)量(例如,用于使用2比例*索引+基址+按比例縮放的位移的地址生成)。忽略冗余的低階位,并且因此將位移因數(shù)字段的內(nèi)容乘以存儲器操作數(shù)總大小(n)以生成在計算有效地址時所使用的最終位移。n的值由處理器硬件在運行時基于完整操作碼字段2874(稍后在本文中描述)和數(shù)據(jù)操縱字段2854c確定。位移字段2862a和位移因數(shù)字段2862b不用于無存儲器訪問2805指令模板,和/或不同的實施例可以實現(xiàn)僅一者或兩者都不實現(xiàn),從這個意義上說,位移字段2862a和位移因數(shù)字段2862b是任選的。
數(shù)據(jù)元素寬度字段2864——其內(nèi)容區(qū)分將使用多個數(shù)據(jù)元素寬度中的哪一個(在一些實施例中,用于所有指令;在其他實施例中,用于指令中的僅一些)。如果支持僅一個數(shù)據(jù)元素寬度和/或使用操作碼的某一方面來支持?jǐn)?shù)據(jù)元素寬度,則該字段是不需要的,在這個意義上該字段是任選的。
寫掩碼字段2870——其內(nèi)容在每一數(shù)據(jù)元素位置的基礎(chǔ)上控制目的地向量操作數(shù)中的數(shù)據(jù)元素位置是否反映基礎(chǔ)操作和擴充操作的結(jié)果。a類指令模板支持合并-寫掩碼操作,而b類指令模板支持合并-寫掩碼操作和歸零-寫掩碼操作兩者。當(dāng)合并時,向量掩碼允許在執(zhí)行任何操作期間保護目的地中的任何元素集免于更新(由基礎(chǔ)操作和擴充操作指定);在另一實施例中,保持其中對應(yīng)掩碼位具有0的目的地的每一元素的舊值。相反,當(dāng)歸零時,向量掩碼允許在執(zhí)行任何操作期間使目的地中的元素的任何集合歸零(由基礎(chǔ)操作和擴充操作指定);在一個實施例中,目的地的元素在對應(yīng)掩碼位具有0值時被設(shè)為0。該功能的子集是控制執(zhí)行的操作的向量長度的能力(即,從第一個到最后一個要修改的元素的跨度),然而,被修改的元素不一定要是連續(xù)的。如此,寫掩碼字段2870允許部分向量操作,包括加載、存儲、算術(shù)、邏輯等等。盡管描述了其中寫掩碼字段2870的內(nèi)容選擇多個寫掩碼寄存器中的包含要使用的寫掩碼的一個寫掩碼寄存器(并且由此,寫掩碼字段2870的內(nèi)容間接地標(biāo)識了要執(zhí)行的掩碼操作)的本發(fā)明的多個實施例,但是替代地或附加地,替代實施例允許掩碼寫字段2870的內(nèi)容直接地指定要執(zhí)行的掩碼操作。
立即數(shù)字段2872——其內(nèi)容允許對立即數(shù)的指定。該字段在實現(xiàn)不支持立即數(shù)的通用向量友好格式中不存在且在不使用立即數(shù)的指令中不存在,在這個意義上該字段是任選的。
類字段2868——其內(nèi)容在不同類的指令之間進行區(qū)分。參考圖28a-b,該字段的內(nèi)容在a類和b類指令之間進行選擇。在圖28a-b中,使用圓角方形來指示在字段中存在專用值(例如,在圖28a-b中,分別是針對類字段2868的a類2868a和b類2868b)。
a類指令模板
在a類非存儲器訪問2805的指令模板的情況下,α字段2852被解釋為rs字段2852a,其內(nèi)容區(qū)分將執(zhí)行不同的擴充操作類型中的哪一種(例如,分別為無存儲器訪問的舍入型操作2810以及無存儲器訪問的數(shù)據(jù)變換型操作2815指令模板指定的舍入2852a.1和數(shù)據(jù)變換2852a.2),而β字段2854區(qū)別將執(zhí)行指定的類型的操作中的哪一個。在無存儲器訪問2805的指令模板中,比例字段2860、位移字段2862a以及位移比例字段2862b不存在。
無存儲器訪問的指令模板——完全舍入控制型操作
在無存儲器訪問的完全舍入控制型操作2810指令模板中,β字段2854被解釋為舍入控制字段2854a,其內(nèi)容提供靜態(tài)舍入操作。盡管在本發(fā)明的所描述的實施例中,舍入控制字段2854a包括抑制所有浮點異常(sae)字段2856和舍入操作控制字段2858,但是替代實施例可以支持將這兩個概念編碼為同一個字段,或僅具有這些概念/字段中的一個或另一個(例如,可以僅具有舍入操作控制字段2858)。
sae字段2856——其內(nèi)容區(qū)分是否停用異常事件報告;當(dāng)sae字段2856的內(nèi)容指示啟用抑制時,給定指令不報告任何種類的浮點異常標(biāo)志且不喚起任何浮點異常處理程序。
舍入操作控制字段2858——其內(nèi)容區(qū)分執(zhí)行一組舍入操作中的哪一個(例如,向上舍入、向下舍入、向零舍入、以及就近舍入)。如此,舍入操作控制字段2858允許逐指令地改變舍入模式。在其中處理器包括用于指定舍入模式的控制寄存器的本發(fā)明的一個實施例中,舍入操作控制字段2850的內(nèi)容優(yōu)先于該寄存器值。
無存儲器訪問的指令模板——數(shù)據(jù)變換型操作
在無存儲器訪問的數(shù)據(jù)變換型操作2815指令模板中,β字段2854被解釋為數(shù)據(jù)變換字段2854b,其內(nèi)容區(qū)分將執(zhí)行數(shù)個數(shù)據(jù)變換中的哪一個(例如,無數(shù)據(jù)變換、混合、廣播)。
在a類存儲器訪問2820的指令模板的情況下,α字段2852被解釋為驅(qū)逐提示字段2852b,其內(nèi)容區(qū)分要使用驅(qū)逐提示中的哪一個(在圖28a中,對于存儲器訪問時效性2825的指令模板和存儲器訪問非時效性2830的指令模板分別指定時效性的2852b.1和非時效性的2852b.2),而β字段2854被解釋為數(shù)據(jù)操縱字段2854c,其內(nèi)容區(qū)分要執(zhí)行多個數(shù)據(jù)操縱操作(也稱為基元(primitive))中的哪一個(例如,無操縱、廣播、源的向上轉(zhuǎn)換以及目的地的向下轉(zhuǎn)換)。存儲器訪問2820指令模板包括比例字段2860,并且任選地包括位移字段2862a或位移比例字段2862b。
向量存儲器指令使用轉(zhuǎn)換支持來執(zhí)行來自存儲器的向量加載并將向量存儲到存儲器。如同尋常的向量指令,向量存儲器指令以數(shù)據(jù)元素式的方式與存儲器來回傳輸數(shù)據(jù),其中實際傳輸?shù)脑赜蛇x為寫掩碼的向量掩碼的內(nèi)容規(guī)定。
存儲器訪問指令模板——時效性
時效性的數(shù)據(jù)是可能足夠快地重新使用以從高速緩存受益的數(shù)據(jù)。然而,這是提示,且不同的處理器可以不同的方式實現(xiàn)它,包括完全忽略該提示。
存儲器訪問指令模板——非時效性
非時效性數(shù)據(jù)是不大可能足夠快地重復(fù)使用以從第1級高緩存中的高速緩存操作獲益且應(yīng)當(dāng)給予驅(qū)逐優(yōu)先級的數(shù)據(jù)。然而,這是提示,且不同的處理器可以不同的方式實現(xiàn)它,包括完全忽略該提示。
b類指令模板
在b類指令模板的情況下,α字段2852被解釋為寫掩碼控制(z)字段2852c,其內(nèi)容區(qū)分由寫掩碼字段2870控制的寫掩碼操作應(yīng)當(dāng)是合并還是歸零。
在b類非存儲器訪問2805指令模板的情況下,β字段2854的部分被解釋為rl字段2857a,其內(nèi)容區(qū)分將執(zhí)行不同的擴充操作類型中的哪一種(例如,分別為無存儲器訪問的寫掩碼控制部分舍入控制型操作2812指令模板和無存儲器訪問的寫掩碼控制vsize型操作2817指令模板指定的舍入2857a.1和向量長度(vsize)2857a.2),而β字段2854的其余部分區(qū)分將執(zhí)行指定類型的操作中的哪一個。在無存儲器訪問2805的指令模板中,比例字段2860、位移字段2862a以及位移比例字段2862b不存在。
在無存儲器訪問的寫掩碼控制部分舍入控制型操作2810指令模板中,β字段2854的其余部分被解釋為舍入操作字段2859a,并且異常事件報告被禁用(給定的指令不報告任何種類的浮點異常標(biāo)志,并且不引發(fā)任何浮點異常處理程序)。
舍入操作控制字段2859a——正如舍入操作控制字段2858,其內(nèi)容區(qū)分執(zhí)行一組舍入操作中的哪一個(例如,向上舍入、向下舍入、向零舍入、以及就近舍入)。由此,舍入操作控制字段2859a允許在每一指令的基礎(chǔ)上改變舍入模式。在其中處理器包括用于指定舍入模式的控制寄存器的本發(fā)明的一個實施例中,舍入操作控制字段2850的內(nèi)容優(yōu)先于該寄存器值。
在無存儲器訪問的寫掩碼控制vsize型操作2817指令模板中,β字段2854的其余部分被解釋為向量長度字段2859b,其內(nèi)容區(qū)分將執(zhí)行數(shù)個數(shù)據(jù)向量長度中的哪一個(例如,128、256或512字節(jié))。
在b類存儲器訪問2820指令模板的情況下,β字段2854的部分被解釋為廣播字段2857b,其內(nèi)容區(qū)分是否將執(zhí)行廣播類型數(shù)據(jù)操縱操作,而β字段2854的其余部分被解釋為向量長度字段2859b。存儲器訪問2820指令模板包括比例字段2860,并且任選地包括位移字段2862a或位移比例字段2862b。
就通用向量友好指令格式2800而言,完整操作碼字段2874示出為包括格式字段2840、基礎(chǔ)操作字段2842以及數(shù)據(jù)元素寬度字段2864。盡管示出了其中完整操作碼字段2874包括所有這些字段的一個實施例,但是,在不是支持所有這些字段的實施例中,完整操作碼字段2874包括少于全部這些字段。完整操作碼字段2874提供操作代碼(操作碼)。
擴充操作字段2850、數(shù)據(jù)元素寬度字段2864以及寫掩碼字段2870允許以通用向量友好指令格式逐指令地指定這些特征。
寫掩碼字段和數(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)??墒挂愿呒壵Z言撰寫的程序成為(例如,及時編譯或者靜態(tài)編譯)各種不同的可執(zhí)行形式,包括:1)僅具有目標(biāo)處理器支持以執(zhí)行的類的指令的形式;或者2)具有使用所有類的指令的不同組合而編寫的替代例程且具有選擇這些例程以基于由當(dāng)前正在執(zhí)行代碼的處理器支持的指令而執(zhí)行的控制流代碼的形式。
示例性專用向量友好指令格式
圖29是示出根據(jù)本發(fā)明的實施例的示例性專用向量友好指令格式的框圖。圖29示出專用向量友好指令格式2900,其指定位置、大小、解釋、字段的次序、以及那些字段中的一些字段的值,在這個意義上專用向量友好指令格式1300是專用的。專用向量友好指令格式2900可以被用來擴展x86指令集,并且由此,這些字段中的一些與用于現(xiàn)有的x86指令集及其擴展(例如,avx)中的那些字段類似或相同。該格式保持與具有擴展的現(xiàn)有x86指令集的前綴編碼字段、實操作碼字節(jié)字段、modr/m字段、sib字段、位移字段、以及立即數(shù)字段一致。示出來自圖28的字段,來自圖29的字段映射到來自圖28的字段。
應(yīng)當(dāng)理解,雖然出于說明的目的在通用向量友好指令格式2800的上下文中,本發(fā)明的實施例參考專用向量友好指令格式2900進行了描述,但是本發(fā)明不限于專用向量友好指令格式2900,聲明的地方除外。例如,通用向量友好指令格式2800構(gòu)想了各種字段的各種可能的大小,而專用向量友好指令格式2900示出為具有特定大小的字段。作為具體示例,盡管數(shù)據(jù)元素寬度字段2864示出為專用向量友好指令格式2900中的一個位字段,但是本發(fā)明不限于此(也就是說,通用向量友好指令格式2800構(gòu)想數(shù)據(jù)元素寬度字段2864的其他大小)。
通用向量友好指令格式2800包括下文中按照圖29a中所示出的順序列出的字段。
evex前綴(字節(jié)0-3)2902——以四字節(jié)形式進行編碼。
格式字段2840(evex字節(jié)0,位[7:0])——第一字節(jié)(evex字節(jié)0)是格式字段2840,并且它包含0x62(在本發(fā)明的一個實施例中用于區(qū)分向量友好指令格式的唯一值)。
第二-第四字節(jié)(evex字節(jié)1-3)包括提供專用能力的多個位字段。
rex字段2905(evex字節(jié)1,比特[7-5])-由evex.r比特字段(evex字節(jié)1,比特[7]–r)、evex.x比特字段(evex字節(jié)1,比特[6]–x)以及(2857bex字節(jié)1,比特[5]–b)組成。evex.r、evex.x和evex.b位字段提供與對應(yīng)vex位字段相同的功能,并且使用1補碼的形式進行編碼,即zmm0被編碼為1111b,zmm15被編碼為0000b。這些指令的其他字段對如在本領(lǐng)域中已知的寄存器索引的較低三個位(rrr、xxx、以及bbb)進行編碼,由此可通過增加evex.r、evex.x以及evex.b來形成rrrr、xxxx以及bbbb。
rex’字段2810——這是rex’字段2810的第一部分,并且是用于對擴展的32個寄存器集合的較高16個或較低16個寄存器進行編碼的evex.r’位字段(evex字節(jié)1,位[4]–r’)。在本發(fā)明的一個實施例中,該位與以下指示的其他位一起以位反轉(zhuǎn)的格式存儲以(在公知x86的32位模式下)與實操作碼字節(jié)是62的bound指令進行區(qū)分,但是在modr/m字段(在下文中描述)中不接受mod字段中的值11;本發(fā)明的替代實施例不以反轉(zhuǎn)的格式存儲該指示的位以及下文中其他指示的位。值1用于對較低16個寄存器進行編碼。換句話說,通過組合evex.r’、evex.r以及來自其他字段的其他rrr來形成r’rrrr。
操作碼映射字段2915(evex字節(jié)1,位[3:0]–mmmm)——其內(nèi)容對隱含的前導(dǎo)操作碼字節(jié)(0f、0f38、或0f3)進行編碼。
數(shù)據(jù)元素寬度字段2864(evex字節(jié)2,位[7]–w)——由記號evex.w表示。evex.w用于定義數(shù)據(jù)類型的粒度(大小)(32位數(shù)據(jù)元素或64位數(shù)據(jù)元素)。
evex.vvvv2920(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字段2920對以反轉(zhuǎn)(1補碼)的形式存儲的第一源寄存器說明符的4個低階位進行編碼。取決于該指令,額外不同的evex位字段用于將說明符大小擴展到32個寄存器。
evex.u2868類字段(evex字節(jié)2,位[2]-u)——如果evex.u=0,則它指示a類或evex.u0;如果evex.u=1,則它指示b類或evex.u1。
前綴編碼字段2925(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之前被擴展成傳統(tǒng)simd前綴(因此,該pla可執(zhí)行傳統(tǒng)格式和evex格式的這些傳統(tǒng)指令,而無需修改)。雖然較新的指令可將evex前綴編碼字段的內(nèi)容直接用作操作碼擴展,但是為了一致性,某些實施例以類似的方式擴展,但允許由這些傳統(tǒng)simd前綴指定不同的含義。替代實施例可重新設(shè)計pla以支持2位simd前綴編碼,并且由此不需要擴展。
α字段2852(evex字節(jié)3,位[7]–eh,也稱為evex.eh、evex.rs、evex.rl、evex.寫掩碼控制以及evex.n;也以α示出)-如先前所述,該字段是針對上下文的。
β字段2854(evex字節(jié)3,位[6:4]-sss,也稱為evex.s2-0、evex.r2-0、evex.rr1、evex.ll0、evex.llb,還以βββ示出)——如前所述,此字段是針對上下文的。
rex’字段2810——這是rex’字段的其余部分,并且是可用于對擴展的32個寄存器集合的較高16個或較低16個寄存器進行編碼的evex.v’位字段(evex字節(jié)3,位[3]–v’)。該位以位反轉(zhuǎn)的格式存儲。值1用于對較低16個寄存器進行編碼。換句話說,通過組合evex.v’、evex.vvvv來形成v’vvvv。
寫掩碼字段2870(evex字節(jié)3,位[2:0]-kkk)——其內(nèi)容指定寫掩碼寄存器中的寄存器索引,如先前所述。在本發(fā)明的一個實施例中,特定值evex.kkk=000具有暗示沒有寫掩碼用于特定指令的特殊行為(這可以各種方式實現(xiàn),包括使用硬連線成全部為1的寫掩碼或者旁路掩碼硬件的硬件來實現(xiàn))。
實操作碼字段2930(字節(jié)4)也稱為操作碼字節(jié)。操作碼的一部分在該字段中被指定。
modr/m字段2940(字節(jié)5)包括mod字段2942、reg字段2944以及r/m字段2946。如先前所述的,mod字段2942的內(nèi)容將存儲器訪問和非存儲器訪問操作區(qū)分開。reg字段2944的作用可被歸結(jié)為兩種情形:對目的地寄存器操作數(shù)或源寄存器操作數(shù)進行編碼;或者被視為操作碼擴展且不用于對任何指令操作數(shù)進行編碼。r/m字段2946的作用可包括如下:對引用存儲器地址的指令操作數(shù)進行編碼,或者對目的地寄存器操作數(shù)或源寄存器操作數(shù)進行編碼。
比例、索引、基址(sib)字節(jié)(字節(jié)6)——如先前所述的,比例字段2850的內(nèi)容用于存儲器地址生成。sib.xxx2954和sib.bbb2956——先前已經(jīng)針對寄存器索引xxxx和bbbb提及了這些字段的內(nèi)容。
位移字段2862a(字節(jié)7-10)——當(dāng)mod字段2942包含10時,字節(jié)7-10是位移字段2862a,并且它與傳統(tǒng)32位位移(disp32)一樣地工作,并且以字節(jié)粒度工作。
位移因數(shù)字段2862b(字節(jié)7)——當(dāng)mod字段2942包含01時,字節(jié)7是位移因數(shù)字段2862b。該字段的位置與傳統(tǒng)x86指令集8位位移(disp8)的位置相同,它以字節(jié)粒度工作。由于disp8是符號擴展的,因此它僅能在-128和127字節(jié)偏移量之間尋址;在64字節(jié)高速緩存行的方面,disp8使用可被設(shè)為僅四個真正有用的值-128、-64、0和64的8位;由于常常需要更大的范圍,所以使用disp32;然而,disp32需要4個字節(jié)。與disp8和disp32對比,位移因數(shù)字段2862b是disp8的重新解釋;當(dāng)使用位移因數(shù)字段2862b時,通過將位移因數(shù)字段的內(nèi)容乘以存儲器操作數(shù)訪問的大小(n)來確定實際位移。該類型的位移被稱為disp8*n。這減小了平均指令長度(單個字節(jié)用于位移,但具有大得多的范圍)。這種壓縮位移基于有效位移是存儲器訪問的粒度的倍數(shù)的假設(shè),并且由此地址偏移量的冗余低階位不需要被編碼。換句話說,位移因數(shù)字段2862b替代傳統(tǒng)x86指令集8位位移。由此,位移因數(shù)字段2862b以與x86指令集8位位移相同的方式(因此在modrm/sib編碼規(guī)則中沒有變化)進行編碼,唯一的不同在于,將disp8超載至disp8*n。換句話說,在編碼規(guī)則或編碼長度中沒有變化,而僅在通過硬件對位移值的解釋中有變化(這需要按存儲器操作數(shù)的大小按比例縮放位移量以獲得字節(jié)式地址偏移量)。
立即數(shù)字段2872如先前所述那樣進行操作。
完整操作碼字段
圖29b是示出根據(jù)本發(fā)明的一個實施例的構(gòu)成完整操作碼字段2874的專用向量友好指令格式2900中的字段的框圖。具體而言,完整操作碼字段2874包括格式字段2840、基礎(chǔ)操作字段2842以及數(shù)據(jù)元素寬度(w)字段2864。基礎(chǔ)操作字段2842包括前綴編碼字段2925、操作碼映射字段2915以及實操作碼字段2930。
寄存器索引字段
圖29c是示出根據(jù)本發(fā)明的一個實施例的構(gòu)成寄存器索引字段2844的具有專用向量友好指令格式2900的字段的框圖。具體而言,寄存器索引字段2844包括rex字段2905、rex’字段2910、modr/m.reg字段2944、modr/m.r/m字段2946、vvvv字段2920、xxx字段2954以及bbb字段2956。
擴充操作字段
圖29d是示出根據(jù)本發(fā)明的一個實施例的構(gòu)成擴充操作字段2850的專用向量友好指令格式2900中的字段的框圖。當(dāng)類(u)字段2868包含0時,它表示evex.u0(a類2868a);當(dāng)它包含1時,它表示evex.u1(b類2868b)。當(dāng)u=0且mod字段2942包含11(表明無存儲器訪問操作)時,α字段2852(evex字節(jié)3,位[7]–eh)被解釋為rs字段2852a。當(dāng)rs字段2852a包含1(舍入2852a.1)時,β字段2854(evex字節(jié)3、位[6:4]-sss)被解釋為舍入控制字段2854a。舍入控制字段2854a包括一位的sae字段2856和兩位的舍入操作字段2858。當(dāng)rs字段2852a包含0(數(shù)據(jù)變換2852a.2)時,β字段2854(evex字節(jié)3,位[6:4]-sss)被解釋為三位的數(shù)據(jù)變換字段2854b。當(dāng)u=0且mod字段2942包含00、01或10(表明存儲器訪問操作)時,α字段2852(evex字節(jié)3,位[7]–eh)被解釋為驅(qū)逐提示(eh)字段2852b且β字段2854(evex字節(jié)3,位[6:4]–sss)被解釋為三位數(shù)據(jù)操縱字段2854c。
當(dāng)u=1時,α字段2852(evex字節(jié)3,位[7]–eh)被解釋為寫掩碼控制(z)字段2852c。當(dāng)u=1且mod字段2942包含11(表明無存儲器訪問操作)時,β字段2854的部分(evex字節(jié)3,位[4]–s0)被解釋為rl字段2857a;當(dāng)它包含1(舍入2857a.1)時,β字段2854的其余部分(evex字節(jié)3,位[6-5]–s2-1)被解釋為舍入操作字段2859a,而當(dāng)rl字段2857a包含0(vsize2857.a2)時,β字段2854的其余部分(evex字節(jié)3,位[6-5]-s2-1)被解釋為向量長度字段2859b(evex字節(jié)3,位[6-5]–l1-0)。當(dāng)u=1且mod字段2942包含00、01或10(表明存儲器訪問操作)時,β字段2854(evex字節(jié)3,位[6:4]–sss)被解釋為向量長度字段2859b(evex字節(jié)3,位[6-5]–l1-0)和廣播字段2857b(evex字節(jié)3,位[4]–b)。
示例性寄存器架構(gòu)
圖30是根據(jù)本發(fā)明的一個實施例的寄存器架構(gòu)3000的框圖。在所示出的實施例中,有32個512位寬的向量寄存器3010;這些寄存器被引用為zmm0到zmm31。較低的16zmm寄存器的較低階256個位覆蓋在寄存器ymm0-16上。較低的16zmm寄存器的較低階128個位(ymm寄存器的較低階128個位)覆蓋在寄存器xmm0-15上。專用向量友好指令格式2900按下表中所示方式對這些重疊寄存器堆進行操作。
換句話說,向量長度字段2859b在最大長度與一個或多個其他較短長度之間進行選擇,其中每一這種較短長度是前一長度的一半,并且不具有向量長度字段2859b的指令模板對最大向量長度操作。此外,在一個實施例中,專用向量友好指令格式2900的b類指令模板對緊縮或標(biāo)量單/雙精度浮點數(shù)據(jù)以及緊縮或標(biāo)量整數(shù)數(shù)據(jù)操作。標(biāo)量操作是對zmm/ymm/xmm寄存器中的最低階數(shù)據(jù)元素位置執(zhí)行的操作;取決于本實施例,較高階數(shù)據(jù)元素位置保持與在指令之前相同或者歸零。
寫掩碼寄存器3015——在所示實施例中,有8個寫掩碼寄存器(k0到k7),每一個的大小都是64位。在替代實施例中,寫掩碼寄存器3015的大小為16位。如先前所述的,在本發(fā)明的一個實施例中,向量掩碼寄存器k0無法用作寫掩碼;當(dāng)正常指示k0的編碼用作寫掩碼時,它選擇硬連線的寫掩碼0xffff,從而有效地停用該指令的寫掩碼操作。
通用寄存器3025——在所示實施例中,有十六個64位通用寄存器,這些寄存器與現(xiàn)有的x86尋址模式一起使用來對存儲器操作數(shù)尋址。這些寄存器通過名稱rax、rbx、rcx、rdx、rbp、rsi、rdi、rsp以及r8到r15來引用。
標(biāo)量浮點棧寄存器堆(x87棧)3045,在其上重疊了mmx緊縮整數(shù)平坦寄存器堆3050——在所示出的實施例中,x87棧是用于使用x87指令集擴展來對32/64/80位浮點數(shù)據(jù)執(zhí)行標(biāo)量浮點操作的八元素棧;而使用mmx寄存器來對64位緊縮整數(shù)數(shù)據(jù)執(zhí)行操作,以及為在mmx和xmm寄存器之間執(zhí)行的某些操作保存操作數(shù)。
本發(fā)明的替代實施例可以使用較寬的或較窄的寄存器。另外,本發(fā)明的替代實施例可以使用更多、更少或不同的寄存器堆和寄存器。
示例性核架構(gòu)、處理器和計算機架構(gòu)
處理器核可以以不同方式、出于不同目的、在不同的處理器中實現(xiàn)。例如,這樣的核的實現(xiàn)可以包括:1)旨在用于通用計算的通用有序核;2)旨在用于通用計算的高性能通用亂序核;3)旨在主要用于圖形和/或科學(xué)(吞吐量)計算的專用核。不同處理器的實現(xiàn)可包括:1)包括旨在用于通用計算的一個或多個通用有序核和/或旨在用于通用計算的一個或多個通用亂序核的cpu;以及2)包括旨在主要用于圖形和/或科學(xué)(吞吐量)的一個或多個專用核的協(xié)處理器。這樣的不同處理器導(dǎo)致不同的計算機系統(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),隨后描述示例性處理器和計算機架構(gòu)。
示例性核架構(gòu)
有序和亂序核框圖
圖31a是示出根據(jù)本發(fā)明的各實施例的示例性有序流水線和示例性的寄存器重命名的亂序發(fā)布/執(zhí)行流水線的框圖。圖31b是示出根據(jù)本發(fā)明的各實施例的要被包括在處理器中的有序架構(gòu)核的和示例性寄存器重命名的亂序發(fā)布/執(zhí)行架構(gòu)核的示例性實施例的框圖。圖31a-b中的實線框示出了有序流水線和有序核,而可選增加的虛線框示出了寄存器重命名的、亂序發(fā)布/執(zhí)行流水線和核。給定有序方面是亂序方面的子集的情況下,將描述亂序方面。
在圖31a中,處理器流水線3100包括取出級3102、長度解碼級3104、解碼級3106、分配級3108、重命名級3110、調(diào)度(也稱為分派或發(fā)布)級3112、寄存器讀取/存儲器讀取級3114、執(zhí)行級3116、寫回/存儲器寫入級3118、異常處理級3122以及提交級3124。
圖31b示出了包括耦合到執(zhí)行引擎單元3150的前端單元3130的處理器核3190,且執(zhí)行引擎單元和前端單元兩者都耦合到存儲器單元3170。核3190可以是精簡指令集計算(risc)核、復(fù)雜指令集計算(cisc)核、超長指令字(vliw)核或混合或替代核類型。作為又一選項,核3190可以是專用核,諸如例如網(wǎng)絡(luò)或通信核、緊縮引擎、協(xié)處理器核、通用計算圖形處理單元(gpgpu)核、圖形核、等等。
前端單元3130包括耦合至指令高速緩存單元3134的分支預(yù)測單元3132,指令高速緩存單元3134耦合至指令轉(zhuǎn)換后備緩沖器(tlb)3136,指令轉(zhuǎn)換后備緩沖器3136耦合至指令取出單元3138,指令取出單元3138耦合至解碼單元3140。解碼單元3140(或解碼器)可解碼指令,并生成從原始指令解碼出的、或以其它方式反映原始指令的、或從原始指令導(dǎo)出的一個或多個微操作、微代碼進入點、微指令、其它指令、或其它控制信號作為輸出。解碼單元3140可使用各種不同的機制來實現(xiàn)。合適的機制的示例包括但不僅限于,查找表、硬件實現(xiàn)、可編程邏輯陣列(pla)、微代碼只讀存儲器(rom)等等。在一個實施例中,核3190包括(例如,在解碼單元3140中或以其他方式在前端單元3130內(nèi)的)用于存儲某些宏指令的微代碼的微代碼rom或其他介質(zhì)。解碼單元3140耦合至執(zhí)行引擎單元3150中的重命名/分配器單元3152。
執(zhí)行引擎單元3150包括耦合至引退單元3154的重命名/分配器單元3152以及一組一個或多個調(diào)度器單元3156。調(diào)度器單元3156表示任何數(shù)目的不同調(diào)度器,包括預(yù)留站、中央指令窗等。調(diào)度器單元3156耦合到物理寄存器組單元3158。每個物理寄存器堆單元3158表示一個或多個物理寄存器堆,其中不同的物理寄存器堆存儲一種或多種不同的數(shù)據(jù)類型,諸如標(biāo)量整數(shù)、標(biāo)量浮點、緊縮整數(shù)、緊縮浮點、向量整數(shù)、向量浮點、狀態(tài)(例如,作為要執(zhí)行的下一指令的地址的指令指針)等。在一個實施例中,物理寄存器堆單元3158包括向量寄存器單元、寫掩碼寄存器單元和標(biāo)量寄存器單元。這些寄存器單元可以提供架構(gòu)向量寄存器、向量掩碼寄存器、和通用寄存器。物理寄存器堆單元3158與引退單元3154重疊以示出可以用來實現(xiàn)寄存器重命名和亂序執(zhí)行的各種方式(例如,使用重新排序緩沖器和引退寄存器堆;使用將來的文件、歷史緩沖器和引退寄存器堆;使用寄存器映射和寄存器池等等)。引退單元3154和物理寄存器堆單元3158耦合到執(zhí)行群集3160。執(zhí)行群集3160包括一組一個或多個執(zhí)行單元3162和一組一個或多個存儲器訪問單元3164。執(zhí)行單元3162可以對各種類型的數(shù)據(jù)(例如,標(biāo)量浮點、緊縮整數(shù)、緊縮浮點、向量整數(shù)、向量浮點)執(zhí)行各種操作(例如,移位、加法、減法、乘法)。盡管一些實施例可以包括專用于特定功能或功能組的數(shù)個執(zhí)行單元,但是其他實施例可以僅包括一個執(zhí)行單元或全部都執(zhí)行所有功能的多個執(zhí)行單元。調(diào)度器單元3156、物理寄存器組單元3158和執(zhí)行群集3160被示為可能有多個,因為某些實施例為某些類型的數(shù)據(jù)/操作創(chuàng)建分開的流水線(例如,各自具有其自身的調(diào)度器單元、物理寄存器組單元和/或執(zhí)行群集的標(biāo)量整數(shù)流水線、標(biāo)量浮點/緊縮整數(shù)/緊縮浮點/向量整數(shù)/向量浮點流水線和/或存儲器訪問流水線——以及在分開的存儲器訪問流水線的情況下,實現(xiàn)其中僅該流水線的執(zhí)行群集具有存儲器訪問單元3164的某些實施例)。還應(yīng)當(dāng)理解,在使用分開的流水線的情況下,這些流水線中的一個或多個可以是亂序發(fā)布/執(zhí)行的,而其余的是有序的。
存儲器訪問單元3164的集合耦合到存儲器單元3170,該存儲器單元包括耦合到數(shù)據(jù)高速緩存單元3174的數(shù)據(jù)tlb單元3172,其中數(shù)據(jù)高速緩存單元耦合到第2級(l2)高速緩存單元3176。在一個示例性實施例中,存儲器訪問單元3164可包括加載單元、存儲地址單元和存儲數(shù)據(jù)單元,其中的每一個均耦合至存儲器單元3170中的數(shù)據(jù)tlb單元3172。指令高速緩存單元3134還耦合到存儲器單元3170中的第2級(l2)高速緩存單元3176。l2高速緩存單元3176被耦合到一個或多個其他級的高速緩存,并最終被耦合到主存儲器。
作為示例,示例性寄存器重命名的、亂序發(fā)布/執(zhí)行核架構(gòu)可以如下實現(xiàn)流水線3100:1)指令取出3138執(zhí)行取出和長度解碼級3102和3104;2)解碼單元3140執(zhí)行解碼級3106;3)重命名/分配器單元3152執(zhí)行分配級3108和重命名級3110;4)調(diào)度器單元3156執(zhí)行調(diào)度級3112;5)物理寄存器堆單元3158和存儲器單元3170執(zhí)行寄存器讀取/存儲器讀取級3114;執(zhí)行群集3160執(zhí)行執(zhí)行級3116;6)存儲器單元3170和物理寄存器堆單元3158執(zhí)行寫回/存儲器寫入級3118;7)各單元可牽涉到異常處理級3122;以及8)引退單元3154和物理寄存器堆單元3158執(zhí)行提交級3124。
核3190可支持一個或多個指令集(例如,x86指令集(具有與較新版本一起添加的一些擴展);加利福尼亞州桑尼維爾市的mips技術(shù)公司的mips指令集;加利福尼州桑尼維爾市的arm控股的arm指令集(具有諸如neon等可選附加擴展)),其中包括本文中描述的各指令。在一個實施例中,核3190包括用于支持緊縮數(shù)據(jù)指令集擴展(例如,avx1、avx2)的邏輯,進而允許由許多多媒體應(yīng)用使用的操作通過使用緊縮數(shù)據(jù)來執(zhí)行。
應(yīng)當(dāng)理解,核可以支持多線程操作(執(zhí)行兩個或更多個并行的操作或線程的集合),并且可以按各種方式來完成該多線程操作,各種方式包括時分多線程操作、同步多線程操作(其中,單個物理核為物理核正在同步進行多線程操作的多個線程中的每一個線程提供邏輯核)或其組合(例如,時分取出和解碼以及此后諸如利用
盡管在亂序執(zhí)行的上下文中描述了寄存器重命名,但是,應(yīng)當(dāng)理解,寄存器重命名可以用于有序架構(gòu)中。盡管所示出的處理器的實施例還包括分開的指令和數(shù)據(jù)高速緩存單元3134/3174以及共享l2高速緩存單元3176,但替代實施例可以具有用于指令和數(shù)據(jù)兩者的單個內(nèi)部高速緩存,諸如例如第1級(l1)內(nèi)部高速緩存或多個級別的內(nèi)部高速緩存。在一些實施例中,系統(tǒng)可以包括內(nèi)部高速緩存以及在核和/或處理器外部的外部高速緩存的組合?;蛘?,全部高速緩存都可以在核和/或處理器的外部。
具體的示例性有序核架構(gòu)
圖32a-b示出更具體的示例性有序核架構(gòu)的框圖,該核將是芯片中的多個邏輯塊中的一個(包括相同類型和/或不同類型的其他核)。根據(jù)應(yīng)用,這些邏輯塊通過高帶寬的互連網(wǎng)絡(luò)(例如,環(huán)形網(wǎng)絡(luò))與一些固定的功能邏輯、存儲器i/o接口和其它必要的i/o邏輯通信。
圖32a是根據(jù)本發(fā)明的各實施例的單個處理器核以及它與管芯上互連網(wǎng)絡(luò)3202的連接及其第2級(l2)高速緩存的本地子集3204的框圖。在一個實施例中,指令解碼器3200支持具有緊縮數(shù)據(jù)指令集擴展的x86指令集。l1高速緩存3206允許對進入標(biāo)量和向量單元中的高速緩存存儲器的低等待時間訪問。盡管在一個實施例中(為了簡化設(shè)計),標(biāo)量單元3208和向量單元3210使用分開的寄存器集合(分別為標(biāo)量寄存器3212和向量寄存器3214),并且在這些寄存器之間轉(zhuǎn)移的數(shù)據(jù)被寫入到存儲器并隨后從第一級(l1)高速緩存3206讀回,但是本發(fā)明的替代實施例可以使用不同的方法(例如,使用單個寄存器集合或包括允許數(shù)據(jù)在這兩個寄存器堆之間傳輸而無需被寫入和讀回的通信路徑)。
l2高速緩存的本地子集3204是全局l2高速緩存的一部分,該全局l2高速緩存被劃分成多個分開的本地子集,即每個處理器核一個本地子集。每個處理器核具有到其自己的l2高速緩存的本地子集3204的直接訪問路徑。被處理器核讀出的數(shù)據(jù)被存儲在其l2高速緩存子集3204中,并且可以與其它處理器核訪問其自己的本地l2高速緩存子集并行地被快速訪問。被處理器核寫入的數(shù)據(jù)被存儲在其自己的l2高速緩存子集3204中,并在必要的情況下從其它子集轉(zhuǎn)儲清除。環(huán)形網(wǎng)絡(luò)確保共享數(shù)據(jù)的一致性。環(huán)形網(wǎng)絡(luò)是雙向的,以允許諸如處理器核、l2高速緩存和其它邏輯塊之類的代理在芯片內(nèi)彼此通信。每個環(huán)形數(shù)據(jù)路徑為每個方向1012位寬。
圖32b是根據(jù)本發(fā)明的實施例的圖32a中的處理器核的一部分的展開圖。圖32b包括l1高速緩存3204的l1數(shù)據(jù)高速緩存3206a部分,以及關(guān)于向量單元3210和向量寄存器3214的更多細(xì)節(jié)。具體地說,向量單元3210是16寬向量處理單元(vpu)(見16寬alu3228),該單元執(zhí)行整型、單精度浮點以及雙精度浮點指令中的一個或多個。該vpu通過混合單元3220支持對寄存器輸入的混合、通過數(shù)值轉(zhuǎn)換單元3222a-b支持?jǐn)?shù)值轉(zhuǎn)換、并通過復(fù)制單元3224支持對存儲器輸入的復(fù)制。寫掩碼寄存器3226允許斷言所得的向量寫入。
具有集成存儲器控制器和圖形器件的處理器
圖33是根據(jù)本發(fā)明的實施例的可具有多于一個的核、可具有集成存儲器控制器、以及可具有集成圖形器件的處理器3300的框圖。圖33的實線框示出了處理器3300,處理器3300具有單個核3302a、系統(tǒng)代理3310、一組一個或多個總線控制器單元3316,而可選附加的虛線框示出了替代處理器3300,其具有多個核3302a-n、系統(tǒng)代理單元3310中的一組一個或多個集成存儲器控制器單元3314以及專用邏輯3308。
因此,處理器3300的不同實現(xiàn)可包括:1)cpu,其中專用邏輯3308是集成圖形和/或科學(xué)(吞吐量)邏輯(其可包括一個或多個核),并且核3302a-n是一個或多個通用核(例如,通用的有序核、通用的亂序核、這兩者的組合);2)協(xié)處理器,其中核3302a-n是旨在主要用于圖形和/或科學(xué)(吞吐量)的多個專用核;以及3)協(xié)處理器,其中核3302a-n是多個通用有序核。因此,處理器3300可以是通用處理器、協(xié)處理器或?qū)S锰幚砥?,諸如例如網(wǎng)絡(luò)或通信處理器、緊縮引擎、圖形處理器、gpgpu(通用圖形處理單元)、高吞吐量的集成眾核(mic)協(xié)處理器(包括30個或更多核)、或嵌入式處理器等。該處理器可以被實現(xiàn)在一個或多個芯片上。處理器3300可以是一個或多個襯底的一部分,和/或可以使用諸如例如bicmos、cmos或nmos等的多個工藝技術(shù)中的任何一個技術(shù)將該處理器實現(xiàn)在一個或多個襯底上。
存儲器層次結(jié)構(gòu)包括核內(nèi)的一個或多個層級的高速緩存、一組或一個或多個共享高速緩存單元3306以及耦合到集成存儲器控制器單元3314的集合的外部存儲器(未示出)。共享高速緩存單元3306的集合可以包括一個或多個中級高速緩存,諸如,第2級(l2)、第3級(l3)、第4級(l4),或其他層級的高速緩存,末級高速緩存(llc),和/或上述各項的組合。盡管在一個實施例中,基于環(huán)的互連單元3312將集成圖形邏輯3308、共享高速緩存單元3306的集合以及系統(tǒng)代理單元3310/集成存儲器控制器單元3314互連,但替代實施例可使用任何數(shù)量的公知技術(shù)來將這些單元互連。在一個實施例中,可以維護一個或多個高速緩存單元3306和核3302-a-n之間的一致性。
在一些實施例中,核3302a-n中的一個或多個能夠?qū)崿F(xiàn)多線程。系統(tǒng)代理3310包括協(xié)調(diào)并操作核3302a-n的那些組件。系統(tǒng)代理單元3310可包括例如功率控制單元(pcu)和顯示單元。pcu可以是或可包括用于調(diào)節(jié)核3302a-n和集成圖形邏輯3308的功率狀態(tài)所需的邏輯和組件。顯示單元用于驅(qū)動一個或多個從外部連接的顯示器。
核3302a-n在架構(gòu)指令集方面可以是同構(gòu)的或異構(gòu)的;即,這些核3302a-n中的兩個或更多個核可能能夠執(zhí)行相同的指令集,而其它核可能能夠執(zhí)行該指令集的僅僅子集或不同的指令集。
示例性計算機架構(gòu)
圖34-37是示例性計算機架構(gòu)的框圖。本領(lǐng)域已知的對膝上型設(shè)備、臺式機、手持pc、個人數(shù)字助理、工程工作站、服務(wù)器、網(wǎng)絡(luò)設(shè)備、網(wǎng)絡(luò)集線器、交換機、嵌入式處理器、數(shù)字信號處理器(dsp)、圖形設(shè)備、視頻游戲設(shè)備、機頂盒、微控制器、蜂窩電話、便攜式媒體播放器、手持設(shè)備以及各種其它電子設(shè)備的其它系統(tǒng)設(shè)計和配置也是合適的。一般地,能夠包含本文中所公開的處理器和/或其它執(zhí)行邏輯的多個系統(tǒng)或電子設(shè)備一般都是合適的。
現(xiàn)在參見圖34,所示是根據(jù)本發(fā)明的一個實施例的系統(tǒng)3400的框圖。系統(tǒng)3400可以包括一個或多個處理器3410、3415,這些處理器耦合到控制器中樞3420。在一個實施例中,控制器中樞3420包括圖形存儲器控制器中樞(gmch)3490和輸入/輸出中樞(ioh)3450(其可以在分開的芯片上);gmch3490包括存儲器和圖形控制器,存儲器3440和協(xié)處理器3445耦合到該存儲器和圖形控制器;ioh3450將輸入/輸出(i/o)設(shè)備3460耦合到gmch3490?;蛘撸鎯ζ骱蛨D形控制器中的一個或兩者被集成在處理器內(nèi)(如本文中所描述的),存儲器3440和協(xié)處理器3445直接耦合到處理器3410以及控制器中樞3420,該控制器中樞與ioh3450處于單個芯片中。
在圖34中以虛線表示附加的處理器3415的可選的性質(zhì)。每一個處理器3410、3415可包括本文中描述的處理核中的一個或多個,并且可以是處理器3300的某一版本。
存儲器3440可以是例如動態(tài)隨機存取存儲器(dram)、相變存儲器(pcm)或這兩者的組合。對于至少一個實施例,控制器中樞3420經(jīng)由諸如前端總線(fsb)之類的多分支總線、諸如快速通道互連(qpi)之類的點對點接口、或者類似的連接3495與處理器3410、3415進行通信。
在一個實施例中,協(xié)處理器3445是專用處理器,諸如例如高吞吐量mic處理器、網(wǎng)絡(luò)或通信處理器、緊縮引擎、圖形處理器、gpgpu、或嵌入式處理器等等。在一個實施例中,控制器中樞3420可以包括集成圖形加速器。
在物理資源3410、3415之間會存在包括架構(gòu)、微架構(gòu)、熱、功耗特性等的一系列品質(zhì)度量方面的各種差異。
在一個實施例中,處理器3410執(zhí)行控制一般類型的數(shù)據(jù)處理操作的指令。協(xié)處理器指令可嵌入在這些指令中。處理器3410將這些協(xié)處理器指令識別為應(yīng)當(dāng)由附連的協(xié)處理器3445執(zhí)行的類型。因此,處理器3410在協(xié)處理器總線或者其它互連上將這些協(xié)處理器指令(或者表示協(xié)處理器指令的控制信號)發(fā)布到協(xié)處理器3445。協(xié)處理器3445接受并執(zhí)行所接收的協(xié)處理器指令。
現(xiàn)在參見圖35,所示是根據(jù)本發(fā)明的實施例的第一更具體的示例性系統(tǒng)3500的框圖。如圖35所示,多處理器系統(tǒng)3500是點對點互連系統(tǒng),并且包括經(jīng)由點對點互連3550耦合的第一處理器3570和第二處理器3580。處理器3570和3580中的每一個都可以是處理器3300的某一版本。在本發(fā)明的一個實施例中,處理器3570和3580分別是處理器3410和3415,而協(xié)處理器3538是協(xié)處理器3445。在另一實施例中,處理器3570和3580分別是處理器3410和協(xié)處理器3445。
處理器3570和3580被示為分別包括集成存儲器控制器(imc)單元3572和3582。處理器3570還包括點對點(p-p)接口3576和3578作為其總線控制器單元的部分;類似地,第二處理器3580包括p-p接口3586和3588。處理器3570、3580可以經(jīng)由使用點對點(p-p)接口電路3578、3588的p-p接口3550來交換信息。如圖35所示,imc3572和3582將處理器耦合至相應(yīng)的存儲器,即,存儲器3532和存儲器3534,它們可以是本地連接到相應(yīng)的處理器的主存儲器的部分。
處理器3570、3580可各自經(jīng)由使用點對點接口電路3576、3594、3586、3598的各個p-p接口3552、3554與芯片組3590交換信息。芯片組3590可任選地經(jīng)由高性能接口3539與協(xié)處理器3538交換信息。在一個實施例中,協(xié)處理器3538是專用處理器,諸如例如高吞吐量mic處理器、網(wǎng)絡(luò)或通信處理器、壓縮引擎、圖形處理器、gpgpu、或嵌入式處理器等等。
共享高速緩存(未示出)可被包括在任一處理器中,或在兩個處理器的外部但經(jīng)由p-p互連與這些處理器連接,從而如果處理器被置于低功率模式,則任一個或這兩個處理器的本地高速緩存信息可被存儲在該共享的高速緩存中。
芯片組3590可經(jīng)由接口3596耦合至第一總線3516。在一個實施例中,第一總線3516可以是外圍組件互連(pci)總線,或諸如pciexpress總線或其它第三代i/o互連總線之類的總線,但本發(fā)明的范圍并不受此限制。
如圖35所示,各種i/o設(shè)備3514可以連同總線橋3518被耦合至第一總線3516,總線橋3518將第一總線3516耦合至第二總線3520。在一個實施例中,諸如協(xié)處理器、高吞吐量mic處理器、gpgpu的處理器、加速器(例如,圖形加速器或數(shù)字信號處理(dsp)單元)、現(xiàn)場可編程門陣列或任何其他處理器之類的一個或多個附加處理器3515耦合到第一總線3516。在一個實施例中,第二總線3520可以是低引腳數(shù)(lpc)總線。在一個實施例中,各種設(shè)備可以耦合到第二總線3520,各種設(shè)備包括例如,鍵盤和/或鼠標(biāo)3522、通信設(shè)備3527以及存儲單元3528,存儲單元3528諸如,可包括指令/代碼和數(shù)據(jù)3530的磁盤驅(qū)動器或其他大容量存儲設(shè)備。此外,音頻i/o3524可以被耦合至第二總線3520。注意,其他架構(gòu)是可能的。例如,系統(tǒng)可實現(xiàn)多分支總線或者其他此類架構(gòu),而不是圖35中的點對點架構(gòu)。
現(xiàn)在參考圖36,所示為根據(jù)本發(fā)明的實施例的第二更具體的示例性系統(tǒng)3600的框圖。圖35和36中的類似元件使用類似附圖標(biāo)記,且在圖36中省略了圖35的某些方面以避免混淆圖36的其它方面。
圖36示出處理器3570、3580可分別包括集成存儲器和i/o控制邏輯(“cl”)3572和3582。因此,cl3572、3582包括集成存儲器控制器單元并包括i/o控制邏輯。圖36示出不僅存儲器3532、3534耦合到cl3572、3582,而且i/o設(shè)備3614也耦合到控制邏輯3572、3582。傳統(tǒng)i/o設(shè)備3615被耦合至芯片組3590。
現(xiàn)在參照圖37,所示出的是根據(jù)本發(fā)明的實施例的soc3700的框圖。圖33中相似的部件具有同樣的附圖標(biāo)記。另外,虛線框是更先進的soc的可選特征。在圖37中,互連單元3702被耦合至:應(yīng)用處理器3710,該應(yīng)用處理器包括一個或多個核202a-n的集合以及共享高速緩存單元3306;系統(tǒng)代理單元3310;總線控制器單元3316;集成存儲器控制器單元3314;一組或一個或多個協(xié)處理器3720,其可包括集成圖形邏輯、圖像處理器、音頻處理器和視頻處理器;靜態(tài)隨機存取存儲器(sram)單元3730;直接存儲器存取(dma)單元3732;以及用于耦合至一個或多個外部顯示器的顯示單元3740。在一個實施例中,協(xié)處理器3720包括專用處理器,諸如例如網(wǎng)絡(luò)或通信處理器、緊縮引擎、gpgpu、高吞吐量mic處理器、或嵌入式處理器等等。
本文公開的機制的各實施例可以被實現(xiàn)在硬件、軟件、固件或這些實現(xiàn)方法的組合中。本發(fā)明的實施例可實現(xiàn)為在可編程系統(tǒng)上執(zhí)行的計算機程序或程序代碼,該可編程系統(tǒng)包括至少一個處理器、存儲系統(tǒng)(包括易失性和非易失性存儲器和/或存儲元件)、至少一個輸入設(shè)備以及至少一個輸出設(shè)備。
可將程序代碼(諸如圖35中示出的代碼3530)應(yīng)用于輸入指令,以執(zhí)行本文描述的各功能并生成輸出信息??梢园匆阎绞綄⑤敵鲂畔?yīng)用于一個或多個輸出設(shè)備。為了本申請的目的,處理系統(tǒng)包括具有諸如例如數(shù)字信號處理器(dsp)、微控制器、專用集成電路(asic)或微處理器之類的處理器的任何系統(tǒng)。
程序代碼可以用高級程序化語言或面向?qū)ο蟮木幊陶Z言來實現(xiàn),以便與處理系統(tǒng)通信。在需要時,也可用匯編語言或機器語言來實現(xiàn)程序代碼。事實上,本文中描述的機制不限于任何特定編程語言的范圍。在任一情形下,該語言可以是編譯語言或解釋語言。
至少一個實施例的一個或多個方面可以由存儲在機器可讀介質(zhì)上的表示性指令來實現(xiàn),指令表示處理器中的各種邏輯,指令在被機器讀取時使得該機器制作用于執(zhí)行本文所述的技術(shù)的邏輯。可將被稱為“ip核”的此類表示存儲在有形的機器可讀介質(zhì)上,并將其提供給各種客戶或生產(chǎn)設(shè)施以加載到實際制造該邏輯或處理器的制造機器中。
此類機器可讀存儲介質(zhì)可以包括但不限于通過機器或設(shè)備制造或形成的制品的非暫態(tài)的有形安排,其包括存儲介質(zhì),諸如,硬盤;任何其他類型的盤,包括軟盤、光盤、緊致盤只讀存儲器(cd-rom)、緊致盤可重寫(cd-rw)以及磁光盤;半導(dǎo)體器件,諸如,只讀存儲器(rom)、諸如動態(tài)隨機存取存儲器(dram)和靜態(tài)隨機存取存儲器(sram)之類的隨機存取存儲器(ram)、可擦除可編程只讀存儲器(eprom)、閃存、電可擦除可編程只讀存儲器(eeprom);相變存儲器(pcm);磁卡或光卡;或適于存儲電子指令的任何其他類型的介質(zhì)。
因此,本發(fā)明的各實施例還包括非暫態(tài)有形機器可讀介質(zhì),該介質(zhì)包含指令或包含設(shè)計數(shù)據(jù),諸如硬件描述語言(hdl),它定義本文中描述的結(jié)構(gòu)、電路、裝置、處理器和/或系統(tǒng)特征。這些實施例也被稱為程序產(chǎn)品。
仿真(包括二進制變換、代碼變形等)
在一些情況下,指令轉(zhuǎn)換器可用來將指令從源指令集轉(zhuǎn)換至目標(biāo)指令集。例如,指令轉(zhuǎn)換器可以變換(例如使用靜態(tài)二進制變換、包括動態(tài)編譯的動態(tài)二進制變換)、變形、仿真或以其它方式將指令轉(zhuǎn)換成將由核來處理的一個或多個其它指令。指令轉(zhuǎn)換器可以用軟件、硬件、固件、或其組合實現(xiàn)。指令轉(zhuǎn)換器可以在處理器上、在處理器外、或者部分在處理器上且部分在處理器外。
圖38是根據(jù)本發(fā)明的實施例的對照使用軟件指令轉(zhuǎn)換器將源指令集中的二進制指令轉(zhuǎn)換成目標(biāo)指令集中的二進制指令的框圖。在所示的實施例中,指令轉(zhuǎn)換器是軟件指令轉(zhuǎn)換器,但作為替代,該指令轉(zhuǎn)換器可以用軟件、固件、硬件或其各種組合來實現(xiàn)。圖38示出可以使用x86編譯器3804來編譯高級語言3802形式的程序以生成可由具有至少一個x86指令集核的處理器3816原生地執(zhí)行的x86二進制代碼3806。具有至少一個x86指令集核的處理器3816表示能通過兼容地執(zhí)行或以其他方式處理以下內(nèi)容來執(zhí)行與具有至少一個x86指令集核的英特爾處理器基本相同的功能的任何處理器:(1)英特爾x86指令集核的指令集的本質(zhì)部分,或(2)目標(biāo)為在具有至少一個x86指令集核的英特爾處理器上運行以實現(xiàn)與具有至少一個x86指令集核的英特爾處理器基本相同的結(jié)果的應(yīng)用或其他軟件的目標(biāo)代碼版本。x86編譯器3804表示用于生成x86二進制代碼3806(例如,目標(biāo)代碼)的編譯器,該x86二進制代碼3806可利用或不利用附加的鏈路處理而在具有至少一個x86指令集核的處理器3816上執(zhí)行。類似地,圖38示出可以使用替代的指令集編譯器3808來編譯高級語言3802的程序以生成可由不具有至少一個x86指令集核的處理器3814(例如,具有執(zhí)行加利福尼亞州桑尼維爾市的mips技術(shù)公司的mips指令集和/或執(zhí)行加利福尼州桑尼維爾市的arm控股公司的arm指令集的核的處理器)原生地執(zhí)行的替代的指令集二進制代碼3810。指令轉(zhuǎn)換器3812用于將x86二進制代碼3806轉(zhuǎn)換成可以由不具有x86指令集核的處理器3814原生地執(zhí)行的代碼。該轉(zhuǎn)換后的代碼不大可能與替代的指令集二進制代碼3810相同,因為能夠這樣做的指令轉(zhuǎn)換器難以制造;然而,轉(zhuǎn)換后的代碼將完成通用操作,并且將由來自替代指令集的指令構(gòu)成。因此,指令轉(zhuǎn)換器3812表示軟件、固件、硬件或它們的組合,這些軟件、固件、硬件或它們的組合通過仿真、模擬或任何其他過程允許不具有x86指令集處理器或核的處理器或其他電子設(shè)備執(zhí)行x86二進制代碼3806。