欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

對(duì)處理器中循環(huán)的處理的制作方法

文檔序號(hào):6481996閱讀:239來(lái)源:國(guó)知局
專利名稱:對(duì)處理器中循環(huán)的處理的制作方法
技術(shù)領(lǐng)域
本發(fā)明的領(lǐng)域本發(fā)明涉及對(duì)處理器中循環(huán)的處理。
相關(guān)技術(shù)在高性能的計(jì)算機(jī)中,通常目標(biāo)機(jī)需要高速率的執(zhí)行指令(例如,微處理器)。執(zhí)行時(shí)間是由應(yīng)用程序內(nèi)的循環(huán)結(jié)構(gòu)所控制。為了允許高速率的執(zhí)行指令,微處理器包括多個(gè)獨(dú)立的執(zhí)行單元,每一個(gè)獨(dú)立的執(zhí)行單元可以與執(zhí)行指令的其他執(zhí)行單元并行的執(zhí)行一個(gè)或者多個(gè)指令。
這樣多個(gè)執(zhí)行單元可被用來(lái)提供由多個(gè)獨(dú)立階段所組成的所謂的軟件流水線。每一個(gè)軟件流水線階段沒(méi)有固定的與特定執(zhí)行單元相對(duì)應(yīng)的物理實(shí)體。更確切的說(shuō),當(dāng)應(yīng)用程序中的循環(huán)結(jié)構(gòu)被編譯時(shí),根據(jù)軟件流水線的調(diào)度,構(gòu)成循環(huán)的單次迭代的機(jī)器指令通過(guò)不同的執(zhí)行單元被調(diào)度以執(zhí)行。調(diào)度被劃分成連續(xù)的階段并且指令通過(guò)某一方式而被執(zhí)行,以致允許通過(guò)不同的執(zhí)行單元在連續(xù)迭代的初始化間選擇一循環(huán)初始化間隙以重疊的方式執(zhí)行多次迭代,。這樣,當(dāng)?shù)鷌的第一階段結(jié)束并且此次迭代進(jìn)入第二階段時(shí),下一次迭代i+1的執(zhí)行在迭代i+1的第一階段被初始化。這樣,迭代i+1第一階段的指令與迭代i第二階段的指令的執(zhí)行并行執(zhí)行。
在這樣的軟件流水線化循環(huán)中存在循環(huán)變量值,例如在循環(huán)的每一次不同的迭代中必須重新估值的表達(dá)式,該表達(dá)式在流水線中的不同指令之間傳送。為了處理這樣的循環(huán)-變量值,將這些循環(huán)變量值存儲(chǔ)在一個(gè)所謂的旋轉(zhuǎn)寄存器文件中。在這種情況下,旋轉(zhuǎn)寄存器文件中的每一個(gè)循環(huán)變量值分配一個(gè)邏輯寄存器編號(hào),并且這個(gè)邏輯寄存器編號(hào)從一次迭代到下一次迭代的過(guò)程中是不變的。循環(huán)寄存器文件中的每一個(gè)循環(huán)變量值與寄存器文件中的物理寄存器相映射,并且每次新的迭代開(kāi)始時(shí)這個(gè)映射被旋轉(zhuǎn),例如每次流水線的間界交叉。因此,不同迭代中的相應(yīng)指令都指向同一個(gè)邏輯寄存器編號(hào),僅僅生成編譯的指令,同時(shí)避免了一次迭代所產(chǎn)生的值被隨后不同的迭代所執(zhí)行的指令所覆蓋。
這些內(nèi)容將在我們相關(guān)待決的公開(kāi)號(hào)為CN-A-1308274的中國(guó)專利申請(qǐng)中詳細(xì)描述,通過(guò)參照該申請(qǐng)的整個(gè)內(nèi)容都包含在這里。特別是,那個(gè)申請(qǐng)描述一個(gè)交替寄存器重命名調(diào)度,在該寄存器中每次發(fā)出一個(gè)產(chǎn)生值的指令時(shí)映射被旋轉(zhuǎn)。
在任一的重命名調(diào)度中,產(chǎn)生了由于寄存器位置不一致而引起特殊情況的問(wèn)題,與一次或多次執(zhí)行循環(huán)體的正常情況相比,在這種特殊情況下根本不執(zhí)行軟件流水線化循環(huán)的循環(huán)體??梢园l(fā)生根本不執(zhí)行軟件流水線化循環(huán)的循環(huán)體的特殊情況,例如,當(dāng)循環(huán)指令建立起一個(gè)循環(huán)以迭代,同時(shí)循環(huán)控制變量從起始值到最終值是逐漸變化的,但是在執(zhí)行的過(guò)程中當(dāng)執(zhí)行循環(huán)指令時(shí)最終值本身是一個(gè)小于起始值的變量。這種特殊情況導(dǎo)致當(dāng)一次或多次執(zhí)行循環(huán)體時(shí)寄存器的位置與隨后的寄存器位置不一致。
本發(fā)明的概述在本發(fā)明的一個(gè)實(shí)施例中,一個(gè)處理器用于執(zhí)行軟件流水線化循環(huán)。處理器包括一個(gè)具有多個(gè)寄存器的寄存器單元,用于存儲(chǔ)由于執(zhí)行指令而產(chǎn)生和使用的值。寄存器在執(zhí)行循環(huán)期間被重命名,例如每次軟件流水線間界交叉或者每次提出產(chǎn)生值的指令時(shí)。
在一個(gè)實(shí)施例中,處理器還包括一個(gè)循環(huán)處理單元,在軟件流水線化循環(huán)要求零迭代的情況下該處理單元引起寄存器以預(yù)定的方式被重命名。這種預(yù)定重命名是可取的以致在零迭代情況下循環(huán)體內(nèi)的值仍能保存在相同的寄存器中,因?yàn)檠h(huán)需要一次或者多次迭代以致循環(huán)體內(nèi)的值變?yōu)檠h(huán)體外的值。
在一個(gè)實(shí)施例中,循環(huán)處理單元在循環(huán)要求零迭代的情況下執(zhí)行循環(huán)的收尾階段。當(dāng)非零迭代循環(huán)的所有迭代已被初始化時(shí)(或者循環(huán)內(nèi)的退出指令已經(jīng)被執(zhí)行時(shí))通常進(jìn)入收尾階段。
收尾迭代的次數(shù)(收尾迭代計(jì)數(shù)或者EIC)取決于重命名調(diào)度的操作。例如,在當(dāng)每次軟件流水線的間界交叉時(shí)而對(duì)寄存器重命名的情況下,EIC可能比軟件流水線階段的數(shù)目小一。每一次收尾迭代引起一個(gè)或更多寄存器重命名操作。
這樣收尾階段的執(zhí)行可使寄存器自動(dòng)重命名以致在零迭代循環(huán)之后可以在同一寄存器中找到循環(huán)體內(nèi)的值,因?yàn)橐呀?jīng)執(zhí)行了非零迭代循環(huán)。
在一個(gè)實(shí)施例中,在收尾階段的用于寄存器的重命名操作的次數(shù)是可指定的不取決于循環(huán)本身的迭代次數(shù)(IC)。這可使編譯器指定在由處理器執(zhí)行的目標(biāo)程序中所需的重命名的次數(shù)。
在一個(gè)實(shí)施例中,在收尾階段的迭代次數(shù)(例如EIC)是可指定的不取決于IC。這可使編譯器指定在由處理器執(zhí)行的目標(biāo)程序中所需的收尾迭代的次數(shù)。
EIC可以由處理器執(zhí)行的指令來(lái)指定。在一實(shí)施例中,這個(gè)指令是在軟件流水線化循環(huán)的啟動(dòng)過(guò)程中所執(zhí)行的一循環(huán)指令。
循環(huán)指令具有一個(gè)字段,EIC被指定在這個(gè)字段內(nèi)。這與循環(huán)指令的IC字段相分離,以致EIC和IC可以獨(dú)立指定。
在一實(shí)施例中,循環(huán)處理單元當(dāng)初始化循環(huán)時(shí)(例如當(dāng)執(zhí)行循環(huán)指令時(shí))接收IC以循環(huán)并且,如果接收到的IC是零,這只可以引起收尾階段被執(zhí)行。當(dāng)接收到的IC是非零,這可以引起以正常方式執(zhí)行循環(huán)的開(kāi)始處理階段和核心階段。
在一實(shí)施例中,處理器判定指令的執(zhí)行,例如,如我們相關(guān)待決的公開(kāi)號(hào)為CN-A-1329303的中國(guó)專利申請(qǐng)中所詳細(xì)描述的,通過(guò)參照該申請(qǐng)的整個(gè)內(nèi)容都包含在這里。
在這樣的處理器中,可判定與循環(huán)的不同軟件流水線階段分別對(duì)應(yīng)的寄存器。當(dāng)預(yù)測(cè)寄存器具有第一狀態(tài)(例如1)時(shí),可啟動(dòng)它的相應(yīng)軟件流水線階段,例如,通常執(zhí)行那階段的指令并且其結(jié)果被提交。當(dāng)預(yù)測(cè)寄存器具有第二狀態(tài)(例如2)時(shí),不可啟動(dòng)它的相應(yīng)軟件流水線階段,例如它的指令可執(zhí)行但是其結(jié)果不被提交。
在一實(shí)施例中,循環(huán)處理單元依靠所接收到的IC而初始化預(yù)測(cè)寄存器。
在一實(shí)施例中,當(dāng)循環(huán)迭代的次數(shù)是零時(shí)循環(huán)處理單元以一種方式對(duì)預(yù)測(cè)寄存器初始化并且當(dāng)循環(huán)迭代的次數(shù)不是零時(shí)以至少另外一種方式對(duì)預(yù)測(cè)寄存器初始化。
在一實(shí)施例中,當(dāng)IC是零,與循環(huán)階段相對(duì)應(yīng)的預(yù)測(cè)寄存器在第二狀態(tài)被初始化,然而當(dāng)IC為非零,與第一流水線狀態(tài)相對(duì)應(yīng)的預(yù)測(cè)寄存器在第一狀態(tài)被初始化并且與隨后的階段相對(duì)應(yīng)的每一個(gè)預(yù)測(cè)寄存器在第二狀態(tài)被初始化。這就是說(shuō),在零迭代計(jì)數(shù)情況下立即開(kāi)始收尾階段,但是在正常的情況下(非零迭代計(jì)數(shù))開(kāi)始階段和核心階段首先進(jìn)入。
在一實(shí)施例中,與第一流水線階段相對(duì)應(yīng)的預(yù)測(cè)寄存器被轉(zhuǎn)換為與第二流水線階段相對(duì)應(yīng)的預(yù)測(cè)寄存器,依此類推。按照這種方式,流水線階段可以按照所要求的開(kāi)始、核心、以及收尾階段的順序啟動(dòng)和禁止。
在一實(shí)施例中,與第一流水線階段相對(duì)應(yīng)的預(yù)測(cè)寄存器的狀態(tài)根據(jù)源寄存器來(lái)設(shè)置。在這種情況下循環(huán)處理器單元最好根據(jù)不同的循環(huán)迭代次數(shù)對(duì)源寄存器進(jìn)行初始化。
在一實(shí)施例中,當(dāng)接收到的IC是零或者一時(shí),循環(huán)處理單元在第二狀態(tài)初始化來(lái)源寄存器,并且當(dāng)接收到的IC是二或者更多時(shí),在第一狀態(tài)初始化來(lái)源寄存器。
本發(fā)明的第二個(gè)方面涉及處理器的編譯方法。
在一實(shí)施例中,如果軟件流水線化循環(huán)是零迭代次數(shù),編譯方法包括指定目標(biāo)程序中的寄存器以由處理器執(zhí)行重命名。
在一實(shí)施例中,在零迭代次數(shù)的情況下只執(zhí)行循環(huán)的收尾階段,并且編譯方法包括指定寄存器的編號(hào)以在收尾階段執(zhí)行重命名操作。
在一實(shí)施例中,在零迭代次數(shù)的情況下只執(zhí)行循環(huán)的收尾階段,并且編譯方法包括在目標(biāo)程序信息中指定在收尾階段執(zhí)行的迭代的次數(shù)。
在一實(shí)施例中,信息被指定在包括在目標(biāo)程序中的指令中。在一實(shí)施例中,這個(gè)指令是在軟件流水線化循環(huán)的開(kāi)始期間所執(zhí)行的循環(huán)指令。
循環(huán)指令具有一個(gè)字段,EIC在該字段中被指定。這與循環(huán)指令的IC字段相分離以致可獨(dú)立指定EIC和IC。
本發(fā)明的第三個(gè)方面涉及由處理器執(zhí)行的目標(biāo)程序。
在一實(shí)施例中,處理器在零迭代次數(shù)的情況下只執(zhí)行循環(huán)的收尾階段,并且目標(biāo)程序包括用于指定在收尾階段所執(zhí)行的迭代的次數(shù)。
在一實(shí)施例中,處理器在零迭代次數(shù)的情況下只執(zhí)行循環(huán)的收尾階段,并且目標(biāo)程序包括用于指定在收尾階段所執(zhí)行的迭代的次數(shù)。
循環(huán)指令具有一個(gè)字段,EIC在該字段中被指定。這與循環(huán)指令的IC字段相分離以致可獨(dú)立指定EIC和IC。
體現(xiàn)本發(fā)明的目標(biāo)程序由其本身提供或者由載體介質(zhì)執(zhí)行。載體介質(zhì)是一記錄介質(zhì)(例如,磁盤或者CD-ROM)或者諸如信號(hào)的傳輸介質(zhì)。
本發(fā)明的另一個(gè)方面涉及編譯裝置,用于執(zhí)行上述所提出的編譯方法,并且當(dāng)運(yùn)行計(jì)算機(jī)時(shí),計(jì)算機(jī)程序引起計(jì)算機(jī)執(zhí)行諸如編譯方法和/或,當(dāng)計(jì)算機(jī)程序下載到計(jì)算機(jī)時(shí),引起計(jì)算機(jī)成為這樣的編譯裝置。根據(jù)計(jì)算機(jī)程序,體現(xiàn)本發(fā)明的編譯方法由諸如通用計(jì)算機(jī)這樣的電子數(shù)據(jù)處理設(shè)備執(zhí)行。
體現(xiàn)本發(fā)明的目標(biāo)程序由其本身提供或者由載體介質(zhì)執(zhí)行。載體介質(zhì)是一記錄介質(zhì)(例如,磁盤或者CD-ROM)或者諸如信號(hào)的傳輸介質(zhì)。
現(xiàn)在參考附圖,構(gòu)成了實(shí)施例。
附圖簡(jiǎn)述

圖1給出了體現(xiàn)本發(fā)明處理器的組成部分;圖2給出了用于說(shuō)明由圖1的處理器軟件流水線的執(zhí)行指令的圖表;圖3給出了用于說(shuō)明軟件流水線化循環(huán)的不同執(zhí)行階段的圖表;圖4給出了包含循環(huán)的高級(jí)指令的例子;圖5是用于執(zhí)行圖4循環(huán)的寄存器的略圖;圖6給出了本發(fā)明一實(shí)施例的圖1所示的處理器的一部分;圖7是用于說(shuō)明在圖1的處理器中所執(zhí)行的軟件流水線化循環(huán)的示意圖;圖8給出了優(yōu)選實(shí)施例中循環(huán)指令的格式的一個(gè)例子;圖9給出了在一實(shí)施例中的循環(huán)處理單元的一部分;圖10(a)至10(c)是用于說(shuō)明軟件流水線的一個(gè)例子的示意圖;圖11是用于說(shuō)明在本發(fā)明的優(yōu)選實(shí)施例中預(yù)測(cè)寄存器怎樣用于控制軟件流水線化循環(huán)的執(zhí)行的示意圖;圖12給出了本發(fā)明優(yōu)選實(shí)施例中的預(yù)測(cè)寄存器電路的一部分;圖13(a)至13(d)是用于說(shuō)明對(duì)于不同迭代次數(shù)值怎樣初始化預(yù)測(cè)寄存器的示意圖;本發(fā)明的實(shí)施例的詳細(xì)描述圖1給出了體現(xiàn)本發(fā)明處理器的組成部分。在這個(gè)實(shí)施例中,處理器是超長(zhǎng)指令字(VLIW)處理器,該處理器具有支持軟件流水線和重命名循環(huán)寄存器的硬件。處理器1包括指令發(fā)出單元10,調(diào)度存儲(chǔ)單元12,各個(gè)第一,第二,第三執(zhí)行單元14,16,18,以及寄存器文件20。指令發(fā)出單元10具有三個(gè)分別與第一,第二,第三執(zhí)行單元14,16,18相連的發(fā)出位置IS1,IS2和IS3。二總線24將第一和第二執(zhí)行單元14和16(但是在這個(gè)實(shí)施例中沒(méi)有第三實(shí)施例18)與存儲(chǔ)器26相連,這個(gè)實(shí)施例中存儲(chǔ)器26是外部隨機(jī)存取存儲(chǔ)器(RAM)裝置。存儲(chǔ)器26也可以是處理器1內(nèi)部的RAM。
順便說(shuō)一下,盡管圖1給出了將執(zhí)行單元與寄存器文件20和存儲(chǔ)器26相連的共享總線22和24,但是完全知道每一個(gè)執(zhí)行單元也可以獨(dú)立的與寄存器文件和存儲(chǔ)器相連。
處理器1執(zhí)行一系列的處理循環(huán)。在每一個(gè)處理循環(huán)中指令發(fā)出單元10可以在每一個(gè)發(fā)出位置IS1至IS3發(fā)出一個(gè)指令。根據(jù)存儲(chǔ)在調(diào)度存儲(chǔ)單元12中的軟件流水線調(diào)度表(在下面描述)來(lái)發(fā)出指令。
在指令發(fā)出單元10的不同發(fā)出位置發(fā)出的指令由相應(yīng)的執(zhí)行單元14,16和18執(zhí)行。在這個(gè)實(shí)施例中,每一個(gè)執(zhí)行單元同時(shí)執(zhí)行一個(gè)以上的指令,以致在有關(guān)執(zhí)行單元所發(fā)出的先前指令的執(zhí)行完成之前,初始化新指令的執(zhí)行。
為了執(zhí)行指令,每一個(gè)執(zhí)行單元14,16和18通過(guò)第一總線22存取寄存器文件20。保存在寄存器中的值因此可以通過(guò)執(zhí)行單元14,16和18被讀和寫,寄存器包含在寄存器20中。同時(shí),第一和第二執(zhí)行單元14和16通過(guò)第二總線24存取外部存儲(chǔ)器26,以致存儲(chǔ)在外部存儲(chǔ)器26的存儲(chǔ)單元中的值也可以被讀和寫。第三執(zhí)行單元18不存取外部存儲(chǔ)器26并且這可僅僅處理包含在這個(gè)實(shí)施例的寄存器文件20中的值。
圖1的處理器使用了軟件流水線和從不同的迭代中找出覆蓋指令的技術(shù),以便減少總的循環(huán)執(zhí)行時(shí)間。每一個(gè)迭代被分成多個(gè)流水線階段,每一個(gè)流水線階段具有零個(gè)或者多個(gè)指令。
下面的實(shí)例是循環(huán)的單流水線迭代的概念圖,每一個(gè)流水線階段是一周期階段1ld4 r4=[r5]階段2--//empty stage階段3add r7=r4,r9階段4st4[r6]=r7這里,在階段1中的指令是一個(gè)取指令,該指令將一個(gè)四字節(jié)的值存入到邏輯寄存器4中,四字節(jié)的值包含在由邏輯寄存器5所指的存儲(chǔ)器地址中。
流水線階段2沒(méi)有指令(空階段)。流水線階段3的指令是一個(gè)加指令,該指令將邏輯寄存器4和9中的內(nèi)容相加在一起并將其結(jié)果存儲(chǔ)在邏輯寄存器編指令將邏輯寄存器4和9中的內(nèi)容相加在一起并將其結(jié)果存儲(chǔ)在邏輯寄存器編號(hào)7中。流水線階段4中的指令是一個(gè)存儲(chǔ)指令,該指令將邏輯寄存器編號(hào)7中的內(nèi)容存儲(chǔ)在由邏輯寄存器編號(hào)6所指定的存儲(chǔ)器位置上。
在循環(huán)的軟件流水線執(zhí)行期間,在預(yù)定數(shù)目的周期之后初始化新的迭代。連續(xù)的迭代的開(kāi)始之間的周期數(shù)被稱為初始化間隔(II)。按模計(jì)算的調(diào)度是軟件流水線的一個(gè)特殊方式,在該調(diào)度中迭代間隔II是一個(gè)常數(shù)并且循環(huán)的每次迭代都具有相同的調(diào)度。在本實(shí)施例中,假設(shè)II是一個(gè)周期。
在本例中,還假設(shè)循環(huán)總共需要五次迭代。圖2概念地給出了這五次迭代。可以看出,流水線迭代的每一個(gè)階段是II周期長(zhǎng)。同時(shí)也可以看出,X至X+7的8個(gè)周期是從迭代1的第一個(gè)ld4指令的提出到迭代5的最后st4指令的提出所需要的。在這8個(gè)周期中,總共提出了15個(gè)指令。
軟件流水線化循環(huán)具有三個(gè)階段開(kāi)始階段,核心階段以及收尾階段。圖3說(shuō)明了本實(shí)施例中每一個(gè)階段的開(kāi)始。
在開(kāi)始階段期間,當(dāng)II周期充滿了流水線,開(kāi)始新的循環(huán)迭代。在開(kāi)始階段的第一周期期間,執(zhí)行迭代1的階段1。在第二周期期間,執(zhí)行迭代2的階段1并且執(zhí)行迭代1的階段2,依此類推。
在核心階段開(kāi)始時(shí)(迭代p的開(kāi)始,其中p是流水線階段數(shù))流水線是滿的。執(zhí)行迭代4的階段1,迭代3的階段2,迭代2的階段3以及迭代1的階段4。
在核心階段期間,每II周期,開(kāi)始新的迭代循環(huán),且另外一個(gè)被完成了。
最后,在收尾階段開(kāi)始時(shí),沒(méi)有新的循環(huán)迭代初始化,并且已經(jīng)在進(jìn)行中的迭代繼續(xù)至結(jié)束,用完流水線。在本實(shí)施例中,在周期X+5開(kāi)始收尾階段因?yàn)闆](méi)有開(kāi)始新的循環(huán)迭代并且迭代3即將結(jié)束。這樣,在這個(gè)實(shí)施例中,在收尾階段期間,結(jié)束迭代3至5。
在本例中,在迭代1中的取指令的結(jié)果在使用之前(通過(guò)迭代1中的加指令)提出迭代2中的取指令。接著屬于循環(huán)的連續(xù)迭代的取指令把不同的寄存器作為目標(biāo)以避免覆蓋現(xiàn)有的有效值。
模計(jì)算的調(diào)度允許編譯器執(zhí)行并行而不是順序的循環(huán)迭代。然而,傳統(tǒng)的多次迭代的重疊執(zhí)行需要展開(kāi)循環(huán)以及寄存器的軟件重命名。這產(chǎn)生了程序代碼復(fù)制并涉及一個(gè)復(fù)雜的調(diào)度以處理有效的輸入和輸出值。為了避免展開(kāi)的需要,在循環(huán)的迭代期間用于存儲(chǔ)值的寄存器被重命名為迭代進(jìn)程,以為每次迭代提供它自己的寄存器組。這個(gè)寄存器重命名的一個(gè)例子是所謂的旋轉(zhuǎn)寄存器。在這個(gè)技術(shù)中,邏輯寄存器編號(hào)和物理寄存器地址之間的映射以循環(huán)的方式改變。到頭來(lái)映射的觸發(fā)循環(huán)可以是軟件流水線間界的交叉,例如,一個(gè)流水線階段與下一個(gè)流水線階段的交叉,或者提出了產(chǎn)生值的指令。這些情況在我們相關(guān)待決的公開(kāi)號(hào)為CN-A-1308274的中國(guó)專利申請(qǐng)中詳細(xì)描述,通過(guò)參照該申請(qǐng)的整個(gè)內(nèi)容都包含在這里。通過(guò)使用寄存器重命名,軟件流水線可適用于更廣泛的各種類型的循環(huán),不管是小的還是大的,并顯著的減少了額外消耗。
因?yàn)樵诿看螆?zhí)行時(shí)通過(guò)編譯器可提前知道重命名目標(biāo)寄存器,因此編譯器可為指令所需要存取的寄存器指定適合的邏輯寄存器編號(hào),其中寄存器用于存儲(chǔ)循環(huán)迭代所使用的值。例如,如果每次軟件流水線間界交叉時(shí)寄存器重命名調(diào)度表引起寄存器被重命名,于是可以知道位于寄存器a中的值可通過(guò)n+1階段的指令從寄存器a+1中存取,其中通過(guò)調(diào)度循環(huán)的n階段的指令將值存儲(chǔ)在寄存器a中(假設(shè)邏輯寄存器的編號(hào)是從低編號(hào)到高編號(hào)循環(huán)的)。
實(shí)際上,編譯器的任務(wù)是很復(fù)雜的,依靠屬于循環(huán)不同迭代的指令間的關(guān)系以及循環(huán)內(nèi)的指令與循環(huán)外的指令之間的關(guān)系。在循環(huán)之前定義的值指的是“循環(huán)以內(nèi)的值”,該值用在循環(huán)體內(nèi)。在循環(huán)體內(nèi)定義并在循環(huán)之后使用的值指的是“循環(huán)體外的值”。類似的,“再出現(xiàn)的值”或者“再出現(xiàn)定義的值”是在循環(huán)的一個(gè)迭代內(nèi)定義并用于循環(huán)的隨后的迭代中。通常,再出現(xiàn)的值也是循環(huán)體內(nèi)的值因?yàn)樵谘h(huán)開(kāi)始之前它需要為第一次迭代分配一個(gè)值?!霸俣x的值”是在循環(huán)之前預(yù)先定義的值的再定義。
盡管有這些復(fù)雜之處,還是可能發(fā)生編譯器處理各種情況的循環(huán)體內(nèi)的值,循環(huán)體外的值,再出現(xiàn)的值或者再定義的值,以及用作循環(huán)的輸入的預(yù)測(cè)寄存器,用在循環(huán)每一階段的寄存器,存儲(chǔ)循環(huán)中出現(xiàn)的值的寄存器。
然而,實(shí)際上會(huì)發(fā)現(xiàn),在迭代次數(shù)是零的特殊情況下,通常完全繞過(guò)循環(huán)并且寄存器不循環(huán)。這意味著在特殊情況下變成循環(huán)體外值的任何循環(huán)體內(nèi)的值有可能在不同的寄存器中,循環(huán)體內(nèi)的值來(lái)自在迭代次數(shù)是非零的通常情況下存儲(chǔ)循環(huán)中所產(chǎn)生的值的寄存器。
可發(fā)生根本不執(zhí)行軟件流水線化循環(huán)的這種特殊情況,例如,當(dāng)循環(huán)指令建立起一個(gè)循環(huán)以迭代,只要循環(huán)控制變量是從起始值到最終值是逐漸變化的,但是最終值本身是可變化的,在執(zhí)行期間出現(xiàn)循環(huán)指令時(shí),最終值小于起始值。
現(xiàn)在參考圖4和圖5說(shuō)明當(dāng)一次或多次執(zhí)行循環(huán)體時(shí)導(dǎo)致寄存器的位置與隨后的寄存器位置不一致的特殊情況。
假定有這樣一個(gè)例子,在這個(gè)例子中產(chǎn)生值的指令的發(fā)出引起出現(xiàn)重命名。軟件流水線調(diào)度具有v個(gè)產(chǎn)生值的指令和p個(gè)軟件流水線階段。如果循環(huán)迭代n次,于是在執(zhí)行循環(huán)期間寄存器文件要循環(huán)v(n+p-1)次。編譯器利用這個(gè)信息來(lái)預(yù)測(cè)在循環(huán)內(nèi)部所產(chǎn)生的并接著用在循環(huán)體外的值在寄存器文件中的位置。通常由循環(huán)的最后迭代所產(chǎn)生的值是隨后循環(huán)體外所需要的。實(shí)際上由最后的迭代所產(chǎn)生的每一個(gè)這樣的值都有一個(gè)位置,該位置與循環(huán)迭代次數(shù)n無(wú)關(guān),并且在退出循環(huán)體外是不變的,假如循環(huán)迭代次數(shù)n大于0。循環(huán)的最后迭代需要p次提出循環(huán)調(diào)度。因此,在開(kāi)始最后迭代和最后退出循環(huán)之間存在pv次循環(huán)的交替。如果任何值都是繼續(xù)有效的進(jìn)入循環(huán)并繼續(xù)有效的退出循環(huán),那么必須至少有pv個(gè)旋轉(zhuǎn)寄存器。
圖4給出了一個(gè)循環(huán)的例子。在這個(gè)例子中,標(biāo)量變量s在進(jìn)入循環(huán)之前初始化(第1行),在循環(huán)體內(nèi)再出現(xiàn)(第4行)并且在循環(huán)結(jié)束之后仍要使用(第7行)。生存期因此跨度整個(gè)循環(huán)、按照前面所述的,編譯器被安排為在每一次迭代第4行的代碼過(guò)程中從邏輯寄存器編號(hào)Sr中讀出前一次迭代所產(chǎn)生的值s并將當(dāng)前迭代所產(chǎn)生的值寫入到邏輯寄存器編號(hào)Sw。這些寄存器編號(hào)被選擇以致在寄存器文件被旋轉(zhuǎn)v次之后在先前迭代中寫入寄存器Sw中的值現(xiàn)在可用在當(dāng)前迭代的寄存器Sr中。
在圖4中所定義的初始值s必須寫入適當(dāng)?shù)募拇嫫鱏1,并且S1必須進(jìn)行選擇,用于當(dāng)?shù)谝淮蔚鷱牡?行中讀出Sr時(shí),在第1行中寫入S1中的值可旋轉(zhuǎn)以致可存取在寄存器Sr。在第一次迭代中第1行和第4行之間的旋轉(zhuǎn)的精確次數(shù)取決于發(fā)生第4行的軟件流水線階段和在循環(huán)調(diào)度內(nèi)使用s的指令的位置。假設(shè)將S1中的值移動(dòng)到Sr中所需要的旋轉(zhuǎn)的次數(shù)是q。
最后將s寫入邏輯寄存器編號(hào)Sw出現(xiàn)在循環(huán)的最后迭代的第4行。在第7行中的最后退出循環(huán)之后這個(gè)最后寫入值從邏輯寄存器編號(hào)Se中讀出。假設(shè)將Sw中的值移動(dòng)到Se中所需要的旋轉(zhuǎn)的次數(shù)是t。
圖5示意性的給出了這些寄存器S1,Sw,Sr以及Se之間的關(guān)系。在圖5中,圈表示寄存器文件的旋轉(zhuǎn)區(qū)(例如,重命名寄存器的數(shù)目-參見(jiàn)以下的圖6)。旋轉(zhuǎn)區(qū)的大小(例如圖5中圓周)被假定為pv個(gè)寄存器,這是當(dāng)存在至少一個(gè)既是循環(huán)體內(nèi)的值又是循環(huán)體外的值時(shí)所需的寄存器的數(shù)目。在旋轉(zhuǎn)區(qū)的專用寄存器圍繞著圓周以相等的定距離間隔。
假設(shè)讀s(在第4行)發(fā)生在軟件流水線階段k,其中0≤k≤p-1。同時(shí)假設(shè)當(dāng)在調(diào)度期間出現(xiàn)旋轉(zhuǎn)時(shí)發(fā)生讀s(在第4行),其中0≤k≤v-1。因此,q=kv+w并且t=v(p-k-1)+v-w。由此從第1行中所定義的初始值s到一位置的旋轉(zhuǎn)次數(shù)由g+t-v給定,其中在該位置上可以找到使用了s的出口位置所需值的指令,該旋轉(zhuǎn)次數(shù)是簡(jiǎn)單的v(p-1)。
因此,假設(shè)在循環(huán)執(zhí)行前s寫入至的初始邏輯寄存器S1,編譯器知道在循環(huán)結(jié)束之后最后-寫入的s值可在邏輯寄存器編號(hào)S1+v(p-1)中找到。然而,這不適合根本不執(zhí)行循環(huán)體的特殊情況,如果圖4第2行中的控制變量N在執(zhí)行時(shí)間被發(fā)現(xiàn)為零或者是負(fù)值則出現(xiàn)這種特殊情況。在這種特殊情況中,第7行所需的s值僅僅在S1中找到,而不是同其它所有情況一樣在寄存器S1+v(p-1)中找到。這種前后不一致是不利的因?yàn)榫幾g器需要用一特殊指令來(lái)補(bǔ)充編譯的代碼以處理使在執(zhí)行時(shí)間內(nèi)N為零或者為負(fù)數(shù)。很希望避免編譯器不得不處理這種特殊類型的測(cè)定。
因此,在這個(gè)實(shí)施例中(該實(shí)施例中的寄存器重命名方法包括當(dāng)提出產(chǎn)生值的指令時(shí)的重命名),根據(jù)本發(fā)明的處理器被處理為,如果在執(zhí)行過(guò)程中發(fā)現(xiàn)循環(huán)迭帶次數(shù)為零,并且因此根本不執(zhí)行循環(huán)體,于是在處理器繼續(xù)之前,循環(huán)的結(jié)束之后,寄存器文件旋轉(zhuǎn)v(p-1)次。這樣會(huì)具有如下的效果,即在退出循環(huán)之后在提出第一條指令之前跳過(guò)了v(p-1)序列數(shù)。在實(shí)際上不執(zhí)行指令的情況下這可通過(guò)p-1次調(diào)度提出循環(huán)的指令而方便的完成。提出每一條產(chǎn)生值的指令將會(huì)產(chǎn)生旋轉(zhuǎn)寄存器文件的效果,以致每一個(gè)循環(huán)調(diào)度的完全發(fā)出使寄存器文件循環(huán)v次。按照這種方式,當(dāng)循環(huán)迭代次數(shù)是零,s的初始化值在邏輯寄存器S1+v(p-1)變?yōu)榭捎玫模缢龅摹?br> 如下文所詳細(xì)描述的,通過(guò)有效地一直處理到流水線化循環(huán)的結(jié)束模式并且設(shè)置附加的(通用的)錯(cuò)誤判定以防止執(zhí)行任何指令來(lái)完成p-1次發(fā)出指令。
當(dāng)使用其他寄存器重命名方法時(shí)本發(fā)明若可適用,例如每次流水線的間界交叉時(shí)處理器重命名可重命名的寄存器的技術(shù)方法。在這種情況下,處理器通過(guò)p-1寄存器在零迭代次數(shù)的情況下旋轉(zhuǎn)所述的寄存器。
同樣在這種情況下,在零迭代次數(shù)的情況下處理器跳過(guò)一個(gè)或多個(gè)可重命名寄存器,但是所跳過(guò)的寄存器的數(shù)目取決于產(chǎn)生值的指令,并且與流水線階段的數(shù)目無(wú)關(guān)。最好跳過(guò)的寄存器數(shù)目是p-1。
順便說(shuō)一下,可以理解的是,為了在寄存器重命名方法中根據(jù)產(chǎn)生值的指令準(zhǔn)確的計(jì)算序列的偏移量,產(chǎn)生的指令由于所謂的執(zhí)行(后面還將論述)仍必須提前提供值的數(shù)目。然而,這不會(huì)增加存儲(chǔ)循環(huán)內(nèi)的中間值所需的寄存器的數(shù)目。
假設(shè)再出現(xiàn)的值(在任一的先前迭代中作為本身的函數(shù)而被計(jì)算的任一循環(huán)變量值)再循環(huán)外按正確的順序初始化,那么上面所述的技術(shù)結(jié)合軟件流水線可正確的執(zhí)行。
現(xiàn)在詳細(xì)的描述本發(fā)明的優(yōu)選實(shí)施例。
圖6更詳細(xì)的給出了圖1中的寄存器文件20以及有關(guān)的電路。
在圖6中的寄存器文件20總共具有N個(gè)寄存器,N個(gè)寄存器中的K個(gè)低編號(hào)的寄存器組成了靜態(tài)-編址區(qū)20S并且N-K個(gè)高編號(hào)的寄存器組成了動(dòng)態(tài)-編址區(qū)(可重命名的或者旋轉(zhuǎn)的)20R。靜態(tài)-編址區(qū)20S的寄存器用于存儲(chǔ)循環(huán)-不變量值,然而可重命名區(qū)20R的寄存器用于存儲(chǔ)循環(huán)-變量值。兩個(gè)區(qū)域的間界是可編程的。
如圖1所示的指令發(fā)出單元10將RENAME信號(hào)提供給寄存器文件電路。
如果當(dāng)發(fā)出產(chǎn)生值的指令時(shí)所使用的寄存器重命名方法進(jìn)行重命名,那么產(chǎn)生值的指令檢測(cè)單元30當(dāng)發(fā)出一個(gè)產(chǎn)生值的指令時(shí)進(jìn)行檢測(cè)。產(chǎn)生值的指令檢測(cè)單元30適宜包括在如圖1所示的指令發(fā)出單元10中。當(dāng)檢測(cè)到發(fā)出這樣的指令時(shí),產(chǎn)生值的指令檢測(cè)單元30產(chǎn)生一個(gè)RENAME信號(hào)。
如果每次新的迭代的執(zhí)行開(kāi)始時(shí),例如,每II處理器周期,所使用的寄存器重命名方法進(jìn)行重命名。每個(gè)II處理器周期,指令發(fā)出單元10都產(chǎn)生一個(gè)RENAME信號(hào)。
RENAME信號(hào)提供給寄存器重命名單元32。寄存器重命名單元32與存儲(chǔ)映射偏移值OFFSET的映射偏移量存儲(chǔ)單元34相連。寄存器重命名單元32響應(yīng)RENAME信號(hào)將存儲(chǔ)在映射偏移量存儲(chǔ)單元34中的映射偏移值OFFSET減一。
存儲(chǔ)在映射偏移量存儲(chǔ)單元34中的映射偏移值OFFSET提供給映射單元36。映射單元還接收邏輯寄存器標(biāo)識(shí)符(R)并輸出物理寄存器地址(P)。邏輯寄存器標(biāo)識(shí)符(編號(hào))是從0至N-1范圍內(nèi)的整數(shù)。映射單元36完成從邏輯寄存器標(biāo)識(shí)符到物理寄存器地址的雙射映射。每一個(gè)物理寄存器地址也是從0至N-1范圍內(nèi)的整數(shù)并且直接標(biāo)識(shí)實(shí)際硬件寄存器中的一個(gè)。
如果指令指定邏輯寄存器編號(hào)R作為它的一個(gè)操作數(shù),并且R是包括在0到K-1的范圍內(nèi),于是物理寄存器編號(hào)與那個(gè)操作數(shù)的邏輯寄存器編號(hào)一致。然而,R在K到N-1的范圍內(nèi),操作數(shù)的物理寄存器地址通過(guò)這樣的P給出P=K+|R-K+OFFSET|N-K在這個(gè)表達(dá)式中,|y|x表示y模x。
這樣,改變映射偏移值OFFSET具有這樣的效果,即改變?cè)谥噶钪兴付ǖ倪壿嫾拇嫫鳂?biāo)識(shí)符與寄存器文件20的部分20R中的實(shí)際物理寄存器之間的映射。這導(dǎo)致了重命名寄存器。
圖1的處理器按照兩種不同的模式工作標(biāo)量模式和超長(zhǎng)指令字模式。在標(biāo)量模式中,在每個(gè)處理器周期發(fā)出一個(gè)單指令以由執(zhí)行單元14,16和18中的單一一個(gè)來(lái)執(zhí)行。單執(zhí)行單元(例如單元14)是指作為“主”處理單元。在VLIM方式中,每個(gè)處理器周期發(fā)出一個(gè)單VLIM指令包,該指令包包括由指令發(fā)出單元10在同一個(gè)周期所發(fā)出的多個(gè)指令。這些指令從不同的發(fā)出位置(圖1中IS1至IS3)并行發(fā)出以由兩個(gè)或多個(gè)執(zhí)行單元并行操作執(zhí)行。
圖7示意性的給出了標(biāo)量模式和超長(zhǎng)指令字模式之間的轉(zhuǎn)移,以及不同類型的VLIM程序代碼塊。如圖5所示,從標(biāo)量模式至超長(zhǎng)指令字模式之間的轉(zhuǎn)移是由主執(zhí)行單元執(zhí)行轉(zhuǎn)移分支指令到VLIM(bv)指令而引起的。從VLIW模式至標(biāo)量模式的轉(zhuǎn)換是通地由這些執(zhí)行單元中的任一個(gè)執(zhí)行從VLIW返回(rv)指令而實(shí)現(xiàn)的。
VLIM調(diào)度內(nèi)的程序代碼邏輯上是由兩種不同類型的程序代碼塊組成線性塊和循環(huán)塊。每一塊包括一個(gè)或多個(gè)VLIM包。當(dāng)進(jìn)入每一個(gè)VLIM調(diào)度,處理器執(zhí)行線性塊。這允許通過(guò)執(zhí)行一個(gè)循環(huán)指令來(lái)初始化隨后的循環(huán)塊。
圖8給出了本發(fā)明優(yōu)選實(shí)施例的循環(huán)指令的格式。如圖8所示,循環(huán)指令40具有包括迭代次數(shù)字段40A,收尾迭代次數(shù)字段40B以及大小字段40C的各種字段。在大小字段40C所指定的11位的值的大小定義了循環(huán)塊的長(zhǎng)度。由迭代次數(shù)字段40A所指定的5位操作數(shù)Ad標(biāo)識(shí)了包括迭代次數(shù)(IC)的地址寄存器。IC是循環(huán)中迭代的數(shù)目。
由字段40B所指定的5位的值識(shí)別碼是收尾迭代次數(shù)(EIC)。EIC是循環(huán)收尾階段的迭代次數(shù),例如,在收尾階段期間所完成的迭代數(shù)目。參考圖2和圖3在上述的實(shí)施例中,IC=5并且EIC=3。從圖6中可以看出,循環(huán)指令40具有獨(dú)立的字段40A和40B以分別指定IC和EIC,以致這些參數(shù)可彼此相互獨(dú)立的設(shè)置。典型的,EIC=p-1,其中p是流水線階段的數(shù)目。如下文所詳細(xì)描述的,存儲(chǔ)在循環(huán)指令的字段40A和40C在循環(huán)啟動(dòng)使用,以對(duì)處理器的各種循環(huán)控制寄存器初始化。
循環(huán)指令可按如下寫出loop p,Ad,size,eic自動(dòng)的迭代循環(huán)塊,當(dāng)循環(huán)迭代的次數(shù)到達(dá)由循環(huán)指令所指定的IC時(shí)結(jié)束。也可以在到達(dá)IC之前通過(guò)執(zhí)行退出指令來(lái)強(qiáng)行早些從循環(huán)中退出。當(dāng)循環(huán)塊結(jié)束時(shí),已經(jīng)進(jìn)入隨后的線性塊。通過(guò)執(zhí)行rv指令來(lái)初始化下一個(gè)循環(huán)塊,或者結(jié)束VLIM調(diào)度。當(dāng)結(jié)束VLIM調(diào)度,處理器轉(zhuǎn)回標(biāo)量模式。順便說(shuō)一下,如圖7所示,處理器在重新設(shè)定時(shí)最初進(jìn)入標(biāo)量模式。
處理器1具有各種控制器以控制循環(huán)的開(kāi)始和結(jié)束。在這些處理器中,圖9給出了迭代次數(shù)寄存器(IC寄存器)50和循環(huán)內(nèi)容寄存器52。與這些有關(guān)的更新一步的信息和其他的寄存器都在我們相關(guān)待決的公開(kāi)號(hào)為GB-A-2362733的英國(guó)專利申請(qǐng)中描述(與公開(kāi)號(hào)為CN-A-1326132的中國(guó)專利申請(qǐng)相對(duì)應(yīng)),通過(guò)參照該申請(qǐng)的整個(gè)內(nèi)容都包含在這里。
在循環(huán)開(kāi)始期間,通過(guò)循環(huán)迭代字段40A的地址寄存器的操作數(shù)Ad所定義的迭代次數(shù)IC復(fù)制到寄存器50中。假設(shè)沒(méi)有退出指令提前結(jié)束循環(huán)核心階段,那么IC值表示迭代的最大數(shù)目,該IC值在循環(huán)收尾階段之前被初始化。
循環(huán)內(nèi)容寄存器52具有旋轉(zhuǎn)控制字段52A,循環(huán)次數(shù)字段52B,EIC字段52C以及循環(huán)大小字段52D。字段52C和52D中值EIC和LSize在循環(huán)開(kāi)始期間被初始化為具有由循環(huán)指令字段40B和40C所指定的識(shí)別碼值和大小。循環(huán)次數(shù)字段指定了值LCnt,該值定義了在到達(dá)當(dāng)前循環(huán)迭代的結(jié)尾之前仍在執(zhí)行的VLIM包的數(shù)目。值LCnt被初始化為與LSize具有相同的值并且每次在循環(huán)內(nèi)提出一個(gè)包時(shí)增加該值。當(dāng)開(kāi)始新的迭代時(shí)它從Lsize重裝入。
在收尾階段期間,當(dāng)每次開(kāi)始新的收尾迭代時(shí)字段52C中的EIC值增加。
旋轉(zhuǎn)控制字段52A存儲(chǔ)單一的位R,該位R通過(guò)循環(huán)控制電路自動(dòng)設(shè)置以指示是否啟動(dòng)還是禁止當(dāng)前迭代的寄存器旋轉(zhuǎn)。這個(gè)位僅僅用于記錄寄存器旋轉(zhuǎn)的交叉的內(nèi)容轉(zhuǎn)換間界的狀態(tài),例如,為了保存和修復(fù)處理器狀態(tài)。
一旦寄存器50和52以及其他的循環(huán)控制寄存器由于循環(huán)指令的執(zhí)行而被初始化,處理器進(jìn)入VLIM循環(huán)模式。在這個(gè)模式下,它重復(fù)的執(zhí)行循環(huán)塊程序代碼,在開(kāi)始每一個(gè)新的循環(huán)之前檢查循環(huán)持續(xù)執(zhí)行的條件。
在循環(huán)執(zhí)行期間,預(yù)測(cè)寄存器用于控制指令的執(zhí)行。參考圖10(a)至圖10(c),11和12,現(xiàn)在描述這種方式,在該方式下執(zhí)行這種控制。
圖10(c)給出了在調(diào)度之前的循環(huán)。圖10(b)給出了在調(diào)度五個(gè)流水線階段(階段1至5)之后的循環(huán)。圖10(c)給出了圖10(b)的流水線調(diào)度的七個(gè)重疊迭代的時(shí)空?qǐng)D。圖10(c)還給出了執(zhí)行的開(kāi)始階段,核心階段以及收尾階段。
在循環(huán)的開(kāi)始階段,每一個(gè)流水線階段中的指令需要以規(guī)定的方式操作。同樣的,在收尾階段,每一個(gè)流水線階段中的指令需要以規(guī)定的方式不操作。利用判定可方便的實(shí)現(xiàn)這種操作和不操作。
現(xiàn)在參考圖11,重疊的迭代與圖10中所說(shuō)明的相對(duì)應(yīng)。同樣圖11中所說(shuō)明的是一組五個(gè)預(yù)測(cè)寄存器P1至P5。這些判定預(yù)測(cè)寄存器P1至P5分別與流水線化循環(huán)調(diào)度中的流水線階段1至5相對(duì)應(yīng)并且存儲(chǔ)在預(yù)測(cè)寄存器中的各個(gè)狀態(tài)在循環(huán)執(zhí)行期間從一個(gè)階段變化為下一個(gè)階段。這些預(yù)測(cè)寄存器與處理器1中的每一個(gè)執(zhí)行單元14,16,18相聯(lián)系。
軟件流水線調(diào)度中的每一個(gè)指令用判定編號(hào)來(lái)標(biāo)記,該判定編號(hào)是預(yù)測(cè)寄存器P1至P5其中一個(gè)的標(biāo)識(shí)符,在圖11的例子中,流水線調(diào)度的階段1至5中的指令分別用預(yù)測(cè)寄存器標(biāo)識(shí)符P1至P5來(lái)標(biāo)記。
當(dāng)指令發(fā)出單元10發(fā)出一個(gè)指令時(shí),首先確定與該指令相對(duì)應(yīng)的預(yù)測(cè)寄存器的狀態(tài)(由指令的標(biāo)識(shí)符來(lái)標(biāo)識(shí))是真還是假。如果相應(yīng)的預(yù)測(cè)寄存器的狀態(tài)是真,于是指令自動(dòng)轉(zhuǎn)換為NOP指令。如果相應(yīng)的預(yù)測(cè)寄存器的狀態(tài)是假,于是指令按照通常情況執(zhí)行。
因此在流水線階段i調(diào)度的所有指令用判定標(biāo)識(shí)符標(biāo)記。為了調(diào)度以正確的操作,在循環(huán)執(zhí)行期間,必須使預(yù)測(cè)寄存器P1的狀態(tài)為真只要流水線階段i可操作,對(duì)于所有i的相應(yīng)的值而言。這提出了一個(gè)可操作和不可操作階段的機(jī)制以控制循環(huán)的執(zhí)行。
圖11給出了在循環(huán)執(zhí)行期間對(duì)于每一個(gè)軟件流水線而言預(yù)測(cè)寄存器是怎樣變化的。在開(kāi)始循環(huán)之前,每一個(gè)預(yù)測(cè)寄存器P1至P5被設(shè)置為狀態(tài)0(假狀態(tài))。在初始化第一次迭代之前,狀態(tài)1被設(shè)置到第一預(yù)測(cè)寄存器P1中(真狀態(tài)),這樣包含在每一迭代的第一階段中的指令可操作。所有的其他預(yù)測(cè)寄存器P2至P5保持狀態(tài)0,以致沒(méi)有包含在第二至第五階段中的指令在第一個(gè)II周期內(nèi)執(zhí)行。
在初始化第二次迭代之前,同樣的狀態(tài)1被設(shè)置到第二預(yù)測(cè)寄存器P2中,這樣包含在循環(huán)調(diào)度第二階段中的指令可操作。預(yù)測(cè)寄存器P1仍具有狀態(tài)2,以致包含在第一階段中的指令同樣在第二個(gè)II周期期間也執(zhí)行。預(yù)測(cè)寄存器P3至P5保持狀態(tài)0,因?yàn)檫€不需要包含在第三至第五流水線階段中的指令。
在開(kāi)始階段期間,每一個(gè)連續(xù)的預(yù)測(cè)寄存器按順序變?yōu)闋顟B(tài)1,使每一個(gè)流水線階段按規(guī)定的方式操作,直到所有五個(gè)預(yù)測(cè)寄存器都保持狀態(tài)1并且所有的階段都可操作。這標(biāo)志著核心階段的開(kāi)始,在核心階段中所有流水線階段的指令在不同的迭代中執(zhí)行。在整個(gè)核心階段期間所有的預(yù)測(cè)寄存器都為狀態(tài)1。
在收尾期間,流水線階段按規(guī)定方式不操作,從階段1開(kāi)始到階段5結(jié)束。因此,在每一個(gè)流水線階段的間界之前,狀態(tài)0連續(xù)的按順序裝載到每一個(gè)預(yù)定寄存器P1至P5,從P1開(kāi)始。流水線階段因此按規(guī)定的方式不操作,這樣保證正確的停止循環(huán)。
從圖11所示的預(yù)測(cè)寄存器可清楚的看到一個(gè)動(dòng)態(tài)模式。在我們相關(guān)待決的公開(kāi)號(hào)為CN-A-1329303的中國(guó)專利申請(qǐng)利用了如圖12所示的判定文件電路。通過(guò)參考CN-A-1329303的整個(gè)內(nèi)容都包含在這里。
在圖12,預(yù)測(cè)寄存器文件135具有n個(gè)預(yù)測(cè)寄存器P0至Pn-1。預(yù)測(cè)寄存器P0和P1分別永久的預(yù)制0和1。為了控制循環(huán),預(yù)測(cè)寄存器P3至Pn-1可用作預(yù)測(cè)寄存器。寄存器P2保留,其原因在下面解釋。n位寄存器131(下文指的是“循環(huán)標(biāo)志”寄存器)用于標(biāo)識(shí)n-3個(gè)預(yù)測(cè)寄存器P3至Pn-1的子集合136,預(yù)測(cè)寄存器P3至Pn-1實(shí)際上用作預(yù)測(cè)寄存器以達(dá)到控制循環(huán)的目的。循環(huán)標(biāo)志寄存器131擁有n位,這n位分別與預(yù)測(cè)寄存器文件135中的n個(gè)寄存器相對(duì)應(yīng)。
如果預(yù)測(cè)寄存器Pi包括在子集合136中,那么在循環(huán)標(biāo)志寄存器131中的相應(yīng)的第i位被設(shè)置為值“1”。相反,如果預(yù)測(cè)寄存器Pi沒(méi)有包括在子集合136中,那么在循環(huán)標(biāo)志寄存器131中的相應(yīng)的第i位被設(shè)置為值“0”。典型的循環(huán)標(biāo)志寄存器131包含一個(gè)從第3比特向前的任一位置開(kāi)始的單一的連續(xù)序列,并且該序列的最大長(zhǎng)度為n-3。
在這個(gè)例子中,循環(huán)標(biāo)志寄存器131的位14值25被設(shè)置為1,并且所有其他的位被設(shè)置為0,以致這種情況下子集合136包括寄存器P14至P25。
預(yù)測(cè)寄存器標(biāo)識(shí)符附著于循環(huán)塊的每一個(gè)指令以直接的標(biāo)識(shí)預(yù)測(cè)寄存器文件135的子集合136中的其中一個(gè)預(yù)測(cè)寄存器。
如果,例如,存在32個(gè)預(yù)測(cè)寄存器,預(yù)測(cè)寄存器標(biāo)識(shí)符用包含在指令中的5比特字段標(biāo)識(shí)。
特殊流水線階段中的所有指令的標(biāo)識(shí)符都是相同的以致根據(jù)預(yù)測(cè)寄存器的值所有的指令都可操作或不可操作。然而,這需要多于一個(gè)的與特殊流水線階段相關(guān)的預(yù)測(cè)寄存器(例如具有if/then/else或者比較指令)。
在每一個(gè)連續(xù)循環(huán)迭代的初始化之前,執(zhí)行轉(zhuǎn)移操作,在該操作中將子集合136的每一個(gè)預(yù)測(cè)寄存器的內(nèi)容設(shè)置為它緊靠右側(cè)的預(yù)測(cè)寄存器的內(nèi)容。緊靠轉(zhuǎn)移子集合右側(cè)的預(yù)測(cè)寄存器(圖12中的P13)是一個(gè)源寄存器137。這樣,在每一個(gè)轉(zhuǎn)移操作中轉(zhuǎn)移寄存器子集合136的第一個(gè)預(yù)測(cè)寄存器的內(nèi)容(P14)被設(shè)置為源寄存器的內(nèi)容(“來(lái)源”)。
例如,參考圖11,在循環(huán)執(zhí)行的開(kāi)始和核心階段,源寄存器被預(yù)置到狀態(tài)“1”,而在收尾階段,為了結(jié)束循環(huán)將源寄存器137預(yù)置為狀態(tài)“0”。當(dāng)出現(xiàn)轉(zhuǎn)移時(shí),源寄存器的內(nèi)容被復(fù)制到最右邊的寄存器(P14),但是源寄存器的內(nèi)容保持不變。
在循環(huán)建立處理期間,循環(huán)標(biāo)志寄存器131的內(nèi)容被用作初始化預(yù)測(cè)寄存器的轉(zhuǎn)移子集合13和源寄存器137。如下面所述的它們的初始化值取決于迭代次數(shù)以及循環(huán)標(biāo)志寄存器131中的實(shí)際比特模式。
現(xiàn)在參考圖13(a)至13(d),圖13(a)再次給出了圖12中的循環(huán)標(biāo)志寄存器131。圖13(b)給出了在循環(huán)指令所指定的迭代次數(shù)是零的情況下清除源寄存器137和轉(zhuǎn)移子集合136中的所有預(yù)測(cè)寄存器。
如圖13(c)所示,如果由循環(huán)迭代所指定的迭代次數(shù)是1,清除源寄存器137并且除了緊靠源寄存器137左側(cè)的預(yù)測(cè)寄存器之外轉(zhuǎn)移子集合136的所有預(yù)測(cè)寄存器都被清除。緊靠源寄存器137左側(cè)的預(yù)測(cè)寄存器被設(shè)置為1。
如圖13(d)所示,如果由循環(huán)迭代所指定的迭代次數(shù)大于1,于是源寄存器137和緊靠源寄存器137左側(cè)的轉(zhuǎn)移子集合136中的預(yù)測(cè)寄存器都被設(shè)置為1。轉(zhuǎn)移子集合136中所有的其他預(yù)測(cè)寄存器被設(shè)置為0。
這樣具有一個(gè)或者多個(gè)迭代的任一循環(huán)的循環(huán)建立處理將值00…01分配給預(yù)測(cè)寄存器文件135中的轉(zhuǎn)移子集合136。
在循環(huán)的執(zhí)行期間,在結(jié)束每一個(gè)迭代時(shí),轉(zhuǎn)移子集合被從一位置轉(zhuǎn)移到左邊,并且源寄存器被復(fù)制到轉(zhuǎn)移子集合的右側(cè)端。另外,結(jié)束每一個(gè)迭代時(shí)IC寄存器50減1。
當(dāng)IC寄存器50到達(dá)零時(shí),清除源寄存器137,并且開(kāi)始循環(huán)的收尾階段。在收尾階段中的迭代次數(shù)是由包含在循環(huán)內(nèi)容寄存器中的EIC確定的,這是通過(guò)循環(huán)指令設(shè)置的作為循環(huán)建立處理的一部分。
在任何時(shí)候,循環(huán)本身可初始化提早由于執(zhí)行退出指令而結(jié)束循環(huán)。當(dāng)執(zhí)行退出指令時(shí)并且與之相關(guān)的寄存器設(shè)置為1,通過(guò)清除IC寄存器50和當(dāng)完成當(dāng)前迭代時(shí)清除源寄存器而使處理器進(jìn)入循環(huán)結(jié)尾階段。然而,如果退出指令出現(xiàn)在循環(huán)流水線階段1,那么所有的不可取消的狀態(tài)改變的操作必須在流水線階段1或之后的循環(huán)調(diào)度中出現(xiàn),并且如果它們?cè)陔A段i,那么它們必須在退出指令之前提出。
當(dāng)處理器在收尾階段,指令按通常的情況發(fā)出。在每一個(gè)迭代結(jié)束時(shí),預(yù)測(cè)寄存器的子集合136被轉(zhuǎn)移并且循環(huán)內(nèi)容寄存器52中的EIC減小。當(dāng)?shù)竭_(dá)循環(huán)迭代的結(jié)尾并且IC寄存器50和循環(huán)內(nèi)容寄存器52中EIC值為零時(shí),處理器退出循環(huán)模式。
如果當(dāng)每次流水線交叉時(shí)所使用的寄存器重命名方法重命名,那么通過(guò)循環(huán)所執(zhí)行的重命名操作(旋轉(zhuǎn))的次數(shù)總是IC+EIC。如果每次發(fā)出產(chǎn)生值的指令時(shí)所使用的寄存器重命名方法將要重命名,那么通過(guò)循環(huán)所執(zhí)行的重命名操作(旋轉(zhuǎn))的次數(shù)總是(IC+EIC)v,其中v是循環(huán)調(diào)度中產(chǎn)生值的指令的數(shù)目。
在循環(huán)序列期間用于執(zhí)行預(yù)測(cè)寄存器135的操作的邏輯電路的例子在我們相關(guān)待決的公開(kāi)號(hào)為GB-A-13626132的英國(guó)專利申請(qǐng)中描述。在該申請(qǐng)中初始化操作由偽代碼表示For all i from 2 to n-1Pi′=Li‾AND(PiORLi+1)]]>在本發(fā)明的實(shí)施例中,修改初始化操作以考慮到迭代次數(shù)(例如在循環(huán)指令中所指定)從而使源寄存器137和子集合136的第一個(gè)寄存器根據(jù)IC和循環(huán)標(biāo)志寄存器131中的內(nèi)容而被設(shè)置。所修改的偽代碼如下For all i from 3 to n-1if Li=1 and Li-1=0Pi=(IC≠0)Pi-1=(IC>1)elseif Li=1 and Li-1=1Pi=0如CN-A-1329303所描述的,可利用標(biāo)準(zhǔn)的邏輯設(shè)計(jì)技術(shù)來(lái)實(shí)現(xiàn)一電路以產(chǎn)生有限狀態(tài)時(shí)序機(jī)以作為與每一個(gè)預(yù)測(cè)寄存器相聯(lián)系的操作單元的一部分,其中該電路是用于執(zhí)行在處理器執(zhí)行期間預(yù)測(cè)寄存器文件所需要的初始化操作和其他任何操作。在這種情況下對(duì)于Pi計(jì)算下一個(gè)狀態(tài)的輸入包括IC,除了各種選擇信號(hào)以及在CN-A-1329303所描述的循環(huán)標(biāo)志寄存器位。
如上所述,體現(xiàn)本發(fā)明的處理器被設(shè)置為,如果在執(zhí)行時(shí)間發(fā)現(xiàn)循環(huán)迭代次數(shù)為零,并且因此循環(huán)體根本不執(zhí)行,于是在處理器繼續(xù)之前循環(huán)的結(jié)束之后寄存器文件旋轉(zhuǎn)一定的次數(shù)。將具有如下的效果,即在退出循環(huán)之后在發(fā)出第一條指令之前跳過(guò)了預(yù)定數(shù)目的可重命名寄存器。在實(shí)際上不執(zhí)行指令的情況下可通過(guò)p-1次調(diào)度循環(huán)指令而方便的完成。
通過(guò)有效地一直處理到流水線化循環(huán)的結(jié)束模式并且設(shè)置附加的(通用的)錯(cuò)誤判定以防止執(zhí)行任何指令來(lái)完成p-1次發(fā)出指令。
如上所述,本發(fā)明的實(shí)施例具有的優(yōu)點(diǎn)是在通常情況下和異常情況下(零迭代)的寄存器的定位相同,避免編譯器需要提供附加的程序代碼以處理異常情況。這減少了所有的程序代碼的大小。這也取消了檢查異常情況的需要并避免了處理所引入的額外消耗。最后,簡(jiǎn)化了由編譯器或程序器所產(chǎn)生的程序代碼。
權(quán)利要求
1.用于執(zhí)行軟件流水線化循環(huán)的處理器,包括多個(gè)寄存器,用于存儲(chǔ)通過(guò)執(zhí)行指令而產(chǎn)生和使用的值;寄存器重命名裝置,用于在循環(huán)執(zhí)行期間重命名寄存器;以及循環(huán)處理裝置,用于在軟件流水線化循環(huán)要求零迭代的情況下,以預(yù)定的方式引起寄存器被重命名。
2.按權(quán)利要求1的處理器,其中循環(huán)處理裝置引起寄存器重命名以致循環(huán)體內(nèi)的值在零迭代的情況下與在需要一次或多次迭代的循環(huán)的情況在同一寄存器內(nèi)。
3.按權(quán)利要求1或2的處理器,其中所述循環(huán)處理裝置用于在循環(huán)要求零迭代的情況下只引起執(zhí)行循環(huán)的收尾階段。
4.按權(quán)利要求3的處理器,其中所述的循環(huán)處理裝置包括一個(gè)或多個(gè)收尾迭代,每一個(gè)收尾迭代通過(guò)所述的寄存器重命名裝置引起一個(gè)或多個(gè)寄存器的重命名操作。
5.按權(quán)利要求4的處理器,其中寄存器重命名裝置用于當(dāng)開(kāi)始新的迭代時(shí)對(duì)寄存器重命名,并且在所述收尾階段所引起的所述寄存器重命名操作總的次數(shù)比軟件流水線階段的數(shù)目小一。
6.按權(quán)利要求4的處理器,其中寄存器重命名裝置用于當(dāng)每次發(fā)出產(chǎn)生值的指令時(shí)對(duì)寄存器重命名,并且在所述收尾階段所引起的所述寄存器重命名操作總的次數(shù)是所產(chǎn)生的產(chǎn)生值的指令的數(shù)目并比軟件流水線階段的數(shù)目小一,其中產(chǎn)生值的指令是每次迭代所提出的。
7.按權(quán)利要求4至6的任一項(xiàng)的處理器,其中所述收尾迭代的次數(shù)比軟件流水線階段的數(shù)目小一。
8.按權(quán)利要求3至7的任一項(xiàng)的處理器,其中在收尾階段的寄存器重命名操作的次數(shù)是可指定的與循環(huán)本身的迭代次數(shù)無(wú)關(guān)。
9.按權(quán)利要求4至8的任一項(xiàng)的處理器,其中收尾迭代的次數(shù)是可指定的與循環(huán)本身的迭代次數(shù)無(wú)關(guān)。
10.按權(quán)利要求9的處理器,其中收尾迭代的次數(shù)被指定在由處理器所執(zhí)行的一指令中。
11.按權(quán)利要求9的處理器,其中收尾迭代的次數(shù)被指定在軟件流水線化循環(huán)的開(kāi)始期間所執(zhí)行的一循環(huán)指令中。
12.按權(quán)利要求11的處理器,其中循環(huán)的迭代次數(shù)也可獨(dú)立的指定在所述循環(huán)指令中。
13.按權(quán)利要求11的處理器,其中所述循環(huán)指令具有一獨(dú)立的字段,所述收尾迭代的次數(shù)被指定在該字段中。
14.按權(quán)利要求11的處理器,其中所述循環(huán)指令具有一獨(dú)立的字段,循環(huán)迭代的次數(shù)被指定在該字段中。
15.按權(quán)利要求3至14的任一項(xiàng)的處理器,其中當(dāng)初始化循環(huán)時(shí),所述循環(huán)處理裝置用于接收用于指定循環(huán)中的迭代數(shù)目的迭代次數(shù)并且,如果所指定的數(shù)目為零,所述循環(huán)處理裝置用于僅僅引起執(zhí)行收尾階段并且,如果所指定的數(shù)目為非零,所述循環(huán)處理裝置用于引起循環(huán)的開(kāi)始,核心以及收尾階段的執(zhí)行。
16.按前面權(quán)利要求中的任一項(xiàng)的處理器,適宜指令的判定執(zhí)行,并且進(jìn)一步包括分別與不同軟件流水線階段相對(duì)應(yīng)的預(yù)測(cè)寄存器,每一個(gè)預(yù)測(cè)寄存器在第一狀態(tài)和第二狀態(tài)之間是可轉(zhuǎn)換的,在第一狀態(tài)中與之相對(duì)應(yīng)的軟件流水線階段是可操作的,在第二狀態(tài)中與之相對(duì)應(yīng)的軟件流水線階段是不可操作的;所述循環(huán)處理裝置用于根據(jù)循環(huán)的迭代次數(shù)對(duì)預(yù)測(cè)寄存器初始化。
17.按權(quán)利要求16的處理器,其中所述循環(huán)處理裝置用于當(dāng)循環(huán)迭代的次數(shù)是零時(shí)以一種方式對(duì)預(yù)測(cè)寄存器初始化并且當(dāng)循環(huán)迭代的次數(shù)不是零時(shí)以至少另外一種方式對(duì)預(yù)測(cè)寄存器初始化。
18.按權(quán)利要求16或17的處理器,其中當(dāng)循環(huán)迭代的次數(shù)是零時(shí),與循環(huán)的階段相對(duì)應(yīng)的所有寄存器在第二階段初始化,同時(shí)當(dāng)循環(huán)的迭代次數(shù)是非零時(shí),與第一流水線階段相對(duì)應(yīng)的預(yù)測(cè)寄存器在第一階段初始化,并且與隨后階段相對(duì)應(yīng)的每一個(gè)預(yù)測(cè)寄存器在第二階段被初始化。
19.按權(quán)利要求16,17或18的處理器,進(jìn)一步包括轉(zhuǎn)移裝置,用于將與第一流水線階段相對(duì)應(yīng)的預(yù)測(cè)寄存器的狀態(tài)轉(zhuǎn)移到與第二流水線階段相對(duì)應(yīng)的預(yù)測(cè)寄存器中,依此類推對(duì)于與每一個(gè)隨后的流水線階段相對(duì)應(yīng)的預(yù)測(cè)寄存器,并且根據(jù)源寄存器設(shè)置與第一流水線階段相對(duì)應(yīng)的預(yù)測(cè)寄存器的狀態(tài);所述循環(huán)處理裝置,用于根據(jù)不同的循環(huán)迭代次數(shù)對(duì)源寄存器進(jìn)行初始化。
20.按權(quán)利要求19的處理器,其中當(dāng)循環(huán)的迭代次數(shù)是零或者一時(shí),所述循環(huán)處理裝置在第二階段對(duì)源寄存器初始化,并且當(dāng)循環(huán)的迭代次數(shù)是二或者更多時(shí),在第一階段對(duì)源寄存器初始化。
21.用于處理器的一種編譯方法,包括在軟件流水線化循環(huán)是零迭代次數(shù)的情況下,指定目標(biāo)程序中的將由該處理器進(jìn)行的一個(gè)寄存器重命名。
22.按權(quán)利要求21的編譯方法,其中在零迭代次數(shù)的情況下處理器只執(zhí)行循環(huán)的收尾階段,并且編譯方法涉及包括在目標(biāo)程序中指定在收尾階段執(zhí)行的寄存器重命名操作的次數(shù)。
23.按權(quán)利要求21或22的編譯方法,其中在零迭代次數(shù)的情況下處理器只執(zhí)行循環(huán)的收尾階段,并且編譯方法涉及包括在目標(biāo)程序中指定在收尾階段執(zhí)行的迭代次數(shù)。
24.按權(quán)利要求22或23的編譯方法,其中所述信息被指定在一指令中,該指令包括在目標(biāo)程序中。
25.按權(quán)利要求24的編譯方法,其中所述指令是在軟件流水線化循環(huán)的開(kāi)始期間所執(zhí)行的循環(huán)指令。
26.按權(quán)利要求25的編譯方法,其中循環(huán)指令也獨(dú)立的指定循環(huán)中的迭代次數(shù)。
27.由處理器執(zhí)行的目標(biāo)程序,所述的目標(biāo)程序包括指定在軟件流水線化循環(huán)的收尾階段要執(zhí)行的迭代的次數(shù)的信息。
28.按權(quán)利要求25的目標(biāo)程序,其中在零迭代次數(shù)的情況下處理器只執(zhí)行循環(huán)的收尾階段,并且目標(biāo)程序包括用于指定在收尾階段執(zhí)行的迭代次數(shù)的信息。
29.按權(quán)利要求25的目標(biāo)程序,其中所述信息被指定在一指令中,該指令包括在目標(biāo)程序中。
30.按權(quán)利要求29的目標(biāo)程序,其中所述指令是在軟件流水線化循環(huán)的開(kāi)始期間所執(zhí)行的循環(huán)指令。
31.按權(quán)利要求30的目標(biāo)程序,其中循環(huán)指令也獨(dú)立的指定循環(huán)中的迭代次數(shù)。
32.一計(jì)算機(jī)程序,當(dāng)運(yùn)行計(jì)算機(jī)時(shí),該計(jì)算機(jī)程序引起計(jì)算機(jī)執(zhí)行用于處理器的編譯方法,計(jì)算機(jī)程序包括一重命名信息指定部分,用于在軟件流水線具有零迭代次數(shù)的情況下在目標(biāo)程序中指定由處理器執(zhí)行的寄存器重命名。
33.按權(quán)利要求27至32的任一程序中,該程序記載在媒體介質(zhì)上。
34.按權(quán)利要求33的程序中,媒體介質(zhì)是一記錄介質(zhì)。
35.按權(quán)利要求34的程序中,媒體介質(zhì)是一傳送介質(zhì)。
36.用于處理器的編譯裝置,包括用于在軟件流水線具有零迭代次數(shù)的情況下在目標(biāo)程序中指定由處理器執(zhí)行的寄存器重命名的裝置。
37.循環(huán)指令,由處理器執(zhí)行以開(kāi)始一軟件流水線化循環(huán),包括用于在循環(huán)的收尾階段所執(zhí)行的迭代次數(shù)的信息。
38.按權(quán)利要求34的循環(huán)指令中,進(jìn)一步包括獨(dú)立的指定循環(huán)的迭代次數(shù)。
全文摘要
處理器可執(zhí)行軟件流水線化循環(huán)。多個(gè)寄存器(20)存儲(chǔ)執(zhí)行指令所產(chǎn)生和所使用的值。寄存器重命名單元(32)在執(zhí)行循環(huán)期間對(duì)寄存器重命名。在軟件流水線化循環(huán)需要零迭代的情況下,寄存器以預(yù)定的方式被重命名以使寄存器的位置與執(zhí)行一次或多次迭代的通常情況下所發(fā)生的寄存器的位置相一致。這可通過(guò)只執(zhí)行產(chǎn)生循環(huán)調(diào)度指令的循環(huán)的收尾階段來(lái)實(shí)現(xiàn)以致不牽扯他們的結(jié)果。在收尾階段提出的指令引起自動(dòng)執(zhí)行預(yù)定的重命名。收尾迭代的次數(shù)可被指定在用于開(kāi)始循環(huán)的循環(huán)指令中。
文檔編號(hào)G06F9/30GK1372190SQ0210540
公開(kāi)日2002年10月2日 申請(qǐng)日期2002年1月31日 優(yōu)先權(quán)日2001年1月31日
發(fā)明者尼格爾·彼德·托法姆, 雷蒙德·馬爾科姆·利維斯利 申請(qǐng)人:斯羅揚(yáng)有限公司
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
六安市| 于田县| 论坛| 巍山| 延安市| 方正县| 建昌县| 于田县| 许昌市| 刚察县| 安岳县| 高安市| 黔南| 延庆县| 宿迁市| 江门市| 茶陵县| 桂东县| 资源县| 五指山市| 金沙县| 简阳市| 怀来县| 金堂县| 射阳县| 卢龙县| 东兰县| 锦屏县| 察隅县| 乐平市| 蓬安县| 礼泉县| 成安县| 洪泽县| 原阳县| 长岭县| 贵阳市| 淮南市| 韩城市| 南投县| 平湖市|