專利名稱:混合向量/標(biāo)量寄存器文件的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)處理領(lǐng)域。更具體來說,本發(fā)明涉及帶向量和標(biāo)量數(shù)據(jù)處理寄存器的數(shù)據(jù)處理系統(tǒng)。
數(shù)據(jù)處理指令一般包含一個(gè)操作碼部分和一個(gè)或多個(gè)寄存器指定字段。在有些系統(tǒng)中,可以將寄存器按向量寄存器或標(biāo)量寄存器對待。一個(gè)向量寄存器指定一序列的寄存器,每個(gè)存儲其自己的數(shù)據(jù)值,這些數(shù)據(jù)值在數(shù)據(jù)處理指令重復(fù)其對該序列中的每個(gè)數(shù)據(jù)值操作時(shí),被單獨(dú)地操作。相反,一個(gè)標(biāo)量寄存器則是存儲著單一值的、獨(dú)立于其它寄存器而操作的單一的寄存器。
使用向量寄存器的數(shù)據(jù)處理指令比純粹標(biāo)量的操作有許多優(yōu)點(diǎn)。所需要的指令帶寬可以縮減,因?yàn)橹灰粭l數(shù)據(jù)處理指令就能指定多個(gè)要執(zhí)行的類似數(shù)據(jù)處理操作(這在諸如FIR濾波器的DSP功能中是普遍的)。就因其簡單可取的單發(fā)布機(jī)(即每個(gè)周期提取并解碼一條指令)而言,用多個(gè)并行地執(zhí)行不同的向量指令的功能單元,能取得更高的性能。
附圖中的
圖16和17分別表示一個(gè)克雷(Cray)1處理器寄存器組和一個(gè)數(shù)字設(shè)備公司(Digital Equipment Corporation)的MultiTitan處理器寄存器組。這兩個(gè)現(xiàn)有技術(shù)的處理器都提供向量和標(biāo)量寄存器。
就克雷1來說,提供單獨(dú)的向量和標(biāo)量寄存器組10、12。16位指令提供的各個(gè)操作碼,對應(yīng)于在按向量或標(biāo)量處理的指令中指定的寄存器的不同組合。這樣的缺點(diǎn)是,需要提供更多的操作碼來代表這些不同的組合。此外,由于向量和標(biāo)量寄存器是在獨(dú)立的寄存器組10、12中提供的,要確定將哪個(gè)寄存器組10、12用于指定的特定寄存器,至少需要將操作碼部分地解碼。這額外的解碼要求對能夠盡早讀取寄存器中存儲的數(shù)據(jù)值增加了困難。
克雷1處理器用3位的寄存器指定字段R1、R2、R3,使得能尋址到8個(gè)標(biāo)量寄存器和8個(gè)向量寄存器。實(shí)際上,每個(gè)向量寄存器包含一組寄存器,它們每個(gè)能存儲不同的數(shù)據(jù)值,每個(gè)都能被依次訪問,而取決于長度寄存器16內(nèi)存儲的向量長度值和屏蔽寄存器18內(nèi)存儲的屏蔽位。然而,3位寄存器字段所允許的僅8個(gè)標(biāo)量寄存器的限制,對于現(xiàn)代編譯程序來說是個(gè)重大的缺陷。如果能有更多的寄存器為目標(biāo),這些編譯程序就能生成更快的程序碼。
MultiTitan處理器提供一個(gè)寄存器組20,其中的每個(gè)寄存器都可以按一個(gè)標(biāo)量寄存器或一部分向量寄存器那樣操作。MultiTitan處理器用一個(gè)32位指令來指定其數(shù)據(jù)處理操作。這么大的指令位空間允許指令本身包含字段VS2、VS3確定寄存器是向量還是標(biāo)量的,包含向量的長度(Len)。盡管這個(gè)方法具有很大的靈活性,卻有這樣的缺點(diǎn),即在許多情況下,如果不限制可用來提供一個(gè)豐富指令集的操作碼空間,就沒有足夠的指令位空間可用來使向量/標(biāo)量字段能被包含在指令內(nèi)。此外,在指令本身內(nèi)提供向量長度,使得如果不借助自修改代碼,就難以對向量長度作全局改變。MultiTitan技術(shù)也相當(dāng)不充分地利用其指令位空間,因?yàn)樵摷夹g(shù)將相等的指令位空間資源分配給實(shí)際上極不可能被使用的向量和標(biāo)量寄存器的組合(例如V=SopS,一序列的向量寄存器被填充以對兩個(gè)標(biāo)量寄存器的操作的結(jié)果)。
本發(fā)明的一個(gè)目的是解決上述各系統(tǒng)的至少一些缺陷。
從一方面來說,本發(fā)明提供一種用于數(shù)據(jù)處理的裝置,該裝置包含一個(gè)有多個(gè)寄存器的寄存器組;以及一個(gè)用于譯碼數(shù)據(jù)處理指令的指令譯碼器,至少一條所述數(shù)據(jù)處理指令有至少一個(gè)指定要執(zhí)行的操作的操作指定碼和一個(gè)指定所述寄存器組內(nèi)的一個(gè)第一寄存器的寄存器指定字段;其中所述指令譯碼器用一個(gè)給定的寄存器作為標(biāo)量寄存器或向量寄存器來執(zhí)行操作,以所述給定寄存器作為標(biāo)量寄存器的執(zhí)行,包含對存儲在所述給定寄存器的一個(gè)操作數(shù)執(zhí)行一次所述操作,以所述給定寄存器作為向量寄存器的執(zhí)行,包含對存儲在依賴所述給定寄存器的一個(gè)寄存器指定字段而選擇的所述寄存器組的一個(gè)預(yù)定序列的寄存器中的操作數(shù)執(zhí)行多次所述操作;和所述指令譯碼器響應(yīng)所述第一寄存器指定字段并獨(dú)立于所述操作指定碼,確定要將所述第一寄存器作為向量寄存器還是標(biāo)量寄存器用來執(zhí)行所述操作。
本發(fā)明認(rèn)識到可以用寄存器字段本身來指出要將該寄存器作為向量寄存器還是標(biāo)量寄存器對待。這樣就不需要對操作碼進(jìn)行譯碼,使得僅根據(jù)寄存器字段就較早地對寄存器進(jìn)行存取,并且由于標(biāo)量和向量寄存器二者都一起在一個(gè)寄存器組內(nèi)提供,這樣就使得它們的使用具有更大的靈活性。此外,用寄存器指定字段來編碼寄存器是標(biāo)量寄存器還是向量寄存器,為其它用途釋放了指令位空間。實(shí)際上本發(fā)明的技術(shù)提供一種高效的指令編碼方法,該編碼方法又使指令位空間可用來使更大的寄存器組能被尋址。
在本發(fā)明的較佳實(shí)施例中,所述的至少一個(gè)所述數(shù)據(jù)處理指令有一個(gè)指定一個(gè)第二寄存器的第二寄存器指定字段;所述指令譯碼器用所述第二寄存器作為標(biāo)量寄存器或向量寄存器來執(zhí)行所述操作;和所述指令譯碼器響應(yīng)所述第一寄存器指定字段,確定要將所述第二寄存器作為向量寄存器還是標(biāo)量寄存器用來執(zhí)行所述操作。
這種較佳實(shí)施例建立并利用一個(gè)相關(guān)關(guān)系-即第一寄存器是向量寄存器還是標(biāo)量寄存器以及第二寄存器是向量寄存器還是標(biāo)量寄存器。實(shí)際上已經(jīng)發(fā)現(xiàn)有些組合是常用的,有些是不常用的。這一點(diǎn)是可以利用的,方法是支持常用的組合并用第一寄存器字段值編碼它們,由此避免不得不單獨(dú)地編碼第二寄存器的性質(zhì)(nature)。當(dāng)實(shí)際上需要不常用的組合時(shí),可以用額外的指令來滿足。不可能的組合是足夠地難得見到的,不必為每條指令編碼第二寄存器的性質(zhì)的好處,遠(yuǎn)超過偶爾的對為規(guī)定想要的不常用操作而提供額外指令的需要。
盡管可能在有些實(shí)施例中,該相關(guān)關(guān)系是當(dāng)?shù)谝患拇嫫魇菢?biāo)量寄存器時(shí),第二寄存器是向量寄存器,已經(jīng)發(fā)現(xiàn),第一寄存器和第二寄存器有益的相關(guān)關(guān)系應(yīng)當(dāng)是,或者二者同為向量寄存器,或者二者同為向量寄存器。
本發(fā)明的原理可以有益地進(jìn)一步用于較佳實(shí)施例,其中,所述至少一個(gè)數(shù)據(jù)處理指令有一個(gè)指定一個(gè)第三寄存器的第三寄存器指定字段;
所述指令譯碼器用所述第三寄存器作為標(biāo)量寄存器或向量寄存器來執(zhí)行所述操作;和所述指令譯碼器響應(yīng)所述第二寄存器指定字段,確定要將所述第三寄存器作為向量寄存器還是標(biāo)量寄存器用來執(zhí)行所述操作。
這個(gè)理想的特征用第二寄存器指定字段來編碼第三寄存器的向量或標(biāo)量性質(zhì),由此節(jié)省更多的指令位空間。
用寄存器指定字段來編碼寄存器的向量或標(biāo)量性質(zhì),并非是使標(biāo)量和向量寄存器的所有組合都能容易地被編碼。對于非交換性(non-commutative)運(yùn)算來說有一個(gè)特別的問題,非交換性操作中,VopS或SopV的次序是有差別的,而在寄存器字段內(nèi)卻沒有為這兩種可能提供單獨(dú)的編碼。這個(gè)問題可以在較佳實(shí)施例中解決,在較佳實(shí)施例中,當(dāng)所述操作指定碼沒有對應(yīng)于非交換性運(yùn)算的非交換性碼值時(shí),至少成對地提供一些對應(yīng)于相同的操作但具有相反的操作數(shù)順序的所述非交換性碼值。
向量長度和向量跨距(序列中寄存器號之間的間隔)可以在指令操作碼內(nèi)規(guī)定。然而,最好由存儲在一個(gè)向量控制寄存器中的值來控制向量長度和向量跨距。這些長度和跨距對所使用的所有向量寄存器都普遍地適用。盡管這可能會被認(rèn)為引入了不利的不靈活性,實(shí)際上,對混合長度和跨距值的需求是不常見的,本方法具有的無需自修改代碼就能全局地改變向量長度和跨距的能力,遠(yuǎn)遠(yuǎn)抵銷了這種缺點(diǎn)。
此外,向量控制寄存器中存儲的長度值,可用來獲得對是否某數(shù)據(jù)處理指令的所有寄存器都是標(biāo)量寄存器的快速指示,方法是檢測一個(gè)對應(yīng)于一的長度值,因?yàn)樵谶@種情況下,任何向量寄存器實(shí)際上將像標(biāo)量寄存器一樣操作。這種對全標(biāo)量操作的早期指示,在解決時(shí)序限制的指令譯碼中是有用的。
可以以不同方式劃分寄存器指定字段值,以指示寄存器是向量寄存器還是標(biāo)量寄存器。然而,能夠提供把寄存器指定字段值劃分成分別編碼不同含義的范圍的快速指令譯碼是有益的。
實(shí)際上已經(jīng)發(fā)現(xiàn),提供多于標(biāo)量寄存器的向量寄存器是有益的,因?yàn)橄蛄考拇嫫饕蚱湫再|(zhì)而往往存儲大量不同的值,而標(biāo)量寄存器則常常存儲被重復(fù)使用的值。特別地,發(fā)現(xiàn)該編碼方法中向量寄存器與標(biāo)量寄存器的比為3比1是一個(gè)合適的平衡。
應(yīng)該明白,在所提供的能構(gòu)成編譯程序的目標(biāo)寄存器的寄存器的數(shù)量與讓寄存器字段的長度足以使用所有寄存器而需要的指令位空間之間,要達(dá)到一種平衡。已經(jīng)找到的一種平衡是提供32個(gè)寄存器。
本發(fā)明的較佳實(shí)施例包含一個(gè)存儲器和一個(gè)用于控制所述存儲器與所述寄存器組內(nèi)寄存器之間數(shù)據(jù)值的傳送的傳送控制器,所述傳送控制器響應(yīng)多個(gè)傳送指令,在所述存儲器與所述寄存器組內(nèi)的一系列寄存器之間傳送一系列數(shù)據(jù)值。
提供支持多個(gè)傳送指令(即由一條指令傳送許多字)的傳送控制器,使得能用新數(shù)據(jù)高效地刷新寄存器組,不管正被加載或卸載的寄存器是不是向量寄存器。
盡管本發(fā)明能被用于許多不同類型的數(shù)據(jù)處理裝置,已經(jīng)發(fā)現(xiàn)它在浮點(diǎn)單元內(nèi)特別有用。除主流數(shù)據(jù)處理系統(tǒng)外而額外提供的、諸如以浮點(diǎn)協(xié)處理器為形式的浮點(diǎn)單元,經(jīng)常在想要使用一個(gè)支持向量和標(biāo)量兩種寄存器的大寄存器組時(shí),面臨著它們可用的指令位空間的限制。在這種情況下,本發(fā)明特別有用。
已經(jīng)發(fā)現(xiàn),經(jīng)常需要的給定操作碼的向量和標(biāo)量寄存器的組合是可預(yù)測的,所以就乘法-累加運(yùn)算而言,很適合本發(fā)明。
已經(jīng)發(fā)現(xiàn),經(jīng)常需要的向量和標(biāo)量的不同組合與本發(fā)明的向量/標(biāo)量寄存器編碼技術(shù)之間,有著較好的匹配,其中,第一寄存器是目的地寄存器,第二寄存器是第一源寄存器,第三寄存器是第二源寄存器。
寄存器資源的靈活性可以進(jìn)一步提高,方法是安排數(shù)據(jù)存儲槽(data slots)單個(gè)地代表單精度值或成對地代表雙精度值。
譯碼的速度可以提高,方法是用給定寄存器內(nèi)的值,直接指向要被用于向量寄存器或標(biāo)量寄存器的第一寄存器,使得不必對數(shù)據(jù)處理指令內(nèi)提供的值進(jìn)行任何操作就能開始對這個(gè)寄存器的存取。
從另一方面來說,本發(fā)明提供一種數(shù)據(jù)處理的方法,該方法包含的步驟是在一個(gè)有多個(gè)寄存器的寄存器組中存儲數(shù)據(jù)值;
用一個(gè)指令譯碼器譯碼數(shù)據(jù)處理指令,至少一條所述數(shù)據(jù)處理指令有至少一個(gè)指定要執(zhí)行的操作的操作指定碼和一個(gè)指定所述寄存器組內(nèi)的一個(gè)第一寄存器的第一寄存器指定字段;其中所述指令譯碼器用一個(gè)給定的寄存器作為標(biāo)量寄存器或向量寄存器來執(zhí)行操作,以所述給定寄存器作為標(biāo)量寄存器的執(zhí)行,包含對存儲在所述給定寄存器的一個(gè)操作數(shù)執(zhí)行一次所述操作,以所述給定寄存器作為向量寄存器的執(zhí)行,包含對存儲在依賴所述給定寄存器的一個(gè)寄存器指定字段而選擇的所述寄存器組的一個(gè)預(yù)定的寄存器序列中的操作數(shù)執(zhí)行多次所述操作;和所述指令譯碼器響應(yīng)所述第一寄存器指定字段并獨(dú)立于所述操作指定碼,確定要將所述第一寄存器作為向量寄存器還是標(biāo)量寄存器用來執(zhí)行所述操作。
現(xiàn)在將結(jié)合各附圖,僅通過舉例來說明本發(fā)明的實(shí)施例,附圖中圖1示意性地表示一個(gè)數(shù)據(jù)處理系統(tǒng);圖2表示一個(gè)支持標(biāo)量和向量兩種寄存器的浮點(diǎn)單元;圖3的流程圖表示,對于單精度操作來說,如何確定給定寄存器是向量寄存器還是標(biāo)量寄存器;圖4的流程圖表示,對于雙精度操作來說,如何確定給定寄存器是向量寄存器還是標(biāo)量寄存器;圖5表示在單精度操作期間將寄存器組劃分成子集,每個(gè)子集內(nèi)是環(huán)繞的;圖6表示在雙精度操作期間將寄存器組劃分成子集,每個(gè)子集內(nèi)是環(huán)繞的;圖7A至7C分別表示從主處理器角度看的一條協(xié)處理器指令、從單和雙精度協(xié)處理器角度看的該協(xié)處理器指令以及從單精度協(xié)處理器角度看的該協(xié)處理器指令;圖8表示控制一個(gè)單和雙精度協(xié)處理器的主處理器;圖9表示控制一個(gè)單精度協(xié)處理器的主處理器;圖10表示單和雙精度協(xié)處理器內(nèi)的、確定是否應(yīng)當(dāng)就所接收協(xié)處理器指令向主處理器返回一個(gè)接收信號的電路;圖11表示單精度協(xié)處理器內(nèi)的、確定是否應(yīng)當(dāng)就所接收協(xié)處理器指令向主處理器返回一個(gè)接收信號的電路;圖12表示主處理器內(nèi)的未定義指令異常處理;圖13的框圖表示按照本發(fā)明較佳實(shí)施例的一個(gè)協(xié)處理器的部件;圖14的流程圖表示按照本發(fā)明較佳實(shí)施例的寄存器控制和指令發(fā)布邏輯的操作;圖15提供一例按照本發(fā)明較佳實(shí)施例的浮點(diǎn)寄存器的內(nèi)容的實(shí)例;圖16表示克雷1處理器內(nèi)的寄存器組;和圖17表示MultiTitan處理器內(nèi)的寄存器組。
圖1表示的數(shù)據(jù)處理系統(tǒng)22包含主處理器24、浮點(diǎn)單元協(xié)處理器26、高速緩沖存儲器28、主存儲器30和輸入/輸出系統(tǒng)32。主處理器24、高速緩沖存儲器28、主存儲器30和輸入/輸出系統(tǒng)32通過主總線34連接。協(xié)處理器總線36連接主處理器24與浮點(diǎn)單元協(xié)處理器26。
操作中,主處理器24(也稱ARM核心)執(zhí)行一個(gè)數(shù)據(jù)處理指令流,它們控制一般類型的數(shù)據(jù)處理操作,包括與高速緩沖存儲器28、主存儲器30和輸入/輸出系統(tǒng)32的交互作用。嵌入該數(shù)據(jù)處理指令流內(nèi)的有協(xié)處理器指令。主處理器24識別這些協(xié)處理器指令為應(yīng)當(dāng)由附屬的協(xié)處理器執(zhí)行的類型。相應(yīng)地,主處理器24將這些協(xié)處理器指令在協(xié)處理器總線36上發(fā)出,由任何附屬協(xié)處理器從總線接收它們。在這種情況下,浮點(diǎn)單元協(xié)處理器26將將接受并執(zhí)行它檢測到的為它發(fā)出的任何接收的協(xié)處理器指令。這個(gè)檢測是通過協(xié)處理器指令內(nèi)的協(xié)處理器號字段進(jìn)行的。
圖2更詳細(xì)地表示浮點(diǎn)單元協(xié)處理器26。浮點(diǎn)單元協(xié)處理器26包括一個(gè)由32個(gè)32位寄存器構(gòu)成的寄存器組38(圖2中顯示的較少)。這些寄存器能單個(gè)地作為每個(gè)存儲一個(gè)32位數(shù)據(jù)值的單精度寄存器操作,或者作為共同存儲一個(gè)64位數(shù)據(jù)值的寄存器對操作。在浮點(diǎn)單元協(xié)處理器26內(nèi),提供一個(gè)流水線式的乘法累加單元40和一個(gè)加載存儲控制單元42。在適當(dāng)?shù)那闆r下,乘法累加單元40和加載存儲控制單元42能并發(fā)地操作,乘法累加單元40對寄存器組38內(nèi)的數(shù)據(jù)值執(zhí)行算術(shù)運(yùn)算(包括乘法累加運(yùn)算以及其它運(yùn)算),而加載存儲控制單元42則將乘法累加單元40不在使用的數(shù)據(jù)值經(jīng)主處理器24發(fā)送到或發(fā)送出浮點(diǎn)單元協(xié)處理器26。
在浮點(diǎn)單元協(xié)處理器26內(nèi),被接收的協(xié)處理器指令被鎖存在指令寄存器44內(nèi)。在這個(gè)簡略視圖中,協(xié)處理器指令可視為是由操作碼部分及隨后的三個(gè)寄存器指定字段R1、R2和R3構(gòu)成的(實(shí)際上在完整的指令中這些字段可以是以不同的方式分散分布的)。這些寄存器指定字段R1、R2和R3分別相當(dāng)于寄存器組38內(nèi)充當(dāng)正在進(jìn)行的數(shù)據(jù)處理操作的目的地、第一源和第二源的寄存器。向量控制寄存器46(它可以是具有額外功能的更大的寄存器的一部分)為可能由浮點(diǎn)單元協(xié)處理器26執(zhí)行的向量操作存儲一個(gè)長度值和一個(gè)跨距值。向量控制寄存器46可以根據(jù)向量控制寄存器加載指令用長度值和跨距值初始化和更新。向量長度值和跨距值在浮點(diǎn)單元協(xié)處理器46內(nèi)全局適用,由此,不必借助自修改代碼就能全局地對這些值進(jìn)行動(dòng)態(tài)改變。
寄存器控制與指令發(fā)布單元48、加載存儲控制單元42和向量控制單元50可以共同認(rèn)為是執(zhí)行指令譯碼器功能的主要部分。寄存器控制與指令發(fā)布單元48響應(yīng)操作碼和三個(gè)寄存器指定字段R1、R2和R3,首先將初始寄存器存取(尋址)信號輸出到寄存器組38,而不對操作碼進(jìn)行任何譯碼,也不需使用向量控制單元50。以這一方式直接利用初始的寄存器值,有助于獲得更快的實(shí)現(xiàn)。如果指定了向量寄存器,向量控制單元50的作用是用3位的增量器(加法器)52來生成必要的寄存器存取信號序列。向量控制單元50根據(jù)向量控制寄存器46內(nèi)存儲的長度值和跨距值執(zhí)行其對寄存器組38的尋址。提供一個(gè)寄存器記錄板(scoreboard),用來進(jìn)行寄存器鎖定,使得流水線式乘法累加單元40和并發(fā)操作的加載存儲控制單元42不會產(chǎn)生任何數(shù)據(jù)一致性問題(可以選擇將寄存器記錄板54視為寄存器控制與指令發(fā)布單元48的一部分)。
指令寄存器44內(nèi)的操作碼規(guī)定要執(zhí)行的數(shù)據(jù)處理操作的性質(zhì)(例如指令是否是加、減、乘、除、加載、存儲…等等)。這與所指定的寄存器的向量或標(biāo)量性質(zhì)是無關(guān)的。這進(jìn)一步簡化了指令譯碼和乘法累加單元40的設(shè)置。第一寄存器指定值R1和第二寄存器指定值R2一起對操作碼所確定的操作的向量/標(biāo)量性質(zhì)編碼。該編碼方法所支持的三個(gè)常見的情況是,S=S*S(例如由C編譯程序從一個(gè)C代碼程序塊生成的基本隨機(jī)數(shù)學(xué))、V=VopS(例如為了縮放一個(gè)向量的元素)和V=VopV(例如諸如FIR濾波器和圖形變換的矩陣操作)(注意這里的“op”指示一個(gè)通用操作,語法的形式為目的地=第二操作數(shù)op第一操作數(shù))。也應(yīng)當(dāng)明白,有些指令(例如比較、與零或絕對值的比較)可以沒有目的地寄存器(例如輸出是條件標(biāo)志),或者輸入操作數(shù)較少(例如與零的比較只有一個(gè)輸入操作數(shù))。在這些情況下,有更多的操作碼位空間可用來規(guī)定諸如向量/標(biāo)量性質(zhì)的選擇,并且可以讓每個(gè)操作數(shù)可使用全部范圍的寄存器(例如,比較指令可以總是全標(biāo)量的,不管是什么寄存器)。
共同執(zhí)行指令譯碼器的功能的主要部分的寄存器控制與指令發(fā)布單元48和向量控制單元50,根據(jù)第一寄存器指定字段R1和第二寄存器指定字段R2,確定并控制所規(guī)定的數(shù)據(jù)處理操作的向量/標(biāo)量性質(zhì)。注意到如果向量控制寄存器46內(nèi)存儲的長度值指示的長度為1(相當(dāng)于存儲值零),則這可被用作純標(biāo)量操作的早期指示。
圖3的流程圖表示在單精度方式中用來根據(jù)寄存器指定值譯碼向量/標(biāo)量性質(zhì)的處理邏輯。在步驟56,檢測向量長度是否被全程地設(shè)置為1(長度值等于零)。如果向量長度是1,則在步驟58中把所有寄存器視作標(biāo)量寄存器。在步驟60,檢測目的地寄存器R1是否在范圍S0至S7內(nèi)。如果是這樣,則操作是全標(biāo)量的,形式為S=SopS,正如步驟62中所示。如果步驟60返回“否”,則確定目的地是個(gè)向量寄存器,正如步驟64中所示。如果目的地是向量寄存器,則編碼方法把第二操作數(shù)也作為一個(gè)向量寄存器。于是在這個(gè)階段剩下的兩種可能是V=VopS和V=VopV。這兩個(gè)可能選擇在步驟66進(jìn)行區(qū)分,該步驟確定第一操作數(shù)是否S0至S7的其中之一。如果是這樣,則操作是V=VopS;否則,操作就是V=VopV。這些狀態(tài)分別在步驟68和70中確認(rèn)。
應(yīng)當(dāng)注意,當(dāng)向量長度被設(shè)置為1時(shí),寄存器組的32個(gè)寄存器全部都可用來作為標(biāo)量寄存器,因?yàn)椴僮鞯臉?biāo)量性質(zhì)將在步驟58確認(rèn),而不依賴于步驟60的檢測-后者限制可被用作目的地的寄存器的范圍。在使用混合的向量和標(biāo)量指令時(shí),步驟60的檢測對于識別全標(biāo)量操作是有用的。也要注意,在混合的向量和標(biāo)量方式下操作時(shí),如果第一操作數(shù)是個(gè)標(biāo)量,則它可能是S0至S7的任何一個(gè);而如果第一操作數(shù)是個(gè)向量,則它可能是S8至S31的任何一個(gè)。在寄存器組內(nèi)為是向量的第一操作數(shù)提供三倍數(shù)量的寄存器,是對在使用向量操作時(shí)保存數(shù)據(jù)值的序列所需的通常更多數(shù)量的寄存器的一種適應(yīng)。
應(yīng)當(dāng)知道,人們希望進(jìn)行的一種常用操作是圖形變換。在一般的情況中,要進(jìn)行的變換可以用一個(gè)4*4矩陣表示。在這種計(jì)算中對操作數(shù)的重復(fù)使用,意味著希望將矩陣值存儲在可以按向量操作的寄存器中。同樣,通常把一個(gè)輸入像素值存儲在4個(gè)寄存器中,這些寄存器還是應(yīng)當(dāng)能按向量操作,以利重復(fù)使用。矩陣運(yùn)算的輸出一般是存儲在4個(gè)寄存器中的標(biāo)量(累加各個(gè)向量行乘積)。如果希望加倍輸送(double pump)輸入和輸出值,就要滿足有24個(gè)(16+4+4)個(gè)向量寄存器和8個(gè)(4+4)標(biāo)量寄存器的要求。
圖4是一個(gè)與圖3的流程圖相對應(yīng)的流程圖,但這里表示的是雙精度方式。如上所述,在雙精度方式中,寄存器組38內(nèi)的寄存器槽(slots)成對地工作,在邏輯寄存器D0至D15中存儲16個(gè)64位數(shù)據(jù)值。在這種情況下,對寄存器的向量/標(biāo)量性質(zhì)的編碼方法作了不同于圖3中的編碼方法的修改,步驟60和66的檢測現(xiàn)在分別變成步驟72和74中的“目的地是D0至D3其中之一嗎?”和“第一操作數(shù)是D0至D3其中之一嗎?”盡管上述的對寄存器指定字段內(nèi)寄存器的向量/標(biāo)量性質(zhì)的編碼能顯著節(jié)省指令位空間,它卻對諸如減法和除法的非交換性運(yùn)算產(chǎn)生一些困難。假定寄存器配置是V=VopS,非交換性運(yùn)算的第一與第二操作數(shù)之間缺乏對稱性的問題,無需額外的交換寄存器值的指令就能克服,方法是將指令集擴(kuò)展得包含諸如SUB、RSUB和DIV、RDIV的操作碼對,它們代表非交換性運(yùn)算的兩種不同的操作數(shù)的可能選擇。
圖5表示寄存器組38的子集內(nèi)的向量的環(huán)繞。特別地,在單精度方式中,將寄存器組劃分成地址為S0至S7、S8至S15、S16至S23和S24至S31的4個(gè)寄存器范圍。這些范圍相鄰但不相交。參看圖2,可以通過在向量控制單元50內(nèi)采用一個(gè)3位增量器(加法器)52,來為這些含有8個(gè)寄存器的子集提供環(huán)繞功能。這樣,當(dāng)跨越子集界線時(shí),增量器將繞回。通過在寄存器地址空間內(nèi)將各子集在8個(gè)字邊界上對齊,方便了這個(gè)簡單的實(shí)現(xiàn)。
返回到圖5,為了幫助理解寄存器的環(huán)繞,圖中表示了一些向量運(yùn)算。第一個(gè)向量運(yùn)算指定起始寄存器S2、向量長度4(由向量控制寄存器46內(nèi)的長度值3指示)和跨距1(由向量控制寄存器46內(nèi)的跨距值0指示)。相應(yīng)地,有了這些設(shè)置好的全程向量控制參數(shù),當(dāng)一條指令被執(zhí)行時(shí),指令被譯碼為將寄存器S2當(dāng)作向量,然后分別用寄存器S2、S3、S4和S5內(nèi)的數(shù)據(jù)值四次執(zhí)行該指令。因?yàn)檫@個(gè)向量不跨越子集邊界,所以沒有向量回繞。
在第二個(gè)例子中,起始寄存器是S14,長度是6,跨距是1。這將導(dǎo)致指令從寄存器S14開始被執(zhí)行6次。下一個(gè)使用的寄存器是S15。當(dāng)寄存器再次按跨距遞增時(shí),這時(shí)被使用的寄存器不是S16,它將回繞到寄存器S8。指令然后進(jìn)一步被執(zhí)行3次,完成整個(gè)的S14、S15、S8、S9、S10和S11的序列。
圖5的最后的例子顯示起始寄存器為S25,長度為8,跨距為2。第一個(gè)被使用的寄存器是S25,緊接著是按跨距值2決定的S27、S29和S31。使用寄存器S31之后,下一個(gè)寄存器值將回繞到該子集的開始,由于跨距是2,所以越過寄存器24,而用寄存器S25執(zhí)行運(yùn)算。增量器52可采用3位加法器的形式,當(dāng)在向量寄存器之間移動(dòng)時(shí),它將跨距加到當(dāng)前值上。相應(yīng)地,通過向加法器提供不同的跨距值,能調(diào)整跨距。
圖6表示在雙精度方式中寄存器組38的回繞。在這一方式中,寄存器子集包含D0至D3、D4至D7、D8至D11和D12至D15。在雙精度方式中對起增量器52的作用的加法器的最小值輸入是2-對應(yīng)于雙精度跨距1。雙精度跨距為2時(shí)將要求向加法器輸入4。圖6中表示的第一個(gè)例子中,起始寄存器為D0,長度為4,跨距為1。這將得出一個(gè)向量寄存器序列D0、D1、D2和D3。本例中沒有子集邊界被跨越,所以沒有回繞。在第二個(gè)例子中,起始寄存器為D15,長度為2,跨距為2。這將導(dǎo)致一個(gè)向量寄存器序列D15和D13。
參看圖2,注意加載存儲控制單元42在輸出端有一個(gè)5位增量器,加載/存儲多重操作不受限于對向量運(yùn)用應(yīng)用的寄存器回繞。這使單一的加載/存儲多指令能按其需要訪問許多連續(xù)的寄存器。
一個(gè)充分利用這個(gè)回繞方案的操作的例子是一個(gè)拆分成4個(gè)信號值和4個(gè)taps(分接頭)的單元的FIR濾波器。如果語法R8-R11opR16-R19代表R8opR16、R9opR17、R10opR18和R11opR19,則FIR濾波器操作可以以如下方式進(jìn)行將8個(gè)taps裝入R8-R15并將8個(gè)信號值裝入R16-R23R8-R11opR16-R19并將結(jié)果放入R24-R27R9-R12opR16-R19并將結(jié)果累加到R24-R27R10-R13opR16-R19并將結(jié)果累加到R24-R27R11-R14opR16-R19并將結(jié)果累加到R24-R27用新的taps再加載R8-R11R12-R15opR16-R19并將結(jié)果累加到R24-R27R13-R8opR16-R19并將結(jié)果累加到R24-R27(R15->R8回繞)R14-R9opR16-R19并將結(jié)果累加到R24-R27(R15->R8回繞)R15-R10opR16-R19并將結(jié)果累加到R24-R27(R15->R8回繞)用新的taps再加載R12至R15當(dāng)taps用盡時(shí),用新的數(shù)據(jù)再加載R16-R19R12-R15opR20-R23并將結(jié)果放入R28-R31R13-R8opR20-R23并將結(jié)果累加到R28-R31(R15->R8回繞)R14-R9opR20-R23并將結(jié)果累加到R28-R31(R15->R8回繞)R15-R10opR20-R23并將結(jié)果累加到R28-R31(R15->R8回繞)其余如上。
由以上所述應(yīng)當(dāng)注意到,加載是從多個(gè)累加(accumulates)到不同的寄存器,因此能并行地進(jìn)行(即達(dá)到雙緩沖)。
圖7A示意性地表示主處理器24是如何看待一條協(xié)處理器指令的。主處理器用指令內(nèi)字段76(它可能是拆分的)的一個(gè)位組合來將指令識別為協(xié)處理器指令。在標(biāo)準(zhǔn)ARM處理器指令集內(nèi),一條協(xié)處理器指令包括協(xié)處理器號字段78,主處理器附屬的(各)協(xié)處理器用它來標(biāo)識是否有特定的協(xié)處理器指令以它們?yōu)槟繕?biāo)。不同類型的協(xié)處理器-諸如DSP協(xié)處理器(例如由ARM生產(chǎn)的Piccolo協(xié)處理器)或者浮點(diǎn)單元協(xié)處理器,可以分配不同的協(xié)處理器號,這樣就能在一個(gè)系統(tǒng)中用同一協(xié)處理器總線36單獨(dú)地尋址。協(xié)處理器指令也包括一個(gè)由協(xié)處理器使用的操作碼和分別從協(xié)處理器寄存器中指定目的地、第一操作數(shù)和第二操作數(shù)的三個(gè)5位字段。在有些指令,諸如協(xié)處理器加載或存儲指令中,主處理器至少部分地譯碼協(xié)處理器指令,以便協(xié)處理器與主處理器能共同完成所希望的數(shù)據(jù)處理操作。主處理器也可以響應(yīng)在協(xié)處理器號內(nèi)編碼的數(shù)據(jù)類型,作為它在這種情況中進(jìn)行的指令譯碼的一部分。
圖7B表示支持雙精度和單精度兩種操作的協(xié)處理器是如何解釋其接收的協(xié)處理器指令的。這種協(xié)處理器被分派以兩個(gè)相鄰的協(xié)處理器號,用協(xié)處理器號的3個(gè)最高有效位來標(biāo)識它是不是目標(biāo)協(xié)處理器。這樣,協(xié)處理器的最低有效位對標(biāo)識目標(biāo)協(xié)處理器的目的來說是多余的,可用來規(guī)定要在執(zhí)行該協(xié)處理器指令時(shí)使用的數(shù)據(jù)類型。在本例中,數(shù)據(jù)類型相當(dāng)于是單精度還是雙精度的數(shù)據(jù)大小。
可以注意到,在雙精度方式中,有效地將寄存器的數(shù)目從32個(gè)縮減到16個(gè)。于是,就有可能減低寄存器字段的大小,但是那樣的話,關(guān)于要使用哪個(gè)寄存器的解碼,就不能直接從協(xié)處理器指令內(nèi)已知位置中的自含字段(self-contained fields)得到,而要根據(jù)對協(xié)處理器指令的其它部分的解碼而獲得。這是不利的,會使協(xié)處理器的操作復(fù)雜化,可能降低協(xié)處理器的操作的速度。用協(xié)處理器號的最低有效位來編碼數(shù)據(jù)類型,意味著操作碼可以完全獨(dú)立于數(shù)據(jù)類型,這也簡化并加快了操作碼的譯碼。
圖7C表示只支持是圖7B協(xié)處理器支持的數(shù)據(jù)類型的子集的單一數(shù)據(jù)類型的協(xié)處理器是如何解釋協(xié)處理器指令的。在這種情況中,將整個(gè)協(xié)處理器號用來確定是否接受指令。這樣,如果協(xié)處理器指令具有不受支持的數(shù)據(jù)類型,則它就對應(yīng)于一個(gè)不同的協(xié)處理器號,將不被接受。主處理器24然后就能開始進(jìn)行未定義指令的異常處理,仿真對不受支持的數(shù)據(jù)類型的處理。
圖8表示的數(shù)據(jù)處理系統(tǒng),包含起主處理器作用并通過協(xié)處理器總線82與支持單和雙精度兩種數(shù)據(jù)類型的協(xié)處理器84通信的ARM核心80。包含協(xié)處理器號在內(nèi)的協(xié)處理器指令,當(dāng)在指令流內(nèi)被遇到時(shí),被從ARM核心80在協(xié)處理器總線82上發(fā)出。協(xié)處理器84然后將該協(xié)處理器號與其自己的號作比較,如果匹配,就向ARM核心80發(fā)回一個(gè)接受信號。如果收不到接受信號,ARM核心80就識別出一個(gè)未定義的指令異常,然后求助在存儲系統(tǒng)86中存儲的異常處理程序碼。
圖9表示的是用僅支持單精度運(yùn)算的協(xié)處理器88代替協(xié)處理器84而改變的圖8的系統(tǒng)。在這種情況下,協(xié)處理器88僅識別一個(gè)協(xié)處理器號。于是,原始指令流內(nèi)應(yīng)當(dāng)由圖8的協(xié)處理器84執(zhí)行的雙精度指令,不被該單精度協(xié)處理器88接受。所以,如果希望執(zhí)行相同的程序碼,那么,存儲系統(tǒng)86內(nèi)的未定義異常處理程序碼可包含一個(gè)雙精度仿真例程。
應(yīng)當(dāng)注意到,盡管因需要仿真雙精度指令而將減慢這些指令的執(zhí)行速度,單精度協(xié)處理器88的可以比雙精度協(xié)處理器84更小更便宜,如果雙精度指令足夠少的話,能獲得純粹的收益。
圖10表示支持單和雙精度并有兩個(gè)相鄰協(xié)處理器號的協(xié)處理器84內(nèi)的指令鎖存電路。在這種情況下,要將協(xié)處理器指令內(nèi)協(xié)處理器號的3個(gè)最高有效位CP#[3∶1]與分配給該協(xié)處理器84的協(xié)處理器號作比較。本例中,如果協(xié)處理器號是10和11,則可以通過將協(xié)處理器號的最高有效位CP#[3∶1]對照二進(jìn)制數(shù)101而進(jìn)行這種比較。如果匹配,就向ARM內(nèi)核80返回一個(gè)接受信號,然后將協(xié)處理器指令鎖存起來供執(zhí)行。
圖11表示圖9的單精度協(xié)處理器88內(nèi)的等效電路。這種情況下,僅能識別一個(gè)協(xié)處理器號,缺省地采用單精度運(yùn)算。為確定是否接受并鎖存協(xié)處理器指令而作的比較,在整個(gè)4位協(xié)處理器號CP#[3∶0]與二進(jìn)制1010這個(gè)唯一內(nèi)置的協(xié)處理器號之間進(jìn)行。
圖12的流程圖表示如何能觸發(fā)圖9實(shí)施例的未定義異常處理例程來運(yùn)行雙精度仿真程序碼。這要通過檢測(步驟90)導(dǎo)致未定義指令異常的指令是否是一個(gè)有二進(jìn)制1011的協(xié)處理器號的協(xié)處理器指令來達(dá)到。如果是,則其打算作為一個(gè)雙精度指令,所以可在步驟92被仿真,然后返回到主程序流。其它異常類型如果沒有被步驟90捕獲,可以由另外的步驟檢測并處理。
圖13表示用格式寄存器FPREG200來標(biāo)識存儲在寄存器組220的每個(gè)32位寄存器或數(shù)據(jù)存儲槽中存儲的數(shù)據(jù)的類型的信息。如上所述,每個(gè)數(shù)據(jù)存儲槽可單個(gè)地作為用于存儲一個(gè)32位數(shù)據(jù)值(1個(gè)數(shù)據(jù)字)的單精度寄存器,或者可以與另一個(gè)數(shù)據(jù)存儲片配對,作為用于存儲一個(gè)64位數(shù)據(jù)值(2個(gè)數(shù)據(jù)字)的雙精度寄存器操作。按照本發(fā)明的較佳實(shí)施例,F(xiàn)PREG寄存器200被安排得能標(biāo)識任何特定數(shù)據(jù)存儲槽中存儲的是單精度還是雙精度數(shù)據(jù)。
如圖13中所示,寄存器組220中的32個(gè)數(shù)據(jù)存儲槽被安排得提供16對數(shù)據(jù)存儲槽。在較佳實(shí)施例中,如果某第一數(shù)據(jù)存儲槽中存儲一個(gè)單精度數(shù)據(jù)值,則該對中的另一個(gè)數(shù)據(jù)存儲槽將被安排得只存儲一個(gè)單精度數(shù)據(jù)值,并且不與任何其它數(shù)據(jù)存儲槽鏈接起來用于存儲雙精度數(shù)據(jù)值。這保證了任何一對特定數(shù)據(jù)存儲槽都被安排得或者存儲兩個(gè)單精度數(shù)據(jù)值或者存儲一個(gè)雙精度數(shù)據(jù)值。該信息可以由與寄存器組220中的每對數(shù)據(jù)存儲槽相關(guān)聯(lián)的一個(gè)信息位來標(biāo)識,因此在較佳實(shí)施例中,F(xiàn)PREG寄存器200被安排得存儲16個(gè)用于標(biāo)識在寄存器組220的每對數(shù)據(jù)存儲槽中存儲的數(shù)據(jù)的類型的信息位。應(yīng)當(dāng)知道,寄存器FPREG200因此可以以16位寄存器的形式實(shí)現(xiàn),或者,為了與FPU協(xié)處理器26內(nèi)其它寄存器的一致,可以體現(xiàn)為一個(gè)有16個(gè)備用信息位的32位寄存器。
圖15表示寄存器組220內(nèi)的6對數(shù)據(jù)存儲槽,按照較佳實(shí)施例,它們可被用來存儲6個(gè)雙精度數(shù)據(jù)值或12個(gè)單精度數(shù)據(jù)值。圖15中顯示了一例可以在這些數(shù)據(jù)存儲槽中存儲的數(shù)據(jù),DH代表雙精度數(shù)據(jù)值的32個(gè)最高有效位,DL表示雙精度數(shù)據(jù)值的32個(gè)最低有效位,S代表一個(gè)單精度數(shù)據(jù)值。
圖15中也表示了按照本發(fā)明較佳實(shí)施例的FPREG寄存器200內(nèi)的相應(yīng)條目,F(xiàn)PREG寄存器200中存儲的值“1”,指示所關(guān)聯(lián)的一對數(shù)據(jù)存儲槽中含有一個(gè)雙精度數(shù)據(jù)值,而值“0”則用來指示相應(yīng)的一對數(shù)據(jù)存儲槽中至少有一個(gè)含有一個(gè)單精度數(shù)據(jù)值,或者兩個(gè)數(shù)據(jù)存儲槽都是未初始化的。因此,如果兩個(gè)數(shù)據(jù)存儲槽都是未初始化的,如果數(shù)據(jù)存儲槽對中其中一個(gè)數(shù)據(jù)存儲槽是未初始化的,另一個(gè)含有一個(gè)單精度數(shù)據(jù)值,或者如果數(shù)據(jù)存儲槽對中兩個(gè)都含有一個(gè)單精度數(shù)據(jù)值,則在FPREG寄存器200的相應(yīng)位中將存儲邏輯“0”值。
如上所述,較佳實(shí)施例的FPU協(xié)處理器26可以被用來處理單精度或雙精度數(shù)據(jù)值,主處理器24發(fā)出的協(xié)處理器指令將標(biāo)識任何特定指令是單精度指令還是雙精度指令(見圖7B和相關(guān)的說明)。如果某指令被協(xié)處理器接受,它將被傳送到寄存器控制與指令發(fā)布單元48,供譯碼和執(zhí)行。如果該指令是加載指令,寄存器控制與指令發(fā)布邏輯48將指令加載存儲控制單元42從存儲器檢索所標(biāo)識的數(shù)據(jù)并將該數(shù)據(jù)存儲在寄存器組220的指定數(shù)據(jù)存儲槽中。在這個(gè)階段,協(xié)處理器將知道被檢索的是單精度還是雙精度數(shù)據(jù)值,加載存儲控制單元42將相應(yīng)地進(jìn)行操作。所以,加載存儲控制邏輯42將在路徑225上把32位單精度數(shù)據(jù)值或64位雙精度數(shù)據(jù)值傳送到寄存器組輸入邏輯230,供在寄存器組220中存儲。
除了數(shù)據(jù)被加載存儲控制單元42加載到寄存器組220外,數(shù)據(jù)也被提供到格式寄存器FPREG200,以便能添加必要的信息位,以標(biāo)識接收數(shù)據(jù)的每對數(shù)據(jù)存儲槽存儲的是單精度還是雙精度數(shù)據(jù)值。在較佳實(shí)施例中,該數(shù)據(jù)是在數(shù)據(jù)被加載到寄存器組中之前被存儲在格式寄存器FPREG200中的,以便寄存器組輸入邏輯230能用到該信息。
在較佳實(shí)施例中,寄存器組220中數(shù)據(jù)的內(nèi)部格式是與外部格式相同的,因此在寄存器組220中,單精度數(shù)據(jù)值是按32位數(shù)據(jù)值存儲的,雙精度數(shù)據(jù)值是按64位數(shù)據(jù)值存儲的。因?yàn)榧拇嫫鹘M輸入邏輯230能訪問FPREG格式寄存器200,所以它知道它接收的數(shù)據(jù)是單精度的還是雙精度的,因此在這種實(shí)施例中,寄存器組輸入邏輯230只是安排將在路徑225上接收的數(shù)據(jù)存儲在寄存器組220的適當(dāng)?shù)臄?shù)據(jù)存儲槽中。然而,如果在其它形式的實(shí)施例中,寄存器組內(nèi)的內(nèi)部表示不同于外部格式,則要將寄存器組輸入邏輯230安排得能執(zhí)行必要的轉(zhuǎn)換。例如,數(shù)字一般被表示為1.a(chǎn)bc…乘以某基數(shù)值的某次冪。由于效率的緣故,一般的單精度和雙精度表示法不用一個(gè)數(shù)據(jù)位來代表小數(shù)點(diǎn)左邊的1,該1被視為是隱含的。假設(shè)出于某個(gè)理由,寄存器組220內(nèi)使用的內(nèi)部表示要求要顯式地表示出該1,則寄存器組輸入邏輯230就要進(jìn)行對數(shù)據(jù)的必要轉(zhuǎn)換。在這種實(shí)施例中,數(shù)據(jù)存儲槽一般要大于32位,以便能容納由寄存器組輸入邏輯230生成的額外數(shù)據(jù)。
除了將數(shù)據(jù)值加載到寄存器組220中,加載存儲控制單元42也可以把數(shù)據(jù)加載到協(xié)處理器26的一個(gè)或多個(gè)系統(tǒng)寄存器中,例如用戶狀態(tài)與控制寄存器FPSCR210中。在較佳實(shí)施例中,F(xiàn)PSCR寄存器210含有用戶可訪問的配置位和異常狀態(tài)位,在較佳實(shí)施例說明的最后提供的對浮點(diǎn)單元的結(jié)構(gòu)說明中,將作更加詳細(xì)的討論。
如果寄存器控制與指令發(fā)布單元48接收到一個(gè)標(biāo)識寄存器組220的特定數(shù)據(jù)存儲槽中的內(nèi)容要被存儲到存儲器的存儲指令,則寄存器控制與指令發(fā)布邏輯48將受到相應(yīng)的指令,必要的數(shù)據(jù)字被從寄存器組220讀出,經(jīng)寄存器組輸出邏輯240到加載存儲控制單元42。寄存器組輸出邏輯240訪問FPREG寄存器200的內(nèi)容來確定所讀出的數(shù)據(jù)是單精度還是雙精度數(shù)據(jù)。它然后應(yīng)用適當(dāng)?shù)臄?shù)據(jù)轉(zhuǎn)換,以逆轉(zhuǎn)由寄存器組輸入邏輯施加的任何數(shù)據(jù)轉(zhuǎn)換,然后在路徑235上把數(shù)據(jù)供給加載存儲控制邏輯42。
按照本發(fā)明的較佳實(shí)施例,如果該存儲指令是個(gè)雙精度指令,則可以將協(xié)處理器26視為是在將指令施加到雙精度數(shù)據(jù)值的第二操作方式下操作的。因?yàn)殡p精度數(shù)據(jù)值含有偶數(shù)個(gè)數(shù)據(jù)字,所以在第二操作方式下發(fā)出的任何存儲指令一般要標(biāo)識偶數(shù)個(gè)其內(nèi)容要被存儲到存儲器的數(shù)據(jù)存儲槽。然而,按照本發(fā)明的較佳實(shí)施例,如果指定了奇數(shù)個(gè)數(shù)據(jù)存儲槽,則安排加載存儲控制單元42讀取FPREG寄存器200的內(nèi)容,并首先將這些內(nèi)容存儲到存儲器,再存儲所標(biāo)識的偶數(shù)個(gè)來自寄存器組220的數(shù)據(jù)存儲槽。一般來說,要被傳送的數(shù)據(jù)存儲槽是用一個(gè)基址后隨一個(gè)數(shù)目標(biāo)識的,該基址標(biāo)識寄存器組中某個(gè)數(shù)據(jù)存儲槽,該數(shù)目指示從所標(biāo)識的數(shù)據(jù)存儲槽算起的要存儲的數(shù)據(jù)存儲槽的數(shù)量(即數(shù)據(jù)字的數(shù)量)。
所以,例如如果存儲指令給出的基址是寄存器組220中的第一個(gè)數(shù)據(jù)存儲槽,并規(guī)定33個(gè)數(shù)據(jù)存儲槽,這將導(dǎo)致全部32個(gè)數(shù)據(jù)存儲槽的內(nèi)容被存儲到存儲器,但是由于所規(guī)定的數(shù)據(jù)存儲槽的數(shù)目是奇數(shù)的,所以也將導(dǎo)致FPREG寄存器200的內(nèi)容被存儲到存儲器。
通過這個(gè)方法,用一條指令就能把寄存器組的內(nèi)容和標(biāo)識在寄存器組220的各種數(shù)據(jù)存儲槽中存儲的數(shù)據(jù)類型的FPREG寄存器200的內(nèi)容這兩種內(nèi)容存儲到存儲器。這就免得必須發(fā)布另外的指令來顯式地存儲FPREG寄存器200的內(nèi)容,因此在向存儲器存儲或從存儲器加載的過程中不會不利地影響處理速度。
在本發(fā)明另外的實(shí)施例中,可以將這個(gè)技術(shù)更進(jìn)一步,以便如果需要的話,也能用單一指令使另外的系統(tǒng)寄存器,諸如FPSCR寄存器210,被存儲到存儲器。因此,考察有32個(gè)數(shù)據(jù)存儲片的寄存器組220的例子,那么如上所述,如果在存儲指令中標(biāo)識了33個(gè)數(shù)據(jù)存儲槽,則除了寄存器組220中的32個(gè)數(shù)據(jù)存儲槽的內(nèi)容外,F(xiàn)PREG寄存器200也將被存儲到存儲器。然而,如果標(biāo)識了一個(gè)超過寄存器組中數(shù)據(jù)存儲槽數(shù)的不同的奇數(shù),例如35,則這可被加載存儲控制單元42解釋為,要求除了FPREG寄存器200和寄存器組220中的數(shù)據(jù)存儲槽的內(nèi)容外,也要把FPSCR寄存器210的內(nèi)容存儲到存儲器。協(xié)處理器也可以包含其它的系統(tǒng)寄存器,例如標(biāo)識已經(jīng)在協(xié)處理器處理指令期間發(fā)生的異常的異常寄存器。如果在存儲指令中標(biāo)識了一個(gè)不同的奇數(shù),例如37,則這可被加載存儲控制單元42解釋為,要求除了FPSCR寄存器210、FPREG寄存器200和寄存器組220的內(nèi)容外,還要存儲一個(gè)或多個(gè)異常寄存器的內(nèi)容。
當(dāng)啟動(dòng)存儲或加載指令的程序碼不知道寄存器組內(nèi)容時(shí),以及寄存器組內(nèi)容只是臨時(shí)被存儲到存儲器,供隨后向寄存器組中檢索時(shí),這個(gè)技術(shù)特別有用。假設(shè)程序碼知道寄存器組內(nèi)容,則FPREG寄存器200的內(nèi)容并非也需要存儲到存儲器。可能不知道寄存器組內(nèi)容的程序碼的典型例子是上下文切換代碼(context switch code)和過程調(diào)用入口和出口例程。
在這種情況下,除了寄存器組的內(nèi)容外,還可以把FPREG寄存器200的內(nèi)容高效地存儲到存儲器中,如上所述,實(shí)際上,需要時(shí)也可以存儲某些其它的系統(tǒng)寄存器。
當(dāng)接收到隨后的加載指令時(shí),采用類似的過程。因此,加載存儲控制單元42在接收到指定奇數(shù)個(gè)數(shù)據(jù)存儲槽的雙精度加載指令時(shí),將會使FPREG寄存器200的內(nèi)容被加載到FPREG寄存器200中,接著是由在該加載指令中標(biāo)識的存儲槽的數(shù)量所指出的任何系統(tǒng)寄存器的內(nèi)容,接著使偶數(shù)個(gè)數(shù)據(jù)字被存儲到寄存器組220的指定數(shù)據(jù)存儲槽中。因此,考察前面討論的例子,如果在加載指令中指定的數(shù)據(jù)存儲槽的數(shù)目是33,則FPREG寄存器200的內(nèi)容將被加載到FPREG寄存器200中,接著是32個(gè)數(shù)據(jù)存儲槽的內(nèi)容。類似地,如果指定的數(shù)據(jù)存儲槽的數(shù)目是37,則除了上述內(nèi)容外,任何異常寄存器的內(nèi)容也將被加載到這些異常寄存器中。本領(lǐng)域的熟練人員顯然明白,與特定的奇數(shù)相關(guān)聯(lián)的特定操作完全是任意的,是可以隨意改變的。
圖14表示的是按照本發(fā)明較佳實(shí)施例的寄存器控制與指令發(fā)布單元48在執(zhí)行存儲和加載指令時(shí)的操作的流程圖。首先,在步驟300,從指令讀取數(shù)據(jù)字的數(shù)目(在較佳實(shí)施例中它等于數(shù)據(jù)存儲槽的數(shù)目),以及在該指令中標(biāo)識的第一寄存器號,即基址寄存器。然后在步驟310,確定該指令是不是雙精度指令,如上所述,在這個(gè)階段協(xié)處理器是能得到這個(gè)信息的,因?yàn)樵撝噶顦?biāo)識它是雙精度還是單精度指令。
如果該指令是雙精度指令,則進(jìn)程前進(jìn)到步驟320,在這里確定指令中指定的字?jǐn)?shù)是不是奇數(shù)。假設(shè)因本實(shí)施例的緣故,不采用除FPREG寄存器200外還選擇性地傳送各種系統(tǒng)寄存器的技術(shù),那么,如果字?jǐn)?shù)是奇數(shù),這將表明FPREG寄存器200的內(nèi)容應(yīng)當(dāng)被傳送,于是在步驟325,F(xiàn)PREG寄存器200的內(nèi)容被加載存儲控制單元42傳送。然后在步驟327將字?jǐn)?shù)遞減1,進(jìn)程前進(jìn)到步驟330。如果在步驟320確定字?jǐn)?shù)是偶數(shù),則進(jìn)程直接前進(jìn)到步驟330。
在步驟330,確定字?jǐn)?shù)是否大于零。如果不是,該指令被視為完成,進(jìn)程在步驟360退出。然而,如果字?jǐn)?shù)大于零,則進(jìn)程前進(jìn)到步驟332,在此將一個(gè)雙精度數(shù)據(jù)值(即兩個(gè)數(shù)據(jù)存儲槽的內(nèi)容)傳送到或傳送出所指定的第一寄存器號。然后在步驟334,將字?jǐn)?shù)遞減2,在步驟336,將寄存器號遞增1。如上所述,對于雙精度指令來說,一個(gè)寄存器實(shí)際上由兩個(gè)數(shù)據(jù)存儲槽組成,因此將寄存器計(jì)數(shù)值遞增1相當(dāng)于將數(shù)據(jù)存儲槽號遞增2。
過程然后返回到步驟330,在此確定字?jǐn)?shù)是否仍然大于零;如果是,則重復(fù)該進(jìn)程。當(dāng)字?jǐn)?shù)達(dá)到零時(shí),進(jìn)程在步驟340退出。
如果在步驟310確定該指令不是雙精度指令,則進(jìn)程前進(jìn)到步驟350,在此再次確定字?jǐn)?shù)是否大于零。如果是,則進(jìn)程前進(jìn)到步驟352,在此將一個(gè)單精度數(shù)據(jù)值傳送到或傳送出在該指令中標(biāo)識的第一寄存器號。然后在步驟354,將字?jǐn)?shù)遞減1,在步驟356,將寄存器號遞增1,指向下一個(gè)數(shù)據(jù)存儲槽。進(jìn)程然后返回到步驟350,在此確定字?jǐn)?shù)是否仍然大于零;如果是,則該進(jìn)程一直重復(fù),直到字?jǐn)?shù)等于零的時(shí)候,此時(shí),進(jìn)程在步驟360退出。
以上方法在執(zhí)行不知道寄存器組內(nèi)容的程序碼一例如上下文切換代碼或過程調(diào)用和退出例程時(shí),具有很大的靈活性。在這些情形中,操作系統(tǒng)是不知道寄存器的內(nèi)容,同時(shí)希望不要必須根據(jù)寄存器的內(nèi)容來區(qū)別對待寄存器。上述方法允許在編寫這些程序碼例程時(shí)用一條存儲或加載指令指定奇數(shù)個(gè)數(shù)據(jù)字。如果協(xié)處理器要求使用寄存器內(nèi)容信息,它將把指令中的奇數(shù)個(gè)數(shù)據(jù)字,解釋為也要求向存儲器存儲或從存儲器加載為標(biāo)識寄存器組中數(shù)據(jù)的內(nèi)容而需要的格式信息。這種靈活性避免了需要用特殊的操作系統(tǒng)軟件才能支持要求寄存器內(nèi)容信息的協(xié)處理器。
這個(gè)技術(shù)也避免了需要在程序碼內(nèi)的獨(dú)立操作中加載和存儲寄存器內(nèi)容信息。因?yàn)樵谥噶钪邪藢虞d和存儲寄存器內(nèi)容信息的選擇,所以不需要另外訪問存儲器。這就縮短了程序碼的長度并有可能節(jié)省時(shí)間。
下面給出一個(gè)綜合了上述技術(shù)的浮點(diǎn)單元的結(jié)構(gòu)說明。
1.介紹VFPv1是一個(gè)為實(shí)現(xiàn)作為用于ARM處理器模決的協(xié)處理器而設(shè)計(jì)的浮點(diǎn)系統(tǒng)(FPS)結(jié)構(gòu)。這個(gè)結(jié)構(gòu)的實(shí)現(xiàn)可以包含硬件或軟件中的特征,某個(gè)實(shí)現(xiàn)也可以用軟件來補(bǔ)充功能或提供IEEE754兼容性。本規(guī)范旨在用硬件和軟件支持的組合來獲得全部的IEEE754兼容性。
VFPv1使用兩個(gè)協(xié)處理器號10被用于帶單精度操作數(shù)的操作,而11則被用于帶雙精度操作數(shù)的操作。單精度與雙精度數(shù)據(jù)之間的轉(zhuǎn)換是用2條在源操作數(shù)協(xié)處理器空間中操作的轉(zhuǎn)換指令完成的。
VFPv1結(jié)構(gòu)的特點(diǎn)包括
·在帶支持代碼的硬件上與IEEE754完全兼容·32個(gè)單精度寄存器,每個(gè)都是作為源操作數(shù)或目的地寄存器可尋址的。
·16個(gè)雙精度寄存器,每個(gè)都是作為源操作數(shù)或目的地寄存器可尋址的。(雙精度寄存器與物理的單精度寄存器重疊)·向量方式能顯著增加浮點(diǎn)代碼密度和與加載和存儲操作的并發(fā)性。
·4組的8個(gè)循環(huán)單精度寄存器或4組的4個(gè)循環(huán)雙精度寄存器可增強(qiáng)dsp和圖形操作。
·非正規(guī)處理選項(xiàng)選擇IEEE754兼容性(有來自浮點(diǎn)仿真程序包的預(yù)定支持)或快速清零功能。
·旨在實(shí)現(xiàn)用于具有IEEE754可兼容的結(jié)果的完全流水線鏈接的乘法累加。
·具有FFTOSIZ指令的C、C++和Java的快速浮點(diǎn)向整數(shù)轉(zhuǎn)換。
實(shí)現(xiàn)者可以選擇完全用硬件來實(shí)現(xiàn)VFPv1或者使用硬件和支持程序碼的組合。VFPv1可以完全以軟件實(shí)現(xiàn)。
2.術(shù)語本規(guī)范使用下列術(shù)語自動(dòng)異常-一種異常條件,它總是彈回到支持程序碼,不管各異常啟動(dòng)位的值是什么。對哪些異常(如果有的話)是自動(dòng)的的選擇,是一種實(shí)現(xiàn)上的選擇。參看節(jié)0,6.異常處理彈回-一個(gè)被報(bào)告給操作系統(tǒng)的異常,它將完全由支持程序碼處理,而不調(diào)用用戶陷阱處理程序或者中斷正常的用戶程序碼流。
CDP-“協(xié)處理器數(shù)據(jù)處理”,對于FPS來說,CDP運(yùn)算是算術(shù)運(yùn)算而不是加載或存儲操作。
ConvertToUnsignedInteger(Fm)(轉(zhuǎn)換到無符號整數(shù))-Fm中的內(nèi)容向32位無符號整數(shù)值的轉(zhuǎn)換。結(jié)果取決于最終舍入的舍入方式和對超出32位無符號整數(shù)的范圍的浮點(diǎn)值的處理。如果浮點(diǎn)輸入值是負(fù)的或者對32位無符號整數(shù)來說太大,則可能發(fā)生INVALID異常。
ConvertToSignedInteger(Fm)(轉(zhuǎn)換到有符號整數(shù))-Fm中的內(nèi)容向32位有符號整數(shù)值的轉(zhuǎn)換。結(jié)果取決于最終舍入的舍入方式和對超出32位無符號整數(shù)的范圍的浮點(diǎn)值的處理。如果浮點(diǎn)輸入值對32位有符號整數(shù)來說太大,則可能發(fā)生INVALID異常。
ConvertUnsignedIntToSingle/Double(Rd)(轉(zhuǎn)換無符號整數(shù)到單/雙精度)-將被解釋為是個(gè)32位無符號整數(shù)的ARM寄存器(Rd)的內(nèi)容向單或雙精度浮點(diǎn)值的轉(zhuǎn)換。如果目的地精度是單一的,則在轉(zhuǎn)換操作中可能發(fā)生INEXACT異常。
ConvertSignedIntToSingle/Double(Rd)(轉(zhuǎn)換有符號整數(shù)到單/雙精度)-將被解釋為是個(gè)32位有符號整數(shù)的ARM寄存器(Rd)的內(nèi)容向單或雙精度浮點(diǎn)值的轉(zhuǎn)換。如果目的地精度是單一的,則在轉(zhuǎn)換操作中可能發(fā)生INEXACT異常。
非正規(guī)化值-范圍(-2Emin<x<2Emin)中的值的表示。在IEEE754的單和雙精度操作數(shù)的格式中,非正規(guī)化值或日非正規(guī)值有一個(gè)零指數(shù),并且前導(dǎo)的有效位是而不是1。IEEE754-1985規(guī)范要求用與標(biāo)準(zhǔn)操作數(shù)相同的精度來生成和操作非正規(guī)化操作數(shù)。
禁止的異常-在FPCSR中的相關(guān)異常允許(Exception Enable)位被設(shè)置為0的異常,稱為是“禁止的”。IEEE754規(guī)范為這些異常定義了要被返回的正確結(jié)果。生成一個(gè)異常條件的操作可以彈回到支持程序碼去生成IEEE754定義的結(jié)果。該例外將不被報(bào)告給用戶異常處理程序。
允許的例外-相應(yīng)的例外允許位被設(shè)置為1的例外。如果發(fā)生這個(gè)例外,就將進(jìn)行到用戶處理程序的陷阱。生成一個(gè)例外條件的操作可以彈回到支持程序碼去生成IEEE754定義的結(jié)果。該例外然后將被報(bào)告給用戶例外處理程序。
指數(shù)-浮點(diǎn)數(shù)的一個(gè)成分,一般在確定所代表的數(shù)的值時(shí)指示2的整數(shù)冪。指數(shù)有時(shí)稱為帶符號或無偏指數(shù)。
尾數(shù)-位于其隱含的二進(jìn)制小數(shù)點(diǎn)右邊的有效數(shù)位(significand)字段。
清零方式-在這個(gè)方式下,舍入后在范圍(-2Emin<x<2Emin)內(nèi)的所有值都按零處理,而不是轉(zhuǎn)換成非正規(guī)化值。
高(Fn/Fm)-按存儲器中表示的雙精度值的高32位[63∶32]。
IEEE754-1985-“IEEE二進(jìn)制浮點(diǎn)算術(shù)標(biāo)準(zhǔn)”(ANSI/IEEE標(biāo)準(zhǔn)754-1985,電力電子工程師協(xié)會,美國紐約州紐約市,郵政編碼10017)。該標(biāo)準(zhǔn)經(jīng)常被稱為IEEE754標(biāo)準(zhǔn),它為浮點(diǎn)系統(tǒng)定義數(shù)據(jù)類型、正確運(yùn)算、例外類型與處理、以及錯(cuò)誤界限。多數(shù)處理器在硬件上或者在硬件與軟件的組合上依照該標(biāo)準(zhǔn)制造。
無窮大-一個(gè)用來代表∞的IEEE754特殊格式。指數(shù)將是該精度的最大值,有效數(shù)位將全部為零。
輸入例外-給定操作的一個(gè)或多個(gè)操作數(shù)不受硬件支持的例外條件。該操作將彈回到支持程序碼,以完成該操作。
中間結(jié)果-用來在舍入之前存儲計(jì)算的結(jié)果的內(nèi)部格式。這個(gè)格式可以有比目的地格式更大的指數(shù)字段和有效數(shù)位字段。
低(Fn/Fm)-按存儲器中表示的雙精度值的低32位[31∶0]。
MCR-“從ARM寄存器移到協(xié)處理器”,對于FPS來說,這包括在ARM寄存器與FPS寄存器之間傳送數(shù)據(jù)或控制寄存器的指令。用一條MCR類的指令只能傳送32個(gè)信息位。
MRC-“從協(xié)處理器移到ARM寄存器”,對于FPS來說,這包括在FPS寄存器與ARM寄存器之間傳送數(shù)據(jù)或控制寄存器的指令。用一條MRC類的指令只能傳送32個(gè)信息位。
NaN-“不是數(shù)字”,這是一個(gè)以浮點(diǎn)格式編碼的符號實(shí)體。有兩種NaN,一種是發(fā)信號的,一種是不發(fā)信號的,或日安靜的。發(fā)信號的NaN如果被用作操作數(shù),將導(dǎo)致一個(gè)無效操作數(shù)(Invalid Operand)異常。安靜的NaN散布在幾乎每個(gè)算術(shù)運(yùn)算中而不發(fā)異常信號。NaN的格式有一個(gè)全部為1的指數(shù)字段,有效數(shù)位非零。要表示一個(gè)發(fā)信號的NaN,尾數(shù)的最高有效位為零;而安靜的NaN將把該位設(shè)置為1。
保留的-控制寄存器或指令格式中的一個(gè)字段是“保留的”,如果該字段要由具體實(shí)現(xiàn)來定義,或者如果該字段的內(nèi)容為非零時(shí)會產(chǎn)生不可預(yù)測的結(jié)果。這些字段被保留用于將來對結(jié)構(gòu)的擴(kuò)展或者是特定于具體實(shí)現(xiàn)的。具體實(shí)現(xiàn)不使用的所有保留的位,都必須被寫成零并讀成零。
舍入方式-IEEE754規(guī)范要求所有計(jì)算都要像是對無限精度那樣進(jìn)行,就是說,兩個(gè)單精度值的積必須精確地計(jì)算到兩倍于有效數(shù)位的位數(shù)的有效數(shù)位。要在目的地中表示這個(gè)值,經(jīng)常要求對有效數(shù)位進(jìn)行精度舍入。IEEE547標(biāo)準(zhǔn)規(guī)定四種舍入方式-舍入到最近的(RN)、舍入到零或日斬?cái)?RZ)、舍入到正無窮大(RP)和舍入到負(fù)無窮大(RM)。第一種方式的完成方法是,在中間點(diǎn)進(jìn)行舍入,相持情況向上舍入,如果它使有效數(shù)位的最低位為零,則使之成為“偶的”。第二種方法有效地去除有效數(shù)位右邊的任何位,總是舍去,由C、C++和Java語言在整數(shù)轉(zhuǎn)換中使用。后兩種方式用于區(qū)間運(yùn)算。
有效數(shù)位(Significand)-二進(jìn)制浮點(diǎn)數(shù)的分量,由隱含的二進(jìn)制小數(shù)點(diǎn)左邊的顯式或隱式前導(dǎo)位和右邊的尾數(shù)字段組成。
支持程序碼(Support Code)-為提供與IEEE754標(biāo)準(zhǔn)的兼容而補(bǔ)充硬件所必須使用的軟件。支持程序碼設(shè)計(jì)有兩個(gè)組件一個(gè)例程庫,它執(zhí)行超出硬件的范圍的操作-諸如超越計(jì)算,以及被支持的功能-諸如用不受支持的輸入或可能產(chǎn)生異常的輸入進(jìn)行除法;一個(gè)異常處理程序的集合,它為符合IEEE754而處理異常條件。要求支持程序碼執(zhí)行補(bǔ)充的功能,以便仿真對不受支持的數(shù)據(jù)類型或數(shù)據(jù)表示(例如非正規(guī)值或十進(jìn)制數(shù)據(jù)類型)的適當(dāng)處理??梢跃帉懤虂砝弥虚g計(jì)算中的FPS-如果注意在例程的出口恢復(fù)用戶的狀態(tài)。
陷阱(Trap)-一個(gè)在FPSCR中設(shè)置了相應(yīng)的異常允許位的例外條件。用戶的陷阱處理程序?qū)⒈粓?zhí)行。
未定義的-指出一條生成未定義的指令陷阱的指令。關(guān)于ARM異常的更詳細(xì)信息,可參看ARM結(jié)構(gòu)參考手冊(ARM ArchitecturalReference Manual)。
不可預(yù)測的-不可靠的指令或控制寄存器字段值的結(jié)果。不可預(yù)測的指令或結(jié)果不得表示安全漏洞,或者停止或暫停處理器或系統(tǒng)的任何部分。
不受支持的數(shù)據(jù)-不被硬件處理、但彈回到支持程序碼去完成的特定數(shù)據(jù)值。這些數(shù)據(jù)可包括無窮大、NaN、非正規(guī)值和零。具體實(shí)現(xiàn)可自由地選擇這些值中的哪些將全部或部分地得到硬件上的支持,或者將要求支持程序碼的輔助才能完成該操作。因處理不受支持的數(shù)據(jù)而產(chǎn)生的任何異常,都將被俘獲到用戶程序碼-如果該異常的相應(yīng)的異常允許位是置位的。
3.寄存器文件3.1導(dǎo)言該體系結(jié)構(gòu)提供32個(gè)單精度和16個(gè)雙精度寄存器,它們都是作為源或目的地操作數(shù)在整個(gè)定義的5位寄存器變址范圍內(nèi)可單個(gè)尋址的。
這32個(gè)單精度寄存器與這16個(gè)雙精度寄存器是重疊的,就是說,向D5寫入的一個(gè)雙精度數(shù)據(jù),將覆蓋S10和S11的內(nèi)容。編譯程序或匯編語言程序員的工作就是要知道在重疊的實(shí)現(xiàn)中,寄存器使用在用寄存器來存儲一個(gè)單精度數(shù)據(jù)與存儲半個(gè)雙精度數(shù)據(jù)之間的沖突。不提供硬件來保證寄存器的使用限于一種精度,如果違反了這一點(diǎn),則結(jié)果就是不可預(yù)測的。
VFPv1提供在標(biāo)量方式下或向量方式下對這些寄存器的訪問。在標(biāo)量方式下,用1個(gè)、2個(gè)或3個(gè)操作數(shù)寄存器來生成一個(gè)被寫入目的地寄存器的結(jié)果;在向量方式下,所指定的操作數(shù)指的是一組寄存器。VFPv1支持在一條單精度操作數(shù)的指令中有多達(dá)8個(gè)元素的向量操作和一條雙精度操作數(shù)的指令中有多達(dá)4個(gè)元素的向量操作。
表1LEN(長度)位編碼
向量方式是通過向LEN字段寫入非零值而被啟動(dòng)的。如果LEN字段含有0,F(xiàn)PS在標(biāo)量方式下操作,寄存器字段被解釋為對普通寄存器模型中的32個(gè)獨(dú)立單精度寄存器或16個(gè)雙精度寄存器尋址。如果LEN字段是非零的,F(xiàn)PS在向量方式下操作,寄存器字段被解釋為對寄存器的向量尋址。參看表1中LEN字段的編碼。
通過對目的地寄存器的說明,能得到一種不改變LEN字段而混合標(biāo)量和向量操作的方法。在向量方式下如果目的地寄存器是在第一寄存器組(S0-S7或D0-D3)中,可以指定標(biāo)量操作。更多的信息見節(jié)0。
3.2單精度寄存器的用法如果FPSCR中的LEN字段是0,就有編號為S0至S31的32個(gè)單精度寄存器可用。任何一個(gè)寄存器都可以被用作源或目的地寄存器。
3131 31 31 0
圖表1.單精度寄存器圖可以按圖表1中所示的那樣畫出單精度(協(xié)處理器10)的寄存器圖。
如果FPSCR中的LEN字段大于0,則該寄存器文件可以作為4個(gè)寄存器組,每組有8個(gè)循環(huán)寄存器,如圖表2所示。第一組向量寄存器V0至V7與標(biāo)量寄存器S0至S7重疊,根據(jù)為每個(gè)操作數(shù)選擇的寄存器,按標(biāo)量或向量來尋址。詳情可參看節(jié)0,3.4寄存器的用法。
圖表2.循環(huán)單精度寄存器例如,如果FPSCR中的LEN字段被設(shè)置為3,引用向量V10將導(dǎo)致在向量操作中包含S10、S11、S12和S13。類似地,V22會在操作中涉及S22、S23、S16和S17。當(dāng)在向量方式下訪問寄存器文件時(shí)按順序排在V7之后的是V0;類似地,V8在V15之后,V16在V23之后,V24在V31之后。
3.3雙精度寄存器的用法如果FPSCR中的LEN字段是0,則有16個(gè)雙精度寄存器可用。630630
圖表3.雙精度寄存器圖任何一個(gè)寄存器都可被用作源或目的地寄存器。可以按圖表3中所示的那樣畫出寄存器圖。
如果FPSCR中的LEN字段大于0,則有每組4個(gè)循環(huán)寄存器的4組中的4個(gè)標(biāo)量寄存器和16個(gè)向量寄存器可用,如圖表4所示。第一組向量寄存器V0至V3與標(biāo)量寄存器S0至S3重疊。各寄存器是根據(jù)為每個(gè)操作數(shù)選擇的寄存器,按標(biāo)量或向量來尋址的。詳情可參看節(jié)0,3.4寄存器的用法。 圖表4.循環(huán)雙精度寄存器如節(jié)0中單精度例子中的一樣,該4組內(nèi)的雙精度寄存器是循環(huán)的。
3.4寄存器的用法支持標(biāo)量和向量之間的3種操作(OP2可以是浮點(diǎn)協(xié)處理器所支持的任何二操作數(shù)操作;OP3可以是任何三操作數(shù)操作。)在以下說明中,將寄存器文件的“第一組”定義為單精度操作的寄存器S0-S7和雙精度操作的D0-D3。
·標(biāo)量D=OP2標(biāo)量A或標(biāo)量D=標(biāo)量A OP3標(biāo)量B或標(biāo)量D=標(biāo)量A*標(biāo)量B+標(biāo)量D·向量D=OP2標(biāo)量A或向量D=標(biāo)量A OP3向量B或向量D=標(biāo)量A*向量B+向量D·向量D=OP2向量A或向量D=向量A OP3向量B或向量D=向量A*向量B+向量D3.4.1標(biāo)量操作兩種條件將導(dǎo)致FPS在標(biāo)量方式下操作。1?FPSCR中的LEN字段是0。目的地和源寄存器,對于單精度操作來說可以是標(biāo)量寄存器0至31中的任何一個(gè),對于雙精度操作來說可以是寄存器0至15中的任何一個(gè)。僅對在指令中明確指定的寄存器進(jìn)行操作。2?目的地寄存器在寄存器文件的第一組中。源標(biāo)量可以是任何其它寄存器。這個(gè)方式允許混合標(biāo)量和向量操作而不必改變FPSCR中的LEN字段。
3.4.2涉及標(biāo)量和向量源并以向量為目的地的操作要在這個(gè)方式下操作,F(xiàn)PSCR中的LEN字段要大于零,并且目的地寄存器不在寄存器文件的第一組中。標(biāo)量源寄存器可以是寄存器文件的第一組中的任何寄存器,其余的任何寄存器可用作向量B。注意,如果源向量寄存器是向量B的成員,或者向量D與向量B重疊的元素?cái)?shù)小于LEN,則操作結(jié)果是不可預(yù)測的;就是說,向量D和向量B必須或者是相同的向量或者所有的成員都完全不同。參看節(jié)0中的總結(jié)表。
3.4.3僅涉及向量數(shù)據(jù)的操作要在這個(gè)方式下操作,F(xiàn)PSCR中的LEN字段要大于零,并且目的地向量寄存器不在寄存器文件的第一組中。向量A向量的各個(gè)元素與向量B中的相應(yīng)元素組合后被寫入向量D。寄存器文件的第一組以外的寄存器都可用于向量A,而所有向量都可用于向量B。如第二種情形中一樣,如果源向量與目的地向量重疊的元素?cái)?shù)小于LEN,則操作結(jié)果是不可預(yù)測的。它們必須或者是相同的或者所有的成員都完全不同。參看節(jié)0中的總結(jié)表。
注意,對于FMAC系列的操作來說,目的地寄存器或向量總是累加寄存器或向量。
3.4.4.操作總結(jié)表以下各表表示單和雙精度2個(gè)和3個(gè)操作數(shù)指令的寄存器使用選擇?!叭魏巍敝傅氖菍χ付ǖ牟僮鲾?shù)來說可使用該精度的所有寄存器。
表2.單精度3操作數(shù)寄存器的用法
表3.單精度2操作數(shù)寄存器的用法。
表4.雙精度3操作數(shù)寄存器的用法
表5.雙精度2操作數(shù)寄存器的用法。
4.指令集FPS指令可劃分成三個(gè)類別·MCR和MRC-ARM與FPS之間的傳送操作·LDC和STC-FPS與存儲器之間的加載和存儲操作·CDP-數(shù)據(jù)處理操作4.1指令并發(fā)性FPS結(jié)構(gòu)規(guī)范的目的是在兩個(gè)層次上的并發(fā)性流水線式功能單元和與CDP功能并行的加載/存儲操作。通過支持與當(dāng)前處理操作沒有寄存器相關(guān)關(guān)系的加載和存儲操作與這些操作并行執(zhí)行,能獲得顯著的性能增益。
4.2指令串行化FPS指定一條指令使FPS忙-等待ARM,一直到所有當(dāng)前執(zhí)行的指令都完成并且每個(gè)的異常狀態(tài)都已知。如果有異常等待處理,在ARM中,串行化指令將被中止,異常處理將開始。FPS中的串行化指令是·FMOVX-讀或?qū)懸粋€(gè)浮點(diǎn)系統(tǒng)寄存器對浮點(diǎn)系統(tǒng)寄存器的任何讀或?qū)憣⒈煌V?,直到?dāng)前指令完成。對系統(tǒng)ID寄存器(FPSID)的FMOCX將觸發(fā)一個(gè)由在先的浮點(diǎn)指令引起的異常。(用FMOVX)對用戶狀態(tài)與控制寄存器(FPSCR)進(jìn)行讀/修改/寫,可用來清除異常狀態(tài)位(FPSCR[4∶0])。
4.3涉及整數(shù)數(shù)據(jù)的轉(zhuǎn)換在FPS中,浮點(diǎn)與整數(shù)數(shù)據(jù)之間的轉(zhuǎn)換是一個(gè)兩個(gè)步驟的過程,由一條涉及整數(shù)數(shù)據(jù)的數(shù)據(jù)傳送指令和一條進(jìn)行轉(zhuǎn)換的CDP指令組成。如果試圖對FPS寄存器中整數(shù)格式的整數(shù)數(shù)據(jù)進(jìn)行算術(shù)運(yùn)算,結(jié)果將是不可預(yù)測的,應(yīng)當(dāng)避免任何這種操作。
4.3.1FPS寄存器中整數(shù)數(shù)據(jù)向浮點(diǎn)數(shù)據(jù)的轉(zhuǎn)換整數(shù)數(shù)據(jù)可以用MCR FMOVS指令從任何ARM寄存器加載到浮點(diǎn)單精度寄存器中。然后可以用整-到-浮系列的運(yùn)算將FPS寄存器中的整數(shù)數(shù)據(jù)轉(zhuǎn)換成一個(gè)單精度或雙精度數(shù)據(jù)值,并寫入一個(gè)目的地FPS寄存器。如果不再需要該整數(shù)值,則目的地寄存器可以就是源寄存器。該整數(shù)可以是一個(gè)帶符合的或無符合的32位量。
4.3.2FPS寄存器中的浮點(diǎn)數(shù)據(jù)向整數(shù)數(shù)據(jù)的轉(zhuǎn)換FPS單精度或雙精度寄存器中的值,可以用浮-到-整系列的指令轉(zhuǎn)換成帶符合的或無符合的32位整數(shù)格式。生成的整數(shù)被放置在目的地單精度寄存器中??梢杂肕RC FMOVS指令將整數(shù)數(shù)據(jù)存儲到ARM寄存器。
4.4寄存器文件尋址在單精度空間(S=0)中操作的指令將指令字段中可用的5位來存取操作數(shù)。高4位包含在標(biāo)記為Fn、Fm或Fd的操作數(shù)字段中;地址的最低有效位分別在N、M或D中。
在雙精度空間(S=1)中操作的指令將只使用操作數(shù)地址的高4位。這4位包含在Fn、Fm和Fd字段中。N、M和D位在對應(yīng)操作數(shù)字段含有操作數(shù)地址時(shí)必定含有0。
4.5MCR(從ARM寄存器轉(zhuǎn)移到協(xié)處理器)MCR操作涉及FPS對ARM寄存器中的數(shù)據(jù)的傳送或使用。這包括將單精度格式的數(shù)據(jù)從一個(gè)ARM寄存器或?qū)㈦p精度格式的數(shù)據(jù)從一對ARM寄存器轉(zhuǎn)移到一個(gè)FPS寄存器,將一個(gè)帶符號或無符號整數(shù)值從ARM寄存器加載到單精度FPS寄存器,用ARM寄存器的內(nèi)容加載一個(gè)控制寄存器。
MCR指令的格式在圖表5中給出。31 28 27 24 23 21 20 19 16 15 12 11 87 6 5 43 0
圖表5MCR指令格式表6.MCR位字段定義
表7MCR操作碼字段定義
注解FMOV[S,HD,LD]指令只支持32位數(shù)據(jù)操作。FMOVS操作只移動(dòng)ARM寄存器或單精度寄存器中的數(shù)據(jù)。為了從2個(gè)ARM寄存器傳送一個(gè)雙精度操作數(shù),F(xiàn)MOVLD和FMOVHD將分別轉(zhuǎn)移低半部分和高半部分。
4.6MRC(從協(xié)處理器/比較浮點(diǎn)寄存器轉(zhuǎn)移到ARM寄存器)MRC操作涉及將FPS寄存器中的數(shù)據(jù)傳送到ARM寄存器。這包括將一個(gè)單精度值或?qū)⒏↑c(diǎn)值向整數(shù)轉(zhuǎn)換的結(jié)果轉(zhuǎn)移到一個(gè)ARM寄存器或者從一個(gè)雙精度FPS寄存器轉(zhuǎn)移到兩個(gè)ARM寄存器,然后用前一次浮點(diǎn)比較操作的結(jié)果修改CPSR的狀態(tài)位。
MRC指令的格式在圖表6中給出。31 28 27 24 23 21 20 19 16 15 12 11 87 6 5 43 0
圖表6MRC指令格式表8.MRC位字段定義
*對于FMOVX FPSCR指令,如果Rd字段含有R15(1111),則CPSR的高4位將被用生成的條件碼更新。
表9.MRC操作碼字段定義
注解參看對MCR FMOV指令的注解。
4.7LDC/STC(加載/存儲FPS寄存器)LDC和STC操作在FPS與存儲器之間傳送數(shù)據(jù)。浮點(diǎn)數(shù)據(jù)可以以任一種精度在一次數(shù)據(jù)傳送中或在多次數(shù)據(jù)傳送中傳送,ARM地址寄存器同時(shí)被更新或保持不變。支持滿的下降堆棧和空的上升堆棧兩種結(jié)構(gòu),以及在轉(zhuǎn)移多操作中對數(shù)據(jù)結(jié)構(gòu)的多操作數(shù)存取。參看表11對LDC和STC的各種選擇的說明。
LDC和STC指令的格式在圖表7中給出。31 28 27 25 2423 22 21 2019 1615 1211 8 70
圖表7LDC/STC指令格式表10.LDC/STC位字段定義
4.7.1對加載和存儲操作的通用注解加載和存儲多個(gè)寄存器將通過寄存器文件而線性地進(jìn)行,而無需像向量操作所使用的那樣跨4個(gè)或8個(gè)邊界回繞。對超過寄存器文件的結(jié)尾的加載的試圖是不可預(yù)測的。
如果某雙加載或存儲多個(gè)(store multiple)的偏移量含有奇數(shù)的寄存器數(shù)17或更少,具體實(shí)現(xiàn)可以寫另一個(gè)32位數(shù)據(jù)項(xiàng)或者讀另一個(gè)32位數(shù)據(jù)項(xiàng),但不要求這樣做。這額外的數(shù)據(jù)項(xiàng)可被用來在寄存器被加載或存儲時(shí)標(biāo)識寄存器的內(nèi)容。這在其中對該精度來說寄存器文件格式不同于IEEE754格式并且每個(gè)寄存器有要求在存儲器中標(biāo)識其的類型信息的實(shí)現(xiàn)中是有用的。如果偏移量是奇數(shù)的并且數(shù)目大于單精度寄存器的數(shù)目,這可被用來啟動(dòng)這些寄存器和所有系統(tǒng)寄存器的上下文切換。
表11.加載和存儲尋址方式選擇
4.7.2LDC/STC操作總結(jié)表12列舉了LDC/STC操作碼中P、W和U位的允許組合和每個(gè)有效操作的偏移量字段的功能。
表12LDC/STC操作總結(jié)
4.8CDP(協(xié)處理器數(shù)據(jù)處理)CDP指令包括涉及來自浮點(diǎn)寄存器文件的操作數(shù),并生成將要寫回到該寄存器文件的結(jié)果的所有數(shù)據(jù)處理操作。特別值得注意的是FMAC(鏈接的乘法-累加)操作,該操作將兩個(gè)操作數(shù)相乘后加上第3個(gè)操作數(shù)。該操作與合并的乘法-累加操作的不同在于,在加上第3操作數(shù)之前,要對積進(jìn)行IEEE舍入操作。這使得Java程序碼能使用FMAC操作,與分別先乘后加的操作相比,提高乘法-累加操作的速度。
CDP組中有兩條指令在將FPS寄存器中的浮點(diǎn)值向其整數(shù)值轉(zhuǎn)換是是有用的。FFTOUI[S/D]用FPSCR中當(dāng)前的舍入方式將單精度或雙精度的內(nèi)容轉(zhuǎn)換成FPS寄存器中的無符號整數(shù)。FFTOSI[S/D]進(jìn)行向帶符號整數(shù)的轉(zhuǎn)換。FFTOUIZ[S/D]和FFTOSIZ[S/D]執(zhí)行相同的功能,但不考慮轉(zhuǎn)換的FPSCR舍入方式,而是截去任何小數(shù)位。C、C++和Java要用FFTOSIZ[S/D]的功能來進(jìn)行浮點(diǎn)到整數(shù)的轉(zhuǎn)換。FFTOSIZ[S/D]指令提供這個(gè)功能,而不要求為轉(zhuǎn)換而將FPSCR中的舍入方式位調(diào)整為RZ,這就將轉(zhuǎn)換所需的周期數(shù)減到僅是FFTOSIZ[S/D]操作的周期數(shù),節(jié)省了4至6個(gè)周期。
比較操作的執(zhí)行,要使用CDP CMP指令,其后是MRC FMOVX FPSCR指令,它用生成的FPS標(biāo)志位(FPSCR[31∶28])加載ARM CPSR標(biāo)志位。如果比較操作數(shù)之一是NaN,也提供比較操作,而可有可無無效(INVALID)異常。如果比較操作數(shù)之一是NaN,FCMP和FCMPO將不發(fā)出INVALID信號,而FCMPE和FCMEO則要發(fā)出異常信號。FCMPO和FCMPEO將Fm字段中的操作數(shù)與0比較,相應(yīng)地設(shè)置FPS標(biāo)志。ARM標(biāo)志N、Z、C和V在FMOVX FPSCR之后的含義有如下定義N小于Z等于C大于或等于或無序V無序CDP指令的格式在圖表8中給出。31 28 27 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3.0
圖表8CDP指令格式表13.CDP位字段定義
4.8.1操作碼表14列舉了CDP指令的主要操作碼。所有助記符的格式均為[OPERATION][COND][S/D]表14.CDP操作碼說明
4.8.2擴(kuò)展的操作表15列舉了可以用操作碼字段中的擴(kuò)展值使用的擴(kuò)展操作。除串行化和FLSCB指令外,所有助記符的格式均為[OPERATION][COND][S/D]。擴(kuò)展操作的指令編碼的方法,與Fn操作數(shù)的寄存器文件內(nèi)變址的方法相同,即{Fn[3∶0],N}。
表15.CDP擴(kuò)展操作
*非可向量化的操作。忽略LEN字段,對指定寄存器進(jìn)行標(biāo)量操作。
5.系統(tǒng)寄存器FPSID含有FPS結(jié)構(gòu)和實(shí)現(xiàn)定義的標(biāo)識值。該字可被用來確定FPS的型號特征集和修訂以及屏蔽集號。FPSID是只讀的,對FPSID寫數(shù)據(jù)是無效的。參看圖表9中FPSID寄存器的布局。31 24 23 16 15 430
圖表9.FPSID寄存器編碼5.2用戶狀態(tài)與控制寄存器(FPSCR)FPSCR寄存器含有用戶可訪問的配置位和異常狀態(tài)位。配置選擇包括異常允許位、舍入控制、向量跨距和長度、非正規(guī)操作數(shù)和結(jié)果的處理、調(diào)試方式的使用。該寄存器供用戶和操作系統(tǒng)代碼配置FPS和查詢已完成操作的狀態(tài)。它必須在上下文切換期間保存和恢復(fù)。位31至28含有最近一條比較指令產(chǎn)生的標(biāo)志值,可以通過讀FPSCR來訪問。圖表10中展示了FPSCR。3130292827262524 23222120 19 18 16
15 14 13 1211 10 9 8 76 5 4 3 21 0
圖表10.用戶狀態(tài)與控制寄存器(FPSCR)5.2.1比較狀態(tài)和處理控制字節(jié)位31至28含有最近一次比較操作的結(jié)果,一些控制位用于規(guī)定特殊情況中FPS的算術(shù)響應(yīng)。圖表11給出了比較狀態(tài)和處理控制字節(jié)的格式。3130292827262524
圖表11.FPSCR比較狀態(tài)和處理控制字節(jié)的格式表16.FPSCR比較狀態(tài)和處理控制字節(jié)的字段定義
5.2.2系統(tǒng)控制字節(jié)系統(tǒng)控制字節(jié)控制舍入方式、向量跨距和向量長度字段。對各位的規(guī)定如圖表12中所示。
VFPv1結(jié)構(gòu)中包括一種寄存器文件跨距機(jī)制用于向量操作。如果跨距(STRIDE)位被設(shè)置為00,則向量操作中選擇的下一個(gè)寄存器將是寄存器文件中緊接前一個(gè)寄存器之后的寄存器。正常的寄存器文件回繞機(jī)制不受跨距值的影響??缇嘀?1將使所有輸入寄存器和輸出寄存器遞增2。例如,F(xiàn)MULEQS F8,F16,F24將執(zhí)行下列非向量操作FMULEQS F8,F16,F24FMULEQS F10,F18,F26FMULEQS F12,F20,F28FMULEQS F14,F22,F30有效地使寄存器文件中表示乘數(shù)的操作數(shù)的寄存器跨越2個(gè)而不是1個(gè)寄存器。23 2221 20 19 18 16
圖表12.FPSCR系統(tǒng)控制字節(jié)表17.FPSCR系統(tǒng)控制字節(jié)的字段定義
5.2.3異常允許字節(jié)異常允許字節(jié)占據(jù)位15∶8,含有對異常陷阱的允許。對這些位的規(guī)定如圖表13中所示。這些異常允許位符合IEEE 754規(guī)范對處理浮點(diǎn)異常條件的要求。如果該位被置位,則該異常是允許的,如果當(dāng)前指令上發(fā)生異常條件,F(xiàn)PS將向操作系統(tǒng)發(fā)出一個(gè)用戶可見的陷阱信號。如果該位被清零,則該異常是不允許的,如果發(fā)生異常條件,F(xiàn)PS將不向操作系統(tǒng)發(fā)出用戶可見的陷阱信號,但是將生成一個(gè)數(shù)學(xué)上合理的結(jié)果。異常允許位的缺省狀態(tài)是不允許的。關(guān)于異常處理的詳細(xì)內(nèi)容請參看IEEE 754標(biāo)準(zhǔn)。
有些實(shí)現(xiàn)將生成一個(gè)向支持程序碼的彈回,以便處理超出硬件能力的異常條件,即使異常不被允許時(shí)也是如此。這一般將是用戶程序碼不可見的。15 14 13 12 11 10 9 8
圖表13.FPSCR異常允許字節(jié)表18FPSCR異常允許字節(jié)字段
5.2.4異常狀態(tài)字節(jié)異常狀態(tài)字節(jié)占據(jù)FPSCR的位7∶0,含有異常狀態(tài)標(biāo)志位。有5個(gè)異常狀態(tài)標(biāo)志位,每個(gè)對應(yīng)一種浮點(diǎn)異常。這些位是“粘性的”,它們一旦被檢測到的異常設(shè)置后,必須通過FMOVX向FPSCR的寫或者FSERIALCL指令才能清除。對這些位的規(guī)定如圖表14中所示。如果發(fā)生一個(gè)允許的異常,對應(yīng)的異常狀態(tài)位將不是自動(dòng)設(shè)置的。按需要設(shè)置適當(dāng)?shù)漠惓顟B(tài)位,是支持程序碼的任務(wù)。有些異??赡苁亲詣?dòng)的,即,如果檢測到異常條件,F(xiàn)PS將在后繼浮點(diǎn)指令上彈回,而不管異常允許位是如何設(shè)置的。這就允許將IEEE 754標(biāo)準(zhǔn)所要求的一些更復(fù)雜的異常處理以軟件而不是硬件來執(zhí)行。一個(gè)例子是FZ位被設(shè)置為0時(shí)發(fā)生下溢條件。在這種情況下,正確的結(jié)果可能是一個(gè)取決于該結(jié)果的指數(shù)和舍入方式的非正規(guī)化數(shù)。FPS允許實(shí)現(xiàn)者選擇響應(yīng),包括選擇彈回并用支持程序碼來生成正確的結(jié)果和將該值寫到目的地寄存器。如果下溢異常允許位是置位的,用戶的陷阱處理程序?qū)⒃谥С殖绦虼a完成操作后被調(diào)用。這個(gè)程序碼可以改變FPS的狀態(tài)并返回或停止該進(jìn)程。
6.異常處理FPS在調(diào)試方式和正常方式這兩種方式之一下操作。如果在FPSCR中DM位被置位,F(xiàn)PS在調(diào)試方式下操作。在這個(gè)方式中,F(xiàn)PS一次執(zhí)行一條指令,與此同時(shí),讓ARM一直等待到知道該指令的異常狀態(tài)。這將保障寄存器文件和存儲器針對指令流保持準(zhǔn)確,但要以大量增加執(zhí)行時(shí)間為代價(jià)。FPS將在資源情況允許時(shí)從ARM接受新指令,當(dāng)檢測到異常條件時(shí)發(fā)出異常信號。對ARM的異常報(bào)告將總是針對浮點(diǎn)指令流保持準(zhǔn)確,除非是跟在向量操作之后的與向量操作并行執(zhí)行的加載或存儲操作。在這種情況下,加載操作的寄存器文件的內(nèi)容或者存儲操作的存儲器可以是不準(zhǔn)確的。
6.1支持程序碼FPS的實(shí)現(xiàn)可以選擇符合IEEE754的硬件與軟件支持的組合。對于不受支持的數(shù)據(jù)類型和自動(dòng)異常,支持程序碼將執(zhí)行一致性硬件的功能,適當(dāng)時(shí)將結(jié)果返回到目的地寄存器并在不調(diào)用用戶的陷阱處理程序或者修改用戶程序碼的流的情況下返回給用戶的程序碼。在用戶看來,只有硬件在負(fù)責(zé)浮點(diǎn)程序碼的處理。彈回到支持程序碼去處理這些特征功能,顯著增加執(zhí)行或處理該特征功能的時(shí)間,但這些情形在用戶程序碼、內(nèi)置應(yīng)用程序或編寫良好的數(shù)字應(yīng)用程序中一般極少發(fā)生。
支持程序碼設(shè)計(jì)有兩個(gè)組件一個(gè)例程庫,它執(zhí)行超出硬件的范圍的操作-諸如超越計(jì)算,以及被支持的功能-諸如用不受支持的輸入或可能產(chǎn)生異常的輸入進(jìn)行除法;一個(gè)異常處理程序的集合,它為符合IEEE754而處理異常陷阱。要求支持程序碼執(zhí)行補(bǔ)充的功能,以便仿真對不受支持的數(shù)據(jù)類型或數(shù)據(jù)表示(例如非正規(guī)值)的適當(dāng)處理??梢跃帉懤虂砝弥虚g計(jì)算中的FPS-如果注意在例程的出口恢復(fù)用戶的狀態(tài)。
6.2異常報(bào)告和處理在標(biāo)準(zhǔn)方式中,異常將在異常條件被檢測到后下一個(gè)浮點(diǎn)指令被發(fā)出時(shí)被報(bào)告給ARM。ARM處理器的狀態(tài)、FPS寄存器文件和存儲器在異常被捕獲時(shí),相對于引起異常的指令來說可能并不準(zhǔn)確。支持程序碼有足夠的信息可用來正確地仿真該指令并處理該指令產(chǎn)生的任何異常。
在有些實(shí)現(xiàn)中,支持程序碼可被用來處理一些或所有帶包括無窮大、NaN、非正規(guī)數(shù)據(jù)和零的特殊IEEE754數(shù)據(jù)的操作。這樣做的實(shí)現(xiàn),將按不受支持的數(shù)據(jù)來引用這些數(shù)據(jù),并以一般為用戶程序碼不可見的方式彈回到支持程序碼,并以在目的地寄存器中的IEEE754規(guī)定的結(jié)果返回。從操作得出的任何異常都遵守IEEE754異常規(guī)則。這可包括如果相應(yīng)的異常允許位置位時(shí)陷入到用戶程序碼。
IEEE754標(biāo)準(zhǔn)針對FPSCR中異常允許和禁止兩種情況定義對異常條件的響應(yīng)。VFPv1結(jié)構(gòu)不規(guī)定為適當(dāng)?shù)胤螴EEE754規(guī)范而使用的硬件與軟件之間的界線。
6.2.1不受支持的操作和格式FPS不支持任何帶十進(jìn)制數(shù)據(jù)或者向十進(jìn)制數(shù)據(jù)轉(zhuǎn)換或從十進(jìn)制數(shù)據(jù)轉(zhuǎn)換的操作。這些操作是IEEE754標(biāo)準(zhǔn)所要求的,必須由支持程序碼提供。如果要使用十進(jìn)制數(shù)據(jù),就要要求庫例程來完成所需的功能。FPS沒有十進(jìn)制數(shù)據(jù)類型,不能被用來捕獲使用十進(jìn)制數(shù)據(jù)的指令。
6.2.1FPS被禁止或異常時(shí)FMOVX的使用在SUPERVISOR(管理器)或UNDEFINED(未定義)方式下執(zhí)行的FMOVX指令,可以在FPS處于異常狀態(tài)或被禁止(如果該實(shí)現(xiàn)支持禁止選擇的話)時(shí),讀和寫FPSCR或者讀FPSID或FPREG,而不會引起向ARM發(fā)出異常信號。
盡管討論了本發(fā)明的一些特定的實(shí)施例,顯然本發(fā)明并不局限于此,在本發(fā)明的范圍內(nèi)可以進(jìn)行許多修改和增補(bǔ)。例如,可以將后文的從屬權(quán)利要求的特征與獨(dú)立權(quán)利要求的特征作出各種組合,而不偏離本發(fā)明的范圍。
權(quán)利要求
1.一種用于處理數(shù)據(jù)的裝置,該裝置包含一個(gè)有多個(gè)寄存器的寄存器組;和一個(gè)用于譯碼數(shù)據(jù)處理指令的指令譯碼器,至少一條所述數(shù)據(jù)處理指令有至少一個(gè)定義要執(zhí)行的操作的操作指定碼和一個(gè)指定所述寄存器組內(nèi)的一個(gè)第一寄存器的第一寄存器指定字段;其中所述指令譯碼器用一個(gè)給定的寄存器作為標(biāo)量寄存器或向量寄存器來執(zhí)行操作,以所述給定寄存器作為標(biāo)量寄存器的執(zhí)行,包含對存儲在所述給定寄存器的一個(gè)操作數(shù)執(zhí)行一次所述操作,以所述給定寄存器作為向量寄存器的執(zhí)行,包含對存儲在依賴所述給定寄存器的一個(gè)寄存器指定字段而選擇的所述寄存器組的寄存器的一個(gè)預(yù)定序列中的操作數(shù)執(zhí)行多次所述操作;和所述指令譯碼器響應(yīng)所述第一寄存器指定字段并獨(dú)立于所述操作指定碼,確定要將所述第一寄存器作為向量寄存器還是標(biāo)量寄存器用來執(zhí)行所述操作。
2.如權(quán)利要求1中所要求的裝置,其中所述的至少一個(gè)所述數(shù)據(jù)處理指令有一個(gè)指定一個(gè)第二寄存器的第二寄存器指定字段;所述指令譯碼器用所述第二寄存器作為標(biāo)量寄存器或向量寄存器來執(zhí)行所述操作;和所述指令譯碼器響應(yīng)所述第一寄存器指定字段,確定要將所述第二寄存器作為向量寄存器還是標(biāo)量寄存器用來執(zhí)行所述操作。
3.如權(quán)利要求2中所要求的裝置,其中,當(dāng)所述第一寄存器是標(biāo)量寄存器時(shí),所述第二寄存器是標(biāo)量寄存器,并且當(dāng)所述第一寄存器是向量寄存器時(shí),所述第二寄存器是向量寄存器。
4.如權(quán)利要求2和3的任意一項(xiàng)中所要求的裝置,其中所述至少一個(gè)數(shù)據(jù)處理指令有一個(gè)指定一個(gè)第三寄存器的第三寄存器指定字段;所述指令譯碼器用所述第三寄存器作為標(biāo)量寄存器或向量寄存器來執(zhí)行所述操作;和所述指令譯碼器響應(yīng)所述第二寄存器指定字段,確定要將所述第三寄存器作為向量寄存器還是標(biāo)量寄存器用來執(zhí)行所述操作。
5.如前面的任意一項(xiàng)權(quán)利要求中所要求的裝置,其中,所述的操作指定碼有對應(yīng)于非交換性運(yùn)算的非交換性碼值,至少成對地提供一些對應(yīng)于相同的運(yùn)算但具有相反的操作數(shù)順序的所述非交換性碼值。
6.如前面的任意一項(xiàng)權(quán)利要求中所要求的裝置,包含一個(gè)向量控制寄存器,它存儲著一個(gè)規(guī)定在所述給定寄存器是個(gè)向量寄存器時(shí)在要重復(fù)所述操作的所述預(yù)定寄存器序列中的寄存器的數(shù)目的長度值,所述長度值適用于所述數(shù)據(jù)處理指令中使用的所有向量寄存器。
7.如權(quán)利要求6中要求的裝置,其中,所述指令譯碼器檢測所述規(guī)定所述預(yù)定序列中的所述寄存器數(shù)目的長度值是否是一來提供在所述數(shù)據(jù)處理指令中使用的所有寄存器都是標(biāo)量寄存器的指示。
8.如權(quán)利要求6或7的任意一項(xiàng)中所要求的裝置,其中,所述向量控制寄存器存儲一個(gè)規(guī)定在所述預(yù)定寄存器序列的所述寄存器之間的寄存器號的增量的跨距值,所述跨距值適用于所述數(shù)據(jù)處理指令中使用的所有向量寄存器。
9.如前面的任意一項(xiàng)權(quán)利要求中所要求的裝置,其中,當(dāng)所述第一寄存器指定字段在一個(gè)第一N個(gè)值的范圍內(nèi)時(shí),所述第一寄存器是個(gè)向量寄存器;當(dāng)所述第一寄存器值在一個(gè)與所述第一N個(gè)值的范圍不同的第二M個(gè)值范圍內(nèi)時(shí),所述第一寄存器是個(gè)向量寄存器。
10.如權(quán)利要求9中所要求的裝置,其中,M>N。
11.如權(quán)利要求10中所要求的裝置,其中,M=3*N。
12.如權(quán)利要求4中所要求的裝置,其中,當(dāng)所述第二寄存器指定字段在一個(gè)第一P個(gè)值的范圍內(nèi)時(shí),所述第三寄存器是個(gè)向量寄存器;當(dāng)所述第二寄存器值在一個(gè)與所述第一P個(gè)值的范圍不同的第二Q個(gè)值范圍內(nèi)時(shí),所述第三寄存器是個(gè)向量寄存器。
13.如權(quán)利要求12中所要求的裝置,其中,P>Q。
14.如權(quán)利要求13中所要求的裝置,其中,P=3*Q。
15.如前面的任意一項(xiàng)權(quán)利要求中所要求的裝置,包含一個(gè)存儲器和一個(gè)用于控制所述存儲器與所述寄存器組內(nèi)寄存器之間數(shù)據(jù)值的傳送的傳送控制器,所述傳送控制器響應(yīng)多個(gè)傳送指令,在所述存儲器與所述寄存器組內(nèi)的一系列寄存器之間傳送一系列數(shù)據(jù)值。
16.如前面的任意一項(xiàng)權(quán)利要求中所要求的裝置,其中,所述寄存器組和所述指令譯碼器是一個(gè)浮點(diǎn)單元的一部分。
17.如權(quán)利要求16中所要求的裝置,其中所述浮點(diǎn)單元包含一個(gè)用于執(zhí)行乘法-累加運(yùn)算的乘法-累加單元。
18.如前面的任意一項(xiàng)權(quán)利要求中所要求的裝置,其中,將所述操作的結(jié)果寫到起目的地寄存器作用的所述第一寄存器。
19.如權(quán)利要求2中所要求的裝置,其中,所述第二寄存器作為存儲所述操作的一個(gè)第一輸入操作數(shù)的第一操作數(shù)寄存器。
20.如權(quán)利要求的裝置, 其中,所述第三寄存器作為存儲所述操作的一個(gè)第二輸入操作數(shù)的第二操作數(shù)寄存器。
21.如前面的任意一項(xiàng)權(quán)利要求中所要求的裝置,其中,所述寄存器組包含32個(gè)寄存器。
22.如前面的任意一項(xiàng)權(quán)利要求中所要求的裝置,其中,所述寄存器可以個(gè)別地操作和被控制,以存儲一個(gè)單精度值,或者成對地操作和被控制,以存儲一個(gè)雙精度值。
23.如前面的任意一項(xiàng)權(quán)利要求中所要求的裝置,其中,所述給定寄存器指定字段在要用所述給定寄存器作為向量寄存器來執(zhí)行所述操作時(shí)規(guī)定所述預(yù)定寄存器序列內(nèi)的一個(gè)起始寄存器。
24.如前面的任意一項(xiàng)權(quán)利要求中所要求的裝置,其中,所述指令譯碼器響應(yīng)至少一個(gè)另外的數(shù)據(jù)處理指令,該指令中的所述操作碼定義所述指令中指定的所述給定寄存器是一個(gè)向量寄存器還是一個(gè)標(biāo)量寄存器,而與任何寄存器指定字段無關(guān)。
25.一種處理數(shù)據(jù)的方法,該方法包含的步驟是在一個(gè)有多個(gè)寄存器的寄存器組中存儲數(shù)據(jù)值;用一個(gè)指令譯碼器譯碼數(shù)據(jù)處理指令,至少一條所述數(shù)據(jù)處理指令有至少一個(gè)指定要執(zhí)行的操作的操作指定碼和一個(gè)指定所述寄存器組內(nèi)的一個(gè)第一寄存器的寄存器指定字段;其中所述指令譯碼器用一個(gè)給定的寄存器作為標(biāo)量寄存器或向量寄存器來執(zhí)行操作,以所述給定寄存器作為標(biāo)量寄存器的執(zhí)行,包含對存儲在所述給定寄存器的一個(gè)操作數(shù)執(zhí)行一次所述操作,以所述給定寄存器作為向量寄存器的執(zhí)行,包含對存儲在依賴所述給定寄存器的一個(gè)寄存器指定字段而選擇的所述寄存器組的一個(gè)預(yù)定的寄存器序列中的操作數(shù)執(zhí)行多次所述操作;和所述指令譯碼器響應(yīng)所述第一寄存器指定字段并獨(dú)立于所述操作指定碼,確定要將所述第一寄存器作為向量寄存器還是標(biāo)量寄存器用來執(zhí)行所述操作。
全文摘要
浮點(diǎn)單元配備一個(gè)包含32個(gè)既可用作向量寄存器又可用作標(biāo)量寄存器的寄存器的寄存器組。數(shù)據(jù)處理指令包括至少一個(gè)指向含有要在該操作中使用的數(shù)據(jù)值的寄存器的寄存器指定字段。通過在寄存器字段本身內(nèi)對某寄存器要按向量寄存器還是按標(biāo)量寄存器對待進(jìn)行編碼,能增加可用來編碼更多操作碼或容納更多寄存器的指令位空間。此外,指令的一個(gè)寄存器的寄存器字段可以編碼另一個(gè)寄存器是向量寄存器還是標(biāo)量寄存器。一開始可以不管操作碼如何,而用指令的寄存器字段內(nèi)的值來訪問寄存器,這更加易于譯碼。
文檔編號G06F7/544GK1303501SQ99806659
公開日2001年7月11日 申請日期1999年3月9日 優(yōu)先權(quán)日1998年5月27日
發(fā)明者C·N·欣德斯, D·V·雅加, D·T·馬特尼, D·J·西爾 申請人:Arm有限公司