CN101373426A - 用于执行simd运算的数据处理系统及其方法 - Google Patents
用于执行simd运算的数据处理系统及其方法 Download PDFInfo
- Publication number
- CN101373426A CN101373426A CNA2008101445685A CN200810144568A CN101373426A CN 101373426 A CN101373426 A CN 101373426A CN A2008101445685 A CNA2008101445685 A CN A2008101445685A CN 200810144568 A CN200810144568 A CN 200810144568A CN 101373426 A CN101373426 A CN 101373426A
- Authority
- CN
- China
- Prior art keywords
- instruction
- component
- storer
- data
- general
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims description 32
- 238000012545 processing Methods 0.000 title claims description 10
- 238000003860 storage Methods 0.000 claims description 78
- 238000011068 loading method Methods 0.000 claims description 31
- 230000005540 biological transmission Effects 0.000 claims description 14
- 239000013598 vector Substances 0.000 abstract description 104
- 238000012546 transfer Methods 0.000 abstract description 3
- 239000011159 matrix material Substances 0.000 description 74
- 230000003139 buffering effect Effects 0.000 description 22
- 230000014509 gene expression Effects 0.000 description 22
- 238000005070 sampling Methods 0.000 description 19
- 101150103933 VMAC gene Proteins 0.000 description 17
- 238000009825 accumulation Methods 0.000 description 12
- 230000007246 mechanism Effects 0.000 description 8
- 230000006870 function Effects 0.000 description 7
- 230000036961 partial effect Effects 0.000 description 7
- 230000002093 peripheral effect Effects 0.000 description 7
- 230000008901 benefit Effects 0.000 description 6
- 239000004020 conductor Substances 0.000 description 6
- 238000013461 design Methods 0.000 description 5
- 230000008569 process Effects 0.000 description 5
- 230000004044 response Effects 0.000 description 5
- 230000008859 change Effects 0.000 description 4
- 238000010586 diagram Methods 0.000 description 4
- 230000009191 jumping Effects 0.000 description 4
- 230000004048 modification Effects 0.000 description 4
- 238000012986 modification Methods 0.000 description 4
- 229910052757 nitrogen Inorganic materials 0.000 description 4
- 238000003491 array Methods 0.000 description 3
- 230000002457 bidirectional effect Effects 0.000 description 2
- 230000001934 delay Effects 0.000 description 2
- 238000001914 filtration Methods 0.000 description 2
- 229910052760 oxygen Inorganic materials 0.000 description 2
- 239000000758 substrate Substances 0.000 description 2
- 238000004364 calculation method Methods 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 238000006073 displacement reaction Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000007667 floating Methods 0.000 description 1
- 230000000670 limiting effect Effects 0.000 description 1
- 230000014759 maintenance of location Effects 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 238000002715 modification method Methods 0.000 description 1
- 229910052698 phosphorus Inorganic materials 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 230000002829 reductive effect Effects 0.000 description 1
- 238000000926 separation method Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 229910052717 sulfur Inorganic materials 0.000 description 1
- 230000036962 time dependent Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30181—Instruction operation extension or modification
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F15/00—Digital computers in general; Data processing equipment in general
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30007—Arrangements for executing specific machine instructions to perform operations on data operands
- G06F9/3001—Arithmetic instructions
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/30007—Arrangements for executing specific machine instructions to perform operations on data operands
- G06F9/30036—Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3004—Arrangements for executing specific machine instructions to perform operations on memory
- G06F9/30043—LOAD or STORE instructions; Clear instruction
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/34—Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes
- G06F9/345—Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes of multiple operands or results
- G06F9/3455—Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes of multiple operands or results using stride
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Mathematical Optimization (AREA)
- Mathematical Analysis (AREA)
- Computational Mathematics (AREA)
- Pure & Applied Mathematics (AREA)
- Mathematical Physics (AREA)
- Computer Hardware Design (AREA)
- Advance Control (AREA)
- Executing Machine-Instructions (AREA)
- Memory System (AREA)
- Complex Calculations (AREA)
Abstract
提供一种用于执行SIMD运算的数据处理系统及其方法。可使用各种加载与存储指令在寄存器文件(元件34)中的寄存器和存储器(元件12)间传送多个矢量分量。可使用cnt参数表示将向或从存储器传送的分量的总数,并且可使用rcnt参数表示向或从寄存器文件中的单个寄存器传送的矢量分量的最大数量。另外,这些指令可使用各种不同的寻址模式。可独立于该寄存器分量大小指定该存储器分量大小,使得指令中的源与目标的大小可不相同。通过一些指令,可发起矢量流,并条件入队或出队。可提供截短或舍入字段,使得在传送时可截短或舍入源数据分量。另外,可在传送时对源数据分量进行有符号或无符号扩展。
Description
本申请是申请号为200480024425.0,申请日为2004年8月30日的中国专利申请“用于执行SIMD运算的数据处理系统及其方法”的分案申请。
技术领域
本发明主要涉及数据处理系统,更具体地,涉及在数据处理系统中使用的指令。
背景技术
通过允许在矢量的多个分量上执行并行运算,可实现提高数据处理系统的性能。目前可用的一种处理器类型为矢量处理器,其利用执行矢量运算的矢量寄存器。然而,尽管矢量处理器允许更高的性能,但对于使用标量通用寄存器的处理器而言,增加了复杂度和成本。也就是,矢量处理器中的矢量寄存器文件通常包括N个矢量寄存器,其中每个矢量寄存器包括M个寄存器的库用于保存M个分量。例如,在本领域公知的一种矢量寄存器中,该寄存器文件包括32个矢量寄存器,其中,每个寄存器包括32个64位寄存器的库,从而等于需要1024个64位寄存器。
目前另一种可用的矢量寄存器是单指令多数据(SIMD)标量处理器(也称为“短矢量机”),其允许有限的矢量处理,同时使用任何现有的标量通用寄存器(GPR)。例如,在具有32个标量64位GPR的数据处理系统中,每一标量寄存器可以保存2个32位分量,4个16位分量,或8个8位分量,从而能够执行2个32位分量运算,4个16位分量运算,或8个8位分量运算。因此,与矢量处理器相比(根据上述示例,其每次可对寄存器库中的32个64位寄存器执行运算),尽管每次运算的分量数目受到限制,但减少了所需的硬件。然而,在当前的SIMD标量处理器中,存在大量的与向标量寄存器传送用于执行的矢量分量和向存储器传送回多个矢量分量相关联的开销。该开销限制了运算的有效吞吐量,因此,存在对于在存储器与寄存器间加载和存储多个矢量分量的改良方法的需求。
附图说明
通过示例说明本发明,并不受限于附图,在附图中,相同的引用号码表示相同的元素,并且其中:
图1以框图的形式表示遵照本发明的一个实施例的数据处理系统;
图2-11表示可由图1的数据处理系统执行的矢量加载和存储指令,其遵照本发明的各种实施例;
图12表示示例存储器部分,其遵照本发明的一个实施例;
图13-17表示一组标量GPR中的条目的示例,其遵照本发明的各种实施例;
图18表示存储器部分随时间变化的示例,其遵照本发明的一个实施例;
图19-26表示一组标量GPR中条目的示例,其遵照本发明的各种实施例;
图27-33表示可由图1的数据处理系统执行的矢量加载和存储指令,其遵照本发明的替换实施例;
图34表示存储器部分的示例,其遵照本发明的一个实施例;和
图35表示一组标量GPR中条目的示例,其遵照本发明的一个实施例。
技术人员明白,图中的元件出于简化和说明的目的而表示,并不一定按比例绘制。例如,图中某些元件的尺寸相对于其它元件夸大,以有助于理解本发明的实施例。
具体实施方式
如此处所使用的,术语“总线”指用于传送一种或多种信息,例如,数据、地址、控制或状态的多个信号或导线(conductor)。此处讨论的导线可表示或说明为单个导线、多个导线、单向导线或双向导线。然而,不同的实施例可变化这些导线的实现方式。例如,可使用多个分离的单向导线,而不是双向导线,反之亦然。另外,可用以串行或时间复用方式传送信号的单个导线代替多个导线。同样地,承载多个信号的单个导线可分离为承载这些信号的子集的各种不同导线。因此,对于传送信号存在多个选项。
当将信号、状态位或类似的装置分别呈现其逻辑真或假状态时,使用术语“肯定”(assert)或“设置”(set)以及“否定”(negate)(或“非肯定”(deasert)或“清除”(clear))。如果该逻辑真状态为逻辑水平一,则逻辑假状态为逻辑水平零。并且如果逻辑水平真状态为逻辑水平零,则逻辑水平假状态为逻辑水平一。另外,在数字前的“0x”表明该数字以其16进制或16基底形式表示。数字前的“%”表明该数字以其二进制或2基底形式表示。
如上所述,存在对于降低从存储器向寄存器和从寄存器向存储器传送多个矢量分量的开销的需求。因此,此处将讨论多种不同的矢量加载和存储指令,其允许以改进的方式从或向存储器传送矢量分量。此外,使用此处说明的指令可允许降低的开销,向现有的设计增加最小的硬件复杂度。例如,如同在许多类型的数据处理系统中的使用,标量寄存器文件可与这些指令一同使用,从而无需成本更高的独立矢量寄存器文件。另外,这些指令可允许降低的软件复杂度,同时还提供执行效率。另外,此处的指令可用于解决各种问题,例如,存储器中矢量分量的对齐,将存储器分量的大小扩展至寄存器分量以提高的精确度的需要,存储器的任意矢量长度对于固定长度,或与检索/存储矢量数据所需的加载/存储指令数关联的开销(例如,在发出与执行指令时)。此处的这些指令还可用于解决这些问题的组合,或别的问题或问题的组合,如通过在下面参考图1-35提供的说明将要理解的那样。
图1以框图的形式表示根据本发明的一个实施例的数据处理系统10。数据处理系统10包括处理器14、存储器12、输入/输出(I/O)16、其它外围设备18以及系统总线20。存储器12通过导线22双向连接至系统总线20,I/O 16通过导线24双向连接至系统总线20,其它外围设备18通过导线26双向连接至系统总线20,处理器14通过导线58连接至系统总线20。在一个实施例中,其它外围设备18可包括一个或多个外围设备,其中,每一外围设备可为任何类型的外围设备,例如,通用异步收发器(UART),实时时钟(RTC),键盘控制器,其它存储器,等等。其它外围设备18的一些或全部能够通过导线62传送数据处理系统10外部的信息。I/O电路16可包括任何类型的I/O电路,其通过例如导线60,接收或提供数据处理系统10的外部信息。存储器12可为任何类型的存储器,例如,只读存储器(ROM),随机存取存储器(RAM),非易失性存储器(例如,flash)等。数据处理系统10可包括除表示的那些之外的其它元件,或可包括比表示出的那些更多或更少的元件。例如,数据处理系统10可包括任意数量的存储器或处理器。
处理器14可为任何类型的处理器,例如,微处理器、微控制器、数字信号处理器,等等。在一个实施例中,处理器14可称为处理器内核。在另一实施例中,处理器14可为多处理器数据处理系统中多个处理器中的一个。另外,尽管没有这样表示,但处理器14可为流水线处理器。在图1中所示的实施例中,处理器14包括控制单元28、指令单元30、执行单元32、标量寄存器文件34、总线接口单元(BIU)36以及加载/存储单元38。控制单元28通过导线40双向连接至指令单元30,通过导线42连接至执行单元32,通过导线46连接至标量寄存器文件34,并且通过导线48连接至加载/存储单元38。执行单元32通过导线44双向连接至标量寄存器文件34,并且标量寄存器文件34通过导线50双向连接至加载/存储单元38。BIU 36通过导线54双向连接至指令单元30,并且通过导线52连接至加载/存储单元38。处理器14通过连接至导线58的导线56,能够与系统总线20双向通信。注意,处理器14可包括比表示出的更多的电路,其中,附加电路可连接至导线58。也就是,导线56可通过全部或部分导线58与系统总线20通信。还要注意,全部或部分处理器14可称为处理电路。
在操作中,指令单元30通过BIU 36和系统总线20从例如存储器12的存储器取回指令,并从或向控制单元28接收和提供控制信息。指令单元30可为本领域所公知的任何类型的指令单元,并如本领域所公知的那样操作,并且因此不在此处详细说明。指令单元30因此向控制单元28提供指令,控制单元通过,例如,执行单元32和加载/存储单元38,控制这些接收的指令的执行,执行单元32和加载/存储单元38这两个单元可在必要时直接地或通过控制单元28与标量寄存器文件34通信。例如,控制单元28通过加载/存储单元38和BIU 36,能在需要执行指令时从存储器(例如存储器12)向标量寄存器文件34中的寄存器加载数据,并且能在需要执行指令时将来自寄存器文件34中寄存器的数据存储至存储器(例如存储器12)。例如,在一个实施例中,加载/存储单元38能够通过导线50,基于控制单元28通过导线48提供的控制信息,直接与标量寄存器文件34通信(以读取和写入数据)。执行单元32可在需要执行通过控制单元28从指令单元30接收的指令时,使用在标量寄存器文件34中存储的数据,执行算术、逻辑、移位或其它运算操作,并将结果存储至标量寄存器34中的寄存器。执行单元32可包括,例如,算术逻辑单元(ALU)、浮点单元,等等。
标量寄存器文件34包括N个通用寄存器(GPR),其中,N可为大于或等于一的任何整数。在一个实施例中,标量寄存器文件34包括32个64位寄存器。如同此处所使用,标量寄存器表示具有一维映射并因此仅保存一行数据(例如,1×M位寄存器)的寄存器,其中,M为大于或等于一的任何整数。在一个实施例中,M为64,并且每个寄存器因此能够存储64位的量。标量寄存器文件34可通过导线46向或从控制单元28提供或接收控制信息。
处理器14的操作通常可由本领域的普通技术人员理解。因此在此处将不详细说明处理器14,除了在理解参考图2-36说明的各种实施例中需要的那些部分外。还要注意,可在需要执行此处说明的加载与存储指令时修改具有存储在通用寄存器文件中的操作数的数据处理系统的现有设计。此外,注意,由于可使用标量寄存器文件,可更新目前的现有设计,以允许此处说明的指令。(然而,此处说明的实施例可与任何类型的寄存器文件一同使用,并不仅限于标量寄存器文件。)
图2-11表示各种不同的矢量分量加载与存储指令,其可由处理电路执行,例如,由图1的处理器14等执行。例如,每一指令可由指令单元30取回,其在适当时将它们提供至控制单元28。控制单元28因此可在需要时指示加载/存储单元38和执行单元28执行接收的指令,在需要存储数据时使用寄存器文件34,如下详述。注意,参考后面的图,提供使用在图2-11中表示的指令的示例。另外,注意,如此处所使用,矢量分量(或寄存器分量)指一个最多为标量GPR大小,但也可以小于GPR大小的分量。例如,在标量寄存器文件34包括64位寄存器(M=64)的情况下,矢量分量可为64位的大小或更小。例如,矢量分量可为一个字节(8位),使得一个64位GPR能够保存8个矢量分量。另外,矢量分量可为半字(16位),使得一个64位GPR能够保存4个矢量分量。类似地,矢量分量可为字(32位),使得64位GPR可保存2个分量。还要注意,如此处所使用,字节由“b”表示,半字由“h”表示,并且字由“w”表示。(注意,在替换实施例中,字或半字的定义可能不同。例如,字可以指16位,而不是32位。然而,如此处所使用,为了便于说明,字指32位。)
图2表示加载矢量分量(lvex)指令,其用来自存储器的分量加载该寄存器文件(例如,标量寄存器文件34)中的一个目标寄存器。在一个实施例中,可利用附加控制字段进一步限定该操作,例如s/u字段、ms字段以及ds字段,在图2中将每一个说明为紧随操作符“lvex”,并由句点分隔。在一个实施例中,具有这些控制字段中的每一个;然而在替换实施例中,可能存在这些控制字段中的一些或者完全不存在。在一个实施例中,ms字段对应于存储器分量大小字段,ds字段对应于目标分量大小。例如,在一个实施例中,该存储器分量大小(ms)字段可设置为mb、mh或mw中的一个,以分别表明该将要加载的存储器分量是否为字节、半字或字。类似地,目标分量大小(ds)字段用于表示在目标寄存器中每一加载的分量将具有的大小。
图2的lvex指令还包括三个操作数:rD、rA以及rB。该指令lvex利用来自存储器的矢量分量加载目标寄存器rD。寄存器rA指向存储器中的第一个分量,并且在图2的实施例中,在寄存器rB中指定附加参数。因此,每一rD、rA和rB可表明标量寄存器文件34中GPR中的一个。在寄存器rB中存储的附加参数包括计数(cnt)值和跨度(stride)值,使得lvex指令在具有ds大小的rD字段中用来自存储器的“cnt”个分量(由rA指向这些分量的第一个)加载寄存器rD,使得rD中的每一目标分量具有ds大小。
还可指定跨度值,其指示存储器中的分量如何分隔。也就是,存储器中的这些分量距离“stride”个大小ms的单位。例如,如果存储器中的分量相邻,则可使用跨度1得到“cnt”个大小为“ms”的相邻分量。例如,如果这些分量距离三个分量放置,则可使用跨度3获得“cnt”个元素,彼此间距离3个“ms”大小的单位。例如,如果ms表示字(例如,mw),则跨度3将在存储器中从rA所指的存储器位置开始每三个字取一个字。另外,该跨度值可为有符号值,其中,负值将向低位地址位置取分量,不是向高位地址位置取分量。
在一个实施例中,目标大小(ds)应当大于或等于存储器分量大小(ms)。如果该目标大小(ds)大于该存储器大小(ms),则s/u字段可用于适当地扩展每个存储器分量。“s”用于表示这些分量是有符号的,并且应该因此能够进行符号扩展,而“u”可用于表示这些分量是无符号的,并且应当因此能够进行零扩展。例如,在“lvex.u.mh.dwrD,rA,rB”的情况下,rD中(字大小)的每一目标位置的上半字可归零,如下面详细说明。另外,注意,在一个实施例中,如果“cnt*ds”小于目标寄存器rD的大小,则rD剩余的低阶部分归零。可替换地,rD的任何剩余部分,例如,rD的剩余的低阶部分,可由任何预定值填充(例如,零或任何其它预定值)。另外,在一个实施例中,如果ds小于ms,则在加载至rD时,可对每一分量进行舍入或截短(其中,该lvex指令还可包括截短或舍入控制字段,如下对于存储指令的说明)。
在说明的实施例中,可将s/u字段、ms字段以及ds字段编码为操作码或子操作码的部分。因此,在说明的实施例中,该lvex指令包括表示该操作码的字段、表示rD的字段、表示rA的字段、表示rB的字段以及表示子操作码的字段。然而,在替换实施例中,注意,s/u、ms以及ds字段还可在rB中连同cnt和stride(跨度)一起表示。
图3表示图2的lvex指令的替换实施例,其中不是将rB表示为操作数,其中,rB包括附加参数,而是作为该指令的操作码和子操作码的全部或部分提供所有这些参数。例如,可在该指令的子操作码部分提供cnt、stride以及控制字段(s/u,ms和ds)。
注意,上面提供的对于控制字段s/u、ms和ds的说明适用于所有此处说明的加载指令。在使用该指令lvex时,在此处说明的其它加载指令中,可存在这些控制字段的全部、一些或是完全不存在。还需要注意,对于此处的讨论,rD通常指目标寄存器,rA指向存储器中第一个存储器分量,并且rB,如果在该指令中存在的话,存储该指令的一些或全部附加参数。注意,rB还可称为控制寄存器,并且不必是GPR中的一个。类似地,rA可为控制寄存器或另一存储器位置,并且不必是GPR中的一个。还要注意,在此处说明的所有指令(加载与存储)中,这些控制字段可编码为该指令的操作码或子操作码的一部分或可位于寄存器rB中。如果它们位于寄存器rB中,则这些控制字段通常不出现在操作符之后,并由句点分隔,而将仅出现在寄存器rB中。还要注意,如果需要更多的参数或控制字段,此处的任何指令可表示,如必要的话,多于一个的寄存器,用于表示指令参数和控制字段,或者在共同的或不相连的存储位置中可包含附加信息。
图4表示加载多个矢量分量(lmvex)指令,其用来自存储器的分量加载多个目标寄存器。在使用该lmvex指令时,该lmvex指令还可包括s/u字段、ms字段,以及ds字段,每一个在图4中表示为紧随操作符“lmvex”,并由句点分隔。图4的lmvex指令还包括三个操作数:rD,rA和rB。该lmvex指令用“cnt”个来自存储器的矢量分量加载第一目标寄存器rD,和所需的多个跟随rD之后的寄存器(其中,寄存器rA指向存储器中的第一个分量),使得任何目标寄存器中的每一目标分量的大小为ds。例如,如果9个半字(16位)大小的分量将加载至rD(其中,每一GPR为64位),则需要3个GPR。在一个实施例中,rD表示第一个寄存器,并且如果需要更多,则使用额外的相邻寄存器。例如,如果rD表示该9个分量的寄存器R4,则使用寄存器R4,R5和R6。
在寄存器rB中存储的附加参数包括cnt、stride(跨度)、skip(跳跃)和skip_cnt。参数cnt与stride与上述参考图1的说明相同。也就是,存储器中将要加载的分量可距离“stride”个ms大小的单位放置。该lmvex指令从存储器距离“stride”个(ms大小的)单位加载分量,直到取回“skip_cnt”个分量。此时,下一个分量位于“skip”个ms大小的单位处,并且重置该记录skip_cnt的机制(例如,计数器)。因此,每次取回skip_cnt个分量时(从该指令的起始或从上次重置skip_cnt计数器),下一分量就位于“skip”(而不是“stride”)个ms大小的单位处。在一个实施例中,处理器14(例如,控制单元28中)中的计数器设置为“skip_cnt-1”,并在每次取数后递减,直到该计数器终止(到达零),并再次设置为“skip_cnt-1”,以继续取回位于“skip”个单位处的分量,直到取回“cnt”个分量。(可替换地,可将该计数器设置为零,并逐次增加,直到该计数器到达skip_cnt-1,替换实施例可使用其它方法记录skip_cnt。)注意,stride和skip均可为有符号量。另外,在一个实施例中,在从存储器加载“cnt”个分量后,最后一个寄存器中任何剩下的未填充字节用预定值填充(例如,零)。
在一个实施例中,该目标大小(ds)应大于或等于该存储器分量大小(ms)。如果该目标大小(ds)大于该存储器分量大小(ms),则该s/u字段可用于适当地扩展每一存储器分量,如上对于lvex的说明。然而,在一个实施例中,如果ds小于ms,则每个分量可在加载至rD时舍入或截短,如下对于存储指令的说明。
图5表示图4的lmvex指令的替换实施例,其中,不是将rB表示为操作数,其中rB包括附加参数,而是可将所有这些参数作为该指令子操作码的全部或部分提供。例如,cnt、stride、skip、skip_cnt以及控制字段(s/u、ms和ds)可全部在该指令的子操作码或操作码部分指示。但在另一替换实施例中(未示出),各个指令参数可分配至指令字段或rB中的字段。例如,当希望使该参数能够基于计算结果或基于系统状态动态修改时,可使用分配至rB中的字段。其它参数可为静态特性,并且可编码至该指令中的字段。
注意,对于此处说明的其余字段,任何附加参数将位于rB中,其中rB作为操作数提供至该指令。然而,应当理解,在替换实施例中,该指令可具有不同的格式,如上所述。
图6表示另一加载多矢量分量(lmvex2)指令,其也用来自存储器的分量加载多个目标寄存器。在使用上述指令时,该lmvex2指令还可包括s/u字段、ms字段和ds字段,每个在图6中表示为跟随操作符“lmvex2”,并由句点分隔。图6的lmvex2还包括三个操作数:rD,rA和rB。该指令lmvex2用来自存储器的“cnt”个矢量分量(其中,寄存器rA指向存储器中的第一个分量)加载该目标寄存器rD(和所需的多个跟随rD的寄存器),使得任一目标寄存器中的每一目标分量的大小为ds。例如,如果9个半字(16位)的分量将加载至rD(其中,每一GPR为64位),则至少需要3个GPR,并且如进一步所述,则还需要超过3个的附加GPR。在一个实施例中,rD表示该第一个寄存器,并且如果需要更多,则使用附加的连续寄存器。例如,如果rD表示这9个分量的寄存器R4,则至少使用寄存器R4,R5和R6。
在寄存器rB中存储的用于lmvex2的附加参数包括cnt、rcnt、stride和skip。参数cnt和stride如同上面对于lmvex的说明。也就是,存储器中将要加载的分量可位于“stride”个ms大小的单位处,并且cnt定义要加载的分量的总数。该rcnt参数定义将加载至每一寄存器中目标分量的最大数。(因此,所需的寄存器总数取决于cnt和rcnt。)该lmvex2指令从存储器加载总共“cnt”个分量至一个或更多目标寄存器(按照需要的数量),其中,仅有“rcnt”个分量加载至每一目标寄存器。(因此,在一个实施例中,rcnt小于或等于可包含在单个GPR中的ds大小的目标分量的总数,并且rcnt还小于或等于cnt。)
例如,该lmvex2指令从存储器间隔“stride”个(ms大小的)单位加载分量至目标寄存器(rD),直到取回“rcnt”个分量至单个寄存器。此时,如果还没有取回总共“cnt”个分量,则下一个“分量”位于“skip”个ms大小的单位处。来自存储器相隔“stride”个(ds大小的)单位位置的分量然后加载至另一目标寄存器(例如,rD+1等),直到取回“rcnt”个分量至该目标寄存器(或者直到取回“cnt”个分量,无论哪一个先发生)。在取回“rcnt”分量后,如果还没有取回“cnt”个分量,则继续将位于“skip”个单位处的下一个分量加载至,例如rD+2。当已经取回“cnt”个分量时,加载停止。因此注意,存储器中对于给定目标寄存器的分量距离“stride”个ms大小的单位,在将“skip”个ms大小的单位加至前一目标寄存器的最后一个分量的地址后,取回后面寄存器的分量。还要注意,stride和skip均为有符号的量,允许负stride和skip。
注意,在替换实施例中,可使用skip_cnt参数,使得在取回skip_cnt个分量后,下一分量位于“skip”个ms大小的单位处。按照这种方式,在将“rcnt”个分量载入至目标寄存器中后,如果已取回skip_cnt个分量,或者基于stride,如果从该指令的起始或从上次重置skip_cnt以来还没有加载skip_cnt个分量,则基于skip取回后面寄存器的下一个分量。
如上对于lvex的说明,处理器14中的计数器(例如,在控制单元28中)可用于在加载矢量分量期间记录“cnt”。类似地,处理器14中的计数器还可用于在加载每一目标寄存器期间记录“rcnt”。替换实施例可使用其它方法记录cnt和rcnt。另外,在一个实施例中,在取回“rcnt”个分量之后,每一目标寄存器中的其余字节由预定值填充,例如零等。另外,在一个实施例中,在从存储器加载“cnt”个分量后,所使用的最后一个寄存器中的剩余字节用预定值填充(例如,零)。
在一个实施例中,该目标大小(ds)应大于或等于该存储器分量大小(ms)。如果该目标大小(ds)大于该存储器分量大小(ms),则该s/u字段可用于适当地扩展每一存储器分量,如同对于上面指令的上述说明。然而,在一个实施例中,如果ds小于ms,则在加载至rD时,每一分量可被舍入或截短,如下面对于该存储指令的说明。
图7表示加载矢量分量流(lstrmvex)指令,其发起从存储器向与目标寄存器关联的指定流加载矢量分量流。在使用上述指令时,该lstrmvex指令也可包括s/u字段、ms字段和ds字段,每一个在图7中表示为跟随操作符“lstrmvex”,并由句点分隔。图7的lstrmvex指令还包括三个操作数:rD,rA和rB。lstrmvex的附加参数还包括cnt、rcnt、stride、skip和skip_cnt。参数cnt、rcnt、stride、skip和skip_cnt通常与对于lvex,lmvex和lmvex2的上述说明相同。
lstrmvex指令用来自存储器的总共“cnt”个分量加载多个rD的实例(其中,寄存器rA指向存储器中的第一个分量),使得该目标寄存器中的每一目标分量的大小为ds。cnt和rcnt的值确定目标rD实例的数量。该lstrmvex指令从间隔“stride”个ms大小的单位的存储器加载矢量分量,直到取回“skip_cnt”个分量。此时,将“skip*ms”添加至最后一个取回的地址(而不是“stride*ms”),以获得将要加载的下一分量的地址。另外,此时重置记录skip_cnt的机制(例如,计数器)。因此,每次取回“skip_cnt”个分量时(自从该指令的起始或从上次重置该skip_cnt计数器),由“skip”,而不是“stride”参数指示下一分量的位置。
该“rcnt”参数定义每寄存器实例的目标分量数。(因此,在一个实施例中,rcnt小于或等于单个GPR中ds大小的目标分量的总数,并且rcnt小于或等于cnt。)例如,该lstrmvex指令从存储器(根据参数stride、skip以及skip_cnt,如上所述)加载分量至rD(即,rD的第一个实例),直到取回“rcnt”个分量。此时,如果还没有取回“cnt”个分量,则下一分量位于“stride”个ms大小的单位处(或者,如果取回skip_cnt分量,则下一分量位于“skip”个,而不是“stride”个ms大小的单位处)。该lstrmvex指令然后继续从存储器(根据参数stride、skip和skip_cnt)向不同的rD实例(即,rD的第二个实例,覆盖以前的rD值)加载分量,直到取回“rcnt”个分量(或直到取回“cnt”个分量,无论哪一个先发生)。如果,在取回“rcnt”个分量后,并还没有取回“cnt”个分量,则继续加载下一分量至rD(rD的另一实例)。当取回“cnt”个分量时,加载停止。rD的每一实例对应于从存储器取回的rcnt个分量的唯一集合。随着rD每一实例的出队,用分量流中的下一rcnt个分量集合加载下一实例,直到加载该流的总共cnt个分量。
在一个实施例中,rD的实例基于后面指令中rD的使用或位置出队。例如,在一个实施例中,如果rD用作后面指令中特定源寄存器,则rD实例出队。因此,在执行后面指令后(rD作为特定源寄存器),将在rD中加载下一个“rcnt”个分量(假设还没有达到“cnt”个分量)。然而,如果rD没有用作特定源寄存器(即,如果其为不同的目标寄存器,或其为目标寄存器),则rD不出队,并且不将下一“rcnt”个分量加载至rD。在替换实施例中,以其它方式指示是否出队的选项,例如,通过指令中的标志,或通过不同的操作码等(例如,对应于要求出队的指令的特殊子集等)。可选出队的示例将在后面参考图23-26说明。
如上对于上面指令的说明,处理器14中的计数器(例如,在控制单元28中)可在加载矢量分量期间用于记录“cnt”。类似地,处理器14中的寄存器还可在加载每一目标寄存器期间记录“rcnt”。计数器还可用于记录skip_cnt。替换实施例可使用其它方法记录cnt,rcnt,和skip_cnt。另外,在一个实施例中,在加载“rcnt”个分量后,每一目标寄存器或寄存器实例中的任何剩余字节由预定值填充,例如零。另外,在一个实施例中,从存储器加载“cnt”个分量后,所使用的最后一个目标寄存器或寄存器实例中的剩余字节用预定值填充(例如零)。还要注意,stride和skip可为有符号量,允许负的stride和skip。
在一个实施例中,目标大小(ds)应大于或等于存储器分量大小(ms)。如果该目标大小(ds)大于该存储器分量大小(ms),则s/u字段可用于适当地拓展每一存储器分量,如对于上面指令的上述说明。然而,在一个实施例中,如果ds小于ms,则在加载至rD时,可舍入或截短每一分量。
注意,在替换实施例中,lstrmvex指令的各个参数的每一个可为可选的,并且此处说明的其它指令的替换实施例也可能如此,例如lvex、lmvex和lmvex2指令。
图8表示存储矢量分量(stvex)指令,其从源寄存器向存储器存储分量。该stvex指令可认为是Ivex指令的对应。在一个实施例中,该stvex指令使用附加控制字段,例如,s/u字段、ms字段、ss字段和h/l字段,在图8中将每一个表示为跟随操作符“stvex“,并由句点分隔。在一个实施例中,这些控制字段的每一个都存在;然而,在替换实施例中,仅存在这些控制字段中的一些,或者完全没有。在一个实施例中,s/u字段(有符号或无符号扩展)和ms字段(存储器大小)与上面对于加载指令的说明相同。在一个实施例中,ss字段对应于源分量大小字段,其指示源寄存器中每一源分量的大小。例如,在一个实施例中,该ss字段可设置为sb、sh或sw之一,以分别指示将存储至存储器的源分量是否为字节、半字或字。
图8的stvex指令还包括三个操作数:rS、rA和rB。在图8的实施例中,在寄存器rB中指定了附加参数,其中这些附加参数包括cnt和stride。(因此,在使用上面的加载指令时,每一rS、rA和rB可指示标量寄存器34中GPR中的一个。)该stvex指令从源寄存器rS向存储器存储“cnt”个ss大小的分量,其中,第一个分量将存储在由寄存器rA指向的存储器位置,使得存储器中的每一目标分量具有ms大小(并且可选地截短或拓展,如s/u字段和h/l字段指示)。
还可指定跨度(stride)值,其指示存储器中的分量如何分隔。也就是,在存储时,存储器中的分量将距离“stride”个ms大小的单位。例如,跨度1可用于存储“cnt”个相邻的“ms”大小的分量。类似地,跨度3可用于向存储器存储“cnt”个“ms”大小的分量,每一个彼此间距离3个“ms”大小的单位。另外,注意,该跨度值可为有符号值。
在一个实施例中,h/l字段为截短控制字段。例如,如果ss大于ms(即,源大小大于存储器大小),则该h/l字段可用于指示如何截短该源分量。例如,如果该h/l字段为“h”,则截短该源分量的低阶部分。然而,如果该h/l字段为“1”,则截短该源分量的高阶部分。注意,在替换实施例中,stvex指令还包括舍入控制字段(除了或替换该截短控制字段),使得如果,例如,ss大于ms,则对各值进行舍入,而不是截短。例如,在一个实施例中,可基于源分量的低阶部分,舍入该源分量的高阶部分。
在一个实施例中,如果该源分量大小(ss)小于该存储器分量大小(ms),则该s/u字段可用于在存储至存储器中时适当地扩展每一源分量。可使用“s”指示分量是有符号的,并且因此应当进行符号扩展,而使用“u”指示分量是无符号的,并因此应当进行零扩展。
在表示的实施例中,此处说明的任何存储指令的s/u字段、ms字段,ss字段和h/l字段可编码为操作码或子操作码的一部分。因此,在表示的实施例中,stvex指令包括指示该操作码的字段、指示rS的字段、指示rA的字段、指示rB的字段和指示子操作码的字段。然而,在替换实施例中,注意,s/u、h/l、ms、和ss字段,连同cnt和stide,还可在rB中指示。另外,在使用该加载指令时,每一附加参数还可编码为操作码或子操作码的一部分,无需指定寄存器,例如rB。因此注意,在替换实施例中,此处说明的任何存储指令可具有各种不同的格式。另外注意,将参考在寄存器rB中存储附加参数说明该存储指令。(如上所述,如果需要附加参数和控制字段,则在该指令中可指示多个寄存器或存储位置。)
注意,上面提供的对于控制字段s/u、ms、ss和h/l的说明适用于此处说明的所有存储指令。在使用指令stvex时,在此处说明的其它存储指令中可存在这些控制字段中的全部,一些,或完全不存在。还要注意,对于此处的讨论,rS通常指源寄存器,rA指向将要存储第一个分量的存储器位置,并且rB,如果在该指令中存在的话,保存该指令的一些或全部附加参数。
图9表示存储多矢量分量(strmvex)指令,其从多个源寄存器向存储器存储分量。该stmvex指令可认为是lmvex指令的存储对应。在一个实施例中,该stmvex指令使用附加控制字段,例如s/u字段、ss字段、ds字段和h/l字段,每一个在图9中表示为跟随操作符“stmvex”,并由句点分隔。上面提供的对于stvex指令的这些字段的说明也适用于该stmvex指令。
图9的stmvex指令还包括三个操作数:rS,rA和rB。在图9的实施例中,在寄存器rB中指定附加参数。其中,这些附加的参数包括cnt、stride、skip和skip_cnt。该stmvex指令从多个源寄存器rS(以及rS之后的寄存器,例如,rS+1,rS+2,按照需要)向存储器存储“cnt”个ss大小的分量,其中,寄存器rA指向将要存储的第一个分量的地址,并且使得存储器中的每一分量具有ms的大小(并且可选地截短或扩展,根据s/u和h/l字段的指示)。
在使用stmvex时,跨度值可指示如何分隔存储器中的分量。因此,来自rS的源分量存储至存储器,使得它们距离“stride”个(ms大小的)单位放置,直到存储了“skip_cnt”个分量。此时,向最后一个存储的分量的地址增加“skip*ms”(而不是“stride*ms”),以获得将要存储的下一个分量的地址。另外,此时,重置用于记录skip_cnt的机制(例如,计数器)。因此,每次存储“skip_cnt”个分量时(从该指令的开始或从上次重置skip_cnt计数器),将要存储的下一个分量的地址由skip参数指示,而不是由stride参数指示。在将来自rS的源分量存储至存储器时,将来自下一源寄存器的源分量(例如,rS+1等)基于stride、skip和skip_cnt参数存储至存储器,直到存储了“cnt”个分量。
如上对于加载指令的说明,处理器14中的计数器(例如控制单元28中)可用于适当地记录cnt和skip_cnt。例如,计数器可用于指示skip_cnt个分量,其中,在存储了skip_cnt个分量后,重置该计数器,并且将下一skip_cnt个分量存储在起始处由skip指示的位置。继续如此,例如,直到存储了cnt个分量(其可由,例如,另一计数器指示)。替换实施例可使用其它方法记录cnt和skip_cnt。
注意,在一个实施例中,如果ss小于ms,则可适当地扩展每一源分量,如同s/u字段(如对于stvex的说明)所指示,以生成存储器目标分量。另外,在一个实施例中,如果ss大于ms,则适当地截短每一源分量,如同h/l字段(如对于stvex的说明)所指示,以生成存储器目标分量。
图10表示另一存储多矢量分量(stmvex2)指令,其从多个目标寄存器向存储器存储分量。该stmvex2指令可视为lmvex2指令的存储对应。在一个实施例中,该stmvex2指令使用附加控制参数,例如s/u字段、ss字段、ds字段和h/l字段,每一个在图10中表示为跟随操作符“stmvex2”,并由句点分隔。上面对于stvex和stmvex指令的这些控制字段提供的说明也适用于stmvex2指令。
图10的stmvex2指令还包括三个操作数:rS、rA和rB。在图10的实施例中,在rB中指定附加参数,其中,这些附加参数包括cnt、rcnt、stride和skip。该stmvex2指令从多个源寄存器rS(以及rS之后的寄存器,例如,rS+1、rS+2,按照需要)向存储器存储“cnt”个ss大小的分量,其中,寄存器rA指向将要存储的第一个分量的地址,并且使得存储器中的每一分量具有ms的大小(并且可选地截短或扩展,如s/u和h/l字段所指示)。该rcnt参数定义将要存储的每个源寄存器的源分量的数量,并且该cnt参数定义将要存储的分量的总数。
在使用stmvex2时,跨度(stride)值可指示如何分隔存储器中的分量。因此,来自rS的源分量存储至存储器,使得它们距离“stride”个(ms大小的)单位放置。在一个实施例中,在存储“rcnt”个来自给定源寄存器(rS)的分量后,如果要存储其余的分量,则向最后一个存储的分量的地址增加“skip*ms”(而不是“stride*ms”),以获得将要存储的下一个分量的地址。然后将来自下一个源寄存器(例如,rS+1等)的“rcnt”个源分量利用所指示的“stride”值存储至存储器。继续如此,直到存储了“cnt”个分量。注意,在一个实施例中,如“rcnt*ss”小于该源寄存器的大小,则忽略每一源寄存器的其余低阶部分。还要注意,“stride”和“skip”可为有符号的量,从而允许负的stride和skip。
注意,在替换实施例中,还可使用skip_cnt参数,使得在存储了skip_cnt个分量之后,下一个分量位于“skip”个ms大小的单位处(而不是“stride”个ms大小的单位处)。按照这种方式,在向存储器存储了“rcnt”个分量后,如果存储了skip_cnt个分量,或者基于stride,如果自从该指令的起始或从上次重置skip_cnt以来没有存储skip_cnt个分量,则基于skip将来自后面寄存器的下一个分量存储至存储器中的位置。
如上对于该加载指令的说明,处理器14中的计数器(例如,控制单元28中)可用于适当地记录cnt和rcnt。替换实施例可使用其它方法记录cnt和rcnt。
注意,在一个实施例中,如果ss小于ms,则适当扩展每一源分量,如同s/u字段所指示(如对于stvex的说明),以生成存储器目标分量。另外,在一个实施例中,如果ss大于ms,则适当地截短每一源分量,如同h/l字段所指示(如同对于stvex和stmvex的说明),以生成存储器目标分量。还可以可选地指定舍入,如前对于stvex指令的说明。
图11表示存储矢量分量流(ststrmvex)指令,其发起从指定流向存储器存储矢量分量流。该ststrmvex指令可视为lstrmvex指令的存储对应。在一个实施例中,该ststrmvex指令使用附加控制字段,例如s/u字段、ss字段、ds字段和h/l字段,每一个在图11中表示为跟随操作符“ststrmvex”,并由句点分隔。对于stvex、stmvex和stmvex2指令的这些字段的说明在这里也适用于ststrmvex指令。
图11的ststrmvex指令还包括三个操作数:rS、rA和rB。在图11的实施例中,附加参数在寄存器rB中指定,其中,这些附加参数包括cnt、rcnt、stride、skip和skip_cnt。该ststrmvex指令向存储器存储具有总共“cnt”个分量的源寄存器rS的多个实例,其中,rA指向第一个将要存储的分量的地址。该“cnt”参数因此定义将要存储的分量的总数,并且“rcnt”参数定义每个源寄存器rS的实例的源分量数。该ststrmvex指令从rS(即,rS的第一个实例)向存储器存储分量,使得它们距离“stride”个(ms大小的)单位,直到存储了“skip_cnt”个分量。此时,将“skip*ms”添加至最后一个存储的分量的地址(而不是“stride*ms”),以获得下一分量的地址。另外,此时,重置记录skip_cnt的机制(例如,计数器)。因此,每次存储“skip_cnt”个分量时(自从该指令的起始或从上次重置该skip_cnt计数器),由“skip”参数,而不是“stride”参数指示下一分量的位置。
另外,在从rS的给定实例存储“rcnt”个分量后,如果还有分量要存储(即,还没有存储“cnt”个分量),则将“stride*ms”添加至最后一个存储的分量的地址(除非已经存储了“skip_cnt”个分量,在这种情况下,将“skip*ms”,而不是“stride*ms”添加至最后一个存储的分量的地址),以获得从rS的下一个实例存储的第一个分量的地址(例如,在执行rS用作目标寄存器的指令后存储)。例如,在一个实施例中,在rS用作指令的目标寄存器时实例入队。例如,如果rS用作后面指令的目标寄存器,并且还没有存储“cnt”个分量,则根据stride、skip和skip_cnt参数将来自rS(该后面指令的目标寄存器)的“rcnt”个分量(包括,例如,后面指令结果的全部或部分)存储至存储器。在此实施例中,如果rS没有用作指令的目标寄存器,则其在执行该指令时不入队(并因此不存储为该矢量流的一部分)。在替换实施例中,可使用其它机制,例如指令中的标志,或者操作码(例如,对应于要求入队的指令的特殊子集等)指示rS的实例是否入队。
注意,在一个实施例中,如果“rcnt*ss”小于源寄存器的大小,则忽略该源寄存器的剩余低阶部分。还要注意,“stride”和“skip”可为有符号的量,从而允许负的stride和skip。
如上对于加载指令的说明,处理器14中的计数器(例如,在控制单元28中)可用于适当地记录cnt、rcnt、skip和skip_cnt。替换实施例可使用其它方法记录这些参数。
注意,在一个实施例中,如果ss小于ms,则每一源分量被适当地扩展,如s/u字段所指示(如对于stvex的说明),以生成存储器目标分量。另外,在一个实施例中,如果ss大于ms,则每一源分量被适当地截短,如h/l字段所指示(如对于stvex和stmvex的说明),以生成存储器目标分量。可替换地,可使用舍入生成存储器目标分量。
将参考图12-16说明上述各种不同加载指令的示例。图12表示存储器的一部分100,其可对应于,例如,图1的存储器12的全部或一部分。为了说明简单起见,将存储器部分100示出为128位宽的存储器,但在给定实施例中的实际配置可以不同。例如,存储器部分100包括矩阵102,其第一行存储在位置0x12-0x16(对应于半字A、B和C),第二行存储在位置0x22-0x26(对应于半字D、E和F),并且第三行存储在位置0x32-0x36(对应于半字G、H和I)。存储器部分100包括矩阵106,其第一行存储在位置0x54-0x58(对应于半字K、L和M),第二行存储在位置0x64-0x68(对应于半字N、O和P),第三行存储在位置0x74-0x78(对应于半字Q、R和S)。存储器部分100包括矩阵108,其第一行存储在位置0x8A-0x8E(对应于半字aa、bb和cc),第二行存储在位置0x9A-0x9E(对应于半字dd、ee和ff),第三行存储在位置0xAA-0xAE(对应于半字gg、hh和ii)。存储器部分100包括存储在位置0x46-0x4E的矢量104,其对应于半字pp、qq、rr、ss和tt。存储器部分100还包括分别存储在位置0xA2、0xA3、0xA4和0xA5的字节大小的分量T、U、V和W。
注意,在替换实施例中,存储器部分100可以不同方式寻址。另外,存储器部分100可为任何大小,并可保存任何类型的信息,还可位于数据处理系统的任何位置。
当矩阵存储为图12中的矩阵102和106时,上述加载和存储指令可用于执行,例如,矩阵运算。也就是,注意到每一矩阵102和106存储为3×3二维矩阵。另外,在一个实施例中,矩阵运算的结果还可以相同的格式存储,如3×3二维矩阵,例如,矩阵108。因此,注意到,下面的伪码可用于执行矩阵102和矩阵106第一行的和,以获得最终的第一行矩阵108。
/*R7存储0x12,并且R8存储cnt值3和stride值1*/
lvex.u.mh.dh R0,R7,R8
/*R9存储0x54,并且R10存储cnt值3和stride值1*/
lvex.u.mh.dh R1,R9,R10
add.h R2,R0,R1/*对R0和R1中四个独立的半字分量求和,并将结果存储至R2*/
/*R11存储0x8A,并且R12存储cnt值3和stride值1*/
stvex.u.mh.sh R2,R11,R12
注意,在此实施例中,R7存储矩阵102的第一行的起始地址(0x12),并且R8用作rB,以存储上面参考图2和图3说明的cnt和stride参数。类似地,R9存储矩阵106的第一行的起始地址(0x54),并且R10用作rB,以存储cnt和stride参数。R11用于存储R2的第一分量将要存储的位置(0x8A),并且R12用于存储cnt和stride参数。
图13表示执行上述伪码后的寄存器文件(例如,图1的标量寄存器文件34等)。注意,利用执行第一条lvex指令,将矩阵102的A、B和C加载至R0,R0的最后一个字段由预定值填充(例如,当前实施例中的零)。类似地,利用执行第二条lvex指令,将矩阵106的K、L和M加载至R1。因此,注意,仅利用单个指令即可容易地加载每一矩阵的第一行,其允许指定cnt和stride。该add.h指令对R0和R1中的四个独立的半字分量进行求和,并且将四个最终的半字分量放入R2。注意,lvex指令允许用零填充R0和R1的最后一个未使用的字段(因为cnt*ds小于64位,R0和R1的宽度),这两个寄存器的和在R2的不想要的字段中导致零。按照这种方式,不是在R2的不想要的字段中具有未知值(或由于未知值的和造成出现不希望的异常条件),而是为已知的预定值(在此示例中为零)。然后使用stvex指令将R2的头3个字段存储至存储器,使得aa=A+K,bb=B+L和cc=C+H。
然后通过下面的伪码完成矩阵102和106的和。
add R7,0x10 /*R7现在存储0x22*/
add R9,0x10 /*R9现在存储0x64*/
add R11,0x10 /*R11现在存储0x9A*/
lvex.u.mh.dh R0,R7,R8
lvex.u.mh.dh R1,R9,R10
add.h R2,R0,R1
stvex.u.mh.sh R2,R11,R12
add R7,0x10 /*R7现在存储0x32*/
add R9,0x10 /*R9现在存储0x74*/
add R11,0x10 /*R11现在存储0xAA*/
lvex.u.mh.dh R3,R7,R8
lvex.u.mh.dh R4,R9,R10
add.h R5,R0,R1
stvex.u.mh.sh R5,R11,R12
头三个求和指令增加了R7,R9和R11的值,使得它们均分别指向每一矩阵102、106和108的第二行的第一个分量。图14表示执行上面代码后图13的寄存器文件。头两个lvex指令后,D、E和F载入至R0,并且N、O和P载入至R1。该add.h指令对R0和R1中的四个独立半字分量求和,并将最终的四个半字分量放入R2。然后由stvex指令将该结果存储至矩阵108中的存储器,使得dd=D+N、ee=E+O以及ff=F+P。第五至第七条求和指令再一次地增加了R7、R9和R11的值,使得它们均分别指向每一矩阵102、106和108的第三行的第一个分量。注意,用于加载矩阵102和106的第三行的lvex指令将它们分别加载至R3和R4,而不是R0和R1。应当理解,替换实施例可按照需要使用这些寄存器中的任一个,以执行这些操作。例如,可连续覆盖同样的寄存器(例如,R0和R1)或可使用不同的寄存器(例如R3和R4)。最后一条存储指令将结果存储至矩阵108,使得gg=G+Q、hh=H+R以及ii=I+S。
注意,在替换实施例中,可使用不同的代码和指令对矩阵102和106进行求和,并将结果存储至108。例如,上面的伪码可写在循环中,使得在循环体中对于这些矩阵的每一行具有两个lvex和一个stvex指令,其中,该循环执行3次,每行一次。可替换地,可使用不同的矢量加载和存储指令将所有的矩阵102和矩阵106一次送入寄存器文件。这可使用,例如lmvex或lmvex2指令完成。例如,图15和16表示将矩阵102加载至寄存器R0、R1和R2的两个示例。
图15表示例如使用lvmvex指令加载矩阵102后的寄存器文件。在下面的lvmex指令中,假设R7指向矩阵102的起始(R7存储0x12),并且R8对应于rB,其存储cnt值9,stride值1,skip值6和skip_cnt值3。因此,可使用下列指令:
lmvex.u.mh.dh R0,R7,R8 /*cnt=9,stride=1,skip=6且skip_cnt=3*/
因此,如图15中所示,分量A、B和C载入至R0,每一个在存储器中连续,因为这些分量距离“stride*ms”或1个半字放置。然后,由于加载了skip_cnt个(即,3个)分量,将位于“skip*ms”(即,6个半字)处,而不是“stride*ms”(即,1个半字)处的下一个分量D作为R0的第四个分量加载。然后,分量E和F加载至R1,其为R0之后的寄存器,直到再一次地加载skip_cnt分量,从而需要“跳跃(skip)”至下一个分量G,其位于6个半字处。继续如此,直到加载了“cnt”个分量。因此,最后一个分量I加载至R2的第一个字段。注意,R2的其余字段由预定值填充(在此示例中为零)。
图16表示使用例如,lmvex2指令加载矩阵102后的寄存器文件,在该指令中指定cnt、rcnt、skip和skip_cnt。在下面的lmvex指令中,假设R7指向矩阵102的起始(R7存储0x12),并且R8对应于rB,其存储cnt值9,rcnt值3,stride值1和skip值6。因此,可使用下面的指令:
lmvex2.u.mh.dh R0,R7,R8 /*cnt=9,rcnt=3,stride=1,skip=6*/
因此,如图16中所示,分量A、B和C载入至R0,每一个在存储器中连续,因为跨度(stride)为“stride*ms”或1个半字。此时,在R0中载入rcnt个分量(即,3个),并且因此,从“skip*ms”(即,6个半字)位置处加载下一分量D。此外,不将下一分量D作为R0的第四个分量加载,如同在图15的前一示例中利用lvmvex指令的做法,而是作为R1(其为R0之后的寄存器)的第一个分量加载,因为R0已经具有“rcnt”个分量。分量E和F也加载至R1,对于R1完成值为3的rcnt。由于已经在R1中加载了rcnt个分量(并且,还没有加载cnt个分量,即9个),因而从由skip确定的位置,即6个半字处的位置,将下一个分量G取回至R2。另外,分量H和I也载入至R2。此时,已经加载了cnt个分量。还要注意,R0,R1和R2的每一未使用的字段由预定值填充(在此例中为零)。
在替换实施例中,如上所述,lvmvex2指令还可允许指定skip_cnt字段。例如,还可使用lmvex2指令,如上利用值为3的skip_cnt,如图16所示加载矩阵102。在此示例中(仍然指图16和上面的具有所有同样参数和附加的skip_cnt=3的lvmvex2指令),分量A、B和C载入至R0,每一个在存储器中连续,因为这些分量距离“stride*ms”或1个半字放置。然后,由于已经加载了skip_cnt个(即,3个)分量,则加载位于“skip*ms”(即,6个半字)处,而不是位于“stride*ms”(即,1个半字)处的下一分量D。另外注意,仅在每一寄存器中加载rcnt个(即,3个)分量。因此,不将下一分量D作为R0的第四分量加载,如同图15的前一示例使用lmvex指令那样,而是作为R1(其为R0后面的寄存器)的第一个分量加载。然后分量E和F也加载至R1。由于再一次地加载了skip_cnt个分量(并且还没有加载cnt个分量,即9个),则下一分量G位于6个半字处。另外,由于已经将rcnt个分量加载至R1,则将下一分量G连同H和I一起加载至R2。此时,加载了cnt个分量。还要注意,R0,R1和R2的每一未使用的字段由预定值填充(在此例中为零)。
因此,采用上述加载指令的各种实施例,诸如矩阵102的矩阵可容易地以多种方式从存储器移动至寄存器文件。还要注意,使用rcnt参数允许减少在使用传统编程方法从存储器加载矢量分量时所需的掩码运算。
在替换实施例中,上述指令可比此处说明的指令包括更多,更少或不同的参数。例如,在不同的实施例中,该lmvex2指令可以考虑,也可以不考虑skip_cnt参数。还要注意,上面提供的示例指令将s/u字段设置为u,使得如果有必要的话,在存储至寄存器时,对这些分量进行零扩展。在一个实施例中,可将s/u字段设置为“s”,或者省略该字段。例如,在一个实施例中,如果ms=ds,则省略或忽略该s/u字段。
图16还表示加载指令的示例,其从存储器部分100的位置0xA2、0xA3和0xA4向R4加载T、U和V。例如,可使用下面的lvex指令,其中假设R10存储起始值0xA2并且R11存储cnt值3和stride值1。
lvex.u.mb.dh R4,R10,R11
注意,存储器大小(mb)与目标大小(dh)是不同的。也就是,在此处说明的所有指令中,可独立地设置每一存储器大小和目标大小(在存储指令的情况下为源大小),使得它们相同或者不同。在上面的示例中,注意,存储器大小设置为mb,表明存储器中每一分量(T、U和V)的大小为字节。然而,目标大小设置为dh,以表示R4中目标大小为半字,其大于字节。因此,在R4中加载cnt个分量(3个分量),其中,适当地扩展每一分量T、U和V,以填充半字目标大小。在此示例中,它们按照“.u”所示进行零扩展(即,无符号扩展)。然而,可使用“.s”对每一分量进行有符号扩展。另外,注意,由于“cnt*ds”为3个半字(即46位),并且从而小于R4的大小,则R4的其余未使用部分由预定值填充(在此示例中为零)。
图17表示寄存器文件的示例,其中,利用值为1的stride和值为2的stride加载存储器部分100的矢量104。在一个示例中,假设通过存储0x46,R7指向pp,矢量104的起始,并且R10存储cnt值5,stride值1和skip_cnt值5。注意,skip的值在此示例中无关紧要,因为cnt=skip_cnt(即从存储器正在加载单个矢量,无需不断地“跳跃”)。因此可使用下面的指令将矢量104加载至寄存器文件。
lmvex.u.mh.dh R1,R7,R10 /*cnt=5,stride=1,skip_cnt=5*/
在上面的示例中,将cnt个(5个)分量加载至寄存器文件,从R1开始,然后是R2。由于stride=1,并且后面的分量距离“stride”个ms大小的单位放置,则将要加载的分量彼此距离1个半字。因此,5个连续的半字(pp、qq、rr、ss和tt)载入至寄存器R1和R2。还要注意,R2的其余未使用部分由预定值填充(在此例中为零)。另外注意,对于s/u字段可使用“.s”代替。或者可替换地,不提供该s/u字段。
在另一实施例中,假设R7指向pp(存储0x46),并且R10存储cnt值3和stride值2。因此,可使用下面的指令每隔一个分量向该寄存器加载矢量104。
lvex.u.mh.dh R4,R7,R10 /*cnt=3,stride=2*/
在此示例中,可使用lvex指令,因为cnt*ms(3隔半字)适合单个寄存器(所示实施例中的64位寄存器)。利用此lvex指令,将cnt个分量(3个分量)加载至R4,其中,后面的分量距离“stride”个ms大小的单位放置。因此,在此示例中,后面的分量以距离2个半字(“stride*ms”)放置,因此,在加载每一分量后,下一分量从2个半字处取回。例如,从0x46取回pp,从0x4A(0x46+0x2)取回rr。如此继续,直到加载3个分量。还要注意,R4的未使用部分由预定值填充(在此示例中为零)。
图18表示处于四个不同时刻(time=0,time=1,time=2,time=3)的存储器的一部分200,其可对应于,例如,图1的存储器12的全部或部分(或者可位于数据处理系统的任何地方)。在说明的实施例中,存储器部分200示出为64位宽存储器。注意,在替换实施例中,可以各种不同方式将存储器部分200格式化为具有不同的宽度。存储器部分200分别在存储器位置0x08,0x0A,0x0C,0x0E和0x10存储分量C4,C3,C2,C1和C0。分量t、u和v分别存储在0x12,0x14和0x16。存储器部分200还在time=0时分别在位置0x20,0x22,0x24,0x26和0x28存储X-4,X-3,X-2,X-1和X0。在一个实施例中,这些值的每一个可以指以特定采样速率采样的数字采样信号的各种时间采样。例如,在time=0,当前采样由X0表示,并且一个时间延迟(即,1/采样速率)前的采样由X-1表示,两个时间延迟(即,2*1/采样速率)前的采样由X-2表示,等等。
接下来,在time=1,当前采样由X1表示,并且一个时间延迟(即,1/采样速率)前的采样由X0表示,两个时间延迟(即,2*1/采样速率)前的采样由X-1表示,等。注意,最新的采样覆盖最老的时间采样,在示出time=1的示例中其为X-4。因此,在time=2,当前采样X2覆盖X-3,并且,在time=3,当前采样X3覆盖X-2。因此,存储位置0x20,0x22,0x24,0x26和0x28可实现循环缓冲,其连续地存储进来的数字采样信号的时间采样。在替换实施例中,可对于不同的原因或应用实现循环缓冲。
在一个实施例中,可使用修改的lmvex加载指令按照某种方式将该循环缓冲的值正确地送入寄存器文件的寄存器(如将参考图19-22的说明),该方式为这些值处于用于计算的正确的希望的顺序,例如,在执行滤波函数时。例如,下面的等式对应于滤波函数,其中,Y0,Y1,Y2和Y3分别对应于在time=0,time=1,time=2,time=3时的结果:
Eq.1 Y0=C0*X0+C1*X-1+C2*X-2+C3*X-3+C4*X-4
Eq.2 Y1=C0*X1+C1*X0+C2*X-1+C3*X-2+C4*X-3
Eq.3 Y2=C0*X2+C1*X1+C2*X0+C3*X-1+C4*X-2
Eq.4 Y3=C0*X3+C1*X2+C2*X1+C3*X0+C4*X-1
在一个实施例中,该修改的lmvex指令称为一次跳跃加载多个矢量分量(lmvex_skip_once)指令,如图27中所示。图27的lmvex_skip_once指令包括s/u字段、ms字段和ds字段,其就是按照上面对于lmvex指令的说明操作。该lmvex_skip_once指令还采用三个操作数:rD、rA和rB。该lmvex_skip_once指令使用附加参数cnt、stride、skip和skip_cnt,其中,它们存储在由rB表示的一个或多个寄存器中,或由该指令的子操作码指定。除了skip_cnt附加参数外,所有操作数和附加参数以与对于lvmex指令的说明相同的方式操作。如上所述,该lmvex指令取回skip_cnt个分量,并且然后使用“skip”参数取回下一个分量。此时,必须重置该skip_cnt计数器,使得在再一次跳跃前取回下一skip_cnt个分量。如此继续,直到加载了cnt个分量。与lmvex指令不同,lmvex_skip_once指令在取回skip_cnt个分量后并不重置该skip_cnt计数器。因此,在取回skip_cnt个分量后,下一个分量位于skip个ms大小的单位处。然而,从该指针开始,skip_cnt计数器持续递减(即,不重置),直到取回“cnt”个分量。
例如,如将参考图19-22的说明,下面的伪码段可用于计算上面等式1、2、3和4的滤波结果Y0,Y1,Y2和Y3。
/*初始化R12,以存储cnt值5和stride值1*/
/*初始化R13,以存储cnt值5,stride值1,skip_cnt值5和skip值-4*/
/*初始化R1,以存储0x08*/
/*初始化R2,以存储0x20*/
lmvex.u.mh.dh R6,R1,R12/*将C4-C1加载至R6,将C0加载至R7*/
loop:
lmvex_skip_once.u.mh.dh R8,R2,R13 /*在第一次迭代中,将X-4-X-1加载至R8,并将X0加载至R9*/
vmac.h R10,R6,R8 /*在第一次迭代中,将C4*X-4+C3*X-3+C2*X-2+C1*X-1加载至R10*/
vmac.h R11,R7,R9 /*在第一次迭代中,将C0*X0存储至R11*/
add R10,R10,R11 /*在第一次迭代中,将Y0存储至R10*/
/*在R10中的值可存储至存储器*/
add R2,R2,2 /*将R2中的指针向前移动2*/
/*修改R13中的值,使得“skip_cnt=skip_cnt-1”*/
branch loop
循环由上面代码段中的标签“loop:”表示,在进入该循环之前,,用cnt值5和stride值1初始化R12,用cnt值5,stride值1,skip_cnt值5和skip值-4初始化R13。因此,寄存器R12和R13可在后面的矢量加载指令中用作“rB”。初始化R1指向常矢量的起始(位于0x08的C4)。初始化R2指向循环缓冲的起始,其在time=0时为0x20,如图18所示。因此注意,循环的第一次迭代对应于加载至对应于time=0时寄存器文件(如图19所示)的值。
第一条lmvex指令根据R12中存储的参数,将C4-C1加载至R6,并将C0加载至R7,R12在前面初始化;并且控制字段如上参考图4和5的说明。然后,循环内的第一次迭代开始于lmvex_skip_once指令。在该第一次迭代中,对应于time=0,该lmvex_skip_once指令根据R12中存储的参数和这些控制字段,将X-4-X-1加载至R8,并且将X0加载至R9,如图19中的R8和R9所示,其中,R12在前面初始化。注意,由于在该第一次迭代中,skip_cnt=cnt,skip可视为“无关紧要”,因为并不需要该skip值。也就是,当该skip_cnt计数器终止时,cnt计数器也终止,并从而不需要“跳跃”即可完成该指令。
第一条矢量乘积累加指令(vmac.h)对寄存器R6和R8的半字分量执行矢量乘积累加运算,并将结果存储至R10。因此,R10现在存储C4*X-4+C3*X-3+C2*X-2+C1*X-1,如图19中的R10所示。第二条矢量乘积累加指令对寄存器R7和R9的半字分量执行矢量乘积累加运算,并将结果存储至R11。因此,R11现在存储C0*X0+0*0+0*0+0*0,其就等于C0*X0。注意,在当前的示例中,通过每一个加载矢量指令(lmvex和lmvex_skip_once),寄存器(例如R7和R9)的其余未使用的部分清零,从在R11中产生正确结果。否则,如果例如,反而从存储器200加载值t,u和v,则R11可能为不正确的值。
然后,第一条求和指令对R10和R11的值求和,并将结果存储至R10(此运算并未在图19中示出)。然后可在需要时存储对应于上面等式1的Y0的该值,例如回到存储器200。第二条求和指令将循环缓冲的起始指针向前移动至下一个半字,使得对于time=1,该起始指针现在指向地址0x22的X-3,如图18和20所示。接下来,修改R13,使得skip_cnt=skip_cnt-1。因此。经过上面代码段的第一次迭代,skip_cnt现在等于4。可使用循环计数器或附加指令(未包括在上面的代码段中)指示是否退出该循环。如果不退出该循环,则代码返回“loop”,并开始下一次迭代。
值C4-C0保持在R6和R7中(如图20的R6和R7所示)。该循环的第二次迭代开始于lmvex_skip_once指令。在该第二次迭代中,对应于time=1,该lmvex_skip_once指令根据存储在R12中的参数和控制字段,将X3-X0加载至R8,并将X1加载至R9,如图20中的R8和R9所示。在此次迭代中,由于skip_cnt为4,并且rA指向X-3为第一个要加载的分量,加载4个分量:X-3-X0。此时,由于加载了skip_cnt(4)个分量,并且还没有加载cnt(5)个分量,则从“skip”个ms大小(半字)的单位的位置处加载下一分量。因此,在此示例中,值为-4的skip允许从0x28-4*2=0x20加载分量X1。(注意,存储器200可半字寻址;因此,skip个ms大小的单位处表示-4个半字处。)注意,如上所述,在time=1时,存储器200中的最近分量存储在0x20,其为前一最老的时间采样的位置。因此,lmvex_skip_once指令以从最老到最新的时间采样顺序,从存储器位置0x20-0x28向R8和R9正确地加载了用于计算Y1所需的5个分量。
第一条矢量乘积累加指令(vmac.h)对寄存器R6和R8的半字分量执行矢量乘积累加运算,并将结果存储至R10。因此,R10现在存储C4*X-3+C3*X-2+C2*X-1+C1*X0,如图20中的R10所示。第二条矢量乘积累加指令对寄存器R7和R9的半字分量执行矢量乘积累加运算,并将结果存储至R11。因此,R11现在存储C0*X1+0*0+0*0+0*0,其就等于C0*X1。注意,在当前的示例中,通过每一加载矢量指令(lmvex和lmvex_skip_once),寄存器(例如R7和R9)的其余未使用部分清零,从在R11中产生正确结果。否则,如果例如,反而从存储器200加载值a、b或c(或者t、u和v),则R11可能为不正确的值,。
然后,第一条求和指令对R10和R11的值求和,并将结果存储至R10(此运算并未在图20中示出)。然后可在需要时存储对应于上面等式2的Y1的该值,例如回到存储器200。第二条求和指令将循环缓冲的起始指针向前移动至下一个半字,使得对于time=2,该起始指针现在指向地址0x24的X-2,如图18和21所示。接下来,修改R13,使得skip_cnt=skip_cnt-1。因此。经过上面代码段的第二次迭代,skip_cnt现在等于3。可使用循环计数器或附加指令(未包括在上面的代码段中)指示是否退出该循环。如果不退出该循环,则代码返回至“loop”,并开始下一次迭代。
第三次迭代类似于第一次和第二次迭代操作。对于第三次迭代,其对应于time=2,lmvex_skip_once指令将X-2,X-1,X0,X1,X2加载至寄存器R8和R9,如图21所示。因此,一旦加载了分量X-2,X-1和X0(开始于0x24),就已经加载了skip_cnt个分量,并且使用skip加载X1和X2。后面的矢量乘积累加指令导致C4*X-2+C3*X-1+C2*X0+C1*X1存储在R10中,并且导致C0*X2存储在R11中。第一条求和指令将对应于Y2的结果存储在R10中,其中,然后可将Y2存储至存储器,如果需要的话。第二条求和指令然后将该指针向前移动至起始位置0x26,如图22中所示。另外,修改R13,使得skip_cnt=skip_cnt-1。因此。经过上面代码段的第三次迭代,skip_cnt现在等于2。可使用循环计数器或附加指令(未包括在上面的代码段中)指示是否退出该循环。如果不退出该循环,则代码返回至“loop”,并开始下一次迭代。
通过上面参考图4和5所述的lmvex指令,重置该记录skip_cnt的机制(例如,计数器),使得当加载下一skip_cnt个分量时(并且假设还没有加载cnt个分量),从skip*ms个单位处加载下一分量。然而,在当前示例中,使用lvmex_skip_once指令,使得当加载skip_cnt个分量时,不重置记录skip_cnt的机制。按照这种方式,在加载全部cnt个分量前,将不会再一次地使用跳跃。这允许在后面的迭代中,正确地加载所有分量,如将所述,例如通过第四次迭代(对应于time=3)。
第四次迭代类似于前面的迭代操作。对于第四次迭代,对应于time=3,lmvex_skip_once指令将X-1,X0,X1,X2和X3加载至寄存器R8和R9,如图22所示。在此次迭代中,注意,加载的第一个分量是来自位置0x26的X-1(如图18对于time=3的表示)。加载X-1和X0之后,就已经加载了skip_cnt(其等于2)个分量;因此,使用skip将指针绕回位置0x20,因为还没有加载cnt(5)个分量。还要注意,并没有重置skip_cnt机制。按照这种方式,即使加载了下一skip_cnt(2)个分量,也不进行跳跃。如果在下一skip_cnt个分量后对于此次迭代进行跳跃,则在跳跃前仅取回分量X1和X2,从而遗漏了X3。因此,尽管在前面的迭代中,在第一次跳跃后是否重置skip_cnt并不重要,但在某些迭代中,例如此次迭代,其可确定是否取回正确的分量。因此,可以知道如何将lmvex_skip_once指令用于正确地执行循环缓冲,例如,对于滤波器应用。还要注意,能够以多种不同的方法书写上面的代码段。例如,该循环可以展开,而不是写为循环形式。在此示例中,可以对于time=0,1,2使用lmvex指令,而仅对于time=3和4使用lmvex_skip_once指令。
在图22中可以看出,一旦加载了X-1,X0,X1,X2和X3,后面的矢量乘积累加指令导致C4*X-1+C3*X0+C2*X1+C1*X2存储在R10中,并且导致C0*X3存储在R11中。第一条求和指令将对应于Y3的结果存储在R10中,其中,然后可将Y3存储至存储器,如果需要的话。此时,流程按照上面对于前面迭代的说明继续进行。在一个实施例中,在将R12修改为skip_cnt为0的指针后,可退出该循环,使得重置skip_cnt,例如,返回5,并重复整个过程。
因此,能够理解如何将矢量加载指令,连同skip、skip_cnt和cnt用于执行循环缓冲。在一个实施例中,可使用循环缓冲加载多个矢量分量(lmvex_cb)指令,如图28所示。该指令类似于上面参考图4和5说明的lmvex指令,除了在rB中存储的附加参数为buffer_size(缓冲大小)和offset(偏移)。(在使用lmvex指令时,注意,在替换实施例中,可作为操作码或子操作码部分包括该附加参数)。图29表示如何使用这些附加参数定义循环缓冲。例如,在使用上述加载指令时,rA表示存储器中存储该循环缓冲的存储器位置的起始,如图29所示。该buffer_size表示“缓冲分量总数*ms”,并且offset定义在该循环缓冲中哪里是将要加载的第一个分量。另外注意,尽管并未示出,还可使用循环缓冲存储多个矢量分量(stmvex_cb)指令,作为lmvex_cb的存储对应。对于lmvex_cb和stmvex_cb指令,在某些实施例中,由“offset”表示的当前起始值(current_start)在每次遍历该循环缓冲后,即在处理了cnt个分量后,自动增加或降低预定数量的分量,作为执行lmvex_cb或stmvex_cb指令的一部分。
图30表示循环缓冲加载分量流(lstrmvex_cb)指令,其类似于上面lstrmvex指令操作,除了附加参数包括buffer_size和offset(如上面参考图29的说明),而不是cnt、skip和skip_cnt。正如上面的lstrmvex指令,该lstrmvex_cb指令从存储器发起矢量分量流,其中,例如根据rD何时用作后面指令的特定源操作数,这些分量可以出队。因此,除了关于寻址模式外,上面对于lstrmvex的相同讨论此处也适用于lstrmvex_cb。还要注意,尽管没有说明,但也可以使用循环缓冲存储矢量分量流(ststrmvex_cb)指令,作为lstrmvex_cb的存储对应。对于lstrmvex_cb和ststrmvex_cb指令,在一些实施例中,每次遍历该循环缓冲后,由“offset”表示的当前起始值(current_start)自动递增预定数量的分量。
lmvex_cb、stmvex_cb、lstrmvex_cb和ststrmvex_cb指令的可选指示符包括rcnt和stride(未在图29和30中示出),它们如同前面对于lmvex、lmvex2、stmvex、stmvex2、lstrmvex和ststrmvex指令的说明操作。这允许控制加载至寄存器rD的每一实例,或从源寄存器rS的每一示例存储的循环缓冲分量的数量,并且控制遍历访问该循环缓冲的跨度。例如,可使用跨度执行分数速率滤波运算,或抽取滤波器。
图23-26表示如何使用lstrmvex指令(如上参考图7的说明)执行,例如,矩阵相乘的一个示例。对于此示例,将使用图12的存储器部分100,和矩阵102、106和108。图23-26表示在矩阵相乘期间的不同时间点的寄存器文件内容,例如图1的标量寄存器文件34的内容等。
在当前示例中,矩阵102将乘以矩阵106,结果将对应于矩阵108。例如,在执行矩阵相乘时,下列等式用于结果矩阵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*O+C*R
Eq.9 ee=D*L+E*O+F*R
Eq.10 hh=G*L+H*O+I*R
在上面的等式中,注意,在获得aa、dd和gg时,需要从矩阵102出队分量(因为A、B、C用于获得aa;D、E、F用于获得dd;并且然后G、H、I用于获得gg),同时不需要使矩阵106出队(因为需要K、N、Q获得每个aa、dd和gg)。因此,下面的伪码提供如何使用指令,例如lstrmvex指令,获得结果矩阵108的一个示例。注意,在下面的伪码示例中,仅当rD作为指令(例如,指令目标,源1,源2)的第一个源(源1)时才执行出队。
/*初始化R6,以存储值为9的cnt,值为3的rcnt,值为1的stride,值为6的skip,和值为3的skip_cnt*/
/*初始化R4,以存储0x12,即矩阵102的第一行的起始*/
/*初始化R7,以存储值为9的cnt,值为3的rcnt,值为8的stride,值为-15的skip,和值为3的skip_cnt*/
/*初始化R5,以存储0x54,即矩阵106的第一列的起始*/
lstrmvex.u.mh.dh R1,R4,R6/*加载矩阵102的第一行:A,B,C*/
lstrmvex.u.mh.dh R2,R5,R7/*加载矩阵106的第一列:K,N,Q*/
vmac.h R10,R1,R2 /*在R10中存储aa,并使矩阵102的R1出队*/
vmac.h R11,R1,R2 /*在R11中存储dd,并使矩阵102的R1出队*/
vmac.h R12,R2,R1 /*在R12中存储gg,并使矩阵104的R2出队*/
lstrmvex.u.mh.dh R1,R4,R6/*加载矩阵102的第一行:A,B,C*/
vmac.h R13,R1,R2 /*在R13中存储bb,并使矩阵102的R1出队*/
vmac.h R14,R1,R2 /*在R14中存储ee,并使矩阵102的R1出队*/
vmac.h R15,R2,R1 /*在R15中存储hh,并使矩阵104的R2出队*/
上面的伪码可用于获得aa、dd、gg、bb、ee和hh,如上面的等式5-8所述。如在此示例中所使用,假设所有值为无符号的半字。首先,初始化R6,以存储值为9的cnt,值为3的rcnt,值为1的stride,值为6的skip,和值为3的skip_cnt,其中,R6可用作lstrmvex指令的rB寄存器。如图23所示,将R4初始化为指向位于0x12处的分量A,即图12的矩阵102的第一行的第一个分量。初始化R7,以存储值为9的cnt,值为3的rcnt,值为8的stride,值为-15的skip,和值为3的skip_cnt,其中,R7可用作lstrmvex指令的rB寄存器。如图23所示,将R5初始化为指向0x54处的分量K,即矩阵106的第一列的第一个分量。
第一条lstrmvex指令发起矢量分量流,其依次加载矩阵102的每一行。首先,该指令将矩阵102的第一行加载至R1(如图23中所示)。例如,分量A、B和C彼此距离1半字(因此需要值为1的stride)。值为3的rcnt每次仅向R1加载3个分量(其余部分清零),并且在加载skip_cnt个分量(此例中为3个)之后,则在C(0x16)位置增加8*ms(8半字)的跳跃,以在位置0x22(0x16+0x08)获得下一分量D的地址。当R1用作后面指令的源1时,如下所述,则其出队,使得矩阵102的下一行(如rcnt、stride和skip_cnt所定义)加载至R1。
第二条lstrmvex指令发起矢量分量流,其依次向R2加载矩阵106的每一列。首先,该指令将矩阵106的第一列加载至R2(如图23中所示)。例如,分量K、N和Q在存储器中彼此距离8个半字(因此需要值为8的stride)。值为3的rcnt每次仅向R2加载3个分量(其余部分清零),并且在加载skip_cnt个分量(此例中为3个)之后,则将Q(0x74)位置增加-15*ms(-15或-0x0F个半字)的跳跃,以在位置0x56(0x74-0x0F*2)获得下一分量D的地址,其中,L为矩阵106的第二列的第一个分量。当R2用作后面指令的源1时,如下所述,则其出队,使得矩阵106的下一列(如rcnt、stride和skip_cnt所定义)加载至R2。
第一条乘积累加指令(vmac)指令将A*K+B*N+C*Q(其等于aa)存储至R10,如图24中所示。由于R1用作源1,因而其根据第一条lstrmvex指令(和R6中的参数)出队,使得矩阵102的下一行(D、E和F)存储至R1,而其余部分清零。此时,注意,由于R2没有用作源1,则其不出队;因此,K、N和Q保持在R2中,并且矩阵106的下一列也不存储至R2。
第二条乘积累加指令(vmac)指令将D*K+E*N+F*Q(其等于dd)存储至R11,如图25中所示。由于R1用作源1,其再一次地根据第一条lstrmvex指令(和R6中的参数)出队,使得矩阵102的下一行(G、H和I)存储至R1,而其余部分清零。此时,已经加载了对应于第一条lstrmvex指令的9个分量,从而已经加载了“cnt”个分量,并且此指令流终止。由于R2没有用作源1,则其不出队;因此,K、N和Q保持在R2中,并且矩阵106的下一列也不存储至R2。此时,仅加载了对应于lstrmvix指令的3个分量,从而对于此指令没有加载cnt个分量。
第三条累加指令(vmac)指令将G*K+H*N+I*Q(其等于gg)存储至R11,如图26中所示。由于R2现在用作源1,因此其根据第二条lstrmvex指令(和R7中的参数)出队,使得矩阵106的下一列(L、O和R)存储至R2,而其余部分清零。此时,已经加载了矩阵106的9个分量中的6个。另外,由于通过第一条lstrmvex指令已经加载了(矩阵102的)“cnt”个分量,因而R1并不改变,并仍然保存G、H和I。(此外,即使通过第一条lstrmvex指令还没有加载“cnt”个分量,R1仍然不改变,因为由于R1用作源2,其将不出队。)
第三条lstrmvex指令发起新的矢量分量流,其与第一条lstrmvex指令相同。也就是,该第三条lstrmvex指令依次将矩阵102的每一行加载至R1,如上所述。后面三条vmac指令分别向R13、R14和15存储值bb、ee和hh。注意,在使用头三条vmac指令时,第一条lstrmvex指令通过第三条lstrmvex指令之后的头两条vmac指令出队,第二条lstrmvex指令通过第三条lstrmvex指令之后的第三条vmac指令出队。此时,矩阵106的最后一列(M、P和S)将加载至R2(未示出),并且对于第二条lstrmvex指令的加载将停止,因为此时将要加载“cnt”个(即9个)分量。可使用类似的指令获得cc、ff和ii。可将值aa、dd、gg、bb、ee、hh、cc、ff和ii分别存储回至矩阵108的存储位置0x8A,0x9A,0xAA,0x8C,0x9C,0xAC,0x8E,0x9E,0xAE。如此处所述,可使用矢量存储指令执行这些存储。
注意,在上面的伪码示例中,这些分量根据后面指令中rD的位置出队(即rD是否用作源1或是源2)。然而要注意,在替换实施例中,可使用其它因子指示这些分量是否出队。例如,可使用不同的操作码指示出队,或者使用其它的指示符,例如标志位等。此外,在一个实施例中,rD在任何时候用作为后面指令的源时出队,不是仅在其为源1时出队。在又一实施例中,仅当使用同一rD作为源操作数的指令为一个或多个由处理单元14执行的所有指令的适当子集中的预定指令时执行出队。也就是,在此实施例中,实际上仅有指令或指令功能的子集作为它们执行的一部分执行出队,而由处理器单元14执行的其余指令不执行出队,不论rD是否用作源操作数。该执行出队的子集可为所有执行的指令的预定子集,并可基于数据处理系统10的需要确定。在又一实施例中,出队可由用于控制该出队操作的指令中的控制字段值确定。
尽管在前面说明图23-26的段落中已经说明了出队,但类似的入队操作同样适用于当前发明的实施例,并以基本类似的方式操作。可基于入队源寄存器rS作为后面指令目标的位置,或者基于在由处理单元14执行的所有指令的适当子集中的一个或多个预定指令中成为目标操作数,来执行入队。也就是,在一个实施例中,实际上仅有指令或指令功能的子集作为它们执行的一部分执行入队,由处理器14执行的其余指令并不执行入队,无论rS是否用作目标操作数。该执行入队的子集可为执行的全部指令的预定子集,并可基于数据处理系统10的需要确定。在又一实施例中,入队可由用于控制该入队操作的指令中的控制字段值确定。
图31表示可用于快速傅立叶变换(FFT)的指令。图31表示加载多个矢量分量FFT(lmvex_fft)指令,其具有控制字段s/u、ms和ds以及操作数rD,rA和rB。这些控制字段和操作数的每一个如上对于其它加载指令的说明操作。该lmvex_fft指令还使用在rB中存储的附加参数“radix”(基数),并且可选地如上对于其它加载矢量分量指令的说明执行在rB中存储的rcnt控制字段。在使用上面的指令时,在替换实施例中,“radix”(和“rcnt”,如果存在的话)可为操作码或子操作码的一部分,并且因此,rB可能不是必要的。该lmvex_fft指令还可使用截短或舍入字段,如上所述。
图32表示存储多个矢量分量FFT(stmvex_fft)指令,其也具有控制字库s/u、ms和ss以及操作数rS、rA和rB。这些控制字段和操作数中的每一个如上对于其它存储指令的说明操作。该stmvex_fft指令还可使用截短或舍入字段,如上所述,并可选地如上对于其它存储矢量分量指令的说明执行rcnt控制字段。该stmvex_fft指令还使用在rB中存储的附加参数“radix”。在使用上面的指令时,在替换实施例中,“radix”可为该操作码或子操作码的一部分,并且因此,rB可能不是必要的。该stmvex_fft指令可视为lmvex_fft指令的存储对应。
重新参看该lmvex_fft指令,“radix”参数可用于根据FFT寻址算法向寄存器或寄存器组加载一系列数据,如本领域所公知。例如,对于FFT,公知将以X0,X1,X2,X3,X4,X5,X6和X7为顺序的数据进行“比特翻转”,形成X0,X4,X6,X2,X1,X5,X3,X7,以进行特定FFT计算。在该lmvex_fft指令中,该“radix”定义分量的数量,以及这些分量的特定存储顺序。例如,图34表示存储器部分300,其可为,例如图1的存储器12的一部分。存储器部分300分别包括存储在位置0x16-0x24的分量X0,X1,X2,X3,X4,X5,X6和X7。存储器部分300还包括存储在位置0x44-0x52的分量Y0,Y4,Y6,Y2,Y1,Y5,Y3和Y7。
图35表示诸如图1的标量寄存器文件34的寄存器文件的一部分。例如,基数8的lvmex_fft指令可用于以比特翻转形式将X个分量送入寄存器R1和R2(如图35所示),其中,R1由rD指定,并且将要加载的第一个存储器位置(0x16)由rA指定。类似地,基数8的lmvex_fft可用于将比特翻转的Y个分量以连续顺序送入寄存器R4和R5(如图35所示),其中,R4由rD指定,并且将要加载的第一个存储器位置(0x44)由rA指定。因此,该lmvex_fft指令可以比特翻转的形式加载分量,其中,这些分量可以一开始就进行比特翻转,或者不翻转。
类似地,stmvex_fft指令可用于将这些分量与比特翻转形式存储至存储器。例如,基数8的该stmvex_fft指令可用于将比特翻转的X个分量从R1和R2存储至位置0x16-0x24的存储器,使得存储器中的这些分量与R1和R2中的那些分量相比没有进行比特翻转。类似地,该stmvex_fft指令可用于将连续的Y个分量从R4和R5存储至位置0x44-0x52的存储器,使得存储器中的这些分量与R4和R5中的那些分量相比进行了比特翻转。
图33表示加载矢量分量流FFT(lmstrmvex_fft)指令,其具有控制字段s/u、ms和ds以及操作数rD、rA和rB。这些控制字段和操作数的每一个如上对于lmstrmvex指令的说明操作。该lmstrmvex_fft指令还使用存储在rB中的附加参数“radix”,并且能够如上对于其它加载矢量分量指令的说明可选地执行存储在rB中的rcnt控制字段。在利用上面的指令时,在替换实施例中,“radix”(和“rcnt”,如果存在的话)可为操作码或子操作码的一部分,并且因此,rB可不是必要的。“radix”定义将要加载的分量的总数。在利用lmstrmvex_fft指令时,该lmstrmvex_fft从存储器发起矢量分量流,其中,以比特翻转形式或以来自比特翻转的连续顺序加载这些分量,并且根据例如,后面指令中rD的位置使这些分量出队。注意,尽管没有表示出来,但可使用对应的存储指令发起以比特翻转形式向存储器存储分量流,例如对于FFT应用。
因此,可以明白,如何将各种不同类型的矢量加载和存储指令用于具有一组寄存器的系统,例如,标量寄存器文件等。也就是,上面的指令可用于现有设计或仅需对现有设计的执行单元(例如执行单元32)和控制单元(例如控制单元28)进行少量的改动。注意,此处说明的每一条指令可具有不同的格式,并且甚至可分为多条指令。另外,在从或向寄存器传送矢量分量时,可使用附加参数指示将哪一个寄存器分量传送至存储器(例如对于矢量存储指令),或者寄存器中的哪一个寄存器分量存储从存储器加载的矢量分量(例如对于矢量加载指令)。此外,可使用附加参数定义如何将矢量分量放置在寄存器中,或者从存储器的何处读取矢量分量。例如,可提供起始位置指示符指示向或从寄存器中的何处开始传送。另外,对于寄存器可给定跨度,使得能够以非相邻的方式在寄存器中向或从寄存器传送参数。另外,此处说明的所有参数和控制字段可出现在任何这些指令的任何组合之中。
还要注意,上面已经讨论了不同的寻找模式,例如使用stride、skip、skip_cnt等的模式,或者使用buffer_size和offset的模式,或者使用基数(radix)的模式。然而,在替换实施例中,可使用不同的寻址模式。例如,可代之以指定阵列维数,例如,阵列的维数等(例如,2-维4×4阵列,3-维5×5阵列等)。因此,与上面实施例一同说明的寻址模式可用于以各种模式加载或存储数据或数据阵列,包括例如,zig-zag模式和其它规则模式,如上所述。与在当前SIMD处理器中所需的开销相比,此处说明的指令还可降低向或从存储器传送存储器分量所需的开销。例如,在能够进行SIMD运算的当前处理器中,需要大量的指令向或从存储器传送矢量分量(例如,矢量或数据阵列或其它规则模式的数据)。然而,可利用上述矢量加载和存储指令完成相同的分量传送,其中,降低的指令数量(或者仅用一条指令)可用于完成此传送。
下面的段落提供本发明的各种方面,形式和实施例的说明。每一说明仅提供各种实施例的示例,目的并不是限制上面讨论的任何说明或实施例。
根据本发明的一个方面,一种数据处理系统具有用于存储操作数的存储器和至少一个通用寄存器。处理器电路执行一条或多条指令,并且该一条或多条指令中的至少一条在该存储器和该至少一个通用寄存器间传送数据分量。该至少一条或多条指令指定存储器中数据分量的大小,其独立于指定该至少一个通用寄存器中数据分量的大小。在一种形式中,该一条或多条指令包括独立字段,其用于分别存储用于存储器的第一数据大小指定符和用于该至少一个通用寄存器的第二数据大小指定符。在另一形式中,该一条或多条指令指定用于定义存储器的第一数据大小指定符和该至少一个通用寄存器的第二数据大小指定符的存储位置。在一种形式中,该存储位置为存储器中的位置和该存储器外部的处理器寄存器位置中的任何一个。在另一形式中,该存储位置为该数据处理系统的控制寄存器。在一种形式中,该存储位置为该数据处理系统的寄存器,算术、逻辑和移位操作由该数据处理系统工具执行。该存储器可进一步包括将在该存储器和该至少一个通用寄存器间传送的多个数据分量。在一种形式中,该多个数据分量在该存储器中相邻。在另一形式中,该多个数据分量在存储器中不相邻。在一种形式中,该至少一个通用寄存器中的每一个保存多个数据分量。在另一形式中,该至少一个通用寄存器中的每一个包括具有一维存储器映射的标量寄存器。
当该至少一条或多条指令指定存储器中的源数据分量的大小大于该至少一个通用寄存器中的目标数据分量的大小时,该处理器电路可截短存储器中的源数据分量的一部分。存储器中该源数据分量被截短的部分可为该存储器中源数据分量的高阶部分。存储器中该源数据分量被截短的部分可为该存储器中源数据分量的低阶部分。当该至少一条或多条指令指定存储器中的源数据分量的大小大于该至少一个通用寄存器中的目标数据分量的大小时,该处理器电路可基于该存储器中源数据分量低阶部分的值,舍入(round)该存储器中源数据分量的高阶部分。当该至少一条或多条指令指定存储器中的源数据分量的大小小于该至少一个通用寄存器中的目标数据分量的大小时,该处理器电路可将预定数据值放入该至少一个通用寄存器的目标数据分量没有被来自该存储器的源数据分量填充的部分。在一种形式中,该处理器电路通过使用零扩展将预定数据值放入该至少一个通用寄存器的目标数据分量的一部分。在另一种形式中,该处理器电路通过使用符号扩展将预定数据值放入该至少一个通用寄存器的目标数据分量的一部分。在还一形式中,该处理器电路通过用预定比特值填充该至少一个通用寄存器的目标数据分量的低阶数据部分,将预定数据值放入该至少一个通用寄存器的目标数据分量的一部分,其中,该预定比特值为零值。
当该至少一条或多条指令指定存储器中的目标数据分量的大小小于该至少一个通用寄存器中的源数据分量的大小时,该处理器电路可截短该至少一个通用寄存器中源数据分量的一部分。在一种形式中,该处理器电路截短该至少一个通用寄存器中源数据分量的高阶部分。在另一种形式中,该处理器电路截短该至少一个通用寄存器中源数据分量的低阶部分。当该至少一条或多条指令指定存储器中的目标数据分量的大小小于该至少一个通用寄存器中的源数据分量的大小时,该处理器电路可根据该源数据分量的低阶部分的值,舍入在该至少一个通用寄存器中的源数据分量的高阶部分。当该至少一条或多条指令指定存储器中的目标数据分量的大小大于该至少一个通用寄存器中的源数据分量的大小时,该处理器电路可将预定数据值放入该存储器中目标数据分量没有被该至少一个通用寄存器中源数据分量填充的部分。在另一形式中,该处理器电路通过使用零扩展将预定数据值放入该存储器中未被填充的目标数据分量部分,或者通过使用符号扩展将预定数据值放入该存储器中未被填充的目标数据分量部分。在另一形式中,通过将预定比特值放置在该目标数据分量的低阶数据部分,将预定数据值放置在该存储器中目标数据分量的未填充部分。
根据另一方面,用于在数据处理系统中加载和存储数据分量的方法包括提供存储操作数的存储器和提供至少一个通用寄存器。执行一条或多条指令,该一条或多条指令中的至少一条引起在该存储器和该至少一个通用寄存器间的数据分量的传送。该至少一条或多条指令指定该存储器中数据分量的大小,其独立于指定该至少一个通用寄存器中数据分量的大小。通过执行该至少一条或多条指令中的独立字段指定数据分量的大小,第一字段表示用于存储器的第一数据大小指定符,第二字段表示用于该至少一个通用寄存器的第二数据大小指定符。通过执行该至少一条或多条指令中的预定字段指定数据分量的大小,该预定字段表示存储位置,其定义用于存储器的第一数据大小指定符和用于该至少一个通用寄存器的第二数据大小指定符。当该至少一条或多条指令指定存储器中的源数据分量的大小大于该至少一个通用寄存器中的目标数据分量的大小时,可截短该存储器中源数据分量的一部分。在另一种形式中,当该至少一条或多条指令指定存储器中的源数据分量的大小大于该至少一个通用寄存器中的目标数据分量的大小时,根据该存储器中的源数据分量低阶部分的值,舍入该存储器中的源数据分量的高阶部分。在另一形式中,数据处理系统包括存储器和用于执行数据处理指令的处理器。至少一条数据处理指令包括指定存储在该存储器中的数据分量大小的控制信息,其独立于指定存储在该存储器外部的数据处理系统中的至少一个存储位置的数据分量的大小。
在另一形式中,该系统中的处理器电路执行至少第一条指令和该第一条指令之后的第二条指令。该第一条指令在存储器和至少一个通用寄存器间传送数据分量流,这些数据分量将在该存储器和该至少一个通用寄存器的至少一个中进行排队。该第二条指令包括至少第一源操作数,并且基于作为该第二条指令的源操作数的该至少一个通用寄存器,使该数据分量流的一部分条件出队。当该至少一个通用寄存器用作由该第二条指令指定的预定类型功能的源操作数时,可执行该数据分量一部分的条件出队。在另一种形式中,基于该第二条指令的控制字段值执行该部分数据分量的条件出队。该第二条指令还可进一步包括第二源操作数,并且当该至少一个通用寄存器用作该第一源操作数时,执行该条件出队。在一种形式中,当该至少一个通用寄存器作为该第二源操作数时,不执行该条件出队。
根据另一方面,数据处理系统中数据分量的选择性出队方法包括提供存储操作数的存储器和提供至少一个通用寄存器。执行至少第一条指令和该第一条指令后的第二条指令。在该存储器和该至少一个通用寄存器间传送数据分量流,以响应该第一条指令。对该存储器和该至少一个通用寄存器中的至少一个中的数据分量进行排队。执行该第一条指令之后的第二条指令。该第二条指令包括至少第一源操作数。根据作为该第二条指令的源操作数的该至少一个通用寄存器,使数据分量流的一部分条件出队。当该至少一个通用寄存器用作由该第二条指令指定的预定类型功能的第二源操作数时,使该部分数据分量流条件出队。可在该第二条指令中提供第二源操作数,并且在当该至少一个通用寄存器作为第一源操作数时使该部分数据分量流条件出队。在一种形式中,当该至少一个通用寄存器用作该第二源操作数时不执行出队。
根据另一方面,数据处理系统包括存储操作数的存储器和至少一个通用寄存器。处理器电路执行多条指令,该多条指令中的第一条在该存储器和该至少一个通用寄存器间传送数据分量流,并在该存储器和该至少一个通用寄存器中的至少一个中对这些数据分量进行排队。数据分量流的一部分条件出队,以响应对应于该多条指令的适当子集中预定指令的该多条指令中的第二条。该处理器电路可基于作为该多条指令的第二条的源操作数的该至少一个通用寄存器,进一步使该部分数据分量流条件出队。该处理器电路可基于该多条指令的第二条的控制字段值,进一步使该部分数据分量流条件出队。
根据另一方面,数据处理系统中数据分量的选择性出队方法包括提供存储操作数的存储器和提供至少一个通用寄存器。执行多条指令,该多条指令的第一条在该存储器和该至少一个通用寄存器间传送数据分量流。在该存储器和该至少一个通用寄存器中的至少一个中对该数据分量流进行排队。使该数据分量流的一部分条件出队,以响应对应于该多条指令的适当子集中预定指令的该多条指令的第二条。
根据另一方面,数据处理系统包括存储操作数的存储器和至少一个通用寄存器。处理器电路执行多条指令。该多条指令的第一条在该存储器和至少一个通用寄存器间传送数据分量流,这些数据分量将在该存储器和该至少一个通用寄存器中的至少一个中进行排队。根据作为该多条指令的第二条的目标操作数的该至少一个通用寄存器,使该数据分量流的一部分条件入队。
根据另一方面,数据处理器中数据分量的选择性入队方法包括提供存储操作数的存储器和提供至少一个通用寄存器。执行多条指令,该多条指令的第一条在该存储器和该至少一个通用寄存器间传送数据分量流,这些数据分量将在该存储器和该至少一个通用寄存器中的至少一个中进行排队。根据作为该多条指令的第二条的目标操作数的该至少一个通用寄存器,使该数据分量流的一部分条件入队。
根据另一方面,数据处理系统包括存储操作数的存储器和至少一个通用寄存器。该处理器电路执行至少第一条指令和该第一条指令后的第二条指令。该第一条指令在存储器和至少一个通用寄存器间传送数据分量流,这些数据分量将在该存储器和该至少一个通用寄存器中的至少一个中进行排队。该第二条指令包括至少第一目标操作数。基于作为该第二条指令的目标操作数的该至少一个通用寄存器,使该数据分量流的一部分条件入队。
根据另一方面,数据处理系统包括存储操作数的存储器和至少一个通用寄存器。该处理器电路执行至少第一条指令和该第一条指令后的第二条指令。该第一条指令在该存储器和该至少一个通用寄存器间传送数据分量流,这些数据分量将在该存储器和该至少一个通用寄存器中的至少一个中进行排队。该第一条指令进一步指定将要传送的数据分量的数量,并且基于作为该第二条指令的源操作数的该至少一个通用寄存器,使来自该部分数据分量流的的多个数据分量条件出队。
根据另一方面,数据处理系统包括存储操作数的存储器和至少一个通用寄存器。该处理器电路执行至少第一条指令和该第一条指令后的第二条指令。该第一条指令在存储器和至少一个通用寄存器间传送数据分量流,这些数据分量将在该存储器和该至少一个通用寄存器中的至少一个中进行排队。该第一条指令进一步指定将要传送的数据分量的数量,并且基于作为该第二条指令的目标操作数的该至少一个通用寄存器,使来自该部分数据分量流的的多个数据分量条件入队。
根据另一方面,数据处理系统包括存储操作数的存储器、至少一个通用寄存器和处理器电路。该处理器电路包括多条指令。该多条指令中的第一条在存储器和至少一个通用寄存器间传送数据分量流,这些数据分量将在该存储器和该至少一个通用寄存器中的至少一个中进行排队。条件执行该数据分量流的一部分的入队和出队中的至少一个,以响应该多条指令的第二条中的控制字段。
根据另一方面,数据处理系统包括存储操作数的存储器和多个通用寄存器,其中,每个通用寄存器保存多个数据分量。处理器电路执行一条或多条指令,该一条或多条指令中的至少一条在该存储器和该多个通用寄存器中的至少两个间传送多个数据分量,其中,该至少一条或多条指令指定将要在该多个通用寄存器中的至少两个中的每一个和该存储器间传送的寄存器分量的数量。该一条或多条指令除了指定将要传送的寄存器分量的数量外,还指定将加载或存储哪一个寄存器分量。在另一种形式中,当在该多个通用寄存器中的至少两个中的每一个和该存储器间仅传送该多个数据分量的子集时,用预定值填充任何未指定的数据分量。
根据另一方面,在数据处理系统中传送数据分量的方法包括在存储器中存储操作数。在多个通用寄存器的每一个中存储多个数据分量。该数据处理系统执行一条或多条指令。该一条或多条指令中的至少一条引起在该存储器和该多个通用寄存器中的至少两个间的多个数据分量的传送。该至少一条或多条指令指定将要在该多个寄存器中的至少两个中的每一个和该存储器间传送的寄存器分量的数量。
根据另一方面,数据处理系统包括存储操作数的存储器和多个通用寄存器,其中,每个通用寄存器保存多个数据分量。处理器电路执行一条或多条指令,该一条或多条指令中的至少一条在该存储器和该多个通用寄存器中的至少两个间传送多个数据分量。该至少一条或多条指令指定将要传送该多个通用寄存器中的至少两个中的哪些数据分量。当仅传送多个数据分量的子集时,该处理器电路用预定值填充任何未指定的数据分量。在一种形式中,由该至少一条或多条指令指定的数据分量在该多个通用寄存器中的至少两个中连续排列。在另一种形式中,由该至少一条或多条指令指定的数据分量在该多个通用寄存器中的至少两个中不是连续排列。
根据另一方面,在数据处理系统中传送数据分量的方法包括在存储器中存储操作数和在多个通用寄存器中的每一个中保存多个数据分量。执行一条或多条指令,该一条或多条指令中的至少一条在该存储器和该多个通用寄存器中的至少两个间引起多个数据分量的传送,其中,至少一条或多条指令指定将要传送该多个通用寄存器中的至少两个中的哪些数据分量。
根据另一方面,一种数据处理系统包括存储操作数的存储器和多个通用寄存器,其中,每一通用寄存器保存多个数据分量。处理器电路执行一条或多条指令,该一条或多条指令中的至少一条在该存储器和该多个通用寄存器中的至少两个间传送多个数据分量。该至少一条或多条指令既指定将要在该多个寄存器中的至少两个中的每一个和该存储器间传送的数据分量的数量,还进一步指定将要传送的数据分量的总数。
根据另一方面,数据处理系统包括存储操作数的存储器和至少一个通用寄存器。处理器电路执行一条或多条指令,该一条或多条指令中的至少一条用于在该存储器和该至少一个通用寄存器间传送多个数据分量,其中,该一条或多条指令指定:(a)存储器中连续数据分量间的第一部分中数据分量间的第一偏移;(b)将在该存储器和该至少一个GPR间传送的数据分量的第一数量;以及(c)该存储器中数据分量的第一部分和第二部分间的第二偏移。在一种形式中,该一条或多条指令中的这一条还指定存储器中数据分量的数据分量大小。在另一形式中,该一条或多条指令中的这一条还指定该存储器中数据分量的大小,其独立于指定该至少一个通用寄存器中数据分量的大小。该处理器电路基于该存储器中数据分量的大小,确定将要传送的数据分量的总数。该处理器电路可基于该至少一个通用寄存器中数据分量的大小,确定将要传送的数据分量的总数。该一条或多条指令中的这一条可进一步指定将要在该存储器和该至少一个通用寄存器间传送的数据分量的总数。该数据处理系统可进一步包括第一通用寄存器和第二通用寄存器,其中,该一条或多条指令中的这一条在该存储器和第一通用寄存器与第二通用寄存器间传送数据分量,以响应执行该一条或多条指令中的该条指令。该一条或多条指令中的这一条指令可进一步指定将要在该存储器和第一通用寄存器与第二通用寄存器间传送的数据分量的总数。如果传送的数据分量的总数并没有完全填充该第二通用寄存器,则处理器电路可用预定值填充任何剩余比特位置的一部分。该一条或多条指令中的这一条指令可独立地指定将要在该存储器和该第一与第二通用寄存器中的每一个间传送的数据分量的数量。如果传送的数据分量的总数并没有完全填充该第二通用寄存器,则该处理器电路可用预定值填充任何剩余比特位置的至少一部分。该一条或多条指令中的这一条指令可进一步包括指示符,其中,该处理器电路使用该第二偏移不超过一次,同时传送第一数量的数据分量。当该一条或多条指令中的这一条指定仅使用该第二偏移一次时,该处理器电路可利用循环缓冲发送存储器中的数据分量。该一条或多条指令中的这一条可进一步包括指示符,其中,如果将要传送的数据分量的第一数量是将要传送的数据分量的第一部分的两倍,则该处理器电路使用该第二偏移多于一次。
根据另一方面,数据处理系统包括存储操作数的存储器和至少一个通用寄存器。处理器电路执行一条或多条指令,该一条或多条指令中的至少一条在该存储器和该至少一个通用寄存器间传送数据分量,其中,该一条或多条指令的一条指定基数指示符,用于在该存储器和该至少一个通用寄存器间以比特翻转的顺序执行传送一个或多个数据分量。
根据另一方面,一种使用多个寻址模式的方法提供存储操作数的存储器。提供至少一个通用寄存器。执行一条或多条指令,该一条或多条指令中的至少一条在该存储器和该至少一个通用寄存器间传送数据分量。该一条或多条指令中的至少一条指定该存储器中连续数据分量的第一部分中数据分量间的第一偏移。该一条或多条指令中的至少一条指定将在该存储器和该至少一个通用寄存器(GPR)间传送的数据分量的第一数量。该一条或多条指令中的至少一条可进一步指定该存储器中数据分量的第一部分和第二部分间的第二偏移。该一条或多条指令中的至少一条可用于进一步指定存储器中数据分量的数据分量大小。该一条或多条指令中的至少一条可用于进一步指定该存储器中数据分量的大小,其独立于指定该至少一个通用寄存器中数据分量的大小。处理器基于该存储器中数据分量的大小,用于确定将要传送的数据分量的总数。该处理器可基于该至少一个通用寄存器中数据分量的大小,确定将要传送的数据分量的总数。该一条或多条指令中的至少一条指令可用于进一步指定将要在该存储器和该至少一个通用寄存器间传送的数据分量的总数。可提供第一通用寄存器和第二通用寄存器并且在该存储器和第一通用寄存器与第二通用寄存器间传送数据分量,以响应执行该一条或多条指令中的该条指令。该一条或多条指令中的这一条指令可用于进一步指定将要在该存储器和第一通用寄存器与第二通用寄存器间传送的数据分量的总数。在一种形式中,如果传送的数据分量的总数并没有完全填充该第二通用寄存器,则用预定值填充该第二通用寄存器中任何剩余的未填充的比特位置的至少一部分。该一条或多条指令中的这一条指令可用于进一步独立地指定将要在该存储器和该第一与第二通用寄存器中的每一个间传送的数据分量的数量。在一种形式中,如果传送的数据分量的总数并没有完全填充该第二通用寄存器,则利用诸如零的预定值填充任何剩余比特位置的至少一部分。可在该一条或多条指令中的这一条中提供指示符,其中,作为该指示符的响应,处理器仅使用该第二偏移一次,来传送第一数量的数据分量。
根据另一方面,当该一条或多条指令中的这一条指定仅使用该第二偏移一次时,则可利用循环缓冲,在该处理器的控制之下,发送存储器中的数据分量。可在该一条或多条指令中的这一条中提供指示符,其中,作为该指示符的响应,如果将要传送的第一数量的数据分量是将要传送的存储器中数据分量的第一部分中的数据分量数量的两倍,则该处理器使用该第二偏移多于一次。可该一条或多条指令的这一条中提供基数指示符,用于在该存储器和该至少一个通用寄存器间以比特翻转的顺序执行一个或多个数据分量的传送。
根据另一方面,一种数据处理寻址方法包括提供存储操作数的存储器和提供至少一个通用寄存器。执行一条或多条指令,该一条或多条指令中的至少一条在该存储器和该至少一个通用寄存器间传送数据分量。该一条或多条指令中的至少一条在该一条或多条指令的这一条中指定基数指示符,该基数指示符在该存储器和该至少一个通用寄存器间以比特翻转的顺序执行一个或多个数据分量的传送。
根据另一方面,一种数据处理系统寻址方法包括提供存储操作数的存储器和提供至少一个通用寄存器。提供处理器电路以执行一条或多条指令。该一条或多条指令中的至少一条在该存储器和该至少一个通用寄存器间传送数据分量,其中,该一条或多条指令中的一条执行以比特翻转的顺序将预定数据分量存储至存储器中,并将该预定数据分量传送至该至少一个通用寄存器。该一条或多条指令中的至少一条进一步指定将要传送至该至少一个通用寄存器中的数据分量的数量。在另一形式中,该一条或多条指令中的至少一条进一步指定该存储器中数据分量的大小,其独立于指定该至少一个通用寄存器中数据分量的大小。
根据另一方面,一种数据处理系统寻址方法包括提供存储操作数的存储器和提供至少一个通用寄存器。提供处理器电路以执行一条或多条指令,该一条或多条指令中的至少一条在该存储器和该至少一个通用寄存器间传送数据分量,其中,该一条或多条指令中的一条在该存储器中以连续顺序存储预定数据分量,并且以比特翻转顺序将该预定数据分量传送至该至少一个通用寄存器。
根据另一方面,一种数据处理系统寻址方法包括提供存储操作数的存储器和提供至少一个通用寄存器。提供处理器电路以执行一条或多条指令,该一条或多条指令中的至少一条在该存储器和该至少一个通用寄存器间传送数据分量,其中,该一条或多条指令中的一条在该至少一个通用寄存器中执行以比特翻转顺序存储预定数据分量,并且将该预定数据分量传送至该存储器。
根据另一方面,一种数据处理系统寻址方法包括提供存储操作数的存储器和提供至少一个通用寄存器。提供处理器电路以执行一条或多条指令,该一条或多条指令中的至少一条在该存储器和该至少一个通用寄存器间传送数据分量,其中,该一条或多条指令中的一条在该至少一个通用寄存器中以连续顺序存储预定数据分量,并且以比特翻转顺序将该预定数据分量传送至该存储器。
在前述说明中,参考特定实施例、示例和方面说明了本发明。然而,本领域的普通技术人员明白,可进行各种修改和变化,而不脱离权利要求说明的本发明的精神与范围。例如,框图可包括与已表示的方框不同的方框,并且可具有更多或更少的方框,或不同的布置。另外,作为另一示例,此处说明的指令可具有不同于那些已经说明的指令的各种不同格式,并使用不同的控制字段和参数。每一条指令甚至可作为多条指令执行。另外,作为另一示例,此处说明的寄存器可为位于该数据处理系统任何地方的任何类型的存储电路。因此,说明书与附图将视为说明意义,而不是限定意义,并且所有这样的改变将包含在本发明的范围之内。
已经针对特定实施例说明了益处、优势和问题的解决方案。然而,这些益处、优势和问题的解决方案以及使任何益处、优势、问题的解决方案出现或变得更加显著的任何要素将不被视为任何或所有权利要求的关键的、必须的或本质的特征或要素。如此处所使用,术语“包括”,或其任何变体,将涵盖非排它性的包涵,使得包括一系列要素的过程、方法、物品或装置不仅包括那些要素,还可包括没有明确列出的,或这些过程、方法、物品或装置固有的其它要素。
Claims (8)
1.一种数据处理系统,其包括:
存储操作数的存储器;
至少一个通用寄存器,其中所述存储器不包括所述至少一个通用寄存器;以及
执行一条或多条指令的处理器电路,所述一条或多条指令的至少一条用于在所述存储器和所述至少一个通用寄存器间传送数据分量,其中,所述至少一条或多条指令指定所述存储器中数据分量的大小,其与指定所述至少一个通用寄存器中数据分量的大小相分离且无关。
2.一种用于在数据处理系统中加载和存储数据分量的方法,其包括:
提供存储操作数的存储器;
提供至少一个通用寄存器,其中所述存储器不包括所述至少一个通用寄存器;以及
执行一条或多条指令,所述一条或多条指令的至少一条引起在所述存储器和所述至少一个通用寄存器间传送数据分量,其中,所述至少一条或多条指令指定所述存储器中数据分量的大小,其与指定所述至少一个通用寄存器中数据分量的大小相分离且无关。
3.一种数据处理系统,其包括存储器和用于执行数据处理指令的处理器,至少一条数据处理指令包括指定存储在所述存储器中的数据分量大小的控制信息,上述指定与指定存储在所述存储器外部的数据处理系统中的至少一个存储位置中的数据分量的大小相分离且无关。
4.一种数据处理系统,其包括:
存储操作数的存储器;
多个通用寄存器,其中,每个通用寄存器保存多个数据分量;以及
执行一条或多条指令的处理器电路,所述一条或多条指令中的至少一条用于在所述多个通用寄存器中的至少两个和所述存储器间传送多个数据分量,其中,所述至少一条或多条指令指定将要在所述多个通用寄存器中的至少两个中的每一个和所述存储器间传送的数据分量的数量,其中,所述一条或多条指令中的至少一条提供要存储到所述存储器中或从所述存储器中加载的连续数据分量的第一部分中数据分量间的第一偏移以及要存储到所述存储器中或从所述存储器中加载的数据分量的第一部分和第二部分间的第二偏移。
5.一种在数据处理系统中传送数据分量的方法,其包括:
在存储器中存储操作数;
在多个通用寄存器的每一个中存储多个数据分量;以及
在所述数据处理系统中执行一条或多条指令,所述一条或多条指令中的至少一条引起在所述多个通用寄存器中的至少两个和所述存储器间的多个数据分量的传送,其中,所述至少一条或多条指令指定将要在所述多个寄存器中的至少两个中的每一个和所述存储器间传送的数据分量的数量,其中,所述一条或多条指令中的至少一条提供要存储到所述存储器中或从所述存储器中加载的连续数据分量的第一部分中数据分量间的第一偏移以及要存储到所述存储器中或从所述存储器中加载的数据分量的第一部分和第二部分间的第二偏移。
6.一种数据处理系统,其包括:
存储操作数的存储器;
多个通用寄存器,其中,每一通用寄存器保存多个数据分量;以及
执行一条或多条指令的处理器电路,所述一条或多条指令中的至少一条用于在所述多个通用寄存器中的至少两个和所述存储器间传送多个数据分量,其中,所述至少一条或多条指令指定将要传输所述多个通用寄存器的至少两个中的每一个中的多个数据分量的哪个子集,其中,所述一条或多条指令中的至少一条提供要存储到所述存储器中或从所述存储器中加载的连续数据分量的第一部分中数据分量间的第一偏移以及要存储到所述存储器中或从所述存储器中加载的数据分量的第一部分和第二部分间的第二偏移。
7.一种在数据处理系统中传送数据分量的方法,其包括:
在存储器中存储操作数;
在多个通用寄存器的每一个中保存多个数据分量;以及
执行一条或多条指令,所述一条或多条指令中的至少一条引起在所述多个通用寄存器中的至少两个和所述存储器间传送多个数据分量,其中,所述至少一条或多条指令指定将要传输所述多个通用寄存器的至少两个中的每一个中的多个数据分量的哪个子集,其中,所述一条或多条指令中的至少一条提供要存储到所述存储器中或从所述存储器中加载的连续数据分量的第一部分中数据分量间的第一偏移以及要存储到所述存储器中或从所述存储器中加载的数据分量的第一部分和第二部分间的第二偏移。
8.一种数据处理系统,其包括:
存储操作数的存储器;
多个通用寄存器,其中,每一通用寄存器保存多个数据分量;以及
执行一条或多条指令的处理器电路,所述一条或多条指令中的至少一条用于在所述多个通用寄存器中的至少两个和所述存储器间传送多个数据分量,其中,所述至少一条或多条指令既指定将要在所述多个寄存器中的至少两个中的每一个和所述存储器间传送的数据分量的数量,还进一步指定将要传送的数据分量的总数,其中,所述一条或多条指令中的至少一条提供要存储到所述存储器中或从所述存储器中加载的连续数据分量的第一部分中数据分量间的第一偏移以及要存储到所述存储器中或从所述存储器中加载的数据分量的第一部分和第二部分间的第二偏移。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US10/657,797 | 2003-09-08 | ||
US10/657,797 US7275148B2 (en) | 2003-09-08 | 2003-09-08 | Data processing system using multiple addressing modes for SIMD operations and method thereof |
Related Parent Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2004800244250A Division CN100481058C (zh) | 2003-09-08 | 2004-08-30 | 用于执行simd运算的数据处理系统及其方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101373426A true CN101373426A (zh) | 2009-02-25 |
CN101373426B CN101373426B (zh) | 2012-06-13 |
Family
ID=34226642
Family Applications (3)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2008101445685A Expired - Fee Related CN101373426B (zh) | 2003-09-08 | 2004-08-30 | 用于执行simd运算的数据处理系统及其方法 |
CNA2008101445670A Pending CN101373425A (zh) | 2003-09-08 | 2004-08-30 | 用于执行simd运算的数据处理系统及其方法 |
CNB2004800244250A Expired - Fee Related CN100481058C (zh) | 2003-09-08 | 2004-08-30 | 用于执行simd运算的数据处理系统及其方法 |
Family Applications After (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNA2008101445670A Pending CN101373425A (zh) | 2003-09-08 | 2004-08-30 | 用于执行simd运算的数据处理系统及其方法 |
CNB2004800244250A Expired - Fee Related CN100481058C (zh) | 2003-09-08 | 2004-08-30 | 用于执行simd运算的数据处理系统及其方法 |
Country Status (7)
Country | Link |
---|---|
US (1) | US7275148B2 (zh) |
EP (1) | EP1665064A1 (zh) |
JP (2) | JP4955389B2 (zh) |
KR (1) | KR101031158B1 (zh) |
CN (3) | CN101373426B (zh) |
TW (1) | TW200519740A (zh) |
WO (1) | WO2005026974A1 (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108681465A (zh) * | 2011-12-22 | 2018-10-19 | 英特尔公司 | 用于产生整数序列的处理器、处理器核及系统 |
CN111813446A (zh) * | 2019-04-12 | 2020-10-23 | 杭州中天微系统有限公司 | 一种数据加载和存储指令的处理方法和处理装置 |
Families Citing this family (50)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1572756B1 (en) * | 2002-12-18 | 2013-04-10 | Basell Poliolefine Italia S.r.l. | Catalyst components for the polymerization of olefins |
US7610466B2 (en) * | 2003-09-05 | 2009-10-27 | Freescale Semiconductor, Inc. | Data processing system using independent memory and register operand size specifiers and method thereof |
US7275148B2 (en) | 2003-09-08 | 2007-09-25 | Freescale Semiconductor, Inc. | Data processing system using multiple addressing modes for SIMD operations and method thereof |
US7315932B2 (en) * | 2003-09-08 | 2008-01-01 | Moyer William C | Data processing system having instruction specifiers for SIMD register operands and method thereof |
US7107436B2 (en) | 2003-09-08 | 2006-09-12 | Freescale Semiconductor, Inc. | Conditional next portion transferring of data stream to or from register based on subsequent instruction aspect |
US7554464B1 (en) * | 2004-09-30 | 2009-06-30 | Gear Six, Inc. | Method and system for processing data having a pattern of repeating bits |
US7257695B2 (en) * | 2004-12-28 | 2007-08-14 | Intel Corporation | Register file regions for a processing system |
US7421566B2 (en) * | 2005-08-12 | 2008-09-02 | International Business Machines Corporation | Implementing instruction set architectures with non-contiguous register file specifiers |
US20070186210A1 (en) * | 2006-02-06 | 2007-08-09 | Via Technologies, Inc. | Instruction set encoding in a dual-mode computer processing environment |
US20070266225A1 (en) * | 2006-05-09 | 2007-11-15 | Ko Tak K V | Microcontroller unit |
GB2447683B (en) * | 2007-03-21 | 2011-05-04 | Advanced Risc Mach Ltd | Techniques for generating a trace stream for a data processing apparatus |
US8407457B2 (en) | 2007-09-28 | 2013-03-26 | Freescale Semiconductor, Inc. | System and method for monitoring debug events |
CN100583030C (zh) * | 2007-12-29 | 2010-01-20 | 中国科学院计算技术研究所 | 一种risc处理器及其数据访存方法 |
US8042002B2 (en) * | 2008-01-18 | 2011-10-18 | Freescale Semiconductor, Inc. | Method and apparatus for handling shared hardware and software debug resource events in a data processing system |
US7945768B2 (en) | 2008-06-05 | 2011-05-17 | Motorola Mobility, Inc. | Method and apparatus for nested instruction looping using implicit predicates |
US8051226B2 (en) | 2008-06-13 | 2011-11-01 | Freescale Semiconductor, Inc. | Circular buffer support in a single instruction multiple data (SIMD) data processor |
US8572147B2 (en) | 2008-06-30 | 2013-10-29 | Freescale Semiconductor, Inc. | Method for implementing a bit-reversed increment in a data processing system |
US8060724B2 (en) * | 2008-08-15 | 2011-11-15 | Freescale Semiconductor, Inc. | Provision of extended addressing modes in a single instruction multiple data (SIMD) data processor |
US8918623B2 (en) | 2009-08-04 | 2014-12-23 | International Business Machines Corporation | Implementing instruction set architectures with non-contiguous register file specifiers |
US8842121B2 (en) * | 2011-02-03 | 2014-09-23 | Intel Corporation | Stream compaction for rasterization |
US20120254591A1 (en) * | 2011-04-01 | 2012-10-04 | Hughes Christopher J | Systems, apparatuses, and methods for stride pattern gathering of data elements and stride pattern scattering of data elements |
CN102200964B (zh) * | 2011-06-17 | 2013-05-15 | 孙瑞琛 | 基于并行处理的fft装置及其方法 |
US20130185540A1 (en) | 2011-07-14 | 2013-07-18 | Texas Instruments Incorporated | Processor with multi-level looping vector coprocessor |
CN106951214B (zh) | 2011-09-26 | 2019-07-19 | 英特尔公司 | 用于向量加载/存储操作的处理器、系统、介质和方法 |
KR101949417B1 (ko) | 2011-12-02 | 2019-02-20 | 삼성전자주식회사 | 프로세서, 명령어 생성 장치 및 방법 |
WO2014105011A1 (en) | 2012-12-26 | 2014-07-03 | Intel Corporation | Coalescing adjacent gather/scatter operations |
US9715385B2 (en) * | 2013-01-23 | 2017-07-25 | International Business Machines Corporation | Vector exception code |
US9778932B2 (en) * | 2013-01-23 | 2017-10-03 | International Business Machines Corporation | Vector generate mask instruction |
US9804840B2 (en) | 2013-01-23 | 2017-10-31 | International Business Machines Corporation | Vector Galois Field Multiply Sum and Accumulate instruction |
US9471308B2 (en) | 2013-01-23 | 2016-10-18 | International Business Machines Corporation | Vector floating point test data class immediate instruction |
US9513906B2 (en) | 2013-01-23 | 2016-12-06 | International Business Machines Corporation | Vector checksum instruction |
CN103077008B (zh) * | 2013-01-30 | 2014-12-03 | 中国人民解放军国防科学技术大学 | 数组相加运算汇编库程序的地址对齐simd加速方法 |
US9424039B2 (en) * | 2014-07-09 | 2016-08-23 | Intel Corporation | Instruction for implementing vector loops of iterations having an iteration dependent condition |
US10061746B2 (en) * | 2014-09-26 | 2018-08-28 | Intel Corporation | Instruction and logic for a vector format for processing computations |
US10489155B2 (en) * | 2015-07-21 | 2019-11-26 | Qualcomm Incorporated | Mixed-width SIMD operations using even/odd register pairs for wide data elements |
GB2543303B (en) | 2015-10-14 | 2017-12-27 | Advanced Risc Mach Ltd | Vector data transfer instruction |
US10180829B2 (en) * | 2015-12-15 | 2019-01-15 | Nxp Usa, Inc. | System and method for modulo addressing vectorization with invariant code motion |
CN108491359B (zh) * | 2016-04-22 | 2019-12-24 | 北京中科寒武纪科技有限公司 | 子矩阵运算装置及方法 |
CN111857820B (zh) * | 2016-04-26 | 2024-05-07 | 中科寒武纪科技股份有限公司 | 一种用于执行矩阵加/减运算的装置和方法 |
CN107315574B (zh) * | 2016-04-26 | 2021-01-01 | 安徽寒武纪信息科技有限公司 | 一种用于执行矩阵乘运算的装置和方法 |
CN107315718B (zh) * | 2016-04-26 | 2020-08-21 | 中科寒武纪科技股份有限公司 | 一种用于执行向量内积运算的装置和方法 |
US10606587B2 (en) | 2016-08-24 | 2020-03-31 | Micron Technology, Inc. | Apparatus and methods related to microcode instructions indicating instruction types |
US11567765B2 (en) | 2017-03-20 | 2023-01-31 | Intel Corporation | Systems, methods, and apparatuses for tile load |
US10698685B2 (en) * | 2017-05-03 | 2020-06-30 | Intel Corporation | Instructions for dual destination type conversion, mixed precision accumulation, and mixed precision atomic memory operations |
GB2563878B (en) * | 2017-06-28 | 2019-11-20 | Advanced Risc Mach Ltd | Register-based matrix multiplication |
US11275588B2 (en) | 2017-07-01 | 2022-03-15 | Intel Corporation | Context save with variable save state size |
CN112230994A (zh) * | 2017-12-15 | 2021-01-15 | 安徽寒武纪信息科技有限公司 | 一种计算方法及相关产品 |
GB2580664B (en) | 2019-01-22 | 2021-01-13 | Graphcore Ltd | Double load instruction |
CN113064841B (zh) * | 2021-01-04 | 2023-06-06 | 统信软件技术有限公司 | 一种数据存储方法、处理方法、计算设备及可读存储介质 |
CN114090079B (zh) * | 2021-11-16 | 2023-04-21 | 海光信息技术股份有限公司 | 串操作方法、串操作装置以及存储介质 |
Family Cites Families (51)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4128880A (en) | 1976-06-30 | 1978-12-05 | Cray Research, Inc. | Computer vector register processing |
JPS5975365A (ja) * | 1982-10-22 | 1984-04-28 | Hitachi Ltd | ベクトル処理装置 |
JPS59128670A (ja) | 1983-01-12 | 1984-07-24 | Hitachi Ltd | ベクトル処理装置 |
JPS60134974A (ja) * | 1983-12-23 | 1985-07-18 | Hitachi Ltd | ベクトル処理装置 |
US4744043A (en) | 1985-03-25 | 1988-05-10 | Motorola, Inc. | Data processor execution unit which receives data with reduced instruction overhead |
JPH087662B2 (ja) | 1985-10-18 | 1996-01-29 | 株式会社日立製作所 | データ転送制御方法 |
US4918600A (en) | 1988-08-01 | 1990-04-17 | Board Of Regents, University Of Texas System | Dynamic address mapping for conflict-free vector access |
JPH06105432B2 (ja) | 1989-06-01 | 1994-12-21 | 三菱電機株式会社 | マイクロプロセッサ |
US5201056A (en) | 1990-05-02 | 1993-04-06 | Motorola, Inc. | RISC microprocessor architecture with multi-bit tag extended instructions for selectively attaching tag from either instruction or input data to arithmetic operation output |
JP2718254B2 (ja) | 1990-10-02 | 1998-02-25 | 日本電気株式会社 | ベクトル処理装置 |
JPH04260929A (ja) | 1991-01-21 | 1992-09-16 | Mitsubishi Electric Corp | データ処理装置 |
WO1992015053A1 (en) | 1991-02-19 | 1992-09-03 | International Business Machines Corporation | Data transfer within a data storage subsystem |
US5206822A (en) | 1991-11-15 | 1993-04-27 | Regents Of The University Of California | Method and apparatus for optimized processing of sparse matrices |
US5361354A (en) | 1991-12-17 | 1994-11-01 | Cray Research, Inc. | Optimization of alternate loop exits |
JP3220881B2 (ja) * | 1992-12-29 | 2001-10-22 | 株式会社日立製作所 | 情報処理装置 |
US5717947A (en) | 1993-03-31 | 1998-02-10 | Motorola, Inc. | Data processing system and method thereof |
US5450607A (en) | 1993-05-17 | 1995-09-12 | Mips Technologies Inc. | Unified floating point and integer datapath for a RISC processor |
US5669013A (en) | 1993-10-05 | 1997-09-16 | Fujitsu Limited | System for transferring M elements X times and transferring N elements one time for an array that is X*M+N long responsive to vector type instructions |
US5530804A (en) | 1994-05-16 | 1996-06-25 | Motorola, Inc. | Superscalar processor with plural pipelined execution units each unit selectively having both normal and debug modes |
JP2660163B2 (ja) | 1994-10-11 | 1997-10-08 | 有限会社アレフロジック | アルゴリズム教育支援システム |
US5887183A (en) | 1995-01-04 | 1999-03-23 | International Business Machines Corporation | Method and system in a data processing system for loading and storing vectors in a plurality of modes |
US6081880A (en) | 1995-03-09 | 2000-06-27 | Lsi Logic Corporation | Processor having a scalable, uni/multi-dimensional, and virtually/physically addressed operand register file |
US5719998A (en) | 1995-06-12 | 1998-02-17 | S3, Incorporated | Partitioned decompression of audio data using audio decoder engine for computationally intensive processing |
US5764787A (en) | 1996-03-27 | 1998-06-09 | Intel Corporation | Multi-byte processing of byte-based image data |
WO1997036227A2 (en) * | 1996-03-28 | 1997-10-02 | Philips Electronics N.V. | Method and computer system for processing a set of data elements on a sequential processor |
US5838984A (en) | 1996-08-19 | 1998-11-17 | Samsung Electronics Co., Ltd. | Single-instruction-multiple-data processing using multiple banks of vector registers |
US5799163A (en) | 1997-03-04 | 1998-08-25 | Samsung Electronics Co., Ltd. | Opportunistic operand forwarding to minimize register file read ports |
US5903769A (en) | 1997-03-31 | 1999-05-11 | Sun Microsystems, Inc. | Conditional vector processing |
US6202130B1 (en) | 1998-04-17 | 2001-03-13 | Motorola, Inc. | Data processing system for processing vector data and method therefor |
US6170001B1 (en) | 1998-05-27 | 2001-01-02 | Arm Limited | System for transfering format data from format register to memory wherein format data indicating the distribution of single or double precision data type in the register bank |
US6052766A (en) * | 1998-07-07 | 2000-04-18 | Lucent Technologies Inc. | Pointer register indirectly addressing a second register in the processor core of a digital processor |
US6192384B1 (en) | 1998-09-14 | 2001-02-20 | The Board Of Trustees Of The Leland Stanford Junior University | System and method for performing compound vector operations |
US6292886B1 (en) | 1998-10-12 | 2001-09-18 | Intel Corporation | Scalar hardware for performing SIMD operations |
US6182384B1 (en) * | 1998-11-24 | 2001-02-06 | Martin Gaspard | Wheeled grading bucket |
SE9804529L (sv) | 1998-12-23 | 2000-06-24 | Axis Ab | Flexibel minneskanal |
US6513107B1 (en) | 1999-08-17 | 2003-01-28 | Nec Electronics, Inc. | Vector transfer system generating address error exception when vector to be transferred does not start and end on same memory page |
US6665749B1 (en) | 1999-08-17 | 2003-12-16 | Nec Electronics, Inc. | Bus protocol for efficiently transferring vector data |
JP2001188675A (ja) * | 1999-12-28 | 2001-07-10 | Nec Eng Ltd | データ転送装置 |
AU2001226324A1 (en) * | 2000-01-18 | 2001-07-31 | Clearwater Networks, Inc. | Method and apparatus for improved computer load and store operations |
US6598221B1 (en) | 2000-04-13 | 2003-07-22 | Koninklijke Philips Electronics N.V. | Assembly code performance evaluation apparatus and method |
US6647546B1 (en) | 2000-05-03 | 2003-11-11 | Sun Microsystems, Inc. | Avoiding gather and scatter when calling Fortran 77 code from Fortran 90 code |
US6898691B2 (en) * | 2001-06-06 | 2005-05-24 | Intrinsity, Inc. | Rearranging data between vector and matrix forms in a SIMD matrix processor |
JP4384828B2 (ja) * | 2001-11-22 | 2009-12-16 | ユニヴァーシティ オブ ワシントン | コプロセッサ装置およびデータ転送を容易にするための方法 |
JP3855069B2 (ja) * | 2002-02-04 | 2006-12-06 | 株式会社キャンパスクリエイト | 論理回路 |
US20030167460A1 (en) | 2002-02-26 | 2003-09-04 | Desai Vipul Anil | Processor instruction set simulation power estimation method |
KR100434502B1 (ko) | 2002-05-07 | 2004-06-05 | 삼성전자주식회사 | DSP(Digital SignalProcessor)의 데이터 추출/삽입 방법 및 데이터추출/삽입 장치 |
US7159099B2 (en) | 2002-06-28 | 2007-01-02 | Motorola, Inc. | Streaming vector processor with reconfigurable interconnection switch |
US6986023B2 (en) | 2002-08-09 | 2006-01-10 | Intel Corporation | Conditional execution of coprocessor instruction based on main processor arithmetic flags |
US7610466B2 (en) * | 2003-09-05 | 2009-10-27 | Freescale Semiconductor, Inc. | Data processing system using independent memory and register operand size specifiers and method thereof |
US7315932B2 (en) * | 2003-09-08 | 2008-01-01 | Moyer William C | Data processing system having instruction specifiers for SIMD register operands and method thereof |
US7275148B2 (en) | 2003-09-08 | 2007-09-25 | Freescale Semiconductor, Inc. | Data processing system using multiple addressing modes for SIMD operations and method thereof |
-
2003
- 2003-09-08 US US10/657,797 patent/US7275148B2/en not_active Expired - Fee Related
-
2004
- 2004-08-30 CN CN2008101445685A patent/CN101373426B/zh not_active Expired - Fee Related
- 2004-08-30 CN CNA2008101445670A patent/CN101373425A/zh active Pending
- 2004-08-30 KR KR1020067004678A patent/KR101031158B1/ko not_active IP Right Cessation
- 2004-08-30 WO PCT/US2004/028241 patent/WO2005026974A1/en active Application Filing
- 2004-08-30 CN CNB2004800244250A patent/CN100481058C/zh not_active Expired - Fee Related
- 2004-08-30 JP JP2006525385A patent/JP4955389B2/ja not_active Expired - Fee Related
- 2004-08-30 EP EP04782675A patent/EP1665064A1/en not_active Withdrawn
- 2004-09-08 TW TW093127200A patent/TW200519740A/zh unknown
-
2010
- 2010-06-28 JP JP2010146102A patent/JP5366893B2/ja not_active Expired - Fee Related
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108681465A (zh) * | 2011-12-22 | 2018-10-19 | 英特尔公司 | 用于产生整数序列的处理器、处理器核及系统 |
CN111813446A (zh) * | 2019-04-12 | 2020-10-23 | 杭州中天微系统有限公司 | 一种数据加载和存储指令的处理方法和处理装置 |
Also Published As
Publication number | Publication date |
---|---|
US20050055535A1 (en) | 2005-03-10 |
JP5366893B2 (ja) | 2013-12-11 |
CN1842779A (zh) | 2006-10-04 |
JP2010211832A (ja) | 2010-09-24 |
CN101373426B (zh) | 2012-06-13 |
KR20060080188A (ko) | 2006-07-07 |
KR101031158B1 (ko) | 2011-04-27 |
JP2007505373A (ja) | 2007-03-08 |
WO2005026974A1 (en) | 2005-03-24 |
CN100481058C (zh) | 2009-04-22 |
EP1665064A1 (en) | 2006-06-07 |
CN101373425A (zh) | 2009-02-25 |
TW200519740A (en) | 2005-06-16 |
JP4955389B2 (ja) | 2012-06-20 |
US7275148B2 (en) | 2007-09-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101373426B (zh) | 用于执行simd运算的数据处理系统及其方法 | |
US11468003B2 (en) | Vector table load instruction with address generation field to access table offset value | |
US7610466B2 (en) | Data processing system using independent memory and register operand size specifiers and method thereof | |
US7315932B2 (en) | Data processing system having instruction specifiers for SIMD register operands and method thereof | |
CN109643233B (zh) | 具有带读取和读取/前进操作数编码的流引擎的数据处理设备 | |
US7418575B2 (en) | Long instruction word processing with instruction extensions | |
CN109144568B (zh) | 将有效位通道作为矢量断言暴露于cpu | |
CN111656367A (zh) | 神经网络加速器的系统和体系结构 | |
KR102201935B1 (ko) | 로드-저장 명령 | |
CN101495959B (zh) | 组合微处理器内的多个寄存器单元的方法和设备 | |
CN111381939B (zh) | 多线程处理器中的寄存器文件 | |
EP3436928B1 (en) | Complex multiply instruction | |
CN109997109B (zh) | 具有提取提前滞后的流引擎 | |
US7107436B2 (en) | Conditional next portion transferring of data stream to or from register based on subsequent instruction aspect | |
KR101756820B1 (ko) | 중첩 루프를 처리하기 위한 재구성 가능 프로세서 및 방법 | |
CN109032665A (zh) | 微处理器中指令输出处理方法及装置 | |
US11327761B2 (en) | Processing device with vector transformation execution | |
CN112181497B (zh) | 一种分支目标预测地址在流水线中的传递方法和装置 | |
CN101615114A (zh) | 完成两次乘法两次加法两次位移的微处理器实现方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20120613 Termination date: 20180830 |
|
CF01 | Termination of patent right due to non-payment of annual fee |