專利名稱:用于執(zhí)行simd運(yùn)算的數(shù)據(jù)處理系統(tǒng)及其方法
技術(shù)領(lǐng)域:
本發(fā)明主要涉及數(shù)據(jù)處理系統(tǒng),更具體地,涉及在數(shù)據(jù)處理系統(tǒng) 中使用的指令。
背景技術(shù):
通過(guò)允許在矢量的多個(gè)分量上執(zhí)行并行運(yùn)算,可實(shí)現(xiàn)提高數(shù)據(jù)處 理系統(tǒng)的性能。目前可用的一種處理器類型為矢量處理器,其利用執(zhí) 行矢量運(yùn)算的矢量寄存器。然而,盡管矢量處理器允許更高的性能, 但對(duì)于使用標(biāo)量通用寄存器的處理器而言,增加了復(fù)雜度和成本。也 就是,矢量處理器中的矢量寄存器文件通常包括N個(gè)矢量寄存器,其 中每個(gè)矢量寄存器包括M個(gè)寄存器的庫(kù)用于保存M個(gè)分量。例如,在 本領(lǐng)域公知的一種矢量寄存器中,該寄存器文件包括32個(gè)矢量寄存器, 其中,每個(gè)寄存器包括32個(gè)64位寄存器的庫(kù),從而等于需要1024個(gè) 64位寄存器。
目前另一種可用的矢量寄存器是單指令多數(shù)據(jù)(SIMD)標(biāo)量處理 器(也稱為"短矢量機(jī)"),其允許有限的矢量處理,同時(shí)使用任何 現(xiàn)有的標(biāo)量通用寄存器(GPR)。例如,在具有32個(gè)標(biāo)量64位GPR 的數(shù)據(jù)處理系統(tǒng)中,每一標(biāo)量寄存器可以保存2個(gè)32位分量,4個(gè)16 位分量,或8個(gè)8位分量,從而能夠執(zhí)行2個(gè)32位分量運(yùn)算,4個(gè)16 位分量運(yùn)算,或8個(gè)8位分量運(yùn)算。因此,與矢量處理器相比(根據(jù) 上述示例,其每次可對(duì)寄存器庫(kù)中的32個(gè)64位寄存器執(zhí)行運(yùn)算),盡管每次運(yùn)算的分量數(shù)目受到限制,但減少了所需的硬件。然而,在 當(dāng)前的SIMD標(biāo)量處理器中,存在大量的與向標(biāo)量寄存器傳送用于執(zhí) 行的矢量分量和向存儲(chǔ)器傳送回多個(gè)矢量分量相關(guān)聯(lián)的開銷。該開銷 限制了運(yùn)算的有效吞吐量,因此,存在對(duì)于在存儲(chǔ)器與寄存器間加載 和存儲(chǔ)多個(gè)矢量分量的改良方法的需求。
通過(guò)示例說(shuō)明本發(fā)明,并不受限于附圖,在附圖中,相同的引用 號(hào)碼表示相同的元素,并且其中
圖1以框圖的形式表示遵照本發(fā)明的一個(gè)實(shí)施例的數(shù)據(jù)處理系
統(tǒng);
圖2-11表示可由圖1的數(shù)據(jù)處理系統(tǒng)執(zhí)行的矢量加載和存儲(chǔ)指
令,其遵照本發(fā)明的各種實(shí)施例;
圖12表示示例存儲(chǔ)器部分,其遵照本發(fā)明的一個(gè)實(shí)施例;
圖13-17表示一組標(biāo)量GPR中的條目的示例,其遵照本發(fā)明的各
種實(shí)施例;
圖18表示存儲(chǔ)器部分隨時(shí)間變化的示例,其遵照本發(fā)明的一個(gè)實(shí)
施例;
圖19-26表示一組標(biāo)量GPR中條目的示例,其遵照本發(fā)明的各種 實(shí)施例;
圖27-33表示可由圖1的數(shù)據(jù)處理系統(tǒng)執(zhí)行的矢量加載和存儲(chǔ)指
令,其遵照本發(fā)明的替換實(shí)施例;
圖34表示存儲(chǔ)器部分的示例,其遵照本發(fā)明的一個(gè)實(shí)施例;和 圖35表示一組標(biāo)量GPR中條目的示例,其遵照本發(fā)明的一個(gè)實(shí)施例。
技術(shù)人員明白,圖中的元件出于簡(jiǎn)化和說(shuō)明的目的而表示,并不 一定按比例繪制。例如,圖中某些元件的尺寸相對(duì)于其它元件夸大, 以有助于理解本發(fā)明的實(shí)施例。
具體實(shí)施例方式
如此處所使用的,術(shù)語(yǔ)"總線"指用于傳送一種或多種信息,例
如,數(shù)據(jù)、地址、控制或狀態(tài)的多個(gè)信號(hào)或?qū)Ь€(conductor)。此處
討論的導(dǎo)線可表示或說(shuō)明為單個(gè)導(dǎo)線、多個(gè)導(dǎo)線、單向?qū)Ь€或雙向?qū)?線。然而,不同的實(shí)施例可變化這些導(dǎo)線的實(shí)現(xiàn)方式。例如,可使用 多個(gè)分離的單向?qū)Ь€,而不是雙向?qū)Ь€,反之亦然。另外,可用以串 行或時(shí)間復(fù)用方式傳送信號(hào)的單個(gè)導(dǎo)線代替多個(gè)導(dǎo)線。同樣地,承載 多個(gè)信號(hào)的單個(gè)導(dǎo)線可分離為承載這些信號(hào)的子集的各種不同導(dǎo)線。 因此,對(duì)于傳送信號(hào)存在多個(gè)選項(xiàng)。
當(dāng)將信號(hào)、狀態(tài)位或類似的裝置分別呈現(xiàn)其邏輯真或假狀態(tài)時(shí),
使用術(shù)語(yǔ)"肯定"(assert)或"設(shè)置"(set)以及"否定"(negate) (或"非肯定"(deasert)或"清除"(clear))。如果該邏輯真狀態(tài) 為邏輯水平一,則邏輯假狀態(tài)為邏輯水平零。并且如果邏輯水平真狀 態(tài)為邏輯水平零,則邏輯水平假狀態(tài)為邏輯水平一。另外,在數(shù)字前 的"Ox"表明該數(shù)字以其16進(jìn)制或16基底形式表示。數(shù)字前的 表明該數(shù)字以其二進(jìn)制或2基底形式表示。
如上所述,存在對(duì)于降低從存儲(chǔ)器向寄存器和從寄存器向存儲(chǔ)器 傳送多個(gè)矢量分量的開銷的需求。因此,此處將討論多種不同的矢量 加載和存儲(chǔ)指令,其允許以改進(jìn)的方式從或向存儲(chǔ)器傳送矢量分量。 此外,使用此處說(shuō)明的指令可允許降低的開銷,向現(xiàn)有的設(shè)計(jì)增加最 小的硬件復(fù)雜度。例如,如同在許多類型的數(shù)據(jù)處理系統(tǒng)中的使用, 標(biāo)量寄存器文件可與這些指令一同使用,從而無(wú)需成本更高的獨(dú)立矢 量寄存器文件。另外,這些指令可允許降低的軟件復(fù)雜度,同時(shí)還提 供執(zhí)行效率。另外,此處的指令可用于解決各種問(wèn)題,例如,存儲(chǔ)器
中矢量分量的對(duì)齊,將存儲(chǔ)器分量的大小擴(kuò)展至寄存器分量以提高的 精確度的需要,存儲(chǔ)器的任意矢量長(zhǎng)度對(duì)于固定長(zhǎng)度,或與檢索/存儲(chǔ) 矢量數(shù)據(jù)所需的加載/存儲(chǔ)指令數(shù)關(guān)聯(lián)的開銷(例如,在發(fā)出與執(zhí)行指 令時(shí))。此處的這些指令還可用于解決這些問(wèn)題的組合,或別的問(wèn)題
或問(wèn)題的組合,如通過(guò)在下面參考圖1-35提供的說(shuō)明將要理解的那樣。 圖1以框圖的形式表示根據(jù)本發(fā)明的一個(gè)實(shí)施例的數(shù)據(jù)處理系統(tǒng)
10。數(shù)據(jù)處理系統(tǒng)IO包括處理器14、存儲(chǔ)器12、輸入/輸出(I/O) 16、 其它外圍設(shè)備18以及系統(tǒng)總線20。存儲(chǔ)器12通過(guò)導(dǎo)線22雙向連接至 系統(tǒng)總線20, I/O 16通過(guò)導(dǎo)線24雙向連接至系統(tǒng)總線20,其它外圍設(shè) 備18通過(guò)導(dǎo)線26雙向連接至系統(tǒng)總線20,處理器14通過(guò)導(dǎo)線58連 接至系統(tǒng)總線20。在一個(gè)實(shí)施例中,其它外圍設(shè)備18可包括一個(gè)或多 個(gè)外圍設(shè)備,其中,每一外圍設(shè)備可為任何類型的外圍設(shè)備,例如, 通用異步收發(fā)器(UART),實(shí)時(shí)時(shí)鐘(RTC),鍵盤控制器,其它存 儲(chǔ)器,等等。其它外圍設(shè)備18的一些或全部能夠通過(guò)導(dǎo)線62傳送數(shù) 據(jù)處理系統(tǒng)10外部的信息。I/O電路16可包括任何類型的I/O電路, 其通過(guò)例如導(dǎo)線60,接收或提供數(shù)據(jù)處理系統(tǒng)10的外部信息。存儲(chǔ)器 12可為任何類型的存儲(chǔ)器,例如,只讀存儲(chǔ)器(ROM),隨機(jī)存取存 儲(chǔ)器(RAM),非易失性存儲(chǔ)器(例如,flash)等。數(shù)據(jù)處理系統(tǒng)IO 可包括除表示的那些之外的其它元件,或可包括比表示出的那些更多 或更少的元件。例如,數(shù)據(jù)處理系統(tǒng)IO可包括任意數(shù)量的存儲(chǔ)器或處 理器。
處理器M可為任何類型的處理器,例如,微處理器、微控制器、 數(shù)字信號(hào)處理器,等等。在一個(gè)實(shí)施例中,處理器14可稱為處理器內(nèi) 核。在另一實(shí)施例中,處理器14可為多處理器數(shù)據(jù)處理系統(tǒng)中多個(gè)處 理器中的一個(gè)。另外,盡管沒有這樣表示,但處理器14可為流水線處 理器。在圖l中所示的實(shí)施例中,處理器14包括控制單元28、指令單 元30、執(zhí)行單元32、標(biāo)量寄存器文件34、總線接口單元(BIU) 36以 及加載/存儲(chǔ)單元38。控制單元28通過(guò)導(dǎo)線40雙向連接至指令單元30, 通過(guò)導(dǎo)線42連接至執(zhí)行單元32,通過(guò)導(dǎo)線46連接至標(biāo)量寄存器文件 34,并且通過(guò)導(dǎo)線48連接至加載/存儲(chǔ)單元38。執(zhí)行單元32通過(guò)導(dǎo)線 44雙向連接至標(biāo)量寄存器文件34,并且標(biāo)量寄存器文件34通過(guò)導(dǎo)線 50雙向連接至加載/存儲(chǔ)單元38。 BIU36通過(guò)導(dǎo)線54雙向連接至指令 單元30,并且通過(guò)導(dǎo)線52連接至加載/存儲(chǔ)單元38。處理器14通過(guò)連 接至導(dǎo)線58的導(dǎo)線56,能夠與系統(tǒng)總線20雙向通信。注意,處理器 14可包括比表示出的更多的電路,其中,附加電路可連接至導(dǎo)線58。 也就是,導(dǎo)線56可通過(guò)全部或部分導(dǎo)線58與系統(tǒng)總線20通信。還要 注意,全部或部分處理器14可稱為處理電路。
在操作中,指令單元30通過(guò)BIU 36和系統(tǒng)總線20從例如存儲(chǔ)器 12的存儲(chǔ)器取回指令,并從或向控制單元28接收和提供控制信息。指 令單元30可為本領(lǐng)域所公知的任何類型的指令單元,并如本領(lǐng)域所公 知的那樣操作,并且因此不在此處詳細(xì)說(shuō)明。指令單元30因此向控制 單元28提供指令,控制單元通過(guò),例如,執(zhí)行單元32和加載/存儲(chǔ)單 元38,控制這些接收的指令的執(zhí)行,執(zhí)行單元32和加載/存儲(chǔ)單元38 這兩個(gè)單元可在必要時(shí)直接地或通過(guò)控制單元28與標(biāo)量寄存器文件34 通信。例如,控制單元28通過(guò)加載/存儲(chǔ)單元38和BIU36,能在需要 執(zhí)行指令時(shí)從存儲(chǔ)器(例如存儲(chǔ)器12)向標(biāo)量寄存器文件34中的寄存 器加載數(shù)據(jù),并且能在需要執(zhí)行指令時(shí)將來(lái)自寄存器文件34中寄存器 的數(shù)據(jù)存儲(chǔ)至存儲(chǔ)器(例如存儲(chǔ)器12)。例如,在一個(gè)實(shí)施例中,加 載/存儲(chǔ)單元38能夠通過(guò)導(dǎo)線50,基于控制單元28通過(guò)導(dǎo)線48提供 的控制信息,直接與標(biāo)量寄存器文件34通信(以讀取和寫入數(shù)據(jù))。 執(zhí)行單元32可在需要執(zhí)行通過(guò)控制單元28從指令單元30接收的指令 時(shí),使用在標(biāo)量寄存器文件34中存儲(chǔ)的數(shù)據(jù),執(zhí)行算術(shù)、邏輯、移位 或其它運(yùn)算操作,并將結(jié)果存儲(chǔ)至標(biāo)量寄存器34中的寄存器。執(zhí)行單 元32可包括,例如,算術(shù)邏輯單元(ALU)、浮點(diǎn)單元,等等。
標(biāo)量寄存器文件34包括N個(gè)通用寄存器(GPR),其中,N可為 大于或等于一的任何整數(shù)。在一個(gè)實(shí)施例中,標(biāo)量寄存器文件34包括 32個(gè)64位寄存器。如同此處所使用,標(biāo)量寄存器表示具有一維映射并 因此僅保存一行數(shù)據(jù)(例如,1XM位寄存器)的寄存器,其中,M為 大于或等于一的任何整數(shù)。在一個(gè)實(shí)施例中,M為64,并且每個(gè)寄存 器因此能夠存儲(chǔ)64位的量。標(biāo)量寄存器文件34可通過(guò)導(dǎo)線46向或從
控制單元28提供或接收控制信息。
處理器14的操作通??捎杀绢I(lǐng)域的普通技術(shù)人員理解。因此在此
處將不詳細(xì)說(shuō)明處理器14,除了在理解參考圖2-36說(shuō)明的各種實(shí)施例 中需要的那些部分外。還要注意,可在需要執(zhí)行此處說(shuō)明的加載與存 儲(chǔ)指令時(shí)修改具有存儲(chǔ)在通用寄存器文件中的操作數(shù)的數(shù)據(jù)處理系統(tǒng) 的現(xiàn)有設(shè)計(jì)。此外,注意,由于可使用標(biāo)量寄存器文件,可更新目前 的現(xiàn)有設(shè)計(jì),以允許此處說(shuō)明的指令。(然而,此處說(shuō)明的實(shí)施例可 與任何類型的寄存器文件一同使用,并不僅限于標(biāo)量寄存器文件。)
圖2-11表示各種不同的矢量分量加載與存儲(chǔ)指令,其可由處理電 路執(zhí)行,例如,由圖1的處理器14等執(zhí)行。例如,每一指令可由指令 單元30取回,其在適當(dāng)時(shí)將它們提供至控制單元28??刂茊卧?8因 此可在需要時(shí)指示加載/存儲(chǔ)單元38和執(zhí)行單元28執(zhí)行接收的指令, 在需要存儲(chǔ)數(shù)據(jù)時(shí)使用寄存器文件34,如下詳述。注意,參考后面的 圖,提供使用在圖2-11中表示的指令的示例。另外,注意,如此處所 使用,矢量分量(或寄存器分量)指一個(gè)最多為標(biāo)量GPR大小,但也 可以小于GPR大小的分量。例如,在標(biāo)量寄存器文件34包括64位寄 存器(M=64)的情況下,矢量分量可為64位的大小或更小。例如,矢 量分量可為一個(gè)字節(jié)(8位),使得一個(gè)64位GPR能夠保存8個(gè)矢量 分量。另外,矢量分量可為半字U6位),使得一個(gè)64位GPR能夠 保存4個(gè)矢量分量。類似地,矢量分量可為字(32位),使得64位 GPR可保存2個(gè)分量。還要注意,如此處所使用,字節(jié)由"b"表示, 半字由"h"表示,并且字由"w"表示。(注意,在替換實(shí)施例中, 字或半字的定義可能不同。例如,字可以指16位,而不是32位。然 而,如此處所使用,為了便于說(shuō)明,字指32位。)
圖2表示加載矢量分量(lvex)指令,其用來(lái)自存儲(chǔ)器的分量加載 該寄存器文件(例如,標(biāo)量寄存器文件34)中的一個(gè)目標(biāo)寄存器。在 一個(gè)實(shí)施例中,可利用附加控制字段進(jìn)一步限定該操作,例如s/u字段、 ms字段以及ds字段,在圖2中將每一個(gè)說(shuō)明為緊隨操作符"lvex", 并由句點(diǎn)分隔。在一個(gè)實(shí)施例中,具有這些控制字段中的每一個(gè);然 而在替換實(shí)施例中,可能存在這些控制字段中的一些或者完全不存在。 在一個(gè)實(shí)施例中,ms字段對(duì)應(yīng)于存儲(chǔ)器分量大小字段,ds字段對(duì)應(yīng)于 目標(biāo)分量大小。例如,在一個(gè)實(shí)施例中,該存儲(chǔ)器分量大小(ms)字 段可設(shè)置為mb、 mh或mw中的一個(gè),以分別表明該將要加載的存儲(chǔ) 器分量是否為字節(jié)、半字或字。類似地,目標(biāo)分量大小(ds)字段用于 表示在目標(biāo)寄存器中每一加載的分量將具有的大小。
圖2的lvex指令還包括三個(gè)操作數(shù)rD、 rA以及rB。該指令lvex 利用來(lái)自存儲(chǔ)器的矢量分量加載目標(biāo)寄存器rD。寄存器rA指向存儲(chǔ)器 中的第一個(gè)分量,并且在圖2的實(shí)施例中,在寄存器rB中指定附加參 數(shù)。因此,每一rD、 rA和rB可表明標(biāo)量寄存器文件34中GPR中的 一個(gè)。在寄存器rB中存儲(chǔ)的附加參數(shù)包括計(jì)數(shù)(cnt)值和跨度(stride) 值,使得lvex指令在具有ds大小的rD字段中用來(lái)自存儲(chǔ)器的"cnt" 個(gè)分量(由rA指向這些分量的第一個(gè))加載寄存器rD,使得rD中的 每一目標(biāo)分量具有ds大小。
還可指定跨度值,其指示存儲(chǔ)器中的分量如何分隔。也就是,存 儲(chǔ)器中的這些分量距離"stride"個(gè)大小ms的單位。例如,如果存儲(chǔ)器 中的分量相鄰,則可使用跨度l得到"cnt"個(gè)大小為"ms"的相鄰 分量。例如,如果這些分量距離三個(gè)分量放置,則可使用跨度3獲得 "cnt"個(gè)元素,彼此間距離3個(gè)"ms"大小的單位。例如,如果ms 表示字(例如,mw),則跨度3將在存儲(chǔ)器中從rA所指的存儲(chǔ)器位 置開始每三個(gè)字取一個(gè)字。另外,該跨度值可為有符號(hào)值,其中,負(fù) 值將向低位地址位置取分量,不是向高位地址位置取分量。
在一個(gè)實(shí)施例中,目標(biāo)大小(ds)應(yīng)當(dāng)大于或等于存儲(chǔ)器分量大 小(ms)。如果該目標(biāo)大小(ds)大于該存儲(chǔ)器大小(ms),貝i」s/u 字段可用于適當(dāng)?shù)財(cái)U(kuò)展每個(gè)存儲(chǔ)器分量。"s"用于表示這些分量是有
符號(hào)的,并且應(yīng)該因此能夠進(jìn)行符號(hào)擴(kuò)展,而"U"可用于表示這些分
量是無(wú)符號(hào)的,并且應(yīng)當(dāng)因此能夠進(jìn)行零擴(kuò)展。例如,在"lvex.u.mh.dw rD,rA,rB"的情況下,rD中(字大小)的每一 目標(biāo)位置的上半字可歸零, 如下面詳細(xì)說(shuō)明。另外,注意,在一個(gè)實(shí)施例中,如果"cn"ds"小于 目標(biāo)寄存器rD的大小,則rD剩余的低階部分歸零??商鎿Q地,rD的 任何剩余部分,例如,rD的剩余的低階部分,可由任何預(yù)定值填充(例 如,零或任何其它預(yù)定值)。另外,在一個(gè)實(shí)施例中,如果ds小于ms, 則在加載至rD時(shí),可對(duì)每一分量進(jìn)行舍入或截短(其中,該lvex指令 還可包括截短或舍入控制字段,如下對(duì)于存儲(chǔ)指令的說(shuō)明)。
在說(shuō)明的實(shí)施例中,可將s/u字段、ms字段以及ds字段編碼為操 作碼或子操作碼的部分。因此,在說(shuō)明的實(shí)施例中,該lvex指令包括 表示該操作碼的字段、表示rD的字段、表示rA的字段、表示rB的字 段以及表示子操作碼的字段。然而,在替換實(shí)施例中,注意,s/u、 ms 以及ds字段還可在rB中連同cnt和stride (跨度) 一起表示。
圖3表示圖2的lvex指令的替換實(shí)施例,其中不是將rB表示為操 作數(shù),其中,rB包括附加參數(shù),而是作為該指令的操作碼和子操作碼 的全部或部分提供所有這些參數(shù)。例如,可在該指令的子操作碼部分 提供cnt、 stride以及控制字段(s/u, ms和ds)。
注意,上面提供的對(duì)于控制字段s/u、 ms和ds的說(shuō)明適用于所有 此處說(shuō)明的加載指令。在使用該指令lvex時(shí),在此處說(shuō)明的其它加載 指令中,可存在這些控制字段的全部、 一些或是完全不存在。還需要 注意,對(duì)于此處的討論,rD通常指目標(biāo)寄存器,rA指向存儲(chǔ)器中第一 個(gè)存儲(chǔ)器分量,并且rB,如果在該指令中存在的話,存儲(chǔ)該指令的一 些或全部附加參數(shù)。注意,rB還可稱為控制寄存器,并且不必是GPR 中的一個(gè)。類似地,rA可為控制寄存器或另一存儲(chǔ)器位置,并且不必 是GPR中的一個(gè)。還要注意,在此處說(shuō)明的所有指令(加載與存儲(chǔ)) 中,這些控制字段可編碼為該指令的操作碼或子操作碼的一部分或可
位于寄存器rB中。如果它們位于寄存器rB中,則這些控制字段通常 不出現(xiàn)在操作符之后,并由句點(diǎn)分隔,而將僅出現(xiàn)在寄存器rB中。還 要注意,如果需要更多的參數(shù)或控制字段,此處的任何指令可表示, 如必要的話,多于一個(gè)的寄存器,用于表示指令參數(shù)和控制字段,或 者在共同的或不相連的存儲(chǔ)位置中可包含附加信息。
圖4表示加載多個(gè)矢量分量(lmvex)指令,其用來(lái)自存儲(chǔ)器的分 量加載多個(gè)目標(biāo)寄存器。在使用該lmvex指令時(shí),該lnwex指令還可 包括s/u字段、ms字段,以及ds字段,每一個(gè)在圖4中表示為緊隨操 作符"lmvex",并由句點(diǎn)分隔。圖4的lmvex指令還包括三個(gè)操作數(shù) rD, rA和rB。該lmvex指令用"cnt"個(gè)來(lái)自存儲(chǔ)器的矢量分量加載第 一目標(biāo)寄存器rD,和所需的多個(gè)跟隨rD之后的寄存器(其中,寄存器 rA指向存儲(chǔ)器中的第一個(gè)分量),使得任何目標(biāo)寄存器中的每一目標(biāo) 分量的大小為ds。例如,如果9個(gè)半字(16位)大小的分量將加載至 rD (其中,每一GPR為64位),則需要3個(gè)GPR。在一個(gè)實(shí)施例中, rD表示第一個(gè)寄存器,并且如果需要更多,則使用額外的相鄰寄存器。 例如,如果rD表示該9個(gè)分量的寄存器R4,則使用寄存器R4, R5和 R6。
在寄存器rB中存儲(chǔ)的附加參數(shù)包括cnt、 stride (跨度)、skip (跳 躍)禾卩skip_cnt。參數(shù)cnt與stride與上述參考圖1的說(shuō)明相同。也就 是,存儲(chǔ)器中將要加載的分量可距離"stride"個(gè)ms大小的單位放置。 該lmvex指令從存儲(chǔ)器距離"stride"個(gè)(ms大小的)單位加載分量, 直到取回"skip—cnt"個(gè)分量。此時(shí),下一個(gè)分量位于"skip"個(gè)ms大 小的單位處,并且重置該記錄skip—cnt的機(jī)制(例如,計(jì)數(shù)器)。因此, 每次取回skip_cnt個(gè)分量時(shí)(從該指令的起始或從上次重置skip—cnt 計(jì)數(shù)器),下一分量就位于"skip"(而不是"stride")個(gè)ms大小的 單位處。在一個(gè)實(shí)施例中,處理器14 (例如,控制單元28中)中的計(jì) 數(shù)器設(shè)置為"skip一cnt-l",并在每次取數(shù)后遞減,直到該計(jì)數(shù)器終止 (到達(dá)零),并再次設(shè)置為"skip_cnt-l",以繼續(xù)取回位于"skip"個(gè)
單位處的分量,直到取回"cnt"個(gè)分量。(可替換地,可將該計(jì)數(shù)器 設(shè)置為零,并逐次增加,直到該計(jì)數(shù)器到達(dá)skip—cnt-l,替換實(shí)施例可 使用其它方法記錄skip_cnt。)注意,stride和skip均可為有符號(hào)量。 另外,在一個(gè)實(shí)施例中,在從存儲(chǔ)器加載"cnt"個(gè)分量后,最后一個(gè) 寄存器中任何剩下的未填充字節(jié)用預(yù)定值填充(例如,零)。
在一個(gè)實(shí)施例中,該目標(biāo)大小(ds)應(yīng)大于或等于該存儲(chǔ)器分量 大小(ms)。如果該目標(biāo)大小(ds)大于該存儲(chǔ)器分量大小(ms), 則該s/u字段可用于適當(dāng)?shù)財(cái)U(kuò)展每一存儲(chǔ)器分量,如上對(duì)于lvex的說(shuō)明。 然而,在一個(gè)實(shí)施例中,如果ds小于ms,則每個(gè)分量可在加載至rD 時(shí)舍入或截短,如下對(duì)于存儲(chǔ)指令的說(shuō)明。
圖5表示圖4的lnwex指令的替換實(shí)施例,其中,不是將rB表示 為操作數(shù),其中rB包括附加參數(shù),而是可將所有這些參數(shù)作為該指令 子操作碼的全部或部分提供。例如,cnt、 stride、 skip、 skip一cnt以及控 制字段(s/u、 ms和ds)可全部在該指令的子操作碼或操作碼部分指示。 但在另一替換實(shí)施例中(未示出),各個(gè)指令參數(shù)可分配至指令字段 或rB中的字段。例如,當(dāng)希望使該參數(shù)能夠基于計(jì)算結(jié)果或基于系統(tǒng) 狀態(tài)動(dòng)態(tài)修改時(shí),可使用分配至rB中的字段。其它參數(shù)可為靜態(tài)特性, 并且可編碼至該指令中的字段。
注意,對(duì)于此處說(shuō)明的其余字段,任何附加參數(shù)將位于rB中,其 中rB作為操作數(shù)提供至該指令。然而,應(yīng)當(dāng)理解,在替換實(shí)施例中, 該指令可具有不同的格式,如上所述。
圖6表示另一加載多矢量分量(lnwex2)指令,其也用來(lái)自存儲(chǔ) 器的分量加載多個(gè)目標(biāo)寄存器。在使用上述指令時(shí),該lmvex2指令還 可包括s/u字段、ms字段和ds字段,每個(gè)在圖6中表示為跟隨操作符 "lmvex2",并由句點(diǎn)分隔。圖6的lmvex2還包括三個(gè)操作數(shù)rD, rA和rB。該指令lmvex2用來(lái)自存儲(chǔ)器的"cnt"個(gè)矢量分量(其中,
寄存器rA指向存儲(chǔ)器中的第一個(gè)分量)加載該目標(biāo)寄存器rD(和所需 的多個(gè)跟隨rD的寄存器),使得任一目標(biāo)寄存器中的每一目標(biāo)分量的 大小為ds。例如,如果9個(gè)半字(16位)的分量將加載至rD (其中, 每一GPR為64位),則至少需要3個(gè)GPR,并且如進(jìn)一步所述,則 還需要超過(guò)3個(gè)的附加GPR。在一個(gè)實(shí)施例中,rD表示該第一個(gè)寄存 器,并且如果需要更多,則使用附加的連續(xù)寄存器。例如,如果rD表 示這9個(gè)分量的寄存器R4,則至少使用寄存器R4, R5和R6。
在寄存器rB中存儲(chǔ)的用于lmvex2的附加參數(shù)包括cnt、rent、stride 和skip。參數(shù)cnt和stride如同上面對(duì)于lmvex的說(shuō)明。也就是,存儲(chǔ) 器中將要加載的分量可位于"stride"個(gè)ms大小的單位處,并且cnt定 義要加載的分量的總數(shù)。該rent參數(shù)定義將加載至每一寄存器中目標(biāo) 分量的最大數(shù)。(因此,所需的寄存器總數(shù)取決于cnt和rcnt。)該lmvex2 指令從存儲(chǔ)器加載總共"cnt"個(gè)分量至一個(gè)或更多目標(biāo)寄存器(按照 需要的數(shù)量),其中,僅有"rcnt"個(gè)分量加載至每一目標(biāo)寄存器。(因 此,在一個(gè)實(shí)施例中,rcnt小于或等于可包含在單個(gè)GPR中的ds大小 的目標(biāo)分量的總數(shù),并且rcnt還小于或等于cnt。)
例如,該lmvex2指令從存儲(chǔ)器間隔"stride"個(gè)(ms大小的)單 位加載分量至目標(biāo)寄存器(rD),直到取回"rent"個(gè)分量至單個(gè)寄存 器。此時(shí),如果還沒有取回總共"cnt"個(gè)分量,則下一個(gè)"分量"位 于"skip"個(gè)ms大小的單位處。來(lái)自存儲(chǔ)器相隔"stride"個(gè)(ds大小 的)單位位置的分量然后加載至另一目標(biāo)寄存器(例如,rD+l等), 直到取回"rcnt"個(gè)分量至該目標(biāo)寄存器(或者直到取回"cnt"個(gè)分量, 無(wú)論哪一個(gè)先發(fā)生)。在取回"rent"分量后,如果還沒有取回"cnt" 個(gè)分量,則繼續(xù)將位于"skip"個(gè)單位處的下一個(gè)分量加載至,例如rD + 2。當(dāng)已經(jīng)取回"cnt"個(gè)分量時(shí),加載停止。因此注意,存儲(chǔ)器中對(duì) 于給定目標(biāo)寄存器的分量距離"stride"個(gè)ms大小的單位,在將"skip" 個(gè)ms大小的單位加至前一目標(biāo)寄存器的最后一個(gè)分量的地址后,取回 后面寄存器的分量。還要注意,stride和skip均為有符號(hào)的量,允許負(fù)stride禾卩skip 。
注意,在替換實(shí)施例中,可使用skip—cnt參數(shù),使得在取回skip—cnt 個(gè)分量后,下一分量位于"skip"個(gè)ms大小的單位處。按照這種方式, 在將"rcnt"個(gè)分量載入至目標(biāo)寄存器中后,如果已取回skip一cnt個(gè)分 量,或者基于stride,如果從該指令的起始或從上次重置skip—cnt以來(lái)
還沒有加載skip—cnt個(gè)分量,則基于skip取回后面寄存器的下一個(gè)分
旦 里。
如上對(duì)于lvex的說(shuō)明,處理器14中的計(jì)數(shù)器(例如,在控制單元 28中)可用于在加載矢量分量期間記錄"cnt"。類似地,處理器14 中的計(jì)數(shù)器還可用于在加載每一目標(biāo)寄存器期間記錄"rcnt"。替換實(shí) 施例可使用其它方法記錄cnt和rcnt。另外,在一個(gè)實(shí)施例中,在取回 "rcnt"個(gè)分量之后,每一目標(biāo)寄存器中的其余字節(jié)由預(yù)定值填充,例 如零等。另外,在一個(gè)實(shí)施例中,在從存儲(chǔ)器加載"cnt"個(gè)分量后, 所使用的最后一個(gè)寄存器中的剩余字節(jié)用預(yù)定值填充(例如,零)。
在一個(gè)實(shí)施例中,該目標(biāo)大小(ds)應(yīng)大于或等于該存儲(chǔ)器分量 大小(ms)。如果該目標(biāo)大小(ds)大于該存儲(chǔ)器分量大小(ms), 則該s/u字段可用于適當(dāng)?shù)財(cái)U(kuò)展每一存儲(chǔ)器分量,如同對(duì)于上面指令的 上述說(shuō)明。然而,在一個(gè)實(shí)施例中,如果ds小于ms,則在加載至rD 時(shí),每一分量可被舍入或截短,如下面對(duì)于該存儲(chǔ)指令的說(shuō)明。
圖7表示加載矢量分量流(lstrmvex)指令,其發(fā)起從存儲(chǔ)器向與 目標(biāo)寄存器關(guān)聯(lián)的指定流加載矢量分量流。在使用上述指令時(shí),該 lstrmvex指令也可包括s/u字段、ms字段和ds字段,每一個(gè)在圖7中 表示為跟隨操作符"lstrmvex",并由句點(diǎn)分隔。圖7的lstrmvex指令 還包括三個(gè)操作數(shù)rD, rA和rB。 lstrmvex的附加參數(shù)還包括cnt、 rcnt、 stride 、 skip禾口 skip—cnt 。 參數(shù)cnt、 rcnt、 stride 、 skip禾口 skip—cnt通常 與對(duì)于1 vex , lmvex禾B lmvex2的上述說(shuō)明相同。 lstrawex指令用來(lái)自存儲(chǔ)器的總共"cnt"個(gè)分量加載多個(gè)rD的實(shí) 例(其中,寄存器rA指向存儲(chǔ)器中的第一個(gè)分量),使得該目標(biāo)寄存 器中的每一目標(biāo)分量的大小為ds。 cnt和rent的值確定目標(biāo)rD實(shí)例的 數(shù)量。該lstrmvex指令從間隔"stride"個(gè)ms大小的單位的存儲(chǔ)器加載 矢量分量,直到取回"skip—cnt"個(gè)分量。此時(shí),將"skip * ms"添加 至最后一個(gè)取回的地址(而不是"stride *ms"),以獲得將要加載的 下一分量的地址。另外,此時(shí)重置記錄skip_cnt的機(jī)制(例如,計(jì)數(shù)器)。 因此,每次取回"skip—cnt"個(gè)分量時(shí)(自從該指令的起始或從上次重 置該skip—cnt計(jì)數(shù)器),由"skip",而不是"stride"參數(shù)指示下一分 量的位置。
該"rent"參數(shù)定義每寄存器實(shí)例的目標(biāo)分量數(shù)。(因此,在一個(gè) 實(shí)施例中,rcnt小于或等于單個(gè)GPR中ds大小的目標(biāo)分量的總數(shù),并 且rcnt小于或等于cnt。)例如,該lstrmvex指令從存儲(chǔ)器(根據(jù)參數(shù) stride、 skip以及skip—cnt,如上所述)加載分量至rD (即,rD的第一 個(gè)實(shí)例),直到取回"rent"個(gè)分量。此時(shí),如果還沒有取回"cnt"個(gè) 分量,則下一分量位于"stride"個(gè)ms大小的單位處(或者,如果取回 skip_cnt分量,則下一分量位于"skip"個(gè),而不是"stride"個(gè)ms大 小的單位處)。該lstrawex指令然后繼續(xù)從存儲(chǔ)器(根據(jù)參數(shù)stride、 skip和skip—cnt)向不同的rD實(shí)例(即,rD的第二個(gè)實(shí)例,覆蓋以前 的rD值)加載分量,直到取回"rent"個(gè)分量(或直到取回"cnt"個(gè) 分量,無(wú)論哪一個(gè)先發(fā)生)。如果,在取回"rent"個(gè)分量后,并還沒 有取回"cnt"個(gè)分量,則繼續(xù)加載下一分量至rD (rD的另一實(shí)例)。 當(dāng)取回"cnt"個(gè)分量時(shí),加載停止。rD的每一實(shí)例對(duì)應(yīng)于從存儲(chǔ)器取 回的rcnt個(gè)分量的唯一集合。隨著rD每一實(shí)例的出隊(duì),用分量流中的 下一rcnt個(gè)分量集合加載下一實(shí)例,直到加載該流的總共cnt個(gè)分量。
在一個(gè)實(shí)施例中,rD的實(shí)例基于后面指令中rD的使用或位置出 隊(duì)。例如,在一個(gè)實(shí)施例中,如果rD用作后面指令中特定源寄存器,
則rD實(shí)例出隊(duì)。因此,在執(zhí)行后面指令后(rD作為特定源寄存器), 將在rD中加載下一個(gè)"rcnt"個(gè)分量(假設(shè)還沒有達(dá)到"cnt"個(gè)分量)。 然而,如果rD沒有用作特定源寄存器(即,如果其為不同的目標(biāo)寄存 器,或其為目標(biāo)寄存器),則rD不出隊(duì),并且不將下一 "rent"個(gè)分 量加載至rD。在替換實(shí)施例中,以其它方式指示是否出隊(duì)的選項(xiàng),例 如,通過(guò)指令中的標(biāo)志,或通過(guò)不同的操作碼等(例如,對(duì)應(yīng)于要求 出隊(duì)的指令的特殊子集等)。可選出隊(duì)的示例將在后面參考圖23-26 說(shuō)明。
如上對(duì)于上面指令的說(shuō)明,處理器14中的計(jì)數(shù)器(例如,在控制 單元28中)可在加載矢量分量期間用于記錄"cnt"。類似地,處理器 14中的寄存器還可在加載每一目標(biāo)寄存器期間記錄"rent"。計(jì)數(shù)器還 可用于記錄skip_cnt。替換實(shí)施例可使用其它方法記錄cnt, rcnt,和 skip—cnt。另外,在一個(gè)實(shí)施例中,在加載"rent"個(gè)分量后,每一 目 標(biāo)寄存器或寄存器實(shí)例中的任何剩余字節(jié)由預(yù)定值填充,例如零。另 外,在一個(gè)實(shí)施例中,從存儲(chǔ)器加載"cnt"個(gè)分量后,所使用的最后 一個(gè)目標(biāo)寄存器或寄存器實(shí)例中的剩余字節(jié)用預(yù)定值填充(例如零)。 還要注意,stride和skip可為有符號(hào)量,允許負(fù)的stride和skip 。
在一個(gè)實(shí)施例中,目標(biāo)大小(ds)應(yīng)大于或等于存儲(chǔ)器分量大小 (ms)。如果該目標(biāo)大小(ds)大于該存儲(chǔ)器分量大小(ms),貝Us/u 字段可用于適當(dāng)?shù)赝卣姑恳淮鎯?chǔ)器分量,如對(duì)于上面指令的上述說(shuō)明。 然而,在一個(gè)實(shí)施例中,如果ds小于ms,則在加載至rD時(shí),可舍入
或截短每一分量。
注意,在替換實(shí)施例中,lstrmvex指令的各個(gè)參數(shù)的每一個(gè)可為 可選的,并且此處說(shuō)明的其它指令的替換實(shí)施例也可能如此,例如lvex、 lmvex禾口 lmvex2 J旨令。
圖8表示存儲(chǔ)矢量分量(stvex)指令,其從源寄存器向存儲(chǔ)器存 儲(chǔ)分量。該stvex指令可認(rèn)為是lvex指令的對(duì)應(yīng)。在一個(gè)實(shí)施例中,該 stvex指令使用附加控制字段,例如,s/u字段、ms字段、ss字段和h/1 字段,在圖8中將每一個(gè)表示為跟隨操作符"stvex ",并由句點(diǎn)分隔。 在一個(gè)實(shí)施例中,這些控制字段的每一個(gè)都存在;然而,在替換實(shí)施 例中,僅存在這些控制字段中的一些,或者完全沒有。在一個(gè)實(shí)施例 中,s/u字段(有符號(hào)或無(wú)符號(hào)擴(kuò)展)和ms字段(存儲(chǔ)器大小)與上 面對(duì)于加載指令的說(shuō)明相同。在一個(gè)實(shí)施例中,ss字段對(duì)應(yīng)于源分量 大小字段,其指示源寄存器中每一源分量的大小。例如,在一個(gè)實(shí)施 例中,該ss字段可設(shè)置為sb、 sh或sw之一,以分別指示將存儲(chǔ)至存 儲(chǔ)器的源分量是否為字節(jié)、半字或字。
圖8的stvex指令還包括三個(gè)操作數(shù)rS、 rA和rB。在圖8的實(shí) 施例中,在寄存器rB中指定了附加參數(shù),其中這些附加參數(shù)包括cnt 和stride。(因此,在使用上面的加載指令時(shí),每一rS、 rA和rB可指 示標(biāo)量寄存器34中GPR中的一個(gè)。)該stvex指令從源寄存器rS向 存儲(chǔ)器存儲(chǔ)"cnt"個(gè)ss大小的分量,其中,第一個(gè)分量將存儲(chǔ)在由寄 存器rA指向的存儲(chǔ)器位置,使得存儲(chǔ)器中的每一目標(biāo)分量具有ms大 小(并且可選地截短或拓展,如s/u字段和h/l字段指示)。
還可指定跨度(stride)值,其指示存儲(chǔ)器中的分量如何分隔。也 就是,在存儲(chǔ)時(shí),存儲(chǔ)器中的分量將距離"stride"個(gè)ms大小的單位。 例如,跨度1可用于存儲(chǔ)"cnt"個(gè)相鄰的"ms"大小的分量。類似地, 跨度3可用于向存儲(chǔ)器存儲(chǔ)"cnt"個(gè)"ms"大小的分量,每一個(gè)彼此 間距離3個(gè)"ms"大小的單位。另外,注意,該跨度值可為有符號(hào)值。
在一個(gè)實(shí)施例中,h/1字段為截短控制字段。例如,如果ss大于 ms (即,源大小大于存儲(chǔ)器大小),則該h/l字段可用于指示如何截短 該源分量。例如,如果該h/1字段為"h",則截短該源分量的低階部 分。然而,如果該h/l字段為"1",則截短該源分量的高階部分。注意, 在替換實(shí)施例中,stvex指令還包括舍入控制字段(除了或替換該截短
控制字段),使得如果,例如,ss大于ms,則對(duì)各值進(jìn)行舍入,而不 是截短。例如,在一個(gè)實(shí)施例中,可基于源分量的低階部分,舍入該 源分量的高階部分。
在一個(gè)實(shí)施例中,如果該源分量大小(SS)小于該存儲(chǔ)器分量大
小(ms),則該s/u字段可用于在存儲(chǔ)至存儲(chǔ)器中時(shí)適當(dāng)?shù)財(cái)U(kuò)展每一源
分量??墒褂?s"指示分量是有符號(hào)的,并且因此應(yīng)當(dāng)進(jìn)行符號(hào)擴(kuò)展, 而使用"u"指示分量是無(wú)符號(hào)的,并因此應(yīng)當(dāng)進(jìn)行零擴(kuò)展。
在表示的實(shí)施例中,此處說(shuō)明的任何存儲(chǔ)指令的s/u字段、ms字 段,ss字段和h/l字段可編碼為操作碼或子操作碼的一部分。因此,在 表示的實(shí)施例中,stvex指令包括指示該操作碼的字段、指示rS的字段、 指示rA的字段、指示rB的字段和指示子操作碼的字段。然而,在替 換實(shí)施例中,注意,s/u、 h/1、 ms、和ss字段,連同cnt和stide,還可 在rB中指示。另外,在使用該加載指令時(shí),每一附加參數(shù)還可編碼為 操作碼或子操作碼的一部分,無(wú)需指定寄存器,例如rB。因此注意, 在替換實(shí)施例中,此處說(shuō)明的任何存儲(chǔ)指令可具有各種不同的格式。 另外注意,將參考在寄存器rB中存儲(chǔ)附加參數(shù)說(shuō)明該存儲(chǔ)指令。(如 上所述,如果需要附加參數(shù)和控制字段,則在該指令中可指示多個(gè)寄 存器或存儲(chǔ)位置。)
注意,上面提供的對(duì)于控制字段s/u、 ms、 ss和h/l的說(shuō)明適用于 此處說(shuō)明的所有存儲(chǔ)指令。在使用指令stvex時(shí),在此處說(shuō)明的其它存 儲(chǔ)指令中可存在這些控制字段中的全部, 一些,或完全不存在。還要 注意,對(duì)于此處的討論,rS通常指源寄存器,rA指向?qū)⒁鎯?chǔ)第一個(gè) 分量的存儲(chǔ)器位置,并且rB,如果在該指令中存在的話,保存該指令 的一些或全部附加參數(shù)。
圖9表示存儲(chǔ)多矢量分量(strmvex)指令,其從多個(gè)源寄存器向 存儲(chǔ)器存儲(chǔ)分量。該stmvex指令可認(rèn)為是lnwex指令的存儲(chǔ)對(duì)應(yīng)。在
一個(gè)實(shí)施例中,該stmvex指令使用附加控制字段,例如s/u字段、ss 字段、ds字段和h/1字段,每一個(gè)在圖9中表示為跟隨操作符"stmvex", 并由句點(diǎn)分隔。上面提供的對(duì)于stvex指令的這些字段的說(shuō)明也適用于 該stmvex指令。
圖9的stmvex指令還包括三個(gè)操作數(shù)rS, rA禾口 rB。在圖9的 實(shí)施例中,在寄存器rB中指定附加參數(shù)。其中,這些附加的參數(shù)包括 cnt、 stride、 skip禾口 skip_cnt。該stmvex指令從多個(gè)源寄存器rS (以及 rS之后的寄存器,例如,rS+l, rS+2,按照需要)向存儲(chǔ)器存儲(chǔ)"cnt" 個(gè)ss大小的分量,其中,寄存器rA指向?qū)⒁鎯?chǔ)的第一個(gè)分量的地址, 并且使得存儲(chǔ)器中的每一分量具有ms的大小(并且可選地截短或擴(kuò)展, 根據(jù)s/u和h/l字段的指示)。
在使用stmvex時(shí),跨度值可指示如何分隔存儲(chǔ)器中的分量。因此, 來(lái)自rS的源分量存儲(chǔ)至存儲(chǔ)器,使得它們距離"stride"個(gè)(ms大小 的)單位放置,直到存儲(chǔ)了 "skip_cnt"個(gè)分量。此時(shí),向最后一個(gè)存 儲(chǔ)的分量的地址增加"skip*ms"(而不是"stride*ms"),以獲得將 要存儲(chǔ)的下一個(gè)分量的地址。另外,此時(shí),重置用于記錄skip—cnt的機(jī) 制(例如,計(jì)數(shù)器)。因此,每次存儲(chǔ)"skip—cnt"個(gè)分量時(shí)(從該指 令的開始或從上次重置skip一cnt計(jì)數(shù)器),將要存儲(chǔ)的下一個(gè)分量的地 址由skip參數(shù)指示,而不是由stride參數(shù)指示。在將來(lái)自rS的源分量 存儲(chǔ)至存儲(chǔ)器時(shí),將來(lái)自下一源寄存器的源分量(例如,rS+l等)基 于stride、 skip和skip—cnt參數(shù)存儲(chǔ)至存儲(chǔ)器,直到存儲(chǔ)了 "cnt"個(gè)分
如上對(duì)于加載指令的說(shuō)明,處理器14中的計(jì)數(shù)器(例如控制單元 28中)可用于適當(dāng)?shù)赜涗沜nt和skip—cnt。例如,計(jì)數(shù)器可用于指示 skip—cnt個(gè)分量,其中,在存儲(chǔ)了 skip—cnt個(gè)分量后,重置該計(jì)數(shù)器, 并且將下一 skip—cnt個(gè)分量存儲(chǔ)在起始處由skip指示的位置。繼續(xù)如 此,例如,直到存儲(chǔ)了 cnt個(gè)分量(其可由,例如,另一計(jì)數(shù)器指示)。
替換實(shí)施例可使用其它方法記錄cnt和skip_cnt。
注意,在一個(gè)實(shí)施例中,如果ss小于ms,則可適當(dāng)?shù)財(cái)U(kuò)展每一源 分量,如同s/u字段(如對(duì)于sWex的說(shuō)明)所指示,以生成存儲(chǔ)器目 標(biāo)分量。另外,在一個(gè)實(shí)施例中,如果ss大于ms,則適當(dāng)?shù)亟囟堂恳?源分量,如同h/l字段(如對(duì)于stvex的說(shuō)明)所指示,以生成存儲(chǔ)器 目標(biāo)分量。
圖10表示另一存儲(chǔ)多矢量分量(stmvex2)指令,其從多個(gè)目標(biāo) 寄存器向存儲(chǔ)器存儲(chǔ)分量。該stmvex2指令可視為lmvex2指令的存儲(chǔ) 對(duì)應(yīng)。在一個(gè)實(shí)施例中,該stmvex2指令使用附加控制參數(shù),例如s/u 字段、ss字段、ds字段和h/l字段,每一個(gè)在圖10中表示為跟隨操作 符"stmvex2 ",并由句點(diǎn)分隔。上面對(duì)于stvex和stmvex指令的這些 控制字段提供的說(shuō)明也適用于stmvex2指令。
圖10的stmvex2指令還包括三個(gè)操作數(shù)rS、 rA和rB。在圖10 的實(shí)施例中,在rB中指定附加參數(shù),其中,這些附加參數(shù)包括cnt、rcnt、 stride和skip。該stmvex2指令從多個(gè)源寄存器rS (以及rS之后的寄存 器,例如,rS+l、 rS+2,按照需要)向存儲(chǔ)器存儲(chǔ)"cnt"個(gè)ss大小的 分量,其中,寄存器rA指向?qū)⒁鎯?chǔ)的第一個(gè)分量的地址,并且使得 存儲(chǔ)器中的每一分量具有ms的大小(并且可選地截短或擴(kuò)展,如s/u 和h/l字段所指示)。該rcnt參數(shù)定義將要存儲(chǔ)的每個(gè)源寄存器的源分 量的數(shù)量,并且該cnt參數(shù)定義將要存儲(chǔ)的分量的總數(shù)。
在使用stnwex2時(shí),跨度(stride)值可指示如何分隔存儲(chǔ)器中的 分量。因此,來(lái)自rS的源分量存儲(chǔ)至存儲(chǔ)器,使得它們距離"stride" 個(gè)(ms大小的)單位放置。在一個(gè)實(shí)施例中,在存儲(chǔ)"rent"個(gè)來(lái)自 給定源寄存器(rS)的分量后,如果要存儲(chǔ)其余的分量,則向最后一個(gè) 存儲(chǔ)的分量的地址增加"skip*ms"(而不是"stride*ms"),以獲得 將要存儲(chǔ)的下一個(gè)分量的地址。然后將來(lái)自下一個(gè)源寄存器(例如,
rS+l等)的"rent"個(gè)源分量利用所指示的"stride"值存儲(chǔ)至存儲(chǔ)器。 繼續(xù)如此,直到存儲(chǔ)了"cnt"個(gè)分量。注意,在一個(gè)實(shí)施例中,如"rcnt^s" 小于該源寄存器的大小,則忽略每一源寄存器的其余低階部分。還要 注意,"stride"和"skip"可為有符號(hào)的量,從而允許負(fù)的stride和skip。
注意,在替換實(shí)施例中,還可使用skip—cnt參數(shù),使得在存儲(chǔ)了 skip—cnt個(gè)分量之后,下一個(gè)分量位于"skip"個(gè)ms大小的單位處(而 不是"stride"個(gè)ms大小的單位處)。按照這種方式,在向存儲(chǔ)器存儲(chǔ) 了 "rent"個(gè)分量后,如果存儲(chǔ)了 skip—cnt個(gè)分量,或者基于stride, 如果自從該指令的起始或從上次重置skip_cnt以來(lái)沒有存儲(chǔ)skip—cnt 個(gè)分量,則基于skip將來(lái)自后面寄存器的下一個(gè)分量存儲(chǔ)至存儲(chǔ)器中 的位置。
如上對(duì)于該加載指令的說(shuō)明,處理器14中的計(jì)數(shù)器(例如,控制 單元28中)可用于適當(dāng)?shù)赜涗沜nt和rcnt。替換實(shí)施例可使用其它方 法記錄cnt禾卩rcnt。
注意,在一個(gè)實(shí)施例中,如果ss小于ms,則適當(dāng)擴(kuò)展每一源分量, 如同s/u字段所指示(如對(duì)于stvex的說(shuō)明),以生成存儲(chǔ)器目標(biāo)分量。 另外,在一個(gè)實(shí)施例中,如果ss大于ms,則適當(dāng)?shù)亟囟堂恳辉捶至浚?如同h/l字段所指示(如同對(duì)于stvex和stmvex的說(shuō)明),以生成存儲(chǔ) 器目標(biāo)分量。還可以可選地指定舍入,如前對(duì)于stvex指令的說(shuō)明。
圖ll表示存儲(chǔ)矢量分量流(ststrmvex)指令,其發(fā)起從指定流向 存儲(chǔ)器存儲(chǔ)矢量分量流。該ststrmvex指令可視為lstrmvex指令的存儲(chǔ) 對(duì)應(yīng)。在一個(gè)實(shí)施例中,該ststrmvex指令使用附加控制字段,例如s/u 字段、ss字段、ds字段和h/l字段,每一個(gè)在圖11中表示為跟隨操作 符"ststrmvex",并由句點(diǎn)分隔。對(duì)于stvex、 stmvex禾卩stmvex2指令 的這些字段的說(shuō)明在這里也適用于ststrmvex指令。
圖11的ststrmvex指令還包括三個(gè)操作數(shù)rS、 rA和rB。在圖11 的實(shí)施例中,附加參數(shù)在寄存器rB中指定,其中,這些附加參數(shù)包括 cnt、 rcnt、 stride、 skip禾口 skip_cnt。該ststrmvex指令向存儲(chǔ)器存儲(chǔ)具 有總共"cnt"個(gè)分量的源寄存器rS的多個(gè)實(shí)例,其中,rA指向第一個(gè) 將要存儲(chǔ)的分量的地址。該"cnt"參數(shù)因此定義將要存儲(chǔ)的分量的總 數(shù),并且"rent"參數(shù)定義每個(gè)源寄存器rS的實(shí)例的源分量數(shù)。該 ststrmvex指令從rS (即,rS的第一個(gè)實(shí)例)向存儲(chǔ)器存儲(chǔ)分量,使得 它們距離"stride"個(gè)(ms大小的)單位,直到存儲(chǔ)了 "skip_cnt"個(gè) 分量。此時(shí),將"skip*ms"添加至最后一個(gè)存儲(chǔ)的分量的地址(而不 是"stride*mS"),以獲得下一分量的地址。另外,此時(shí),重置記錄 skip_cnt的機(jī)制(例如,計(jì)數(shù)器)。因此,每次存儲(chǔ)"skip一cnt"個(gè)分 量時(shí)(自從該指令的起始或從上次重置該skip—cnt計(jì)數(shù)器),由"skip" 參數(shù),而不是"stride"參數(shù)指示下一分量的位置。
另外,在從rS的給定實(shí)例存儲(chǔ)"rent"個(gè)分量后,如果還有分量 要存儲(chǔ)(即,還沒有存儲(chǔ)"cnt"個(gè)分量),則將"stride*ms"添加至 最后一個(gè)存儲(chǔ)的分量的地址(除非已經(jīng)存儲(chǔ)了 "skip_cnt"個(gè)分量,在 這種情況下,將"skip*ms",而不是"stride*ms"添加至最后一個(gè)存 儲(chǔ)的分量的地址),以獲得從rS的下一個(gè)實(shí)例存儲(chǔ)的第一個(gè)分量的地 址(例如,在執(zhí)行rS用作目標(biāo)寄存器的指令后存儲(chǔ))。例如,在一個(gè) 實(shí)施例中,在rS用作指令的目標(biāo)寄存器時(shí)實(shí)例入隊(duì)。例如,如果rS用 作后面指令的目標(biāo)寄存器,并且還沒有存儲(chǔ)"cnt"個(gè)分量,則根據(jù)stride、 skip和skip—cnt參數(shù)將來(lái)自rS (該后面指令的目標(biāo)寄存器)的"rent" 個(gè)分量(包括,例如,后面指令結(jié)果的全部或部分)存儲(chǔ)至存儲(chǔ)器。 在此實(shí)施例中,如果rS沒有用作指令的目標(biāo)寄存器,則其在執(zhí)行該指 令時(shí)不入隊(duì)(并因此不存儲(chǔ)為該矢量流的一部分)。在替換實(shí)施例中, 可使用其它機(jī)制,例如指令中的標(biāo)志,或者操作碼(例如,對(duì)應(yīng)于要 求入隊(duì)的指令的特殊子集等)指示rS的實(shí)例是否入隊(duì)。
注意,在一個(gè)實(shí)施例中,如果"rentes"小于源寄存器的大小,
則忽略該源寄存器的剩余低階部分。還要注意,"stride"和"skip"可 為有符號(hào)的量,從而允許負(fù)的stride和skip。
如上對(duì)于加載指令的說(shuō)明,處理器14中的計(jì)數(shù)器(例如,在控制 單元28中)可用于適當(dāng)?shù)赜涗沜nt、 rcnt、 skip和skip—cnt。替換實(shí)施 例可使用其它方法記錄這些參數(shù)。
注意,在一個(gè)實(shí)施例中,如果ss小于ms,則每一源分量被適當(dāng)?shù)?擴(kuò)展,如s/u字段所指示(如對(duì)于stvex的說(shuō)明),以生成存儲(chǔ)器目標(biāo) 分量。另外,在一個(gè)實(shí)施例中,如果ss大于ms,則每一源分量被適當(dāng) 地截短,如h/l字段所指示(如對(duì)于stvex和stmvex的說(shuō)明),以生成 存儲(chǔ)器目標(biāo)分量??商鎿Q地,可使用舍入生成存儲(chǔ)器目標(biāo)分量。
將參考圖12-16說(shuō)明上述各種不同加載指令的示例。圖12表示存 儲(chǔ)器的一部分100,其可對(duì)應(yīng)于,例如,圖1的存儲(chǔ)器12的全部或一 部分。為了說(shuō)明簡(jiǎn)單起見,將存儲(chǔ)器部分100示出為128位寬的存儲(chǔ) 器,但在給定實(shí)施例中的實(shí)際配置可以不同。例如,存儲(chǔ)器部分100 包括矩陣102,其第一行存儲(chǔ)在位置0x12-0x16 (對(duì)應(yīng)于半字A、 B和 C),第二行存儲(chǔ)在位置0x22-0x26 (對(duì)應(yīng)于半字D、 E和F),并且第 三行存儲(chǔ)在位置0x32-0x36 (對(duì)應(yīng)于半字G、 H和I)。存儲(chǔ)器部分100 包括矩陣106,其第一行存儲(chǔ)在位置0x54-0x58 (對(duì)應(yīng)于半字K、 L和 M),第二行存儲(chǔ)在位置0x64-0x68 (對(duì)應(yīng)于半字N、 O和P),第三 行存儲(chǔ)在位置0x74-0x78 (對(duì)應(yīng)于半字Q、 R和S)。存儲(chǔ)器部分100 包括矩陣108,其第一行存儲(chǔ)在位置0x8A-0x8E (對(duì)應(yīng)于半字aa、 bb 和cc),第二行存儲(chǔ)在位置0x9A-0x9E (對(duì)應(yīng)于半字dd、 ee和ff), 第三行存儲(chǔ)在位置OxAA-OxAE (對(duì)應(yīng)于半字gg、 hh和ii)。存儲(chǔ)器部 分100包括存儲(chǔ)在位置0x46-0x4E的矢量104,其對(duì)應(yīng)于半字pp、 qq、 rr、 ss和tt。存儲(chǔ)器部分100還包括分別存儲(chǔ)在位置0xA2、 OxA3、 0xA4 和OxA5的字節(jié)大小的分量T、 U、 V和W。注意,在替換實(shí)施例中,存儲(chǔ)器部分100可以不同方式尋址。另 外,存儲(chǔ)器部分100可為任何大小,并可保存任何類型的信息,還可 位于數(shù)據(jù)處理系統(tǒng)的任何位置。
當(dāng)矩陣存儲(chǔ)為圖12中的矩陣102和106時(shí),上述加載和存儲(chǔ)指令 可用于執(zhí)行,例如,矩陣運(yùn)算。也就是,注意到每一矩陣102和106 存儲(chǔ)為3X3 二維矩陣。另外,在一個(gè)實(shí)施例中,矩陣運(yùn)算的結(jié)果還可 以相同的格式存儲(chǔ),如3X3二維矩陣,例如,矩陣108。因此,注意 到,下面的偽碼可用于執(zhí)行矩陣102和矩陣106第一行的和,以獲得 最終的第一行矩陣108。
/*R7存儲(chǔ)0x12,并且R8存儲(chǔ)cnt值3和stride值1*/ lvex.u.mh.dh R0, R7, R8
/*R9存儲(chǔ)0x54,并且R10存儲(chǔ)cnt值3和stride值1*/ lvex.u.mh.dh Rl, R9, RIO
add.h R2, R0, Rl /*對(duì)R0和Rl中四個(gè)獨(dú)立的半字分量
求和,并將結(jié)果存儲(chǔ)至R2V
/*R11存儲(chǔ)0x8A,并且R12存儲(chǔ)cnt值3和stride值1*/ stvex.u.mh.sh R2, Rll, R12
注意,在此實(shí)施例中,R7存儲(chǔ)矩陣102的第一行的起始地址 (0x12),并且R8用作rB,以存儲(chǔ)上面參考圖2和圖3說(shuō)明的cnt和 stride參數(shù)。類似地,R9存儲(chǔ)矩陣106的第一行的起始地址(0x54), 并且R10用作rB,以存儲(chǔ)cnt和stride參數(shù)。R11用于存儲(chǔ)R2的第一 分量將要存儲(chǔ)的位置(0x8A),并且R12用于存儲(chǔ)cnt和stride參數(shù)。
圖13表示執(zhí)行上述偽碼后的寄存器文件(例如,圖1的標(biāo)量寄存 器文件34等)。注意,利用執(zhí)行第一條lvex指令,將矩陣102的A、 B和C加載至RO, RO的最后一個(gè)字段由預(yù)定值填充(例如,當(dāng)前實(shí)施 例中的零)。類似地,利用執(zhí)行第二條lvex指令,將矩陣106的K、 L
和M加載至R1。因此,注意,僅利用單個(gè)指令即可容易地加載每一矩
陣的第一行,其允許指定cnt和stride。該add.h指令對(duì)R0和Rl中的 四個(gè)獨(dú)立的半字分量進(jìn)行求和,并且將四個(gè)最終的半字分量放入R2。 注意,lvex指令允許用零填充RO和Rl的最后一個(gè)未使用的字段(因 為cn"ds小于64位,R0禾BR1的寬度),這兩個(gè)寄存器的和在R2的 不想要的字段中導(dǎo)致零。按照這種方式,不是在R2的不想要的字段中 具有未知值(或由于未知值的和造成出現(xiàn)不希望的異常條件),而是 為已知的預(yù)定值(在此示例中為零)。然后使用stvex指令將R2的頭 3個(gè)字段存儲(chǔ)至存儲(chǔ)器,使得aazA+K, bb=B+L和cc=C+H。
然后通過(guò)下面的偽碼完成矩陣102和106的和。
add R7, 0x10 add R9, 0x10 add Rll, 0x10 lvex.u.mh.dh R0, lvex.u.mh.dh Rl, add.h
stvex.u.mh.sh R2, add R7, 0x10 addR9, 0x10 addRll, 0x10 lvex.u.mh.dh R3, lvex.u.mh.dh R4, add.h
stvex.u.mh.sh R5,
/*R7現(xiàn)在存儲(chǔ)0x22*/ /*R9現(xiàn)在存儲(chǔ)0x64*/ /*R11現(xiàn)在存儲(chǔ)0x9A*/
R7, R8
R9, RIO R2, R0, Rl
Rll, R12
/*R7現(xiàn)在存儲(chǔ)0x32*/ /*R9現(xiàn)在存儲(chǔ)0x74*/ /*R11現(xiàn)在存儲(chǔ)OxAA*/
R7, R8
R9, RIO
R5, RO, Rl
Rll, R12
頭三個(gè)求和指令增加了 R7, R9和R11的值,使得它們均分別指 向每一矩陣102、 106和108的第二行的第一個(gè)分量。圖14表示執(zhí)行 上面代碼后圖13的寄存器文件。頭兩個(gè)lvex指令后,D、 E和F載入
至R0,并且N、 0和P載入至R1。該add.h指令對(duì)R0和Rl中的四個(gè) 獨(dú)立半字分量求和,并將最終的四個(gè)半字分量放入R2。然后由stvex 指令將該結(jié)果存儲(chǔ)至矩陣108中的存儲(chǔ)器,使得dd二D+N、 e^E+0以 及ff=F+P。第五至第七條求和指令再一次地增加了 R7、 R9和Rll的 值,使得它們均分別指向每一矩陣102、 106和108的第三行的第一個(gè) 分量。注意,用于加載矩陣102和106的第三行的lvex指令將它們分 別加載至R3和R4,而不是R0和R1。應(yīng)當(dāng)理解,替換實(shí)施例可按照 需要使用這些寄存器中的任一個(gè),以執(zhí)行這些操作。例如,可連續(xù)覆 蓋同樣的寄存器(例如,R0和R1)或可使用不同的寄存器(例如R3 和R4)。最后一條存儲(chǔ)指令將結(jié)果存儲(chǔ)至矩陣108,使得gg=G+Q、 hh=H+R以及ii=I+S。
注意,在替換實(shí)施例中,可使用不同的代碼和指令對(duì)矩陣102和 106進(jìn)行求和,并將結(jié)果存儲(chǔ)至108。例如,上面的偽碼可寫在循環(huán)中, 使得在循環(huán)體中對(duì)于這些矩陣的每一行具有兩個(gè)lvex和一個(gè)stvex指 令,其中,該循環(huán)執(zhí)行3次,每行一次。可替換地,可使用不同的矢 量加載和存儲(chǔ)指令將所有的矩陣102和矩陣106—次送入寄存器文件。 這可使用,例如lmvex或lmvex2指令完成。例如,圖15和16表示將 矩陣102加載至寄存器R0、 R1和R2的兩個(gè)示例。
圖15表示例如使用lvmvex指令加載矩陣102后的寄存器文件。 在下面的lvmex指令中,假設(shè)R7指向矩陣102的起始(R7存儲(chǔ)0x12), 并且R8對(duì)應(yīng)于rB,其存儲(chǔ)cnt值9, stride值1 , skip值6和skip—cnt
值3。因此,可使用下列指令
lmvex.u.mh.dh RO , R7 , R8 /*cnt=9 , stride=l , skip=6且 skip_cnt=3*/
因此,如圖15中所示,分量A、 B和C載入至RO,每一個(gè)在存 儲(chǔ)器中連續(xù),因?yàn)檫@些分量距離"stride*ms"或1個(gè)半字放置。然后, 由于加載了 skip—cnt個(gè)(即,3個(gè))分量,將位于"skip*ms"(即,6
個(gè)半字)處,而不是"stride*ms"(即,1個(gè)半字)處的下一個(gè)分量D 作為R0的第四個(gè)分量加載。然后,分量E和F加載至Rl,其為RO 之后的寄存器,直到再 一 次地加載skip—cnt分量,從而需要"跳躍(skip)" 至下一個(gè)分量G,其位于6個(gè)半字處。繼續(xù)如此,直到加載了 "cnt" 個(gè)分量。因此,最后一個(gè)分量I加載至R2的第一個(gè)字段。注意,R2 的其余字段由預(yù)定值填充(在此示例中為零)。
圖16表示使用例如,lmvex2指令加載矩陣102后的寄存器文件, 在該指令中指定cnt、 rcnt、 skip和skip_cnt。在下面的lmvex指令中, 假設(shè)R7指向矩陣102的起始(R7存儲(chǔ)0xl2),并且R8對(duì)應(yīng)于rB, 其存儲(chǔ)cnt值9, rcnt值3, stride值1和skip值6。因此,可使用下面 的指令
lmvex2.u.mh.dh R0,R7,R8 /*cnt=9,rcnt=3, stride=l, skip=6*/
因此,如圖16中所示,分量A、 B和C載入至RO,每一個(gè)在存 儲(chǔ)器中連續(xù),因?yàn)榭缍?stride)為"stride*ms"或1個(gè)半字。此時(shí), 在RO中載入rcnt個(gè)分量(即,3個(gè)),并且因此,從"skip*ms"(即, 6個(gè)半字)位置處加載下一分量D。此外,不將下一分量D作為RO的 第四個(gè)分量加載,如同在圖15的前一示例中利用lvmvex指令的做法, 而是作為Rl (其為RO之后的寄存器)的第一個(gè)分量加載,因?yàn)镽O已 經(jīng)具有"rcnt"個(gè)分量。分量E和F也加載至R1,對(duì)于Rl完成值為3 的rcnt。由于已經(jīng)在Rl中加載了 rcnt個(gè)分量(并且,還沒有加載cnt 個(gè)分量,即9個(gè)),因而從由skip確定的位置,即6個(gè)半字處的位置, 將下一個(gè)分量G取回至R2。另外,分量H和I也載入至R2。此時(shí), 已經(jīng)加載了 cnt個(gè)分量。還要注意,RO, Rl和R2的每一未使用的字 段由預(yù)定值填充(在此例中為零)。
在替換實(shí)施例中,如上所述,lvmvex2指令還可允許指定skip—cnt 字段。例如,還可使用lmvex2指令,如上利用值為3的skip—cnt,如
圖16所示加載矩陣102。在此示例中(仍然指圖16和上面的具有所有
同樣參數(shù)和附加的skip—cnt=3的lvmvex2指令),分量A、 B和C載 入至R0,每一個(gè)在存儲(chǔ)器中連續(xù),因?yàn)檫@些分量距離"stride*ms"或 l個(gè)半字放置。然后,由于已經(jīng)加載了 skip—cnt個(gè)(即,3個(gè))分量, 則加載位于"skip*ms"(即,6個(gè)半字)處,而不是位于"stride*ms" (即,l個(gè)半字)處的下一分量D。另外注意,僅在每一寄存器中加載 rcnt個(gè)(即,3個(gè))分量。因此,不將下一分量D作為RO的第四分量 加載,如同圖15的前一示例使用lmvex指令那樣,而是作為Rl (其為 R0后面的寄存器)的第一個(gè)分量加載。然后分量E和F也加載至R1。 由于再一次地加載了 skip—cnt個(gè)分量(并且還沒有加載cnt個(gè)分量,即 9個(gè)),則下一分量G位于6個(gè)半字處。另外,由于已經(jīng)將rcnt個(gè)分 量加載至R1,則將下一分量G連同H和I一起加載至R2。此時(shí),加 載了 cnt個(gè)分量。還要注意,R0, Rl和R2的每一未使用的字段由預(yù) 定值填充(在此例中為零)。
因此,采用上述加載指令的各種實(shí)施例,諸如矩陣102的矩陣可 容易地以多種方式從存儲(chǔ)器移動(dòng)至寄存器文件。還要注意,使用rent 參數(shù)允許減少在使用傳統(tǒng)編程方法從存儲(chǔ)器加載矢量分量時(shí)所需的掩 碼運(yùn)算。
在替換實(shí)施例中,上述指令可比此處說(shuō)明的指令包括更多,更少 或不同的參數(shù)。例如,在不同的實(shí)施例中,該lmvex2指令可以考慮, 也可以不考慮skip—cnt參數(shù)。還要注意,上面提供的示例指令將s/u字 段設(shè)置為u,使得如果有必要的話,在存儲(chǔ)至寄存器時(shí),對(duì)這些分量進(jìn) 行零擴(kuò)展。在一個(gè)實(shí)施例中,可將s/u字段設(shè)置為"s",或者省略該 字段。例如,在一個(gè)實(shí)施例中,如果ms:ds,則省略或忽略該s/u字段。
圖16還表示加載指令的示例,其從存儲(chǔ)器部分100的位置0xA2、 OxA3和OxA4向R4加載T、 U和V。例如,可使用下面的lvex指令, 其中假設(shè)R10存儲(chǔ)起始值0xA2并且Rl 1存儲(chǔ)cnt值3和stride值1 。
lvex.u.mb.dh R4, RIO, Rll
注意,存儲(chǔ)器大小(mb)與目標(biāo)大小(dh)是不同的。也就是, 在此處說(shuō)明的所有指令中,可獨(dú)立地設(shè)置每一存儲(chǔ)器大小和目標(biāo)大小 (在存儲(chǔ)指令的情況下為源大小),使得它們相同或者不同。在上面 的示例中,注意,存儲(chǔ)器大小設(shè)置為mb,表明存儲(chǔ)器中每一分量(T、 U和V)的大小為字節(jié)。然而,目標(biāo)大小設(shè)置為dh,以表示R4中目標(biāo) 大小為半字,其大于字節(jié)。因此,在R4中加載cnt個(gè)分量(3個(gè)分量), 其中,適當(dāng)?shù)財(cái)U(kuò)展每一分量T、 U和V,以填充半字目標(biāo)大小。在此示 例中,它們按照".u"所示進(jìn)行零擴(kuò)展(即,無(wú)符號(hào)擴(kuò)展)。然而,可 使用".s"對(duì)每一分量進(jìn)行有符號(hào)擴(kuò)展。另外,注意,由于"cnt*ds" 為3個(gè)半字(即46位),并且從而小于R4的大小,則R4的其余未使 用部分由預(yù)定值填充(在此示例中為零)。
圖17表示寄存器文件的示例,其中,利用值為1的stride和值為 2的stride加載存儲(chǔ)器部分100的矢量104。在一個(gè)示例中,假設(shè)通過(guò) 存儲(chǔ)0x46, R7指向pp,矢量104的起始,并且R10存儲(chǔ)cnt值5, stride 值1和skip_cnt值5。注意,skip的值在此示例中無(wú)關(guān)緊要,因?yàn)?cnt=skip—cnt (即從存儲(chǔ)器正在加載單個(gè)矢量,無(wú)需不斷地"跳躍")。 因此可使用下面的指令將矢量104加載至寄存器文件。
lmvex.u.mh.dhRl, R7, RIO /*cnt=5, stride=l, skip_cnt=5*/
在上面的示例中,將cnt個(gè)(5個(gè))分量加載至寄存器文件,從 Rl開始,然后是R2。由于stride二l,并且后面的分量距離"stride" 個(gè)ms大小的單位放置,則將要加載的分量彼此距離l個(gè)半字。因此, 5個(gè)連續(xù)的半字(pp、 qq、 rr、 ss和tt)載入至寄存器Rl和R2。還要 注意,R2的其余未使用部分由預(yù)定值填充(在此例中為零)。另外注 意,對(duì)于s/u字段可使用".s"代替?;蛘呖商鎿Q地,不提供該s/u字段。
在另一實(shí)施例中,假設(shè)R7指向pp (存儲(chǔ)0x46),并且R10存儲(chǔ) cnt值3和stride值2。因此,可使用下面的指令每隔一個(gè)分量向該寄 存器加載矢量104。
lvex.u.mh.dh R4, R7, RIO /*cnt=3, stride=2*/
在此示例中,可使用lvex指令,因?yàn)閏n"ms (3隔半字)適合單 個(gè)寄存器(所示實(shí)施例中的64位寄存器)。利用此lvex指令,將cnt 個(gè)分量(3個(gè)分量)加載至R4,其中,后面的分量距離"stride"個(gè)ms 大小的單位放置。因此,在此示例中,后面的分量以距離2個(gè)半字 ("stride*mS")放置,因此,在加載每一分量后,下一分量從2個(gè)半 字處取回。例如,從0x46取回pp,從0x4A (0x46+0x2)取回rr。如 此繼續(xù),直到加載3個(gè)分量。還要注意,R4的未使用部分由預(yù)定值填 充(在此示例中為零)。
圖18表示處于四個(gè)不同時(shí)刻(time二O, time=l, time = 2, time =3)的存儲(chǔ)器的一部分200,其可對(duì)應(yīng)于,例如,圖1的存儲(chǔ)器12的 全部或部分(或者可位于數(shù)據(jù)處理系統(tǒng)的任何地方)。在說(shuō)明的實(shí)施 例中,存儲(chǔ)器部分200示出為64位寬存儲(chǔ)器。注意,在替換實(shí)施例中, 可以各種不同方式將存儲(chǔ)器部分200格式化為具有不同的寬度。存儲(chǔ) 器部分200分別在存儲(chǔ)器位置0x08, OxOA, OxOC, OxOE和0x10存儲(chǔ) 分量Q, C3, C2, d和Q)。分量t、 u和v分別存儲(chǔ)在0x12, 0x14和 0x16。存儲(chǔ)器部分200還在timei時(shí)分別在位置0x20, 0x22, 0x24, 0x26和0x28存儲(chǔ)X.4, X.3, X.2, X.!和XQ。在一個(gè)實(shí)施例中,這些值 的每一個(gè)可以指以特定采樣速率采樣的數(shù)字采樣信號(hào)的各種時(shí)間采
樣。例如,在time二O,當(dāng)前采樣由Xo表示,并且一個(gè)時(shí)間延遲(即, l/采樣速率)前的采樣由X.i表示,兩個(gè)時(shí)間延遲(即,2*1/采樣速率)
前的采樣由X.2表示,等等。
接下來(lái),在time二l,當(dāng)前采樣由X!表示,并且一個(gè)時(shí)間延遲(即, l/采樣速率)前的采樣由Xo表示,兩個(gè)時(shí)間延遲(即,2*1/采樣速率) 前的采樣由X.i表示,等。注意,最新的采樣覆蓋最老的時(shí)間采樣,在 示出time=l的示例中其為X.4。因此,在time=2,當(dāng)前采樣乂2覆蓋X.3, 并且,在time二3,當(dāng)前采樣乂3覆蓋義2。因此,存儲(chǔ)位置0x20, 0x22, 0x24, 0x26和0x28可實(shí)現(xiàn)循環(huán)緩沖,其連續(xù)地存儲(chǔ)進(jìn)來(lái)的數(shù)字采樣信 號(hào)的時(shí)間采樣。在替換實(shí)施例中,可對(duì)于不同的原因或應(yīng)用實(shí)現(xiàn)循環(huán) 緩沖。
在一個(gè)實(shí)施例中,可使用修改的lmvex加載指令按照某種方式將 該循環(huán)緩沖的值正確地送入寄存器文件的寄存器(如將參考圖19-22 的說(shuō)明),該方式為這些值處于用于計(jì)算的正確的希望的順序,例如, 在執(zhí)行濾波函數(shù)時(shí)。例如,下面的等式對(duì)應(yīng)于濾波函數(shù),其中,Yo, Y" Y2和Y3分別對(duì)應(yīng)于在time=0, time=l, time=2, time=3時(shí)的結(jié)果: Eq.l Yo=Co*Xo+C1*X.1+C2*X.2+C3*X.3+C4*X.4 Eq.2 Y產(chǎn)C^Xi+C^Xo+CZX.!+CX.2+CX陽(yáng)3 Eq.3 Y2=Co*X2+C1*X1+C2*X()+C3*X.1+C4*X.2 Eq.4 YfCVXrH^Xz+C^Xi+C^Xo+CZX-i
在一個(gè)實(shí)施例中,該修改的lmvex指令稱為一次跳躍加載多個(gè)矢 量分量(lmvex—skip—once )指令,如圖27中所示。圖27的 lmvex_skip_once指令包括s/u字段、ms字段和ds字段,其就是按照上 面對(duì)于lmvex指令的說(shuō)明操作。該lmvex_skip—once指令還采用三個(gè)操 作數(shù)rD、 rA禾Q rB。該lmvex_skip—once指令使用附加參數(shù)cnt、 stride、 skip和skip—cnt,其中,它們存儲(chǔ)在由rB表示的一個(gè)或多個(gè)寄存器中, 或由該指令的子操作碼指定。除了 skip—cnt附加參數(shù)外,所有操作數(shù)和 附加參數(shù)以與對(duì)于lvmex指令的說(shuō)明相同的方式操作。如上所述,該 lmvex指令取回skip—cnt個(gè)分量,并且然后使用"skip"參數(shù)取回下一 個(gè)分量。此時(shí),必須重置該skip—cnt計(jì)數(shù)器,使得在再一次跳躍前取回
下一skip—cnt個(gè)分量。如此繼續(xù),直到加載了cnt個(gè)分量。與lmvex指 令不同,lmvex—skip—once指令在取回skip—cnt個(gè)分量后并不重置該 skip—cnt計(jì)數(shù)器。因此,在取回skip—cnt個(gè)分量后,下一個(gè)分量位于skip 個(gè)ms大小的單位處。然而,從該指針開始,skip—cnt計(jì)數(shù)器持續(xù)遞減 (即,不重置),直到取回"cnt"個(gè)分量。
例如,如將參考圖19-22的說(shuō)明,下面的偽碼段可用于計(jì)算上面 等式l、 2、 3和4的濾波結(jié)果Yo, Yp YjPY3。
/*初始化R12,以存儲(chǔ)cnt值5和stride值1*/ /*初始化R13,以存儲(chǔ)cnt值5, stride值1, skip_cnt值5和skip 值-4*/
嚴(yán)初始化R1,以存儲(chǔ)0x08V 嚴(yán)初始化R2,以存儲(chǔ)0x20W
lmvex.u.mh.dh R6, Rl, R12 /*將Q-Q加載至R6,將C0
加載至R7*/
loop:
lmvexskiponce.u.mh.dh R8, R2, R13 /*在第一次迭代中,將 X.4-X.i加載至R8,并將Xo加載至R9817
vmac.h R10 , R6 , R8 /*在第 一 次迭代中,將 C^X.4+CVX.3+CX.2+CXd加載至R10*/
vmac.h Rll, R7, R9 /*在第一次迭代中,將Co*Xo存儲(chǔ)至 R11*/
add RIO, RIO, Rll /*在第一次迭代中,將Yo存儲(chǔ)至R10"
"在RIO中的值可存儲(chǔ)至存儲(chǔ)器*/
add R2, R2, 2 /*將R2中的指針向前移動(dòng)2*/
/*修改Rl3中的值,使得"skip_cnt=skip_cnt-1" */
branch loop
循環(huán)由上面代碼段中的標(biāo)簽"l00p:"表示,在進(jìn)入該循環(huán)之前,,
用cnt值5禾B stride值1初始化R12,用cnt值5, stride值1, skip—cnt 值5和skip值-4初始化R13。因此,寄存器R12和R13可在后面的矢 量加載指令中用作"rB"。初始化Rl指向常矢量的起始(位于0x08 的C》。初始化R2指向循環(huán)緩沖的起始,其在time:0時(shí)為0x20,如 圖18所示。因此注意,循環(huán)的第一次迭代對(duì)應(yīng)于加載至對(duì)應(yīng)于timeO 時(shí)寄存器文件(如圖19所示)的值。
第一條lmvex指令根據(jù)R12中存儲(chǔ)的參數(shù),將C4-d加載至R6, 并將Co加載至R7, R12在前面初始化;并且控制字段如上參考圖4和 5的說(shuō)明。然后,循環(huán)內(nèi)的第一次迭代開始于lnwex_skip—once指令。 在該第一次迭代中,對(duì)應(yīng)于time = 0,該lmvex_skip—once指令根據(jù)R12 中存儲(chǔ)的參數(shù)和這些控制字段,將X.4-X.i加載至R8,并且將X。加載 至R9,如圖19中的R8和R9所示,其中,R12在前面初始化。注意, 由于在該第一次迭代中,skip_Cnt=cnt, skip可視為"無(wú)關(guān)緊要",因 為并不需要該skip值。也就是,當(dāng)該skip—cnt計(jì)數(shù)器終止時(shí),cnt計(jì)數(shù) 器也終止,并從而不需要"跳躍"即可完成該指令。
第一條矢量乘積累加指令(vmac.h)對(duì)寄存器R6和R8的半字分 量執(zhí)行矢量乘積累加運(yùn)算,并將結(jié)果存儲(chǔ)至RIO。因此,R10現(xiàn)在存儲(chǔ) C4*X.4+C3*X.3+C2*X.2+C1*X.1,如圖19中的R10所示。第二條矢量乘 積累加指令對(duì)寄存器R7和R9的半字分量執(zhí)行矢量乘積累加運(yùn)算,并 將結(jié)果存儲(chǔ)至Rll。因此,Rll現(xiàn)在存儲(chǔ)Q^Xo+(PO+(PO+(^0,其就等 于CZXo。注意,在當(dāng)前的示例中,通過(guò)每一個(gè)加載矢量指令(lmvex 和lmvex_skip_once),寄存器(例如R7和R9)的其余未使用的部分 清零,從在Rll中產(chǎn)生正確結(jié)果。否則,如果例如,反而從存儲(chǔ)器200 加載值t, u和v ,則R11可能為不正確的值。
然后,第一條求和指令對(duì)RlO和Rll的值求和,并將結(jié)果存儲(chǔ)至 R10 (此運(yùn)算并未在圖19中示出)。然后可在需要時(shí)存儲(chǔ)對(duì)應(yīng)于上面 等式1的Y。的該值,例如回到存儲(chǔ)器200。第二條求和指令將循環(huán)緩
沖的起始指針向前移動(dòng)至下一個(gè)半字,使得對(duì)于time=l,該起始指針 現(xiàn)在指向地址0x22的X.3,如圖18和20所示。接下來(lái),修改R13,使 得skip—cnt=skip_cnt-l。因此。經(jīng)過(guò)上面代碼段的第一次迭代,skip_cnt 現(xiàn)在等于4??墒褂醚h(huán)計(jì)數(shù)器或附加指令(未包括在上面的代碼段中) 指示是否退出該循環(huán)。如果不退出該循環(huán),則代碼返回"loop",并開 始下一次迭代。
值CVCo保持在R6和R7中(如圖20的R6和R7所示)。該循 環(huán)的第二次迭代開始于lmvex_skip—once指令。在該第二次迭代中,對(duì) 應(yīng)于time=l,該lmvex_skip_once指令根據(jù)存儲(chǔ)在R12中的參數(shù)和控制 字段,將X3-X。加載至R8,并將X!加載至R9,如圖20中的R8和R9 所示。在此次迭代中,由于skip—cnt為4,并且rA指向X—3為第一個(gè)要 加載的分量,加載4個(gè)分量X.3-XQ。此時(shí),由于加載了 skip一cnt (4) 個(gè)分量,并且還沒有加載cnt (5)個(gè)分量,則從"skip"個(gè)ms大小(半 字)的單位的位置處加載下一分量。因此,在此示例中,值為-4的skip 允許從0x28 - 4*2 = 0x20加載分量X"(注意,存儲(chǔ)器200可半字尋 址;因此,skip個(gè)ms大小的單位處表示-4個(gè)半字處。)注意,如上所 述,在time二l時(shí),存儲(chǔ)器200中的最近分量存儲(chǔ)在0x20,其為前一最 老的時(shí)間采樣的位置。因此,lmvex—skip—once指令以從最老到最新的 時(shí)間采樣順序,從存儲(chǔ)器位置0x20-0x28向R8和R9正確地加載了用 于計(jì)算Y,所需的5個(gè)分量。
第一條矢量乘積累加指令(vmac.h)對(duì)寄存器R6和R8的半字分 量執(zhí)行矢量乘積累加運(yùn)算,并將結(jié)果存儲(chǔ)至R10。因此,R10現(xiàn)在存儲(chǔ) C4*X.3+C3*X.2+C2*X.1+C1*Xo,如圖20中的R10所示。第二條矢量乘 積累加指令對(duì)寄存器R7和R9的半字分量執(zhí)行矢量乘積累加運(yùn)算,并 將結(jié)果存儲(chǔ)至Rll。因此,Rll現(xiàn)在存儲(chǔ)Q^Xi+O+O+OW+O+O,其就等 于Q^Xp注意,在當(dāng)前的示例中,通過(guò)每一加載矢量指令(lmvex和 lmvex—skip—once),寄存器(例如R7禾BR9)的其余未使用部分清零, 從在Rll中產(chǎn)生正確結(jié)果。否則,如果例如,反而從存儲(chǔ)器200加載
值a、 b或c (或者t、 u禾Pv),則R11可能為不正確的值,。
然后,第一條求和指令對(duì)R10和R11的值求和,并將結(jié)果存儲(chǔ)至 R10 (此運(yùn)算并未在圖20中示出)。然后可在需要時(shí)存儲(chǔ)對(duì)應(yīng)于上面 等式2的Yi的該值,例如回到存儲(chǔ)器200。第二條求和指令將循環(huán)緩 沖的起始指針向前移動(dòng)至下一個(gè)半字,使得對(duì)于time=2,該起始指針 現(xiàn)在指向地址0x24的X.2,如圖18和21所示。接下來(lái),修改R13,使 得skip_cnt=skip_cnt-l。因此。經(jīng)過(guò)上面代碼段的第二次迭代,skip_cnt 現(xiàn)在等于3??墒褂醚h(huán)計(jì)數(shù)器或附加指令(未包括在上面的代碼段中) 指示是否退出該循環(huán)。如果不退出該循環(huán),則代碼返回至"loop",并 開始下一次迭代。
第三次迭代類似于第一次和第二次迭代操作。對(duì)于第三次迭代, 其對(duì)應(yīng)于time二2, lmvex—skip—once指令將X.2, X.P XQ, XP 乂2加載 至寄存器R8和R9,如圖21所示。因此, 一旦加載了分量X.2, X.i和 Xo(開始于Ox24),就已經(jīng)加載了 skip—cnt個(gè)分量,并且使用skip加 載X!和X2。后面的矢量乘積累加指令導(dǎo)致C X.2+C^X.一CVX()+C^Xj 存儲(chǔ)在R10中,并且導(dǎo)致CV^2存儲(chǔ)在R11中。第一條求和指令將對(duì) 應(yīng)于Y2的結(jié)果存儲(chǔ)在R10中,其中,然后可將Y2存儲(chǔ)至存儲(chǔ)器,如 果需要的話。第二條求和指令然后將該指針向前移動(dòng)至起始位置0x26, 如圖22中所示。另夕卜,修改R13,使得skip_cnt=skip—cnt-l。因此。經(jīng) 過(guò)上面代碼段的第三次迭代,skip—cnt現(xiàn)在等于2??墒褂醚h(huán)計(jì)數(shù)器 或附加指令(未包括在上面的代碼段中)指示是否退出該循環(huán)。如果 不退出該循環(huán),則代碼返回至"loop",并開始下一次迭代。
通過(guò)上面參考圖4和5所述的lmvex指令,重置該記錄skip—cnt 的機(jī)制(例如,計(jì)數(shù)器),使得當(dāng)加載下一skip—cnt個(gè)分量時(shí)(并且假 設(shè)還沒有加載cnt個(gè)分量),從skip^^ms個(gè)單位處加載下一分量。然而, 在當(dāng)前示例中,使用lvmex—skip_once指令,使得當(dāng)力n載skip_cnt個(gè)分 量時(shí),不重置記錄skip—cnt的機(jī)制。按照這種方式,在加載全部cnt個(gè)
分量前,將不會(huì)再一次地使用跳躍。這允許在后面的迭代中,正確地 加載所有分量,如將所述,例如通過(guò)第四次迭代(對(duì)應(yīng)于tim^3)。
第四次迭代類似于前面的迭代操作。對(duì)于第四次迭代,對(duì)應(yīng)于
time=3, lmvex_skip_once指令將X.!, XQ, XP 乂2和乂3加載至寄存器 R8和R9,如圖22所示。在此次迭代中,注意,加載的第一個(gè)分量是 來(lái)自位置0x26的(如圖18對(duì)于time=3的表示)。加載和X0 之后,就已經(jīng)加載了 skip_Cnt (其等于2)個(gè)分量;因此,使用skip將 指針繞回位置0x20,因?yàn)檫€沒有加載cnt (5)個(gè)分量。還要注意,并 沒有重置skip—cnt機(jī)制。按照這種方式,即使加載了下一skip—cnt (2) 個(gè)分量,也不進(jìn)行跳躍。如果在下一skip一cnt個(gè)分量后對(duì)于此次迭代進(jìn) 行跳躍,則在跳躍前僅取回分量Xi和X2,從而遺漏了 X3。因此,盡 管在前面的迭代中,在第一次跳躍后是否重置skip—cnt并不重要,但在 某些迭代中,例如此次迭代,其可確定是否取回正確的分量。因此, 可以知道如何將lmvex—skip—once指令用于正確地執(zhí)行循環(huán)緩沖,例如, 對(duì)于濾波器應(yīng)用。還要注意,能夠以多種不同的方法書寫上面的代碼 段。例如,該循環(huán)可以展開,而不是寫為循環(huán)形式。在此示例中,可 以對(duì)于time=0, 1, 2使用lmvex指令,而僅對(duì)于time=3禾n 4使用 lmvex—skip_once指令。
在圖22中可以看出,一旦加載了X.p Xo, Xi, X2和X3,后面的 矢量乘積累加指令導(dǎo)致C,X—一CVX()+CX,+CVX2存儲(chǔ)在R10中,并 且導(dǎo)致C/X3存儲(chǔ)在Rll中。第一條求和指令將對(duì)應(yīng)于Y3的結(jié)果存儲(chǔ) 在R10中,其中,然后可將Y3存儲(chǔ)至存儲(chǔ)器,如果需要的話。此時(shí), 流程按照上面對(duì)于前面迭代的說(shuō)明繼續(xù)進(jìn)行。在一個(gè)實(shí)施例中,在將 R12修改為skip_cnt為0的指針后,可退出該循環(huán),使得重置skip_cnt, 例如,返回5,并重復(fù)整個(gè)過(guò)程。
因此,能夠理解如何將矢量加載指令,連同skip、 skip^nt和cnt 用于執(zhí)行循環(huán)緩沖。在一個(gè)實(shí)施例中,可使用循環(huán)緩沖加載多個(gè)矢量
分量(lmvex一cb)指令,如圖28所示。該指令類似于上面參考圖4和 5說(shuō)明的lmvex指令,除了在rB中存儲(chǔ)的附加參數(shù)為buffer—size (緩 沖大小)和offset (偏移)。(在使用lmvex指令時(shí),注意,在替換實(shí) 施例中,可作為操作碼或子操作碼部分包括該附加參數(shù))。圖29表示 如何使用這些附加參數(shù)定義循環(huán)緩沖。例如,在使用上述加載指令時(shí), rA表示存儲(chǔ)器中存儲(chǔ)該循環(huán)緩沖的存儲(chǔ)器位置的起始,如圖29所示。 該buffer—size表示"緩沖分量總數(shù)+ms",并且offset定義在該循環(huán)緩 沖中哪里是將要加載的第一個(gè)分量。另外注意,盡管并未示出,還可 使用循環(huán)緩沖存儲(chǔ)多個(gè)矢量分量(stmvex一cb)指令,作為lmvex一cb的 存儲(chǔ)對(duì)應(yīng)。對(duì)于lmvex一cb和stmvex—cb指令,在某些實(shí)施例中,由 "offset"表示的當(dāng)前起始值(current_start)在每次遍歷該循環(huán)緩沖后, 即在處理了 cnt個(gè)分量后,自動(dòng)增加或降低預(yù)定數(shù)量的分量,作為執(zhí)行 lmvex—cb或stmvex—cb指令的一部分。
圖30表示循環(huán)緩沖加載分量流(lstrmvex—cb)指令,其類似于上 面lstrmvex指令操作,除了附加參數(shù)包括buffer—size和offset (如上面 參考圖29的說(shuō)明),而不是cnt、 skip和skip_cnt。正如上面的lstrmvex 指令,該lstmwex一cb指令從存儲(chǔ)器發(fā)起矢量分量流,其中,例如根據(jù) rD何時(shí)用作后面指令的特定源操作數(shù),這些分量可以出隊(duì)。因此,除 了關(guān)于尋址模式外,上面對(duì)于lstrmvex的相同討論此處也適用于 lstrmvex一cb。還要注意,盡管沒有說(shuō)明,但也可以使用循環(huán)緩沖存儲(chǔ) 矢量分量流(ststrmvex一cb)指令,作為lstrmvex—cb的存儲(chǔ)對(duì)應(yīng)。對(duì)于 lstrmvex—cb禾卩ststrmvex—cb指令,在一些實(shí)施例中,每次遍歷該循環(huán) 緩沖后,由"offset"表示的當(dāng)前起始值(current—start)自動(dòng)遞增預(yù)定 數(shù)量的分量。
lmvex_cb、 stmvex—cb、 lstrmvex—cb禾口 ststrmvex—cb指令的可選指 示符包括rent和stride (未在圖29和30中示出),它們?nèi)缤懊鎸?duì)于 lmvex、 lmvex2、 stmvex、 stmvex2、 lstrmvex禾口 ststrmvex指令的說(shuō)明 操作。這允許控制加載至寄存器rD的每一實(shí)例,或從源寄存器rS的
每一示例存儲(chǔ)的循環(huán)緩沖分量的數(shù)量,并且控制遍歷訪問(wèn)該循環(huán)緩沖 的跨度。例如,可使用跨度執(zhí)行分?jǐn)?shù)速率濾波運(yùn)算,或抽取濾波器。
圖23-26表示如何使用lstrmvex指令(如上參考圖7的說(shuō)明)執(zhí) 行,例如,矩陣相乘的一個(gè)示例。對(duì)于此示例,將使用圖12的存儲(chǔ)器 部分100,和矩陣102、 106和108。圖23-26表示在矩陣相乘期間的不 同時(shí)間點(diǎn)的寄存器文件內(nèi)容,例如圖1的標(biāo)量寄存器文件34的內(nèi)容等。
在當(dāng)前示例中,矩陣102將乘以矩陣106,結(jié)果將對(duì)應(yīng)于矩陣108。 例如,在執(zhí)行矩陣相乘時(shí),下列等式用于結(jié)果矩陣108的頭兩列。
Eq.5 aa = A*K + B*N + C*Q Eq.6 dd = D*K + E*N + F*Q Eq.7 gg = G*K + H*N + I*Q Eq.8 bb = A*L + B*0 + C*R Eq.9 ee = D化+ E*0 + F*R Eq.10 hh = G*L + H*0 + I*R
在上面的等式中,注意,在獲得aa、 dd和gg時(shí),需要從矩陣102 出隊(duì)分量(因?yàn)锳、 B、 C用于獲得aa; D、 E、 F用于獲得dd;并且 然后G、 H、 I用于獲得gg),同時(shí)不需要使矩陣106出隊(duì)(因?yàn)樾枰?K、 N、 Q獲得每個(gè)aa、 dd和gg)。因此,下面的偽碼提供如何使用 指令,例如lstrmvex指令,獲得結(jié)果矩陣108的一個(gè)示例。注意,在 下面的偽碼示例中,僅當(dāng)rD作為指令(例如,指令目標(biāo),源l,源2) 的第一個(gè)源(源l)時(shí)才執(zhí)行出隊(duì)。
/*初始化R6,以存儲(chǔ)值為9的cnt,值為3的rent,值為1的stride, 值為6的skip,禾n值為3的skip—cnt*/
"初始化R4,以存儲(chǔ)0xl2,即矩陣102的第一行的起始*/ /*初始化R7,以存儲(chǔ)值為9的cnt,值為3的rcnt,值為8的stride,
值為-15的skip,和值為3的skip—cnt*/
/"刀始化R5,以存儲(chǔ)0x54,即矩陣106的第一列的起始*/ lstrmvex.u.mh.dh Rl, R4, R6嚴(yán)加載矩陣102的第一行A, B,
C*/
lstrmvex.u.mh.dh R2, R5, R7嚴(yán)加載矩陣106的第一列K, N,
Q*/
vmac.h RIO, Rl, R2 /*在R10中存儲(chǔ)aa,并使矩陣102的 Rl出隊(duì)*/
vmac.h Rll, Rl, R2 /*在Rll中存儲(chǔ)dd,并使矩陣102的 Rl出隊(duì)*/
vmac.h R12, R2, Rl /*在R12中存儲(chǔ)gg,并使矩陣104的 R2出隊(duì)*/
lstrmvex.u.mh.dh Rl, R4, 116/*加載矩陣102的第一行A, B,
C*/
vmac.h R13, Rl, R2 /*在R13中存儲(chǔ)bb,并使矩陣102的 Rl出隊(duì)*/
vmac.h R14, Rl, R2 /*在R14中存儲(chǔ)ee,并使矩陣102的 Rl出隊(duì)*/
vmac.h R15, R2, Rl /*在R15中存儲(chǔ)hh,并使矩陣104的 R2出隊(duì)*/
上面的偽碼可用于獲得aa、 dd、 gg、 bb、 ee和hh,如上面的等式 5-8所述。如在此示例中所使用,假設(shè)所有值為無(wú)符號(hào)的半字。首先, 初始化R6,以存儲(chǔ)值為9的cnt,值為3的rcnt,值為1的stride,值 為6的skip,和值為3的skip_cnt,其中,R6可用作lstrmvex指令的 rB寄存器。如圖23所示,將R4初始化為指向位于0xl2處的分量A, 即圖12的矩陣102的第一行的第一個(gè)分量。初始化R7,以存儲(chǔ)值為9 的cnt,值為3的rcnt,值為8的stride,值為-15的skip,和值為3的 skip_cnt,其中,R7可用作lstrmvex指令的rB寄存器。如圖23所示, 將R5初始化為指向0x54處的分量K,即矩陣106的第一列的第一個(gè)
第一條lstrmvex指令發(fā)起矢量分量流,其依次加載矩陣102的每 一行。首先,該指令將矩陣102的第一行加載至Rl (如圖23中所示)。 例如,分量A、 B和C彼此距離1半字(因此需要值為1的stride)。 值為3的rcnt每次僅向Rl加載3個(gè)分量(其余部分清零),并且在加 載skip_cnt個(gè)分量(此例中為3個(gè))之后,則在C (0x16)位置增加 8*ms (8半字)的跳躍,以在位置0x22 (0x16+0x08)獲得下一分量D 的地址。當(dāng)R1用作后面指令的源1時(shí),如下所述,則其出隊(duì),使得矩 陣102的下一行(如rcnt、 stride和skip_cnt所定義)加載至R1。
第二條lstrmvex指令發(fā)起矢量分量流,其依次向R2加載矩陣106 的每一列。首先,該指令將矩陣106的第一列加載至R2 (如圖23中所 示)。例如,分量K、 N和Q在存儲(chǔ)器中彼此距離8個(gè)半字(因此需 要值為8的stride)。值為3的rent每次僅向R2加載3個(gè)分量(其余 部分清零),并且在加載skip—cnt個(gè)分量(此例中為3個(gè))之后,則將 Q (0x74)位置增加-15*1113 (-15或-0x0F個(gè)半字)的跳躍,以在位置 0x56 (0x74-0x0F*2)獲得下一分量D的地址,其中,L為矩陣106的 第二列的第一個(gè)分量。當(dāng)R2用作后面指令的源1時(shí),如下所述,則其 出隊(duì),使得矩陣106的下一列(如rcnt、 stride和skip—cnt所定義)加 載至R2。
第一條乘積累加指令(vmac)指令將A*K + B*N + C*Q (其等于 aa)存儲(chǔ)至RIO,如圖24中所示。由于R1用作源1,因而其根據(jù)第一 條lstrmvex指令(和R6中的參數(shù))出隊(duì),使得矩陣102的下一行(D、 E和F)存儲(chǔ)至R1,而其余部分清零。此時(shí),注意,由于R2沒有用作 源l,則其不出隊(duì);因此,K、 N和Q保持在R2中,并且矩陣106的 下一列也不存儲(chǔ)至R2。
第二條乘積累加指令(vmac)指令將D+K + E+N + F4Q (其等于
dd)存儲(chǔ)至Rll,如圖25中所示。由于R1用作源1,其再一次地根據(jù) 第一條lstrmvex指令(和R6中的參數(shù))出隊(duì),使得矩陣102的下一行 (G、 H和I)存儲(chǔ)至R1,而其余部分清零。此時(shí),已經(jīng)加載了對(duì)應(yīng)于 第一條lstrmvex指令的9個(gè)分量,從而已經(jīng)加載了 "cnt"個(gè)分量,并 且此指令流終止。由于R2沒有用作源1,則其不出隊(duì);因此,K、 N 和Q保持在R2中,并且矩陣106的下一列也不存儲(chǔ)至R2。此時(shí),僅 加載了對(duì)應(yīng)于lstrawix指令的3個(gè)分量,從而對(duì)于此指令沒有加載cnt 個(gè)分量。
第三條累加指令(vmac)指令將G+K + IPN + PQ (其等于gg) 存儲(chǔ)至Rll,如圖26中所示。由于R2現(xiàn)在用作源1,因此其根據(jù)第二 條lstrmvex指令(和R7中的參數(shù))出隊(duì),使得矩陣106的下一列(L、 O和R)存儲(chǔ)至R2,而其余部分清零。此時(shí),已經(jīng)加載了矩陣106的 9個(gè)分量中的6個(gè)。另外,由于通過(guò)第一條lstrmvex指令已經(jīng)加載了(矩 陣102的)"cnt"個(gè)分量,因而R1并不改變,并仍然保存G、H和I。 (此外,即使通過(guò)第一條lstrmvex指令還沒有加載"cnt"個(gè)分量,Rl 仍然不改變,因?yàn)橛捎赗1用作源2,其將不出隊(duì)。)
第三條lstrmvex指令發(fā)起新的矢量分量流,其與第一條lstmwex 指令相同。也就是,該第三條lstrmvex指令依次將矩陣102的每一行 加載至R1,如上所述。后面三條vmac指令分別向R13、 R14和15存 儲(chǔ)值bb、 ee和hh。注意,在使用頭三條vmac指令時(shí),第一條lstrmvex 指令通過(guò)第三條lstrmvex指令之后的頭兩條vmac指令出隊(duì),第二條 lstrmvex指令通過(guò)第三條lstrmvex指令之后的第三條vmac指令出隊(duì)。 此時(shí),矩陣106的最后一列(M、 P和S)將加載至R2 (未示出),并 且對(duì)于第二條lstmwex指令的加載將停止,因?yàn)榇藭r(shí)將要加載"cnt" 個(gè)(即9個(gè))分量??墒褂妙愃频闹噶瞰@得cc、 ff和ii。可將值aa、 dd、 gg、 bb、 ee、 hh、 cc、 ff和ii分別存儲(chǔ)回至矩陣108的存儲(chǔ)位置 0x8A, 0x9A, OxAA, Ox8C, 0x9C, OxAC, 0x8E, 0x9E, OxAE。如 此處所述,可使用矢量存儲(chǔ)指令執(zhí)行這些存儲(chǔ)。
注意,在上面的偽碼示例中,這些分量根據(jù)后面指令中rD的位置 出隊(duì)(即rD是否用作源l或是源2)。然而要注意,在替換實(shí)施例中, 可使用其它因子指示這些分量是否出隊(duì)。例如,可使用不同的操作碼 指示出隊(duì),或者使用其它的指示符,例如標(biāo)志位等。此外,在一個(gè)實(shí) 施例中,rD在任何時(shí)候用作為后面指令的源時(shí)出隊(duì),不是僅在其為源 l時(shí)出隊(duì)。在又一實(shí)施例中,僅當(dāng)使用同一rD作為源操作數(shù)的指令為 一個(gè)或多個(gè)由處理單元14執(zhí)行的所有指令的適當(dāng)子集中的預(yù)定指令時(shí) 執(zhí)行出隊(duì)。也就是,在此實(shí)施例中,實(shí)際上僅有指令或指令功能的子 集作為它們執(zhí)行的一部分執(zhí)行出隊(duì),而由處理器單元14執(zhí)行的其余指 令不執(zhí)行出隊(duì),不論rD是否用作源操作數(shù)。該執(zhí)行出隊(duì)的子集可為所 有執(zhí)行的指令的預(yù)定子集,并可基于數(shù)據(jù)處理系統(tǒng)10的需要確定。在 又一實(shí)施例中,出隊(duì)可由用于控制該出隊(duì)操作的指令中的控制字段值 確定。
盡管在前面說(shuō)明圖23-26的段落中已經(jīng)說(shuō)明了出隊(duì),但類似的入 隊(duì)操作同樣適用于當(dāng)前發(fā)明的實(shí)施例,并以基本類似的方式操作???基于入隊(duì)源寄存器rS作為后面指令目標(biāo)的位置,或者基于在由處理單 元14執(zhí)行的所有指令的適當(dāng)子集中的一個(gè)或多個(gè)預(yù)定指令中成為目標(biāo) 操作數(shù),來(lái)執(zhí)行入隊(duì)。也就是,在一個(gè)實(shí)施例中,實(shí)際上僅有指令或 指令功能的子集作為它們執(zhí)行的一部分執(zhí)行入隊(duì),由處理器14執(zhí)行的 其余指令并不執(zhí)行入隊(duì),無(wú)論rS是否用作目標(biāo)操作數(shù)。該執(zhí)行入隊(duì)的 子集可為執(zhí)行的全部指令的預(yù)定子集,并可基于數(shù)據(jù)處理系統(tǒng)10的需 要確定。在又一實(shí)施例中,入隊(duì)可由用于控制該入隊(duì)操作的指令中的 控制字段值確定。
圖31表示可用于快速傅立葉變換(FFT)的指令。圖31表示加載 多個(gè)矢量分量FFT (lmvex—fft)指令,其具有控制字段s/u、 ms和ds 以及操作數(shù)rD, rA和rB。這些控制字段和操作數(shù)的每一個(gè)如上對(duì)于其 它加載指令的說(shuō)明操作。該lmvex fft指令還使用在rB中存儲(chǔ)的附加
參數(shù)"radix"(基數(shù)),并且可選地如上對(duì)于其它加載矢量分量指令 的說(shuō)明執(zhí)行在rB中存儲(chǔ)的rcnt控制字段。在使用上面的指令時(shí),在替 換實(shí)施例中,"radix"(和"rent",如果存在的話)可為操作碼或子 操作碼的一部分,并且因此,rB可能不是必要的。該lmvex一fft指令還 可使用截短或舍入字段,如上所述。
圖32表示存儲(chǔ)多個(gè)矢量分量FFT (stmvex一fft)指令,其也具有 控制字庫(kù)s/u、 ms和ss以及操作數(shù)rS、 rA和rB。這些控制字段和操作 數(shù)中的每一個(gè)如上對(duì)于其它存儲(chǔ)指令的說(shuō)明操作。該stmvex—fft指令還 可使用截短或舍入字段,如上所述,并可選地如上對(duì)于其它存儲(chǔ)矢量 分量指令的說(shuō)明執(zhí)行rent控制字段。該stnwex_fft指令還使用在rB中 存儲(chǔ)的附加參數(shù)"radix"。在使用上面的指令時(shí),在替換實(shí)施例中, "radix"可為該操作碼或子操作碼的一部分,并且因此,rB可能不是 必要的。該stmvex—fft指令可視為lmvex—fft指令的存儲(chǔ)對(duì)應(yīng)。
重新參看該lmvex一fft指令,"radix"參數(shù)可用于根據(jù)FFT尋址 算法向寄存器或寄存器組加載一系列數(shù)據(jù),如本領(lǐng)域所公知。例如, 對(duì)于FFT,公知將以Xo, Xp X2, X3, X4, X5, 乂6和乂7為順序的數(shù) 據(jù)進(jìn)行"比特翻轉(zhuǎn)",形成Xo, X4, X6, X2, XP X5, X3, X7,以進(jìn) 行特定FFT計(jì)算。在該lmvex—fft指令中,該"radix"定義分量的數(shù)量, 以及這些分量的特定存儲(chǔ)順序。例如,圖34表示存儲(chǔ)器部分300,其 可為,例如圖1的存儲(chǔ)器12的一部分。存儲(chǔ)器部分300分別包括存儲(chǔ)
在位置0xi6-0x24的分量xQ, xP x2, x3, x4, x5, xjnx7。存儲(chǔ)器
部分300還包括存儲(chǔ)在位置0x44-0x52的分量Yo, Y4, Y6, Y2, Y。 Y5, Ys和Y7。
圖35表示諸如圖1的標(biāo)量寄存器文件34的寄存器文件的一部分。 例如,基數(shù)8的lvmex一fft指令可用于以比特翻轉(zhuǎn)形式將X個(gè)分量送入 寄存器R1和R2 (如圖35所示),其中,Rl由rD指定,并且將要加 載的第一個(gè)存儲(chǔ)器位置(0x16)由rA指定。類似地,基數(shù)8的lmvex—fft
可用于將比特翻轉(zhuǎn)的Y個(gè)分量以連續(xù)順序送入寄存器R4和R5 (如圖 35所示),其中,R4由rD指定,并且將要加載的第一個(gè)存儲(chǔ)器位置 (0x44)由rA指定。因此,該lmvex—fft指令可以比特翻轉(zhuǎn)的形式加 載分量,其中,這些分量可以一開始就進(jìn)行比特翻轉(zhuǎn),或者不翻轉(zhuǎn)。
類似地,stmvex—fft指令可用于將這些分量與比特翻轉(zhuǎn)形式存儲(chǔ)至 存儲(chǔ)器。例如,基數(shù)8的該stmvex—fft指令可用于將比特翻轉(zhuǎn)的X個(gè) 分量從Rl和R2存儲(chǔ)至位置0x16-0x24的存儲(chǔ)器,使得存儲(chǔ)器中的這 些分量與Rl和R2中的那些分量相比沒有進(jìn)行比特翻轉(zhuǎn)。類似地,該 stmvex—fft指令可用于將連續(xù)的Y個(gè)分量從R4和R5存儲(chǔ)至位置 0x44-0x52的存儲(chǔ)器,使得存儲(chǔ)器中的這些分量與R4和R5中的那些分 量相比進(jìn)行了比特翻轉(zhuǎn)。
圖33表示加載矢量分量流FFT (lmstrmvex—fft)指令,其具有控 制字段s/u、 ms和ds以及操作數(shù)rD、 rA和rB。這些控制字段和操作 數(shù)的每一個(gè)如上對(duì)于lmstrmvex指令的說(shuō)明操作。該lmstrmvex—fft指 令還使用存儲(chǔ)在rB中的附加參數(shù)"radix",并且能夠如上對(duì)于其它加 載矢量分量指令的說(shuō)明可選地執(zhí)行存儲(chǔ)在rB中的rcnt控制字段。在利 用上面的指令時(shí),在替換實(shí)施例中,"radix"(和"rent",如果存在 的話)可為操作碼或子操作碼的一部分,并且因此,rB可不是必要的。 "radix"定義將要加載的分量的總數(shù)。在利用lmstrmvex_fft指令時(shí), 該lmstrmvex—fft從存儲(chǔ)器發(fā)起矢量分量流,其中,以比特翻轉(zhuǎn)形式或 以來(lái)自比特翻轉(zhuǎn)的連續(xù)順序加載這些分量,并且根據(jù)例如,后面指令 中rD的位置使這些分量出隊(duì)。注意,盡管沒有表示出來(lái),但可使用對(duì) 應(yīng)的存儲(chǔ)指令發(fā)起以比特翻轉(zhuǎn)形式向存儲(chǔ)器存儲(chǔ)分量流,例如對(duì)于FFT 應(yīng)用。
因此,可以明白,如何將各種不同類型的矢量加載和存儲(chǔ)指令用 于具有一組寄存器的系統(tǒng),例如,標(biāo)量寄存器文件等。也就是,上面 的指令可用于現(xiàn)有設(shè)計(jì)或僅需對(duì)現(xiàn)有設(shè)計(jì)的執(zhí)行單元(例如執(zhí)行單元
32)和控制單元(例如控制單元28)進(jìn)行少量的改動(dòng)。注意,此處說(shuō) 明的每一條指令可具有不同的格式,并且甚至可分為多條指令。另外, 在從或向寄存器傳送矢量分量時(shí),可使用附加參數(shù)指示將哪一個(gè)寄存 器分量傳送至存儲(chǔ)器(例如對(duì)于矢量存儲(chǔ)指令),或者寄存器中的哪 一個(gè)寄存器分量存儲(chǔ)從存儲(chǔ)器加載的矢量分量(例如對(duì)于矢量加載指 令)。此外,可使用附加參數(shù)定義如何將矢量分量放置在寄存器中, 或者從存儲(chǔ)器的何處讀取矢量分量。例如,可提供起始位置指示符指 示向或從寄存器中的何處開始傳送。另外,對(duì)于寄存器可給定跨度, 使得能夠以非相鄰的方式在寄存器中向或從寄存器傳送參數(shù)。另外, 此處說(shuō)明的所有參數(shù)和控制字段可出現(xiàn)在任何這些指令的任何組合之 中。
還要注意,上面已經(jīng)討論了不同的尋找模式,例如使用stride、skip、 skip—cnt等的模式,或者使用buffer—size和offset的模式,或者使用基 數(shù)(radix)的模式。然而,在替換實(shí)施例中,可使用不同的尋址模式。 例如,可代之以指定陣列維數(shù),例如,陣列的維數(shù)等(例如,2-維4X 4陣列,3-維5X5陣列等)。因此,與上面實(shí)施例一同說(shuō)明的尋址模 式可用于以各種模式加載或存儲(chǔ)數(shù)據(jù)或數(shù)據(jù)陣列,包括例如,zig-zag 模式和其它規(guī)則模式,如上所述。與在當(dāng)前SIMD處理器中所需的開 銷相比,此處說(shuō)明的指令還可降低向或從存儲(chǔ)器傳送存儲(chǔ)器分量所需 的開銷。例如,在能夠進(jìn)行SIMD運(yùn)算的當(dāng)前處理器中,需要大量的 指令向或從存儲(chǔ)器傳送矢量分量(例如,矢量或數(shù)據(jù)陣列或其它規(guī)則 模式的數(shù)據(jù))。然而,可利用上述矢量加載和存儲(chǔ)指令完成相同的分 量傳送,其中,降低的指令數(shù)量(或者僅用一條指令)可用于完成此傳送。
下面的段落提供本發(fā)明的各種方面,形式和實(shí)施例的說(shuō)明。每一 說(shuō)明僅提供各種實(shí)施例的示例,目的并不是限制上面討論的任何說(shuō)明 或?qū)嵤├?br>
根據(jù)本發(fā)明的一個(gè)方面, 一種數(shù)據(jù)處理系統(tǒng)具有用于存儲(chǔ)操作數(shù) 的存儲(chǔ)器和至少一個(gè)通用寄存器。處理器電路執(zhí)行一條或多條指令, 并且該一條或多條指令中的至少一條在該存儲(chǔ)器和該至少一個(gè)通用寄 存器間傳送數(shù)據(jù)分量。該至少一條或多條指令指定存儲(chǔ)器中數(shù)據(jù)分量 的大小,其獨(dú)立于指定該至少一個(gè)通用寄存器中數(shù)據(jù)分量的大小。在
一種形式中,該一條或多條指令包括獨(dú)立字段,其用于分別存儲(chǔ)用于 存儲(chǔ)器的第一數(shù)據(jù)大小指定符和用于該至少一個(gè)通用寄存器的第二數(shù) 據(jù)大小指定符。在另一形式中,該一條或多條指令指定用于定義存儲(chǔ) 器的第一數(shù)據(jù)大小指定符和該至少一個(gè)通用寄存器的第二數(shù)據(jù)大小指 定符的存儲(chǔ)位置。在一種形式中,該存儲(chǔ)位置為存儲(chǔ)器中的位置和該 存儲(chǔ)器外部的處理器寄存器位置中的任何一個(gè)。在另一形式中,該存 儲(chǔ)位置為該數(shù)據(jù)處理系統(tǒng)的控制寄存器。在一種形式中,該存儲(chǔ)位置 為該數(shù)據(jù)處理系統(tǒng)的寄存器,算術(shù)、邏輯和移位操作由該數(shù)據(jù)處理系 統(tǒng)工具執(zhí)行。該存儲(chǔ)器可進(jìn)一步包括將在該存儲(chǔ)器和該至少一個(gè)通用 寄存器間傳送的多個(gè)數(shù)據(jù)分量。在一種形式中,該多個(gè)數(shù)據(jù)分量在該 存儲(chǔ)器中相鄰。在另一形式中,該多個(gè)數(shù)據(jù)分量在存儲(chǔ)器中不相鄰。 在一種形式中,該至少一個(gè)通用寄存器中的每一個(gè)保存多個(gè)數(shù)據(jù)分量。 在另一形式中,該至少一個(gè)通用寄存器中的每一個(gè)包括具有一維存儲(chǔ) 器映射的標(biāo)量寄存器。
當(dāng)該至少一條或多條指令指定存儲(chǔ)器中的源數(shù)據(jù)分量的大小大于 該至少一個(gè)通用寄存器中的目標(biāo)數(shù)據(jù)分量的大小時(shí),該處理器電路可 截短存儲(chǔ)器中的源數(shù)據(jù)分量的一部分。存儲(chǔ)器中該源數(shù)據(jù)分量被截短 的部分可為該存儲(chǔ)器中源數(shù)據(jù)分量的高階部分。存儲(chǔ)器中該源數(shù)據(jù)分 量被截短的部分可為該存儲(chǔ)器中源數(shù)據(jù)分量的低階部分。當(dāng)該至少一 條或多條指令指定存儲(chǔ)器中的源數(shù)據(jù)分量的大小大于該至少一個(gè)通用 寄存器中的目標(biāo)數(shù)據(jù)分量的大小時(shí),該處理器電路可基于該存儲(chǔ)器中
源數(shù)據(jù)分量低階部分的值,舍入(round)該存儲(chǔ)器中源數(shù)據(jù)分量的高
階部分。當(dāng)該至少一條或多條指令指定存儲(chǔ)器中的源數(shù)據(jù)分量的大小 小于該至少一個(gè)通用寄存器中的目標(biāo)數(shù)據(jù)分量的大小時(shí),該處理器電
路可將預(yù)定數(shù)據(jù)值放入該至少一個(gè)通用寄存器的目標(biāo)數(shù)據(jù)分量沒有被 來(lái)自該存儲(chǔ)器的源數(shù)據(jù)分量填充的部分。在一種形式中,該處理器電 路通過(guò)使用零擴(kuò)展將預(yù)定數(shù)據(jù)值放入該至少一個(gè)通用寄存器的目標(biāo)數(shù) 據(jù)分量的一部分。在另一種形式中,該處理器電路通過(guò)使用符號(hào)擴(kuò)展 將預(yù)定數(shù)據(jù)值放入該至少一個(gè)通用寄存器的目標(biāo)數(shù)據(jù)分量的一部分。 在還一形式中,該處理器電路通過(guò)用預(yù)定比特值填充該至少一個(gè)通用 寄存器的目標(biāo)數(shù)據(jù)分量的低階數(shù)據(jù)部分,將預(yù)定數(shù)據(jù)值放入該至少一 個(gè)通用寄存器的目標(biāo)數(shù)據(jù)分量的一部分,其中,該預(yù)定比特值為零值。
當(dāng)該至少一條或多條指令指定存儲(chǔ)器中的目標(biāo)數(shù)據(jù)分量的大小小 于該至少一個(gè)通用寄存器中的源數(shù)據(jù)分量的大小時(shí),該處理器電路可 截短該至少一個(gè)通用寄存器中源數(shù)據(jù)分量的一部分。在一種形式中, 該處理器電路截短該至少一個(gè)通用寄存器中源數(shù)據(jù)分量的高階部分。 在另一種形式中,該處理器電路截短該至少一個(gè)通用寄存器中源數(shù)據(jù) 分量的低階部分。當(dāng)該至少一條或多條指令指定存儲(chǔ)器中的目標(biāo)數(shù)據(jù) 分量的大小小于該至少一個(gè)通用寄存器中的源數(shù)據(jù)分量的大小時(shí),該 處理器電路可根據(jù)該源數(shù)據(jù)分量的低階部分的值,舍入在該至少一個(gè) 通用寄存器中的源數(shù)據(jù)分量的高階部分。當(dāng)該至少一條或多條指令指 定存儲(chǔ)器中的目標(biāo)數(shù)據(jù)分量的大小大于該至少一個(gè)通用寄存器中的源 數(shù)據(jù)分量的大小時(shí),該處理器電路可將預(yù)定數(shù)據(jù)值放入該存儲(chǔ)器中目 標(biāo)數(shù)據(jù)分量沒有被該至少一個(gè)通用寄存器中源數(shù)據(jù)分量填充的部分。 在另一形式中,該處理器電路通過(guò)使用零擴(kuò)展將預(yù)定數(shù)據(jù)值放入該存 儲(chǔ)器中未被填充的目標(biāo)數(shù)據(jù)分量部分,或者通過(guò)使用符號(hào)擴(kuò)展將預(yù)定 數(shù)據(jù)值放入該存儲(chǔ)器中未被填充的目標(biāo)數(shù)據(jù)分量部分。在另一形式中, 通過(guò)將預(yù)定比特值放置在該目標(biāo)數(shù)據(jù)分量的低階數(shù)據(jù)部分,將預(yù)定數(shù) 據(jù)值放置在該存儲(chǔ)器中目標(biāo)數(shù)據(jù)分量的未填充部分。
根據(jù)另一方面,用于在數(shù)據(jù)處理系統(tǒng)中加載和存儲(chǔ)數(shù)據(jù)分量的方 法包括提供存儲(chǔ)操作數(shù)的存儲(chǔ)器和提供至少一個(gè)通用寄存器。執(zhí)行一 條或多條指令,該一條或多條指令中的至少一條引起在該存儲(chǔ)器和該
至少一個(gè)通用寄存器間的數(shù)據(jù)分量的傳送。該至少一條或多條指令指 定該存儲(chǔ)器中數(shù)據(jù)分量的大小,其獨(dú)立于指定該至少一個(gè)通用寄存器 中數(shù)據(jù)分量的大小。通過(guò)執(zhí)行該至少一條或多條指令中的獨(dú)立字段指 定數(shù)據(jù)分量的大小,第一字段表示用于存儲(chǔ)器的第一數(shù)據(jù)大小指定符, 第二字段表示用于該至少一個(gè)通用寄存器的第二數(shù)據(jù)大小指定符。通
過(guò)執(zhí)行該至少一條或多條指令中的預(yù)定字段指定數(shù)據(jù)分量的大小,該 預(yù)定字段表示存儲(chǔ)位置,其定義用于存儲(chǔ)器的第一數(shù)據(jù)大小指定符和 用于該至少一個(gè)通用寄存器的第二數(shù)據(jù)大小指定符。當(dāng)該至少一條或 多條指令指定存儲(chǔ)器中的源數(shù)據(jù)分量的大小大于該至少一個(gè)通用寄存 器中的目標(biāo)數(shù)據(jù)分量的大小時(shí),可截短該存儲(chǔ)器中源數(shù)據(jù)分量的一部 分。在另一種形式中,當(dāng)該至少一條或多條指令指定存儲(chǔ)器中的源數(shù) 據(jù)分量的大小大于該至少一個(gè)通用寄存器中的目標(biāo)數(shù)據(jù)分量的大小 時(shí),根據(jù)該存儲(chǔ)器中的源數(shù)據(jù)分量低階部分的值,舍入該存儲(chǔ)器中的 源數(shù)據(jù)分量的高階部分。在另一形式中,數(shù)據(jù)處理系統(tǒng)包括存儲(chǔ)器和 用于執(zhí)行數(shù)據(jù)處理指令的處理器。至少一條數(shù)據(jù)處理指令包括指定存 儲(chǔ)在該存儲(chǔ)器中的數(shù)據(jù)分量大小的控制信息,其獨(dú)立于指定存儲(chǔ)在該 存儲(chǔ)器外部的數(shù)據(jù)處理系統(tǒng)中的至少一個(gè)存儲(chǔ)位置的數(shù)據(jù)分量的大 小。
在另一形式中,該系統(tǒng)中的處理器電路執(zhí)行至少第一條指令和該 第一條指令之后的第二條指令。該第一條指令在存儲(chǔ)器和至少一個(gè)通 用寄存器間傳送數(shù)據(jù)分量流,這些數(shù)據(jù)分量將在該存儲(chǔ)器和該至少一 個(gè)通用寄存器的至少一個(gè)中進(jìn)行排隊(duì)。該第二條指令包括至少第一源 操作數(shù),并且基于作為該第二條指令的源操作數(shù)的該至少一個(gè)通用寄 存器,使該數(shù)據(jù)分量流的一部分條件出隊(duì)。當(dāng)該至少一個(gè)通用寄存器 用作由該第二條指令指定的預(yù)定類型功能的源操作數(shù)時(shí),可執(zhí)行該數(shù)
據(jù)分量一部分的條件出隊(duì)。在另一種形式中,基于該第二條指令的控 制字段值執(zhí)行該部分?jǐn)?shù)據(jù)分量的條件出隊(duì)。該第二條指令還可進(jìn)一步 包括第二源操作數(shù),并且當(dāng)該至少一個(gè)通用寄存器用作該第一源操作 數(shù)時(shí),執(zhí)行該條件出隊(duì)。在一種形式中,當(dāng)該至少一個(gè)通用寄存器作
為該第二源操作數(shù)時(shí),不執(zhí)行該條件出隊(duì)。
根據(jù)另一方面,數(shù)據(jù)處理系統(tǒng)中數(shù)據(jù)分量的選擇性出隊(duì)方法包括 提供存儲(chǔ)操作數(shù)的存儲(chǔ)器和提供至少一個(gè)通用寄存器。執(zhí)行至少第一 條指令和該第一條指令后的第二條指令。在該存儲(chǔ)器和該至少一個(gè)通 用寄存器間傳送數(shù)據(jù)分量流,以響應(yīng)該第一條指令。對(duì)該存儲(chǔ)器和該 至少一個(gè)通用寄存器中的至少一個(gè)中的數(shù)據(jù)分量進(jìn)行排隊(duì)。執(zhí)行該第 一條指令之后的第二條指令。該第二條指令包括至少第一源操作數(shù)。 根據(jù)作為該第二條指令的源操作數(shù)的該至少一個(gè)通用寄存器,使數(shù)據(jù) 分量流的一部分條件出隊(duì)。當(dāng)該至少一個(gè)通用寄存器用作由該第二條 指令指定的預(yù)定類型功能的第二源操作數(shù)時(shí),使該部分?jǐn)?shù)據(jù)分量流條 件出隊(duì)??稍谠摰诙l指令中提供第二源操作數(shù),并且在當(dāng)該至少一 個(gè)通用寄存器作為第一源操作數(shù)時(shí)使該部分?jǐn)?shù)據(jù)分量流條件出隊(duì)。在 一種形式中,當(dāng)該至少一個(gè)通用寄存器用作該第二源操作數(shù)時(shí)不執(zhí)行 出隊(duì)。
根據(jù)另一方面,數(shù)據(jù)處理系統(tǒng)包括存儲(chǔ)操作數(shù)的存儲(chǔ)器和至少一 個(gè)通用寄存器。處理器電路執(zhí)行多條指令,該多條指令中的第一條在 該存儲(chǔ)器和該至少一個(gè)通用寄存器間傳送數(shù)據(jù)分量流,并在該存儲(chǔ)器 和該至少一個(gè)通用寄存器中的至少一個(gè)中對(duì)這些數(shù)據(jù)分量進(jìn)行排隊(duì)。 數(shù)據(jù)分量流的一部分條件出隊(duì),以響應(yīng)對(duì)應(yīng)于該多條指令的適當(dāng)子集 中預(yù)定指令的該多條指令中的第二條。該處理器電路可基于作為該多 條指令的第二條的源操作數(shù)的該至少一個(gè)通用寄存器,進(jìn)一步使該部
分?jǐn)?shù)據(jù)分量流條件出隊(duì)。該處理器電路可基于該多條指令的第二條的 控制字段值,進(jìn)一步使該部分?jǐn)?shù)據(jù)分量流條件出隊(duì)。
根據(jù)另一方面,數(shù)據(jù)處理系統(tǒng)中數(shù)據(jù)分量的選擇性出隊(duì)方法包括 提供存儲(chǔ)操作數(shù)的存儲(chǔ)器和提供至少一個(gè)通用寄存器。執(zhí)行多條指令, 該多條指令的第一條在該存儲(chǔ)器和該至少一個(gè)通用寄存器間傳送數(shù)據(jù) 分量流。在該存儲(chǔ)器和該至少一個(gè)通用寄存器中的至少一個(gè)中對(duì)該數(shù)
據(jù)分量流進(jìn)行排隊(duì)。使該數(shù)據(jù)分量流的一部分條件出隊(duì),以響應(yīng)對(duì)應(yīng) 于該多條指令的適當(dāng)子集中預(yù)定指令的該多條指令的第二條。
根據(jù)另一方面,數(shù)據(jù)處理系統(tǒng)包括存儲(chǔ)操作數(shù)的存儲(chǔ)器和至少一 個(gè)通用寄存器。處理器電路執(zhí)行多條指令。該多條指令的第一條在該 存儲(chǔ)器和至少一個(gè)通用寄存器間傳送數(shù)據(jù)分量流,這些數(shù)據(jù)分量將在 該存儲(chǔ)器和該至少一個(gè)通用寄存器中的至少一個(gè)中進(jìn)行排隊(duì)。根據(jù)作 為該多條指令的第二條的目標(biāo)操作數(shù)的該至少一個(gè)通用寄存器,使該 數(shù)據(jù)分量流的一部分條件入隊(duì)。
根據(jù)另一方面,數(shù)據(jù)處理器中數(shù)據(jù)分量的選擇性入隊(duì)方法包括提 供存儲(chǔ)操作數(shù)的存儲(chǔ)器和提供至少一個(gè)通用寄存器。執(zhí)行多條指令, 該多條指令的第一條在該存儲(chǔ)器和該至少一個(gè)通用寄存器間傳送數(shù)據(jù) 分量流,這些數(shù)據(jù)分量將在該存儲(chǔ)器和該至少一個(gè)通用寄存器中的至 少一個(gè)中進(jìn)行排隊(duì)。根據(jù)作為該多條指令的第二條的目標(biāo)操作數(shù)的該 至少一個(gè)通用寄存器,使該數(shù)據(jù)分量流的一部分條件入隊(duì)。
根據(jù)另一方面,數(shù)據(jù)處理系統(tǒng)包括存儲(chǔ)操作數(shù)的存儲(chǔ)器和至少一 個(gè)通用寄存器。該處理器電路執(zhí)行至少第一條指令和該第一條指令后 的第二條指令。該第一條指令在存儲(chǔ)器和至少一個(gè)通用寄存器間傳送
數(shù)據(jù)分量流,這些數(shù)據(jù)分量將在該存儲(chǔ)器和該至少一個(gè)通用寄存器中 的至少一個(gè)中進(jìn)行排隊(duì)。該第二條指令包括至少第一目標(biāo)操作數(shù)?;?br>
于作為該第二條指令的目標(biāo)操作數(shù)的該至少一個(gè)通用寄存器,使該數(shù) 據(jù)分量流的一部分條件入隊(duì)。
根據(jù)另一方面,數(shù)據(jù)處理系統(tǒng)包括存儲(chǔ)操作數(shù)的存儲(chǔ)器和至少一 個(gè)通用寄存器。該處理器電路執(zhí)行至少第一條指令和該第一條指令后 的第二條指令。該第一條指令在該存儲(chǔ)器和該至少一個(gè)通用寄存器間 傳送數(shù)據(jù)分量流,這些數(shù)據(jù)分量將在該存儲(chǔ)器和該至少一個(gè)通用寄存 器中的至少一個(gè)中進(jìn)行排隊(duì)。該第一條指令進(jìn)一步指定將要傳送的數(shù)
據(jù)分量的數(shù)量,并且基于作為該第二條指令的源操作數(shù)的該至少一個(gè) 通用寄存器,使來(lái)自該部分?jǐn)?shù)據(jù)分量流的的多個(gè)數(shù)據(jù)分量條件出隊(duì)。
根據(jù)另一方面,數(shù)據(jù)處理系統(tǒng)包括存儲(chǔ)操作數(shù)的存儲(chǔ)器和至少一 個(gè)通用寄存器。該處理器電路執(zhí)行至少第一條指令和該第一條指令后 的第二條指令。該第一條指令在存儲(chǔ)器和至少一個(gè)通用寄存器間傳送 數(shù)據(jù)分量流,這些數(shù)據(jù)分量將在該存儲(chǔ)器和該至少一個(gè)通用寄存器中 的至少一個(gè)中進(jìn)行排隊(duì)。該第一條指令進(jìn)一步指定將要傳送的數(shù)據(jù)分 量的數(shù)量,并且基于作為該第二條指令的目標(biāo)操作數(shù)的該至少一個(gè)通 用寄存器,使來(lái)自該部分?jǐn)?shù)據(jù)分量流的的多個(gè)數(shù)據(jù)分量條件入隊(duì)。
根據(jù)另一方面,數(shù)據(jù)處理系統(tǒng)包括存儲(chǔ)操作數(shù)的存儲(chǔ)器、至少一 個(gè)通用寄存器和處理器電路。該處理器電路包括多條指令。該多條指 令中的第一條在存儲(chǔ)器和至少一個(gè)通用寄存器間傳送數(shù)據(jù)分量流,這 些數(shù)據(jù)分量將在該存儲(chǔ)器和該至少一個(gè)通用寄存器中的至少一個(gè)中進(jìn) 行排隊(duì)。條件執(zhí)行該數(shù)據(jù)分量流的一部分的入隊(duì)和出隊(duì)中的至少一個(gè), 以響應(yīng)該多條指令的第二條中的控制字段。
根據(jù)另一方面,數(shù)據(jù)處理系統(tǒng)包括存儲(chǔ)操作數(shù)的存儲(chǔ)器和多個(gè)通 用寄存器,其中,每個(gè)通用寄存器保存多個(gè)數(shù)據(jù)分量。處理器電路執(zhí) 行一條或多條指令,該一條或多條指令中的至少一條在該存儲(chǔ)器和該 多個(gè)通用寄存器中的至少兩個(gè)間傳送多個(gè)數(shù)據(jù)分量,其中,該至少一 條或多條指令指定將要在該多個(gè)通用寄存器中的至少兩個(gè)中的每一個(gè) 和該存儲(chǔ)器間傳送的寄存器分量的數(shù)量。該一條或多條指令除了指定 將要傳送的寄存器分量的數(shù)量外,還指定將加載或存儲(chǔ)哪一個(gè)寄存器 分量。在另一種形式中,當(dāng)在該多個(gè)通用寄存器中的至少兩個(gè)中的每 一個(gè)和該存儲(chǔ)器間僅傳送該多個(gè)數(shù)據(jù)分量的子集時(shí),用預(yù)定值填充任 何未指定的數(shù)據(jù)分量。
根據(jù)另一方面,在數(shù)據(jù)處理系統(tǒng)中傳送數(shù)據(jù)分量的方法包括在存
儲(chǔ)器中存儲(chǔ)操作數(shù)。在多個(gè)通用寄存器的每一個(gè)中存儲(chǔ)多個(gè)數(shù)據(jù)分量。 該數(shù)據(jù)處理系統(tǒng)執(zhí)行一條或多條指令。該一條或多條指令中的至少一 條引起在該存儲(chǔ)器和該多個(gè)通用寄存器中的至少兩個(gè)間的多個(gè)數(shù)據(jù)分 量的傳送。該至少一條或多條指令指定將要在該多個(gè)寄存器中的至少 兩個(gè)中的每一個(gè)和該存儲(chǔ)器間傳送的寄存器分量的數(shù)量。
根據(jù)另一方面,數(shù)據(jù)處理系統(tǒng)包括存儲(chǔ)操作數(shù)的存儲(chǔ)器和多個(gè)通 用寄存器,其中,每個(gè)通用寄存器保存多個(gè)數(shù)據(jù)分量。處理器電路執(zhí)
行一條或多條指令,該一條或多條指令中的至少一條在該存儲(chǔ)器和該 多個(gè)通用寄存器中的至少兩個(gè)間傳送多個(gè)數(shù)據(jù)分量。該至少一條或多 條指令指定將要傳送該多個(gè)通用寄存器中的至少兩個(gè)中的哪些數(shù)據(jù)分 量。當(dāng)僅傳送多個(gè)數(shù)據(jù)分量的子集時(shí),該處理器電路用預(yù)定值填充任 何未指定的數(shù)據(jù)分量。在一種形式中,由該至少一條或多條指令指定 的數(shù)據(jù)分量在該多個(gè)通用寄存器中的至少兩個(gè)中連續(xù)排列。在另一種 形式中,由該至少一條或多條指令指定的數(shù)據(jù)分量在該多個(gè)通用寄存 器中的至少兩個(gè)中不是連續(xù)排列。
根據(jù)另一方面,在數(shù)據(jù)處理系統(tǒng)中傳送數(shù)據(jù)分量的方法包括在存 儲(chǔ)器中存儲(chǔ)操作數(shù)和在多個(gè)通用寄存器中的每一個(gè)中保存多個(gè)數(shù)據(jù)分 量。執(zhí)行一條或多條指令,該一條或多條指令中的至少一條在該存儲(chǔ) 器和該多個(gè)通用寄存器中的至少兩個(gè)間引起多個(gè)數(shù)據(jù)分量的傳送,其 中,至少一條或多條指令指定將要傳送該多個(gè)通用寄存器中的至少兩 個(gè)中的哪些數(shù)據(jù)分量。
根據(jù)另一方面, 一種數(shù)據(jù)處理系統(tǒng)包括存儲(chǔ)操作數(shù)的存儲(chǔ)器和多 個(gè)通用寄存器,其中,每一通用寄存器保存多個(gè)數(shù)據(jù)分量。處理器電 路執(zhí)行一條或多條指令,該一條或多條指令中的至少一條在該存儲(chǔ)器 和該多個(gè)通用寄存器中的至少兩個(gè)間傳送多個(gè)數(shù)據(jù)分量。該至少一條 或多條指令既指定將要在該多個(gè)寄存器中的至少兩個(gè)中的每一個(gè)和該 存儲(chǔ)器間傳送的數(shù)據(jù)分量的數(shù)量,還進(jìn)一步指定將要傳送的數(shù)據(jù)分量
的總數(shù)。
根據(jù)另一方面,數(shù)據(jù)處理系統(tǒng)包括存儲(chǔ)操作數(shù)的存儲(chǔ)器和至少一 個(gè)通用寄存器。處理器電路執(zhí)行一條或多條指令,該一條或多條指令 中的至少一條用于在該存儲(chǔ)器和該至少一個(gè)通用寄存器間傳送多個(gè)數(shù) 據(jù)分量,其中,該一條或多條指令指定(a)存儲(chǔ)器中連續(xù)數(shù)據(jù)分量 間的第一部分中數(shù)據(jù)分量間的第一偏移;(b)將在該存儲(chǔ)器和該至少 一個(gè)GPR間傳送的數(shù)據(jù)分量的第一數(shù)量;以及(C)該存儲(chǔ)器中數(shù)據(jù)分 量的第一部分和第二部分間的第二偏移。在一種形式中,該一條或多 條指令中的這一條還指定存儲(chǔ)器中數(shù)據(jù)分量的數(shù)據(jù)分量大小。在另一 形式中,該一條或多條指令中的這一條還指定該存儲(chǔ)器中數(shù)據(jù)分量的 大小,其獨(dú)立于指定該至少一個(gè)通用寄存器中數(shù)據(jù)分量的大小。該處
理器電路基于該存儲(chǔ)器中數(shù)據(jù)分量的大小,確定將要傳送的數(shù)據(jù)分量 的總數(shù)。該處理器電路可基于該至少一個(gè)通用寄存器中數(shù)據(jù)分量的大 小,確定將要傳送的數(shù)據(jù)分量的總數(shù)。該一條或多條指令中的這一條 可進(jìn)一步指定將要在該存儲(chǔ)器和該至少一個(gè)通用寄存器間傳送的數(shù)據(jù) 分量的總數(shù)。該數(shù)據(jù)處理系統(tǒng)可進(jìn)一步包括第一通用寄存器和第二通 用寄存器,其中,該一條或多條指令中的這一條在該存儲(chǔ)器和第一通
用寄存器與第二通用寄存器間傳送數(shù)據(jù)分量,以響應(yīng)執(zhí)行該一條或多
條指令中的該條指令。該一條或多條指令中的這一條指令可進(jìn)一步指
定將要在該存儲(chǔ)器和第一通用寄存器與第二通用寄存器間傳送的數(shù)據(jù)
分量的總數(shù)。如果傳送的數(shù)據(jù)分量的總數(shù)并沒有完全填充該第二通用
寄存器,則處理器電路可用預(yù)定值填充任何剩余比特位置的一部分。
該一條或多條指令中的這一條指令可獨(dú)立地指定將要在該存儲(chǔ)器和該 第一與第二通用寄存器中的每一個(gè)間傳送的數(shù)據(jù)分量的數(shù)量。如果傳
送的數(shù)據(jù)分量的總數(shù)并沒有完全填充該第二通用寄存器,則該處理器 電路可用預(yù)定值填充任何剩余比特位置的至少一部分。該一條或多條 指令中的這一條指令可進(jìn)一步包括指示符,其中,該處理器電路使用 該第二偏移不超過(guò)一次,同時(shí)傳送第一數(shù)量的數(shù)據(jù)分量。當(dāng)該一條或 多條指令中的這一條指定僅使用該第二偏移一次時(shí),該處理器電路可
利用循環(huán)緩沖發(fā)送存儲(chǔ)器中的數(shù)據(jù)分量。該一條或多條指令中的這一 條可進(jìn)一步包括指示符,其中,如果將要傳送的數(shù)據(jù)分量的第一數(shù)量 是將要傳送的數(shù)據(jù)分量的第一部分的兩倍,則該處理器電路使用該第 二偏移多于一次。
根據(jù)另一方面,數(shù)據(jù)處理系統(tǒng)包括存儲(chǔ)操作數(shù)的存儲(chǔ)器和至少一 個(gè)通用寄存器。處理器電路執(zhí)行一條或多條指令,該一條或多條指令 中的至少一條在該存儲(chǔ)器和該至少一個(gè)通用寄存器間傳送數(shù)據(jù)分量, 其中,該一條或多條指令的一條指定基數(shù)指示符,用于在該存儲(chǔ)器和 該至少一個(gè)通用寄存器間以比特翻轉(zhuǎn)的順序執(zhí)行傳送一個(gè)或多個(gè)數(shù)據(jù)
根據(jù)另一方面, 一種使用多個(gè)尋址模式的方法提供存儲(chǔ)操作數(shù)的 存儲(chǔ)器。提供至少一個(gè)通用寄存器。執(zhí)行一條或多條指令,該一條或 多條指令中的至少一條在該存儲(chǔ)器和該至少一個(gè)通用寄存器間傳送數(shù) 據(jù)分量。該一條或多條指令中的至少一條指定該存儲(chǔ)器中連續(xù)數(shù)據(jù)分 量的第一部分中數(shù)據(jù)分量間的第一偏移。該一條或多條指令中的至少 一條指定將在該存儲(chǔ)器和該至少一個(gè)通用寄存器(GPR)間傳送的數(shù)據(jù) 分量的第一數(shù)量。該一條或多條指令中的至少一條可進(jìn)一步指定該存 儲(chǔ)器中數(shù)據(jù)分量的第一部分和第二部分間的第二偏移。該一條或多條 指令中的至少一條可用于進(jìn)一步指定存儲(chǔ)器中數(shù)據(jù)分量的數(shù)據(jù)分量大 小。該一條或多條指令中的至少一條可用于進(jìn)一步指定該存儲(chǔ)器中數(shù) 據(jù)分量的大小,其獨(dú)立于指定該至少一個(gè)通用寄存器中數(shù)據(jù)分量的大 小。處理器基于該存儲(chǔ)器中數(shù)據(jù)分量的大小,用于確定將要傳送的數(shù) 據(jù)分量的總數(shù)。該處理器可基于該至少一個(gè)通用寄存器中數(shù)據(jù)分量的 大小,確定將要傳送的數(shù)據(jù)分量的總數(shù)。該一條或多條指令中的至少 一條指令可用于進(jìn)一步指定將要在該存儲(chǔ)器和該至少一個(gè)通用寄存器 間傳送的數(shù)據(jù)分量的總數(shù)??商峁┑谝煌ㄓ眉拇嫫骱偷诙ㄓ眉拇嫫?并且在該存儲(chǔ)器和第一通用寄存器與第二通用寄存器間傳送數(shù)據(jù)分 量,以響應(yīng)執(zhí)行該一條或多條指令中的該條指令。該一條或多條指令
中的這一條指令可用于進(jìn)一步指定將要在該存儲(chǔ)器和第一通用寄存器 與第二通用寄存器間傳送的數(shù)據(jù)分量的總數(shù)。在一種形式中,如果傳 送的數(shù)據(jù)分量的總數(shù)并沒有完全填充該第二通用寄存器,則用預(yù)定值 填充該第二通用寄存器中任何剩余的未填充的比特位置的至少一部 分。該一條或多條指令中的這一條指令可用于進(jìn)一步獨(dú)立地指定將要 在該存儲(chǔ)器和該第一與第二通用寄存器中的每一個(gè)間傳送的數(shù)據(jù)分量 的數(shù)量。在一種形式中,如果傳送的數(shù)據(jù)分量的總數(shù)并沒有完全填充 該第二通用寄存器,則利用諸如零的預(yù)定值填充任何剩余比特位置的 至少一部分。可在該一條或多條指令中的這一條中提供指示符,其中, 作為該指示符的響應(yīng),處理器僅使用該第二偏移一次,來(lái)傳送第一數(shù) 量的數(shù)據(jù)分量。
根據(jù)另一方面,當(dāng)該一條或多條指令中的這一條指定僅使用該第 二偏移一次時(shí),則可利用循環(huán)緩沖,在該處理器的控制之下,發(fā)送存 儲(chǔ)器中的數(shù)據(jù)分量??稍谠撘粭l或多條指令中的這一條中提供指示符, 其中,作為該指示符的響應(yīng),如果將要傳送的第一數(shù)量的數(shù)據(jù)分量是 將要傳送的存儲(chǔ)器中數(shù)據(jù)分量的第一部分中的數(shù)據(jù)分量數(shù)量的兩倍, 則該處理器使用該第二偏移多于一次??稍撘粭l或多條指令的這一條 中提供基數(shù)指示符,用于在該存儲(chǔ)器和該至少一個(gè)通用寄存器間以比 特翻轉(zhuǎn)的順序執(zhí)行一個(gè)或多個(gè)數(shù)據(jù)分量的傳送。
根據(jù)另一方面, 一種數(shù)據(jù)處理尋址方法包括提供存儲(chǔ)操作數(shù)的存 儲(chǔ)器和提供至少一個(gè)通用寄存器。執(zhí)行一條或多條指令,該一條或多 條指令中的至少一條在該存儲(chǔ)器和該至少一個(gè)通用寄存器間傳送數(shù)據(jù) 分量。該一條或多條指令中的至少一條在該一條或多條指令的這一條 中指定基數(shù)指示符,該基數(shù)指示符在該存儲(chǔ)器和該至少一個(gè)通用寄存 器間以比特翻轉(zhuǎn)的順序執(zhí)行一個(gè)或多個(gè)數(shù)據(jù)分量的傳送。
根據(jù)另一方面, 一種數(shù)據(jù)處理系統(tǒng)尋址方法包括提供存儲(chǔ)操作數(shù) 的存儲(chǔ)器和提供至少一個(gè)通用寄存器。提供處理器電路以執(zhí)行一條或
多條指令。該一條或多條指令中的至少一條在該存儲(chǔ)器和該至少一個(gè) 通用寄存器間傳送數(shù)據(jù)分量,其中,該一條或多條指令中的一條執(zhí)行 以比特翻轉(zhuǎn)的順序?qū)㈩A(yù)定數(shù)據(jù)分量存儲(chǔ)至存儲(chǔ)器中,并將該預(yù)定數(shù)據(jù) 分量傳送至該至少一個(gè)通用寄存器。該一條或多條指令中的至少一條 進(jìn)一步指定將要傳送至該至少一個(gè)通用寄存器中的數(shù)據(jù)分量的數(shù)量。 在另一形式中,該一條或多條指令中的至少一條進(jìn)一步指定該存儲(chǔ)器 中數(shù)據(jù)分量的大小,其獨(dú)立于指定該至少一個(gè)通用寄存器中數(shù)據(jù)分量 的大小。
根據(jù)另一方面, 一種數(shù)據(jù)處理系統(tǒng)尋址方法包括提供存儲(chǔ)操作數(shù) 的存儲(chǔ)器和提供至少一個(gè)通用寄存器。提供處理器電路以執(zhí)行一條或 多條指令,該一條或多條指令中的至少一條在該存儲(chǔ)器和該至少一個(gè) 通用寄存器間傳送數(shù)據(jù)分量,其中,該一條或多條指令中的一條在該 存儲(chǔ)器中以連續(xù)順序存儲(chǔ)預(yù)定數(shù)據(jù)分量,并且以比特翻轉(zhuǎn)順序?qū)⒃擃A(yù) 定數(shù)據(jù)分量傳送至該至少一個(gè)通用寄存器。
根據(jù)另一方面, 一種數(shù)據(jù)處理系統(tǒng)尋址方法包括提供存儲(chǔ)操作數(shù) 的存儲(chǔ)器和提供至少一個(gè)通用寄存器。提供處理器電路以執(zhí)行一條或 多條指令,該一條或多條指令中的至少一條在該存儲(chǔ)器和該至少一個(gè) 通用寄存器間傳送數(shù)據(jù)分量,其中,該一條或多條指令中的一條在該 至少一個(gè)通用寄存器中執(zhí)行以比特翻轉(zhuǎn)順序存儲(chǔ)預(yù)定數(shù)據(jù)分量,并且 將該預(yù)定數(shù)據(jù)分量傳送至該存儲(chǔ)器。
根據(jù)另一方面, 一種數(shù)據(jù)處理系統(tǒng)尋址方法包括提供存儲(chǔ)操作數(shù) 的存儲(chǔ)器和提供至少一個(gè)通用寄存器。提供處理器電路以執(zhí)行一條或 多條指令,該一條或多條指令中的至少一條在該存儲(chǔ)器和該至少一個(gè) 通用寄存器間傳送數(shù)據(jù)分量,其中,該一條或多條指令中的一條在該 至少一個(gè)通用寄存器中以連續(xù)順序存儲(chǔ)預(yù)定數(shù)據(jù)分量,并且以比特翻 轉(zhuǎn)順序?qū)⒃擃A(yù)定數(shù)據(jù)分量傳送至該存儲(chǔ)器。
在前述說(shuō)明中,參考特定實(shí)施例、示例和方面說(shuō)明了本發(fā)明。然 而,本領(lǐng)域的普通技術(shù)人員明白,可進(jìn)行各種修改和變化,而不脫離 權(quán)利要求說(shuō)明的本發(fā)明的精神與范圍。例如,框圖可包括與已表示的 方框不同的方框,并且可具有更多或更少的方框,或不同的布置。另 外,作為另一示例,此處說(shuō)明的指令可具有不同于那些已經(jīng)說(shuō)明的指 令的各種不同格式,并使用不同的控制字段和參數(shù)。每一條指令甚至 可作為多條指令執(zhí)行。另外,作為另一示例,此處說(shuō)明的寄存器可為 位于該數(shù)據(jù)處理系統(tǒng)任何地方的任何類型的存儲(chǔ)電路。因此,說(shuō)明書 與附圖將視為說(shuō)明意義,而不是限定意義,并且所有這樣的改變將包 含在本發(fā)明的范圍之內(nèi)。
已經(jīng)針對(duì)特定實(shí)施例說(shuō)明了益處、優(yōu)勢(shì)和問(wèn)題的解決方案。然而, 這些益處、優(yōu)勢(shì)和問(wèn)題的解決方案以及使任何益處、優(yōu)勢(shì)、問(wèn)題的解 決方案出現(xiàn)或變得更加顯著的任何要素將不被視為任何或所有權(quán)利要 求的關(guān)鍵的、必須的或本質(zhì)的特征或要素。如此處所使用,術(shù)語(yǔ)"包 括",或其任何變體,將涵蓋非排它性的包涵,使得包括一系列要素 的過(guò)程、方法、物品或裝置不僅包括那些要素,還可包括沒有明確列 出的,或這些過(guò)程、方法、物品或裝置固有的其它要素。
權(quán)利要求
1.一種數(shù)據(jù)處理系統(tǒng),其包括存儲(chǔ)操作數(shù)的存儲(chǔ)器;至少一個(gè)通用寄存器,其中所述存儲(chǔ)器不包括所述至少一個(gè)通用寄存器;以及執(zhí)行一條或多條指令的處理器電路,所述一條或多條指令的至少一條用于在所述存儲(chǔ)器和所述至少一個(gè)通用寄存器間傳送數(shù)據(jù)分量,其中,所述至少一條或多條指令指定所述存儲(chǔ)器中數(shù)據(jù)分量的大小,其與指定所述至少一個(gè)通用寄存器中數(shù)據(jù)分量的大小相分離且無(wú)關(guān)。
2. —種用于在數(shù)據(jù)處理系統(tǒng)中加載和存儲(chǔ)數(shù)據(jù)分量的方法,其包括提供存儲(chǔ)操作數(shù)的存儲(chǔ)器;提供至少一個(gè)通用寄存器,其中所述存儲(chǔ)器不包括所述至少一個(gè) 通用寄存器;以及執(zhí)行一條或多條指令,所述一條或多條指令的至少一條引起在所 述存儲(chǔ)器和所述至少一個(gè)通用寄存器間傳送數(shù)據(jù)分量,其中,所述至 少一條或多條指令指定所述存儲(chǔ)器中數(shù)據(jù)分量的大小,其與指定所述 至少一個(gè)通用寄存器中數(shù)據(jù)分量的大小相分離且無(wú)關(guān)。
3. —種數(shù)據(jù)處理系統(tǒng),其包括存儲(chǔ)器和用于執(zhí)行數(shù)據(jù)處理指令的 處理器,至少一條數(shù)據(jù)處理指令包括指定存儲(chǔ)在所述存儲(chǔ)器中的數(shù)據(jù) 分量大小的控制信息,上述指定與指定存儲(chǔ)在所述存儲(chǔ)器外部的數(shù)據(jù) 處理系統(tǒng)中的至少一個(gè)存儲(chǔ)位置中的數(shù)據(jù)分量的大小相分離且無(wú)關(guān)。
4. 一種數(shù)據(jù)處理系統(tǒng),其包括 存儲(chǔ)操作數(shù)的存儲(chǔ)器;多個(gè)通用寄存器,其中,每個(gè)通用寄存器保存多個(gè)數(shù)據(jù)分量;以及 執(zhí)行一條或多條指令的處理器電路,所述一條或多條指令中的至 少一條用于在所述多個(gè)通用寄存器中的至少兩個(gè)和所述存儲(chǔ)器間傳送 多個(gè)數(shù)據(jù)分量,其中,所述至少一條或多條指令指定將要在所述多個(gè) 通用寄存器中的至少兩個(gè)中的每一個(gè)和所述存儲(chǔ)器間傳送的數(shù)據(jù)分量 的數(shù)量,其中,所述一條或多條指令中的至少一條提供要存儲(chǔ)到所述 存儲(chǔ)器中或從所述存儲(chǔ)器中加載的連續(xù)數(shù)據(jù)分量的第一部分中數(shù)據(jù)分 量間的第一偏移以及要存儲(chǔ)到所述存儲(chǔ)器中或從所述存儲(chǔ)器中加載的 數(shù)據(jù)分量的第一部分和第二部分間的第二偏移。
5. —種在數(shù)據(jù)處理系統(tǒng)中傳送數(shù)據(jù)分量的方法,其包括 在存儲(chǔ)器中存儲(chǔ)操作數(shù);在多個(gè)通用寄存器的每一個(gè)中存儲(chǔ)多個(gè)數(shù)據(jù)分量;以及 在所述數(shù)據(jù)處理系統(tǒng)中執(zhí)行一條或多條指令,所述一條或多條指 令中的至少一條引起在所述多個(gè)通用寄存器中的至少兩個(gè)和所述存儲(chǔ) 器間的多個(gè)數(shù)據(jù)分量的傳送,其中,所述至少一條或多條指令指定將 要在所述多個(gè)寄存器中的至少兩個(gè)中的每一個(gè)和所述存儲(chǔ)器間傳送的 數(shù)據(jù)分量的數(shù)量,其中,所述一條或多條指令中的至少一條提供要存 儲(chǔ)到所述存儲(chǔ)器中或從所述存儲(chǔ)器中加載的連續(xù)數(shù)據(jù)分量的第一部分 中數(shù)據(jù)分量間的第一偏移以及要存儲(chǔ)到所述存儲(chǔ)器中或從所述存儲(chǔ)器 中加載的數(shù)據(jù)分量的第一部分和第二部分間的第二偏移。
6. —種數(shù)據(jù)處理系統(tǒng),其包括 存儲(chǔ)操作數(shù)的存儲(chǔ)器;多個(gè)通用寄存器,其中,每一通用寄存器保存多個(gè)數(shù)據(jù)分量;以及執(zhí)行一條或多條指令的處理器電路,所述一條或多條指令中的至 少一條用于在所述多個(gè)通用寄存器中的至少兩個(gè)和所述存儲(chǔ)器間傳送 多個(gè)數(shù)據(jù)分量,其中,所述至少一條或多條指令指定將要傳輸所述多 個(gè)通用寄存器的至少兩個(gè)中的每一個(gè)中的多個(gè)數(shù)據(jù)分量的哪個(gè)子集, 其中,所述一條或多條指令中的至少一條提供要存儲(chǔ)到所述存儲(chǔ)器中 或從所述存儲(chǔ)器中加載的連續(xù)數(shù)據(jù)分量的第一部分中數(shù)據(jù)分量間的第 一偏移以及要存儲(chǔ)到所述存儲(chǔ)器中或從所述存儲(chǔ)器中加載的數(shù)據(jù)分量 的第一部分和第二部分間的第二偏移。
7. —種在數(shù)據(jù)處理系統(tǒng)中傳送數(shù)據(jù)分量的方法,其包括 在存儲(chǔ)器中存儲(chǔ)操作數(shù);在多個(gè)通用寄存器的每一個(gè)中保存多個(gè)數(shù)據(jù)分量;以及執(zhí)行一條或多條指令,所述一條或多條指令中的至少一條引起在 所述多個(gè)通用寄存器中的至少兩個(gè)和所述存儲(chǔ)器間傳送多個(gè)數(shù)據(jù)分 量,其中,所述至少一條或多條指令指定將要傳輸所述多個(gè)通用寄存 器的至少兩個(gè)中的每一個(gè)中的多個(gè)數(shù)據(jù)分量的哪個(gè)子集,其中,所述 一條或多條指令中的至少一條提供要存儲(chǔ)到所述存儲(chǔ)器中或從所述存 儲(chǔ)器中加載的連續(xù)數(shù)據(jù)分量的第一部分中數(shù)據(jù)分量間的第一偏移以及 要存儲(chǔ)到所述存儲(chǔ)器中或從所述存儲(chǔ)器中加載的數(shù)據(jù)分量的第一部分 和第二部分間的第二偏移。
8. —種數(shù)據(jù)處理系統(tǒng),其包括存儲(chǔ)操作數(shù)的存儲(chǔ)器;多個(gè)通用寄存器,其中,每一通用寄存器保存多個(gè)數(shù)據(jù)分量;以及執(zhí)行一條或多條指令的處理器電路,所述一條或多條指令中的至 少一條用于在所述多個(gè)通用寄存器中的至少兩個(gè)和所述存儲(chǔ)器間傳送 多個(gè)數(shù)據(jù)分量,其中,所述至少一條或多條指令既指定將要在所述多 個(gè)寄存器中的至少兩個(gè)中的每一個(gè)和所述存儲(chǔ)器間傳送的數(shù)據(jù)分量的 數(shù)量,還進(jìn)一步指定將要傳送的數(shù)據(jù)分量的總數(shù),其中,所述一條或 多條指令中的至少一條提供要存儲(chǔ)到所述存儲(chǔ)器中或從所述存儲(chǔ)器中 加載的連續(xù)數(shù)據(jù)分量的第一部分中數(shù)據(jù)分量間的第一偏移以及要存儲(chǔ) 到所述存儲(chǔ)器中或從所述存儲(chǔ)器中加載的數(shù)據(jù)分量的第一部分和第二 部分間的第二偏移。
全文摘要
提供一種用于執(zhí)行SIMD運(yùn)算的數(shù)據(jù)處理系統(tǒng)及其方法。可使用各種加載與存儲(chǔ)指令在寄存器文件(元件34)中的寄存器和存儲(chǔ)器(元件12)間傳送多個(gè)矢量分量??墒褂胏nt參數(shù)表示將向或從存儲(chǔ)器傳送的分量的總數(shù),并且可使用rcnt參數(shù)表示向或從寄存器文件中的單個(gè)寄存器傳送的矢量分量的最大數(shù)量。另外,這些指令可使用各種不同的尋址模式??瑟?dú)立于該寄存器分量大小指定該存儲(chǔ)器分量大小,使得指令中的源與目標(biāo)的大小可不相同。通過(guò)一些指令,可發(fā)起矢量流,并條件入隊(duì)或出隊(duì)。可提供截短或舍入字段,使得在傳送時(shí)可截短或舍入源數(shù)據(jù)分量。另外,可在傳送時(shí)對(duì)源數(shù)據(jù)分量進(jìn)行有符號(hào)或無(wú)符號(hào)擴(kuò)展。
文檔編號(hào)G06F9/318GK101373426SQ200810144568
公開日2009年2月25日 申請(qǐng)日期2004年8月30日 優(yōu)先權(quán)日2003年9月8日
發(fā)明者威廉·C·莫耶, 布賴恩·杰夫里·盧卡斯, 肯特·唐納德·莫特, 菲利普·E·馬伊, 詹姆斯·M·諾里斯, 雷蒙德·B·埃西克四世 申請(qǐng)人:飛思卡爾半導(dǎo)體公司