用于执行simd运算的数据处理系统及其方法

文档序号:6466316阅读:169来源:国知局
专利名称:用于执行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))。如果该逻辑真状态 为逻辑水平一,则逻辑假状态为逻辑水平零。并且如果逻辑水平真状 态为逻辑水平零,则逻辑水平假状态为逻辑水平一。另外,在数字前 的"Ox"表明该数字以其16进制或16基底形式表示。数字前的 表明该数字以其二进制或2基底形式表示。
如上所述,存在对于降低从存储器向寄存器和从寄存器向存储器 传送多个矢量分量的开销的需求。因此,此处将讨论多种不同的矢量 加载和存储指令,其允许以改进的方式从或向存储器传送矢量分量。 此外,使用此处说明的指令可允许降低的开销,向现有的设计增加最 小的硬件复杂度。例如,如同在许多类型的数据处理系统中的使用, 标量寄存器文件可与这些指令一同使用,从而无需成本更高的独立矢 量寄存器文件。另外,这些指令可允许降低的软件复杂度,同时还提 供执行效率。另外,此处的指令可用于解决各种问题,例如,存储器
中矢量分量的对齐,将存储器分量的大小扩展至寄存器分量以提高的 精确度的需要,存储器的任意矢量长度对于固定长度,或与检索/存储 矢量数据所需的加载/存储指令数关联的开销(例如,在发出与执行指 令时)。此处的这些指令还可用于解决这些问题的组合,或别的问题
或问题的组合,如通过在下面参考图1-35提供的说明将要理解的那样。 图1以框图的形式表示根据本发明的一个实施例的数据处理系统
10。数据处理系统IO包括处理器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)等。数据处理系统IO 可包括除表示的那些之外的其它元件,或可包括比表示出的那些更多 或更少的元件。例如,数据处理系统IO可包括任意数量的存储器或处 理器。
处理器M可为任何类型的处理器,例如,微处理器、微控制器、 数字信号处理器,等等。在一个实施例中,处理器14可称为处理器内 核。在另一实施例中,处理器14可为多处理器数据处理系统中多个处 理器中的一个。另外,尽管没有这样表示,但处理器14可为流水线处 理器。在图l中所示的实施例中,处理器14包括控制单元28、指令单 元30、执行单元32、标量寄存器文件34、总线接口单元(BIU) 36以 及加载/存储单元38。控制单元28通过导线40双向连接至指令单元30, 通过导线42连接至执行单元32,通过导线46连接至标量寄存器文件 34,并且通过导线48连接至加载/存储单元38。执行单元32通过导线 44双向连接至标量寄存器文件34,并且标量寄存器文件34通过导线 50双向连接至加载/存储单元38。 BIU36通过导线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和BIU36,能在需要 执行指令时从存储器(例如存储器12)向标量寄存器文件34中的寄存 器加载数据,并且能在需要执行指令时将来自寄存器文件34中寄存器 的数据存储至存储器(例如存储器12)。例如,在一个实施例中,加 载/存储单元38能够通过导线50,基于控制单元28通过导线48提供 的控制信息,直接与标量寄存器文件34通信(以读取和写入数据)。 执行单元32可在需要执行通过控制单元28从指令单元30接收的指令 时,使用在标量寄存器文件34中存储的数据,执行算术、逻辑、移位 或其它运算操作,并将结果存储至标量寄存器34中的寄存器。执行单 元32可包括,例如,算术逻辑单元(ALU)、浮点单元,等等。
标量寄存器文件34包括N个通用寄存器(GPR),其中,N可为 大于或等于一的任何整数。在一个实施例中,标量寄存器文件34包括 32个64位寄存器。如同此处所使用,标量寄存器表示具有一维映射并 因此仅保存一行数据(例如,1XM位寄存器)的寄存器,其中,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个矢量 分量。另外,矢量分量可为半字U6位),使得一个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的单位。例如,如果存储器 中的分量相邻,则可使用跨度l得到"cnt"个大小为"ms"的相邻 分量。例如,如果这些分量距离三个分量放置,则可使用跨度3获得 "cnt"个元素,彼此间距离3个"ms"大小的单位。例如,如果ms 表示字(例如,mw),则跨度3将在存储器中从rA所指的存储器位 置开始每三个字取一个字。另外,该跨度值可为有符号值,其中,负 值将向低位地址位置取分量,不是向高位地址位置取分量。
在一个实施例中,目标大小(ds)应当大于或等于存储器分量大 小(ms)。如果该目标大小(ds)大于该存储器大小(ms),贝i」s/u 字段可用于适当地扩展每个存储器分量。"s"用于表示这些分量是有
符号的,并且应该因此能够进行符号扩展,而"U"可用于表示这些分
量是无符号的,并且应当因此能够进行零扩展。例如,在"lvex.u.mh.dw rD,rA,rB"的情况下,rD中(字大小)的每一 目标位置的上半字可归零, 如下面详细说明。另外,注意,在一个实施例中,如果"cn"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指令时,该lnwex指令还可 包括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-l",并在每次取数后递减,直到该计数器终止 (到达零),并再次设置为"skip_cnt-l",以继续取回位于"skip"个
单位处的分量,直到取回"cnt"个分量。(可替换地,可将该计数器 设置为零,并逐次增加,直到该计数器到达skip—cnt-l,替换实施例可 使用其它方法记录skip_cnt。)注意,stride和skip均可为有符号量。 另外,在一个实施例中,在从存储器加载"cnt"个分量后,最后一个 寄存器中任何剩下的未填充字节用预定值填充(例如,零)。
在一个实施例中,该目标大小(ds)应大于或等于该存储器分量 大小(ms)。如果该目标大小(ds)大于该存储器分量大小(ms), 则该s/u字段可用于适当地扩展每一存储器分量,如上对于lvex的说明。 然而,在一个实施例中,如果ds小于ms,则每个分量可在加载至rD 时舍入或截短,如下对于存储指令的说明。
图5表示图4的lnwex指令的替换实施例,其中,不是将rB表示 为操作数,其中rB包括附加参数,而是可将所有这些参数作为该指令 子操作码的全部或部分提供。例如,cnt、 stride、 skip、 skip一cnt以及控 制字段(s/u、 ms和ds)可全部在该指令的子操作码或操作码部分指示。 但在另一替换实施例中(未示出),各个指令参数可分配至指令字段 或rB中的字段。例如,当希望使该参数能够基于计算结果或基于系统 状态动态修改时,可使用分配至rB中的字段。其它参数可为静态特性, 并且可编码至该指令中的字段。
注意,对于此处说明的其余字段,任何附加参数将位于rB中,其 中rB作为操作数提供至该指令。然而,应当理解,在替换实施例中, 该指令可具有不同的格式,如上所述。
图6表示另一加载多矢量分量(lnwex2)指令,其也用来自存储 器的分量加载多个目标寄存器。在使用上述指令时,该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、rent、stride 和skip。参数cnt和stride如同上面对于lmvex的说明。也就是,存储 器中将要加载的分量可位于"stride"个ms大小的单位处,并且cnt定 义要加载的分量的总数。该rent参数定义将加载至每一寄存器中目标 分量的最大数。(因此,所需的寄存器总数取决于cnt和rcnt。)该lmvex2 指令从存储器加载总共"cnt"个分量至一个或更多目标寄存器(按照 需要的数量),其中,仅有"rcnt"个分量加载至每一目标寄存器。(因 此,在一个实施例中,rcnt小于或等于可包含在单个GPR中的ds大小 的目标分量的总数,并且rcnt还小于或等于cnt。)
例如,该lmvex2指令从存储器间隔"stride"个(ms大小的)单 位加载分量至目标寄存器(rD),直到取回"rent"个分量至单个寄存 器。此时,如果还没有取回总共"cnt"个分量,则下一个"分量"位 于"skip"个ms大小的单位处。来自存储器相隔"stride"个(ds大小 的)单位位置的分量然后加载至另一目标寄存器(例如,rD+l等), 直到取回"rcnt"个分量至该目标寄存器(或者直到取回"cnt"个分量, 无论哪一个先发生)。在取回"rent"分量后,如果还没有取回"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通常 与对于1 vex , lmvex禾B lmvex2的上述说明相同。 lstrawex指令用来自存储器的总共"cnt"个分量加载多个rD的实 例(其中,寄存器rA指向存储器中的第一个分量),使得该目标寄存 器中的每一目标分量的大小为ds。 cnt和rent的值确定目标rD实例的 数量。该lstrmvex指令从间隔"stride"个ms大小的单位的存储器加载 矢量分量,直到取回"skip—cnt"个分量。此时,将"skip * ms"添加 至最后一个取回的地址(而不是"stride *ms"),以获得将要加载的 下一分量的地址。另外,此时重置记录skip_cnt的机制(例如,计数器)。 因此,每次取回"skip—cnt"个分量时(自从该指令的起始或从上次重 置该skip—cnt计数器),由"skip",而不是"stride"参数指示下一分 量的位置。
该"rent"参数定义每寄存器实例的目标分量数。(因此,在一个 实施例中,rcnt小于或等于单个GPR中ds大小的目标分量的总数,并 且rcnt小于或等于cnt。)例如,该lstrmvex指令从存储器(根据参数 stride、 skip以及skip—cnt,如上所述)加载分量至rD (即,rD的第一 个实例),直到取回"rent"个分量。此时,如果还没有取回"cnt"个 分量,则下一分量位于"stride"个ms大小的单位处(或者,如果取回 skip_cnt分量,则下一分量位于"skip"个,而不是"stride"个ms大 小的单位处)。该lstrawex指令然后继续从存储器(根据参数stride、 skip和skip—cnt)向不同的rD实例(即,rD的第二个实例,覆盖以前 的rD值)加载分量,直到取回"rent"个分量(或直到取回"cnt"个 分量,无论哪一个先发生)。如果,在取回"rent"个分量后,并还没 有取回"cnt"个分量,则继续加载下一分量至rD (rD的另一实例)。 当取回"cnt"个分量时,加载停止。rD的每一实例对应于从存储器取 回的rcnt个分量的唯一集合。随着rD每一实例的出队,用分量流中的 下一rcnt个分量集合加载下一实例,直到加载该流的总共cnt个分量。
在一个实施例中,rD的实例基于后面指令中rD的使用或位置出 队。例如,在一个实施例中,如果rD用作后面指令中特定源寄存器,
则rD实例出队。因此,在执行后面指令后(rD作为特定源寄存器), 将在rD中加载下一个"rcnt"个分量(假设还没有达到"cnt"个分量)。 然而,如果rD没有用作特定源寄存器(即,如果其为不同的目标寄存 器,或其为目标寄存器),则rD不出队,并且不将下一 "rent"个分 量加载至rD。在替换实施例中,以其它方式指示是否出队的选项,例 如,通过指令中的标志,或通过不同的操作码等(例如,对应于要求 出队的指令的特殊子集等)。可选出队的示例将在后面参考图23-26 说明。
如上对于上面指令的说明,处理器14中的计数器(例如,在控制 单元28中)可在加载矢量分量期间用于记录"cnt"。类似地,处理器 14中的寄存器还可在加载每一目标寄存器期间记录"rent"。计数器还 可用于记录skip_cnt。替换实施例可使用其它方法记录cnt, rcnt,和 skip—cnt。另外,在一个实施例中,在加载"rent"个分量后,每一 目 标寄存器或寄存器实例中的任何剩余字节由预定值填充,例如零。另 外,在一个实施例中,从存储器加载"cnt"个分量后,所使用的最后 一个目标寄存器或寄存器实例中的剩余字节用预定值填充(例如零)。 还要注意,stride和skip可为有符号量,允许负的stride和skip 。
在一个实施例中,目标大小(ds)应大于或等于存储器分量大小 (ms)。如果该目标大小(ds)大于该存储器分量大小(ms),贝Us/u 字段可用于适当地拓展每一存储器分量,如对于上面指令的上述说明。 然而,在一个实施例中,如果ds小于ms,则在加载至rD时,可舍入
或截短每一分量。
注意,在替换实施例中,lstrmvex指令的各个参数的每一个可为 可选的,并且此处说明的其它指令的替换实施例也可能如此,例如lvex、 lmvex禾口 lmvex2 J旨令。
图8表示存储矢量分量(stvex)指令,其从源寄存器向存储器存 储分量。该stvex指令可认为是lvex指令的对应。在一个实施例中,该 stvex指令使用附加控制字段,例如,s/u字段、ms字段、ss字段和h/1 字段,在图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/1字段为截短控制字段。例如,如果ss大于 ms (即,源大小大于存储器大小),则该h/l字段可用于指示如何截短 该源分量。例如,如果该h/1字段为"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/1、 ms、和ss字段,连同cnt和stide,还可 在rB中指示。另外,在使用该加载指令时,每一附加参数还可编码为 操作码或子操作码的一部分,无需指定寄存器,例如rB。因此注意, 在替换实施例中,此处说明的任何存储指令可具有各种不同的格式。 另外注意,将参考在寄存器rB中存储附加参数说明该存储指令。(如 上所述,如果需要附加参数和控制字段,则在该指令中可指示多个寄 存器或存储位置。)
注意,上面提供的对于控制字段s/u、 ms、 ss和h/l的说明适用于 此处说明的所有存储指令。在使用指令stvex时,在此处说明的其它存 储指令中可存在这些控制字段中的全部, 一些,或完全不存在。还要 注意,对于此处的讨论,rS通常指源寄存器,rA指向将要存储第一个 分量的存储器位置,并且rB,如果在该指令中存在的话,保存该指令 的一些或全部附加参数。
图9表示存储多矢量分量(strmvex)指令,其从多个源寄存器向 存储器存储分量。该stmvex指令可认为是lnwex指令的存储对应。在
一个实施例中,该stmvex指令使用附加控制字段,例如s/u字段、ss 字段、ds字段和h/1字段,每一个在图9中表示为跟随操作符"stmvex", 并由句点分隔。上面提供的对于stvex指令的这些字段的说明也适用于 该stmvex指令。
图9的stmvex指令还包括三个操作数rS, rA禾口 rB。在图9的 实施例中,在寄存器rB中指定附加参数。其中,这些附加的参数包括 cnt、 stride、 skip禾口 skip_cnt。该stmvex指令从多个源寄存器rS (以及 rS之后的寄存器,例如,rS+l, 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+l等)基 于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字段(如对于sWex的说明)所指示,以生成存储器目 标分量。另外,在一个实施例中,如果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+l、 rS+2,按照需要)向存储器存储"cnt"个ss大小的 分量,其中,寄存器rA指向将要存储的第一个分量的地址,并且使得 存储器中的每一分量具有ms的大小(并且可选地截短或扩展,如s/u 和h/l字段所指示)。该rcnt参数定义将要存储的每个源寄存器的源分 量的数量,并且该cnt参数定义将要存储的分量的总数。
在使用stnwex2时,跨度(stride)值可指示如何分隔存储器中的 分量。因此,来自rS的源分量存储至存储器,使得它们距离"stride" 个(ms大小的)单位放置。在一个实施例中,在存储"rent"个来自 给定源寄存器(rS)的分量后,如果要存储其余的分量,则向最后一个 存储的分量的地址增加"skip*ms"(而不是"stride*ms"),以获得 将要存储的下一个分量的地址。然后将来自下一个源寄存器(例如,
rS+l等)的"rent"个源分量利用所指示的"stride"值存储至存储器。 继续如此,直到存储了"cnt"个分量。注意,在一个实施例中,如"rcnt^s" 小于该源寄存器的大小,则忽略每一源寄存器的其余低阶部分。还要 注意,"stride"和"skip"可为有符号的量,从而允许负的stride和skip。
注意,在替换实施例中,还可使用skip—cnt参数,使得在存储了 skip—cnt个分量之后,下一个分量位于"skip"个ms大小的单位处(而 不是"stride"个ms大小的单位处)。按照这种方式,在向存储器存储 了 "rent"个分量后,如果存储了 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指令的说明。
图ll表示存储矢量分量流(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"参数因此定义将要存储的分量的总 数,并且"rent"参数定义每个源寄存器rS的实例的源分量数。该 ststrmvex指令从rS (即,rS的第一个实例)向存储器存储分量,使得 它们距离"stride"个(ms大小的)单位,直到存储了 "skip_cnt"个 分量。此时,将"skip*ms"添加至最后一个存储的分量的地址(而不 是"stride*mS"),以获得下一分量的地址。另外,此时,重置记录 skip_cnt的机制(例如,计数器)。因此,每次存储"skip一cnt"个分 量时(自从该指令的起始或从上次重置该skip—cnt计数器),由"skip" 参数,而不是"stride"参数指示下一分量的位置。
另外,在从rS的给定实例存储"rent"个分量后,如果还有分量 要存储(即,还没有存储"cnt"个分量),则将"stride*ms"添加至 最后一个存储的分量的地址(除非已经存储了 "skip_cnt"个分量,在 这种情况下,将"skip*ms",而不是"stride*ms"添加至最后一个存 储的分量的地址),以获得从rS的下一个实例存储的第一个分量的地 址(例如,在执行rS用作目标寄存器的指令后存储)。例如,在一个 实施例中,在rS用作指令的目标寄存器时实例入队。例如,如果rS用 作后面指令的目标寄存器,并且还没有存储"cnt"个分量,则根据stride、 skip和skip—cnt参数将来自rS (该后面指令的目标寄存器)的"rent" 个分量(包括,例如,后面指令结果的全部或部分)存储至存储器。 在此实施例中,如果rS没有用作指令的目标寄存器,则其在执行该指 令时不入队(并因此不存储为该矢量流的一部分)。在替换实施例中, 可使用其它机制,例如指令中的标志,或者操作码(例如,对应于要 求入队的指令的特殊子集等)指示rS的实例是否入队。
注意,在一个实施例中,如果"rentes"小于源寄存器的大小,
则忽略该源寄存器的剩余低阶部分。还要注意,"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), 第三行存储在位置OxAA-OxAE (对应于半字gg、 hh和ii)。存储器部 分100包括存储在位置0x46-0x4E的矢量104,其对应于半字pp、 qq、 rr、 ss和tt。存储器部分100还包括分别存储在位置0xA2、 OxA3、 0xA4 和OxA5的字节大小的分量T、 U、 V和W。注意,在替换实施例中,存储器部分100可以不同方式寻址。另 外,存储器部分100可为任何大小,并可保存任何类型的信息,还可 位于数据处理系统的任何位置。
当矩阵存储为图12中的矩阵102和106时,上述加载和存储指令 可用于执行,例如,矩阵运算。也就是,注意到每一矩阵102和106 存储为3X3 二维矩阵。另外,在一个实施例中,矩阵运算的结果还可 以相同的格式存储,如3X3二维矩阵,例如,矩阵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 Rl, R9, RIO
add.h R2, R0, Rl /*对R0和Rl中四个独立的半字分量
求和,并将结果存储至R2V
/*R11存储0x8A,并且R12存储cnt值3和stride值1*/ stvex.u.mh.sh R2, Rll, 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加载至RO, RO的最后一个字段由预定值填充(例如,当前实施 例中的零)。类似地,利用执行第二条lvex指令,将矩阵106的K、 L
和M加载至R1。因此,注意,仅利用单个指令即可容易地加载每一矩
阵的第一行,其允许指定cnt和stride。该add.h指令对R0和Rl中的 四个独立的半字分量进行求和,并且将四个最终的半字分量放入R2。 注意,lvex指令允许用零填充RO和Rl的最后一个未使用的字段(因 为cn"ds小于64位,R0禾BR1的宽度),这两个寄存器的和在R2的 不想要的字段中导致零。按照这种方式,不是在R2的不想要的字段中 具有未知值(或由于未知值的和造成出现不希望的异常条件),而是 为已知的预定值(在此示例中为零)。然后使用stvex指令将R2的头 3个字段存储至存储器,使得aazA+K, bb=B+L和cc=C+H。
然后通过下面的伪码完成矩阵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现在存储0x22*/ /*R9现在存储0x64*/ /*R11现在存储0x9A*/
R7, R8
R9, RIO R2, R0, Rl
Rll, R12
/*R7现在存储0x32*/ /*R9现在存储0x74*/ /*R11现在存储OxAA*/
R7, R8
R9, RIO
R5, RO, Rl
Rll, R12
头三个求和指令增加了 R7, R9和R11的值,使得它们均分别指 向每一矩阵102、 106和108的第二行的第一个分量。图14表示执行 上面代码后图13的寄存器文件。头两个lvex指令后,D、 E和F载入
至R0,并且N、 0和P载入至R1。该add.h指令对R0和Rl中的四个 独立半字分量求和,并将最终的四个半字分量放入R2。然后由stvex 指令将该结果存储至矩阵108中的存储器,使得dd二D+N、 e^E+0以 及ff=F+P。第五至第七条求和指令再一次地增加了 R7、 R9和Rll的 值,使得它们均分别指向每一矩阵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 RO , R7 , R8 /*cnt=9 , stride=l , skip=6且 skip_cnt=3*/
因此,如图15中所示,分量A、 B和C载入至RO,每一个在存 储器中连续,因为这些分量距离"stride*ms"或1个半字放置。然后, 由于加载了 skip—cnt个(即,3个)分量,将位于"skip*ms"(即,6
个半字)处,而不是"stride*ms"(即,1个半字)处的下一个分量D 作为R0的第四个分量加载。然后,分量E和F加载至Rl,其为RO 之后的寄存器,直到再 一 次地加载skip—cnt分量,从而需要"跳跃(skip)" 至下一个分量G,其位于6个半字处。继续如此,直到加载了 "cnt" 个分量。因此,最后一个分量I加载至R2的第一个字段。注意,R2 的其余字段由预定值填充(在此示例中为零)。
图16表示使用例如,lmvex2指令加载矩阵102后的寄存器文件, 在该指令中指定cnt、 rcnt、 skip和skip_cnt。在下面的lmvex指令中, 假设R7指向矩阵102的起始(R7存储0xl2),并且R8对应于rB, 其存储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,每一个在存 储器中连续,因为跨度(stride)为"stride*ms"或1个半字。此时, 在RO中载入rcnt个分量(即,3个),并且因此,从"skip*ms"(即, 6个半字)位置处加载下一分量D。此外,不将下一分量D作为RO的 第四个分量加载,如同在图15的前一示例中利用lvmvex指令的做法, 而是作为Rl (其为RO之后的寄存器)的第一个分量加载,因为RO已 经具有"rcnt"个分量。分量E和F也加载至R1,对于Rl完成值为3 的rcnt。由于已经在Rl中加载了 rcnt个分量(并且,还没有加载cnt 个分量,即9个),因而从由skip确定的位置,即6个半字处的位置, 将下一个分量G取回至R2。另外,分量H和I也载入至R2。此时, 已经加载了 cnt个分量。还要注意,RO, Rl和R2的每一未使用的字 段由预定值填充(在此例中为零)。
在替换实施例中,如上所述,lvmvex2指令还可允许指定skip—cnt 字段。例如,还可使用lmvex2指令,如上利用值为3的skip—cnt,如
图16所示加载矩阵102。在此示例中(仍然指图16和上面的具有所有
同样参数和附加的skip—cnt=3的lvmvex2指令),分量A、 B和C载 入至R0,每一个在存储器中连续,因为这些分量距离"stride*ms"或 l个半字放置。然后,由于已经加载了 skip—cnt个(即,3个)分量, 则加载位于"skip*ms"(即,6个半字)处,而不是位于"stride*ms" (即,l个半字)处的下一分量D。另外注意,仅在每一寄存器中加载 rcnt个(即,3个)分量。因此,不将下一分量D作为RO的第四分量 加载,如同图15的前一示例使用lmvex指令那样,而是作为Rl (其为 R0后面的寄存器)的第一个分量加载。然后分量E和F也加载至R1。 由于再一次地加载了 skip—cnt个分量(并且还没有加载cnt个分量,即 9个),则下一分量G位于6个半字处。另外,由于已经将rcnt个分 量加载至R1,则将下一分量G连同H和I一起加载至R2。此时,加 载了 cnt个分量。还要注意,R0, Rl和R2的每一未使用的字段由预 定值填充(在此例中为零)。
因此,采用上述加载指令的各种实施例,诸如矩阵102的矩阵可 容易地以多种方式从存储器移动至寄存器文件。还要注意,使用rent 参数允许减少在使用传统编程方法从存储器加载矢量分量时所需的掩 码运算。
在替换实施例中,上述指令可比此处说明的指令包括更多,更少 或不同的参数。例如,在不同的实施例中,该lmvex2指令可以考虑, 也可以不考虑skip—cnt参数。还要注意,上面提供的示例指令将s/u字 段设置为u,使得如果有必要的话,在存储至寄存器时,对这些分量进 行零扩展。在一个实施例中,可将s/u字段设置为"s",或者省略该 字段。例如,在一个实施例中,如果ms:ds,则省略或忽略该s/u字段。
图16还表示加载指令的示例,其从存储器部分100的位置0xA2、 OxA3和OxA4向R4加载T、 U和V。例如,可使用下面的lvex指令, 其中假设R10存储起始值0xA2并且Rl 1存储cnt值3和stride值1 。
lvex.u.mb.dh R4, RIO, Rll
注意,存储器大小(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.dhRl, R7, RIO /*cnt=5, stride=l, skip_cnt=5*/
在上面的示例中,将cnt个(5个)分量加载至寄存器文件,从 Rl开始,然后是R2。由于stride二l,并且后面的分量距离"stride" 个ms大小的单位放置,则将要加载的分量彼此距离l个半字。因此, 5个连续的半字(pp、 qq、 rr、 ss和tt)载入至寄存器Rl和R2。还要 注意,R2的其余未使用部分由预定值填充(在此例中为零)。另外注 意,对于s/u字段可使用".s"代替。或者可替换地,不提供该s/u字段。
在另一实施例中,假设R7指向pp (存储0x46),并且R10存储 cnt值3和stride值2。因此,可使用下面的指令每隔一个分量向该寄 存器加载矢量104。
lvex.u.mh.dh R4, R7, RIO /*cnt=3, stride=2*/
在此示例中,可使用lvex指令,因为cn"ms (3隔半字)适合单 个寄存器(所示实施例中的64位寄存器)。利用此lvex指令,将cnt 个分量(3个分量)加载至R4,其中,后面的分量距离"stride"个ms 大小的单位放置。因此,在此示例中,后面的分量以距离2个半字 ("stride*mS")放置,因此,在加载每一分量后,下一分量从2个半 字处取回。例如,从0x46取回pp,从0x4A (0x46+0x2)取回rr。如 此继续,直到加载3个分量。还要注意,R4的未使用部分由预定值填 充(在此示例中为零)。
图18表示处于四个不同时刻(time二O, time=l, time = 2, time =3)的存储器的一部分200,其可对应于,例如,图1的存储器12的 全部或部分(或者可位于数据处理系统的任何地方)。在说明的实施 例中,存储器部分200示出为64位宽存储器。注意,在替换实施例中, 可以各种不同方式将存储器部分200格式化为具有不同的宽度。存储 器部分200分别在存储器位置0x08, OxOA, OxOC, OxOE和0x10存储 分量Q, C3, C2, d和Q)。分量t、 u和v分别存储在0x12, 0x14和 0x16。存储器部分200还在timei时分别在位置0x20, 0x22, 0x24, 0x26和0x28存储X.4, X.3, X.2, X.!和XQ。在一个实施例中,这些值 的每一个可以指以特定采样速率采样的数字采样信号的各种时间采
样。例如,在time二O,当前采样由Xo表示,并且一个时间延迟(即, l/采样速率)前的采样由X.i表示,两个时间延迟(即,2*1/采样速率)
前的采样由X.2表示,等等。
接下来,在time二l,当前采样由X!表示,并且一个时间延迟(即, l/采样速率)前的采样由Xo表示,两个时间延迟(即,2*1/采样速率) 前的采样由X.i表示,等。注意,最新的采样覆盖最老的时间采样,在 示出time=l的示例中其为X.4。因此,在time=2,当前采样乂2覆盖X.3, 并且,在time二3,当前采样乂3覆盖义2。因此,存储位置0x20, 0x22, 0x24, 0x26和0x28可实现循环缓冲,其连续地存储进来的数字采样信 号的时间采样。在替换实施例中,可对于不同的原因或应用实现循环 缓冲。
在一个实施例中,可使用修改的lmvex加载指令按照某种方式将 该循环缓冲的值正确地送入寄存器文件的寄存器(如将参考图19-22 的说明),该方式为这些值处于用于计算的正确的希望的顺序,例如, 在执行滤波函数时。例如,下面的等式对应于滤波函数,其中,Yo, Y" Y2和Y3分别对应于在time=0, time=l, time=2, time=3时的结果: Eq.l Yo=Co*Xo+C1*X.1+C2*X.2+C3*X.3+C4*X.4 Eq.2 Y产C^Xi+C^Xo+CZX.!+CX.2+CX陽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
在一个实施例中,该修改的lmvex指令称为一次跳跃加载多个矢 量分量(lmvex—skip—once )指令,如图27中所示。图27的 lmvex_skip_once指令包括s/u字段、ms字段和ds字段,其就是按照上 面对于lmvex指令的说明操作。该lmvex_skip—once指令还采用三个操 作数rD、 rA禾Q 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的说明,下面的伪码段可用于计算上面 等式l、 2、 3和4的滤波结果Yo, Yp YjPY3。
/*初始化R12,以存储cnt值5和stride值1*/ /*初始化R13,以存储cnt值5, stride值1, skip_cnt值5和skip 值-4*/
严初始化R1,以存储0x08V 严初始化R2,以存储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存储至 R11*/
add RIO, RIO, Rll /*在第一次迭代中,将Yo存储至R10"
"在RIO中的值可存储至存储器*/
add R2, R2, 2 /*将R2中的指针向前移动2*/
/*修改Rl3中的值,使得"skip_cnt=skip_cnt-1" */
branch loop
循环由上面代码段中的标签"l00p:"表示,在进入该循环之前,,
用cnt值5禾B stride值1初始化R12,用cnt值5, stride值1, skip—cnt 值5和skip值-4初始化R13。因此,寄存器R12和R13可在后面的矢 量加载指令中用作"rB"。初始化Rl指向常矢量的起始(位于0x08 的C》。初始化R2指向循环缓冲的起始,其在time:0时为0x20,如 图18所示。因此注意,循环的第一次迭代对应于加载至对应于timeO 时寄存器文件(如图19所示)的值。
第一条lmvex指令根据R12中存储的参数,将C4-d加载至R6, 并将Co加载至R7, R12在前面初始化;并且控制字段如上参考图4和 5的说明。然后,循环内的第一次迭代开始于lnwex_skip—once指令。 在该第一次迭代中,对应于time = 0,该lmvex_skip—once指令根据R12 中存储的参数和这些控制字段,将X.4-X.i加载至R8,并且将X。加载 至R9,如图19中的R8和R9所示,其中,R12在前面初始化。注意, 由于在该第一次迭代中,skip_Cnt=cnt, skip可视为"无关紧要",因 为并不需要该skip值。也就是,当该skip—cnt计数器终止时,cnt计数 器也终止,并从而不需要"跳跃"即可完成该指令。
第一条矢量乘积累加指令(vmac.h)对寄存器R6和R8的半字分 量执行矢量乘积累加运算,并将结果存储至RIO。因此,R10现在存储 C4*X.4+C3*X.3+C2*X.2+C1*X.1,如图19中的R10所示。第二条矢量乘 积累加指令对寄存器R7和R9的半字分量执行矢量乘积累加运算,并 将结果存储至Rll。因此,Rll现在存储Q^Xo+(PO+(PO+(^0,其就等 于CZXo。注意,在当前的示例中,通过每一个加载矢量指令(lmvex 和lmvex_skip_once),寄存器(例如R7和R9)的其余未使用的部分 清零,从在Rll中产生正确结果。否则,如果例如,反而从存储器200 加载值t, u和v ,则R11可能为不正确的值。
然后,第一条求和指令对RlO和Rll的值求和,并将结果存储至 R10 (此运算并未在图19中示出)。然后可在需要时存储对应于上面 等式1的Y。的该值,例如回到存储器200。第二条求和指令将循环缓
冲的起始指针向前移动至下一个半字,使得对于time=l,该起始指针 现在指向地址0x22的X.3,如图18和20所示。接下来,修改R13,使 得skip—cnt=skip_cnt-l。因此。经过上面代码段的第一次迭代,skip_cnt 现在等于4。可使用循环计数器或附加指令(未包括在上面的代码段中) 指示是否退出该循环。如果不退出该循环,则代码返回"loop",并开 始下一次迭代。
值CVCo保持在R6和R7中(如图20的R6和R7所示)。该循 环的第二次迭代开始于lmvex_skip—once指令。在该第二次迭代中,对 应于time=l,该lmvex_skip_once指令根据存储在R12中的参数和控制 字段,将X3-X。加载至R8,并将X!加载至R9,如图20中的R8和R9 所示。在此次迭代中,由于skip—cnt为4,并且rA指向X—3为第一个要 加载的分量,加载4个分量X.3-XQ。此时,由于加载了 skip一cnt (4) 个分量,并且还没有加载cnt (5)个分量,则从"skip"个ms大小(半 字)的单位的位置处加载下一分量。因此,在此示例中,值为-4的skip 允许从0x28 - 4*2 = 0x20加载分量X"(注意,存储器200可半字寻 址;因此,skip个ms大小的单位处表示-4个半字处。)注意,如上所 述,在time二l时,存储器200中的最近分量存储在0x20,其为前一最 老的时间采样的位置。因此,lmvex—skip—once指令以从最老到最新的 时间采样顺序,从存储器位置0x20-0x28向R8和R9正确地加载了用 于计算Y,所需的5个分量。
第一条矢量乘积累加指令(vmac.h)对寄存器R6和R8的半字分 量执行矢量乘积累加运算,并将结果存储至R10。因此,R10现在存储 C4*X.3+C3*X.2+C2*X.1+C1*Xo,如图20中的R10所示。第二条矢量乘 积累加指令对寄存器R7和R9的半字分量执行矢量乘积累加运算,并 将结果存储至Rll。因此,Rll现在存储Q^Xi+O+O+OW+O+O,其就等 于Q^Xp注意,在当前的示例中,通过每一加载矢量指令(lmvex和 lmvex—skip—once),寄存器(例如R7禾BR9)的其余未使用部分清零, 从在Rll中产生正确结果。否则,如果例如,反而从存储器200加载
值a、 b或c (或者t、 u禾Pv),则R11可能为不正确的值,。
然后,第一条求和指令对R10和R11的值求和,并将结果存储至 R10 (此运算并未在图20中示出)。然后可在需要时存储对应于上面 等式2的Yi的该值,例如回到存储器200。第二条求和指令将循环缓 冲的起始指针向前移动至下一个半字,使得对于time=2,该起始指针 现在指向地址0x24的X.2,如图18和21所示。接下来,修改R13,使 得skip_cnt=skip_cnt-l。因此。经过上面代码段的第二次迭代,skip_cnt 现在等于3。可使用循环计数器或附加指令(未包括在上面的代码段中) 指示是否退出该循环。如果不退出该循环,则代码返回至"loop",并 开始下一次迭代。
第三次迭代类似于第一次和第二次迭代操作。对于第三次迭代, 其对应于time二2, lmvex—skip—once指令将X.2, X.P XQ, XP 乂2加载 至寄存器R8和R9,如图21所示。因此, 一旦加载了分量X.2, X.i和 Xo(开始于Ox24),就已经加载了 skip—cnt个分量,并且使用skip加 载X!和X2。后面的矢量乘积累加指令导致C X.2+C^X.一CVX()+C^Xj 存储在R10中,并且导致CV^2存储在R11中。第一条求和指令将对 应于Y2的结果存储在R10中,其中,然后可将Y2存储至存储器,如 果需要的话。第二条求和指令然后将该指针向前移动至起始位置0x26, 如图22中所示。另夕卜,修改R13,使得skip_cnt=skip—cnt-l。因此。经 过上面代码段的第三次迭代,skip—cnt现在等于2。可使用循环计数器 或附加指令(未包括在上面的代码段中)指示是否退出该循环。如果 不退出该循环,则代码返回至"loop",并开始下一次迭代。
通过上面参考图4和5所述的lmvex指令,重置该记录skip—cnt 的机制(例如,计数器),使得当加载下一skip—cnt个分量时(并且假 设还没有加载cnt个分量),从skip^^ms个单位处加载下一分量。然而, 在当前示例中,使用lvmex—skip_once指令,使得当力n载skip_cnt个分 量时,不重置记录skip—cnt的机制。按照这种方式,在加载全部cnt个
分量前,将不会再一次地使用跳跃。这允许在后面的迭代中,正确地 加载所有分量,如将所述,例如通过第四次迭代(对应于tim^3)。
第四次迭代类似于前面的迭代操作。对于第四次迭代,对应于
time=3, lmvex_skip_once指令将X.!, XQ, XP 乂2和乂3加载至寄存器 R8和R9,如图22所示。在此次迭代中,注意,加载的第一个分量是 来自位置0x26的(如图18对于time=3的表示)。加载和X0 之后,就已经加载了 skip_Cnt (其等于2)个分量;因此,使用skip将 指针绕回位置0x20,因为还没有加载cnt (5)个分量。还要注意,并 没有重置skip—cnt机制。按照这种方式,即使加载了下一skip—cnt (2) 个分量,也不进行跳跃。如果在下一skip一cnt个分量后对于此次迭代进 行跳跃,则在跳跃前仅取回分量Xi和X2,从而遗漏了 X3。因此,尽 管在前面的迭代中,在第一次跳跃后是否重置skip—cnt并不重要,但在 某些迭代中,例如此次迭代,其可确定是否取回正确的分量。因此, 可以知道如何将lmvex—skip—once指令用于正确地执行循环缓冲,例如, 对于滤波器应用。还要注意,能够以多种不同的方法书写上面的代码 段。例如,该循环可以展开,而不是写为循环形式。在此示例中,可 以对于time=0, 1, 2使用lmvex指令,而仅对于time=3禾n 4使用 lmvex—skip_once指令。
在图22中可以看出,一旦加载了X.p Xo, Xi, X2和X3,后面的 矢量乘积累加指令导致C,X—一CVX()+CX,+CVX2存储在R10中,并 且导致C/X3存储在Rll中。第一条求和指令将对应于Y3的结果存储 在R10中,其中,然后可将Y3存储至存储器,如果需要的话。此时, 流程按照上面对于前面迭代的说明继续进行。在一个实施例中,在将 R12修改为skip_cnt为0的指针后,可退出该循环,使得重置skip_cnt, 例如,返回5,并重复整个过程。
因此,能够理解如何将矢量加载指令,连同skip、 skip^nt和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 指令,该lstmwex一cb指令从存储器发起矢量分量流,其中,例如根据 rD何时用作后面指令的特定源操作数,这些分量可以出队。因此,除 了关于寻址模式外,上面对于lstrmvex的相同讨论此处也适用于 lstrmvex一cb。还要注意,尽管没有说明,但也可以使用循环缓冲存储 矢量分量流(ststrmvex一cb)指令,作为lstrmvex—cb的存储对应。对于 lstrmvex—cb禾卩ststrmvex—cb指令,在一些实施例中,每次遍历该循环 缓冲后,由"offset"表示的当前起始值(current—start)自动递增预定 数量的分量。
lmvex_cb、 stmvex—cb、 lstrmvex—cb禾口 ststrmvex—cb指令的可选指 示符包括rent和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*0 + C*R Eq.9 ee = D化+ E*0 + F*R Eq.10 hh = G*L + H*0 + 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作为指令(例如,指令目标,源l,源2) 的第一个源(源l)时才执行出队。
/*初始化R6,以存储值为9的cnt,值为3的rent,值为1的stride, 值为6的skip,禾n值为3的skip—cnt*/
"初始化R4,以存储0xl2,即矩阵102的第一行的起始*/ /*初始化R7,以存储值为9的cnt,值为3的rcnt,值为8的stride,
值为-15的skip,和值为3的skip—cnt*/
/"刀始化R5,以存储0x54,即矩阵106的第一列的起始*/ lstrmvex.u.mh.dh Rl, R4, R6严加载矩阵102的第一行A, B,
C*/
lstrmvex.u.mh.dh R2, R5, R7严加载矩阵106的第一列K, N,
Q*/
vmac.h RIO, Rl, R2 /*在R10中存储aa,并使矩阵102的 Rl出队*/
vmac.h Rll, Rl, R2 /*在Rll中存储dd,并使矩阵102的 Rl出队*/
vmac.h R12, R2, Rl /*在R12中存储gg,并使矩阵104的 R2出队*/
lstrmvex.u.mh.dh Rl, R4, 116/*加载矩阵102的第一行A, B,
C*/
vmac.h R13, Rl, R2 /*在R13中存储bb,并使矩阵102的 Rl出队*/
vmac.h R14, Rl, R2 /*在R14中存储ee,并使矩阵102的 Rl出队*/
vmac.h R15, R2, Rl /*在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初始化为指向位于0xl2处的分量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的第一行加载至Rl (如图23中所示)。 例如,分量A、 B和C彼此距离1半字(因此需要值为1的stride)。 值为3的rcnt每次仅向Rl加载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的rent每次仅向R2加载3个分量(其余 部分清零),并且在加载skip—cnt个分量(此例中为3个)之后,则将 Q (0x74)位置增加-15*1113 (-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)存储至RIO,如图24中所示。由于R1用作源1,因而其根据第一 条lstrmvex指令(和R6中的参数)出队,使得矩阵102的下一行(D、 E和F)存储至R1,而其余部分清零。此时,注意,由于R2没有用作 源l,则其不出队;因此,K、 N和Q保持在R2中,并且矩阵106的 下一列也不存储至R2。
第二条乘积累加指令(vmac)指令将D+K + E+N + F4Q (其等于
dd)存储至Rll,如图25中所示。由于R1用作源1,其再一次地根据 第一条lstrmvex指令(和R6中的参数)出队,使得矩阵102的下一行 (G、 H和I)存储至R1,而其余部分清零。此时,已经加载了对应于 第一条lstrmvex指令的9个分量,从而已经加载了 "cnt"个分量,并 且此指令流终止。由于R2没有用作源1,则其不出队;因此,K、 N 和Q保持在R2中,并且矩阵106的下一列也不存储至R2。此时,仅 加载了对应于lstrawix指令的3个分量,从而对于此指令没有加载cnt 个分量。
第三条累加指令(vmac)指令将G+K + IPN + PQ (其等于gg) 存储至Rll,如图26中所示。由于R2现在用作源1,因此其根据第二 条lstrmvex指令(和R7中的参数)出队,使得矩阵106的下一列(L、 O和R)存储至R2,而其余部分清零。此时,已经加载了矩阵106的 9个分量中的6个。另外,由于通过第一条lstrmvex指令已经加载了(矩 阵102的)"cnt"个分量,因而R1并不改变,并仍然保存G、H和I。 (此外,即使通过第一条lstrmvex指令还没有加载"cnt"个分量,Rl 仍然不改变,因为由于R1用作源2,其将不出队。)
第三条lstrmvex指令发起新的矢量分量流,其与第一条lstmwex 指令相同。也就是,该第三条lstrmvex指令依次将矩阵102的每一行 加载至R1,如上所述。后面三条vmac指令分别向R13、 R14和15存 储值bb、 ee和hh。注意,在使用头三条vmac指令时,第一条lstrmvex 指令通过第三条lstrmvex指令之后的头两条vmac指令出队,第二条 lstrmvex指令通过第三条lstrmvex指令之后的第三条vmac指令出队。 此时,矩阵106的最后一列(M、 P和S)将加载至R2 (未示出),并 且对于第二条lstmwex指令的加载将停止,因为此时将要加载"cnt" 个(即9个)分量。可使用类似的指令获得cc、 ff和ii。可将值aa、 dd、 gg、 bb、 ee、 hh、 cc、 ff和ii分别存储回至矩阵108的存储位置 0x8A, 0x9A, OxAA, Ox8C, 0x9C, OxAC, 0x8E, 0x9E, OxAE。如 此处所述,可使用矢量存储指令执行这些存储。
注意,在上面的伪码示例中,这些分量根据后面指令中rD的位置 出队(即rD是否用作源l或是源2)。然而要注意,在替换实施例中, 可使用其它因子指示这些分量是否出队。例如,可使用不同的操作码 指示出队,或者使用其它的指示符,例如标志位等。此外,在一个实 施例中,rD在任何时候用作为后面指令的源时出队,不是仅在其为源 l时出队。在又一实施例中,仅当使用同一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"(和"rent",如果存在的话)可为操作码或子 操作码的一部分,并且因此,rB可能不是必要的。该lmvex一fft指令还 可使用截短或舍入字段,如上所述。
图32表示存储多个矢量分量FFT (stmvex一fft)指令,其也具有 控制字库s/u、 ms和ss以及操作数rS、 rA和rB。这些控制字段和操作 数中的每一个如上对于其它存储指令的说明操作。该stmvex—fft指令还 可使用截短或舍入字段,如上所述,并可选地如上对于其它存储矢量 分量指令的说明执行rent控制字段。该stnwex_fft指令还使用在rB中 存储的附加参数"radix"。在使用上面的指令时,在替换实施例中, "radix"可为该操作码或子操作码的一部分,并且因此,rB可能不是 必要的。该stmvex—fft指令可视为lmvex—fft指令的存储对应。
重新参看该lmvex一fft指令,"radix"参数可用于根据FFT寻址 算法向寄存器或寄存器组加载一系列数据,如本领域所公知。例如, 对于FFT,公知将以Xo, Xp X2, X3, X4, X5, 乂6和乂7为顺序的数 据进行"比特翻转",形成Xo, X4, X6, X2, XP X5, X3, X7,以进 行特定FFT计算。在该lmvex—fft指令中,该"radix"定义分量的数量, 以及这些分量的特定存储顺序。例如,图34表示存储器部分300,其 可为,例如图1的存储器12的一部分。存储器部分300分别包括存储
在位置0xi6-0x24的分量xQ, xP x2, x3, x4, x5, xjnx7。存储器
部分300还包括存储在位置0x44-0x52的分量Yo, Y4, Y6, Y2, Y。 Y5, Ys和Y7。
图35表示诸如图1的标量寄存器文件34的寄存器文件的一部分。 例如,基数8的lvmex一fft指令可用于以比特翻转形式将X个分量送入 寄存器R1和R2 (如图35所示),其中,Rl由rD指定,并且将要加 载的第一个存储器位置(0x16)由rA指定。类似地,基数8的lmvex—fft
可用于将比特翻转的Y个分量以连续顺序送入寄存器R4和R5 (如图 35所示),其中,R4由rD指定,并且将要加载的第一个存储器位置 (0x44)由rA指定。因此,该lmvex—fft指令可以比特翻转的形式加 载分量,其中,这些分量可以一开始就进行比特翻转,或者不翻转。
类似地,stmvex—fft指令可用于将这些分量与比特翻转形式存储至 存储器。例如,基数8的该stmvex—fft指令可用于将比特翻转的X个 分量从Rl和R2存储至位置0x16-0x24的存储器,使得存储器中的这 些分量与Rl和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"(和"rent",如果存在 的话)可为操作码或子操作码的一部分,并且因此,rB可不是必要的。 "radix"定义将要加载的分量的总数。在利用lmstrmvex_fft指令时, 该lmstrmvex—fft从存储器发起矢量分量流,其中,以比特翻转形式或 以来自比特翻转的连续顺序加载这些分量,并且根据例如,后面指令 中rD的位置使这些分量出队。注意,尽管没有表示出来,但可使用对 应的存储指令发起以比特翻转形式向存储器存储分量流,例如对于FFT 应用。
因此,可以明白,如何将各种不同类型的矢量加载和存储指令用 于具有一组寄存器的系统,例如,标量寄存器文件等。也就是,上面 的指令可用于现有设计或仅需对现有设计的执行单元(例如执行单元
32)和控制单元(例如控制单元28)进行少量的改动。注意,此处说 明的每一条指令可具有不同的格式,并且甚至可分为多条指令。另外, 在从或向寄存器传送矢量分量时,可使用附加参数指示将哪一个寄存 器分量传送至存储器(例如对于矢量存储指令),或者寄存器中的哪 一个寄存器分量存储从存储器加载的矢量分量(例如对于矢量加载指 令)。此外,可使用附加参数定义如何将矢量分量放置在寄存器中, 或者从存储器的何处读取矢量分量。例如,可提供起始位置指示符指 示向或从寄存器中的何处开始传送。另外,对于寄存器可给定跨度, 使得能够以非相邻的方式在寄存器中向或从寄存器传送参数。另外, 此处说明的所有参数和控制字段可出现在任何这些指令的任何组合之 中。
还要注意,上面已经讨论了不同的寻找模式,例如使用stride、skip、 skip—cnt等的模式,或者使用buffer—size和offset的模式,或者使用基 数(radix)的模式。然而,在替换实施例中,可使用不同的寻址模式。 例如,可代之以指定阵列维数,例如,阵列的维数等(例如,2-维4X 4阵列,3-维5X5阵列等)。因此,与上面实施例一同说明的寻址模 式可用于以各种模式加载或存储数据或数据阵列,包括例如,zig-zag 模式和其它规则模式,如上所述。与在当前SIMD处理器中所需的开 销相比,此处说明的指令还可降低向或从存储器传送存储器分量所需 的开销。例如,在能够进行SIMD运算的当前处理器中,需要大量的 指令向或从存储器传送矢量分量(例如,矢量或数据阵列或其它规则 模式的数据)。然而,可利用上述矢量加载和存储指令完成相同的分 量传送,其中,降低的指令数量(或者仅用一条指令)可用于完成此传送。
下面的段落提供本发明的各种方面,形式和实施例的说明。每一 说明仅提供各种实施例的示例,目的并不是限制上面讨论的任何说明 或实施例。
根据本发明的一个方面, 一种数据处理系统具有用于存储操作数 的存储器和至少一个通用寄存器。处理器电路执行一条或多条指令, 并且该一条或多条指令中的至少一条在该存储器和该至少一个通用寄 存器间传送数据分量。该至少一条或多条指令指定存储器中数据分量 的大小,其独立于指定该至少一个通用寄存器中数据分量的大小。在
一种形式中,该一条或多条指令包括独立字段,其用于分别存储用于 存储器的第一数据大小指定符和用于该至少一个通用寄存器的第二数 据大小指定符。在另一形式中,该一条或多条指令指定用于定义存储 器的第一数据大小指定符和该至少一个通用寄存器的第二数据大小指 定符的存储位置。在一种形式中,该存储位置为存储器中的位置和该 存储器外部的处理器寄存器位置中的任何一个。在另一形式中,该存 储位置为该数据处理系统的控制寄存器。在一种形式中,该存储位置 为该数据处理系统的寄存器,算术、逻辑和移位操作由该数据处理系 统工具执行。该存储器可进一步包括将在该存储器和该至少一个通用 寄存器间传送的多个数据分量。在一种形式中,该多个数据分量在该 存储器中相邻。在另一形式中,该多个数据分量在存储器中不相邻。 在一种形式中,该至少一个通用寄存器中的每一个保存多个数据分量。 在另一形式中,该至少一个通用寄存器中的每一个包括具有一维存储 器映射的标量寄存器。
当该至少一条或多条指令指定存储器中的源数据分量的大小大于 该至少一个通用寄存器中的目标数据分量的大小时,该处理器电路可 截短存储器中的源数据分量的一部分。存储器中该源数据分量被截短 的部分可为该存储器中源数据分量的高阶部分。存储器中该源数据分 量被截短的部分可为该存储器中源数据分量的低阶部分。当该至少一 条或多条指令指定存储器中的源数据分量的大小大于该至少一个通用 寄存器中的目标数据分量的大小时,该处理器电路可基于该存储器中
源数据分量低阶部分的值,舍入(round)该存储器中源数据分量的高
阶部分。当该至少一条或多条指令指定存储器中的源数据分量的大小 小于该至少一个通用寄存器中的目标数据分量的大小时,该处理器电
路可将预定数据值放入该至少一个通用寄存器的目标数据分量没有被 来自该存储器的源数据分量填充的部分。在一种形式中,该处理器电 路通过使用零扩展将预定数据值放入该至少一个通用寄存器的目标数 据分量的一部分。在另一种形式中,该处理器电路通过使用符号扩展 将预定数据值放入该至少一个通用寄存器的目标数据分量的一部分。 在还一形式中,该处理器电路通过用预定比特值填充该至少一个通用 寄存器的目标数据分量的低阶数据部分,将预定数据值放入该至少一 个通用寄存器的目标数据分量的一部分,其中,该预定比特值为零值。
当该至少一条或多条指令指定存储器中的目标数据分量的大小小 于该至少一个通用寄存器中的源数据分量的大小时,该处理器电路可 截短该至少一个通用寄存器中源数据分量的一部分。在一种形式中, 该处理器电路截短该至少一个通用寄存器中源数据分量的高阶部分。 在另一种形式中,该处理器电路截短该至少一个通用寄存器中源数据 分量的低阶部分。当该至少一条或多条指令指定存储器中的目标数据 分量的大小小于该至少一个通用寄存器中的源数据分量的大小时,该 处理器电路可根据该源数据分量的低阶部分的值,舍入在该至少一个 通用寄存器中的源数据分量的高阶部分。当该至少一条或多条指令指 定存储器中的目标数据分量的大小大于该至少一个通用寄存器中的源 数据分量的大小时,该处理器电路可将预定数据值放入该存储器中目 标数据分量没有被该至少一个通用寄存器中源数据分量填充的部分。 在另一形式中,该处理器电路通过使用零扩展将预定数据值放入该存 储器中未被填充的目标数据分量部分,或者通过使用符号扩展将预定 数据值放入该存储器中未被填充的目标数据分量部分。在另一形式中, 通过将预定比特值放置在该目标数据分量的低阶数据部分,将预定数 据值放置在该存储器中目标数据分量的未填充部分。
根据另一方面,用于在数据处理系统中加载和存储数据分量的方 法包括提供存储操作数的存储器和提供至少一个通用寄存器。执行一 条或多条指令,该一条或多条指令中的至少一条引起在该存储器和该
至少一个通用寄存器间的数据分量的传送。该至少一条或多条指令指 定该存储器中数据分量的大小,其独立于指定该至少一个通用寄存器 中数据分量的大小。通过执行该至少一条或多条指令中的独立字段指 定数据分量的大小,第一字段表示用于存储器的第一数据大小指定符, 第二字段表示用于该至少一个通用寄存器的第二数据大小指定符。通
过执行该至少一条或多条指令中的预定字段指定数据分量的大小,该 预定字段表示存储位置,其定义用于存储器的第一数据大小指定符和 用于该至少一个通用寄存器的第二数据大小指定符。当该至少一条或 多条指令指定存储器中的源数据分量的大小大于该至少一个通用寄存 器中的目标数据分量的大小时,可截短该存储器中源数据分量的一部 分。在另一种形式中,当该至少一条或多条指令指定存储器中的源数 据分量的大小大于该至少一个通用寄存器中的目标数据分量的大小 时,根据该存储器中的源数据分量低阶部分的值,舍入该存储器中的 源数据分量的高阶部分。在另一形式中,数据处理系统包括存储器和 用于执行数据处理指令的处理器。至少一条数据处理指令包括指定存 储在该存储器中的数据分量大小的控制信息,其独立于指定存储在该 存储器外部的数据处理系统中的至少一个存储位置的数据分量的大 小。
在另一形式中,该系统中的处理器电路执行至少第一条指令和该 第一条指令之后的第二条指令。该第一条指令在存储器和至少一个通 用寄存器间传送数据分量流,这些数据分量将在该存储器和该至少一 个通用寄存器的至少一个中进行排队。该第二条指令包括至少第一源 操作数,并且基于作为该第二条指令的源操作数的该至少一个通用寄 存器,使该数据分量流的一部分条件出队。当该至少一个通用寄存器 用作由该第二条指令指定的预定类型功能的源操作数时,可执行该数
据分量一部分的条件出队。在另一种形式中,基于该第二条指令的控 制字段值执行该部分数据分量的条件出队。该第二条指令还可进一步 包括第二源操作数,并且当该至少一个通用寄存器用作该第一源操作 数时,执行该条件出队。在一种形式中,当该至少一个通用寄存器作
为该第二源操作数时,不执行该条件出队。
根据另一方面,数据处理系统中数据分量的选择性出队方法包括 提供存储操作数的存储器和提供至少一个通用寄存器。执行至少第一 条指令和该第一条指令后的第二条指令。在该存储器和该至少一个通 用寄存器间传送数据分量流,以响应该第一条指令。对该存储器和该 至少一个通用寄存器中的至少一个中的数据分量进行排队。执行该第 一条指令之后的第二条指令。该第二条指令包括至少第一源操作数。 根据作为该第二条指令的源操作数的该至少一个通用寄存器,使数据 分量流的一部分条件出队。当该至少一个通用寄存器用作由该第二条 指令指定的预定类型功能的第二源操作数时,使该部分数据分量流条 件出队。可在该第二条指令中提供第二源操作数,并且在当该至少一 个通用寄存器作为第一源操作数时使该部分数据分量流条件出队。在 一种形式中,当该至少一个通用寄存器用作该第二源操作数时不执行 出队。
根据另一方面,数据处理系统包括存储操作数的存储器和至少一 个通用寄存器。处理器电路执行多条指令,该多条指令中的第一条在 该存储器和该至少一个通用寄存器间传送数据分量流,并在该存储器 和该至少一个通用寄存器中的至少一个中对这些数据分量进行排队。 数据分量流的一部分条件出队,以响应对应于该多条指令的适当子集 中预定指令的该多条指令中的第二条。该处理器电路可基于作为该多 条指令的第二条的源操作数的该至少一个通用寄存器,进一步使该部
分数据分量流条件出队。该处理器电路可基于该多条指令的第二条的 控制字段值,进一步使该部分数据分量流条件出队。
根据另一方面,数据处理系统中数据分量的选择性出队方法包括 提供存储操作数的存储器和提供至少一个通用寄存器。执行多条指令, 该多条指令的第一条在该存储器和该至少一个通用寄存器间传送数据 分量流。在该存储器和该至少一个通用寄存器中的至少一个中对该数
据分量流进行排队。使该数据分量流的一部分条件出队,以响应对应 于该多条指令的适当子集中预定指令的该多条指令的第二条。
根据另一方面,数据处理系统包括存储操作数的存储器和至少一 个通用寄存器。处理器电路执行多条指令。该多条指令的第一条在该 存储器和至少一个通用寄存器间传送数据分量流,这些数据分量将在 该存储器和该至少一个通用寄存器中的至少一个中进行排队。根据作 为该多条指令的第二条的目标操作数的该至少一个通用寄存器,使该 数据分量流的一部分条件入队。
根据另一方面,数据处理器中数据分量的选择性入队方法包括提 供存储操作数的存储器和提供至少一个通用寄存器。执行多条指令, 该多条指令的第一条在该存储器和该至少一个通用寄存器间传送数据 分量流,这些数据分量将在该存储器和该至少一个通用寄存器中的至 少一个中进行排队。根据作为该多条指令的第二条的目标操作数的该 至少一个通用寄存器,使该数据分量流的一部分条件入队。
根据另一方面,数据处理系统包括存储操作数的存储器和至少一 个通用寄存器。该处理器电路执行至少第一条指令和该第一条指令后 的第二条指令。该第一条指令在存储器和至少一个通用寄存器间传送
数据分量流,这些数据分量将在该存储器和该至少一个通用寄存器中 的至少一个中进行排队。该第二条指令包括至少第一目标操作数。基
于作为该第二条指令的目标操作数的该至少一个通用寄存器,使该数 据分量流的一部分条件入队。
根据另一方面,数据处理系统包括存储操作数的存储器和至少一 个通用寄存器。该处理器电路执行至少第一条指令和该第一条指令后 的第二条指令。该第一条指令在该存储器和该至少一个通用寄存器间 传送数据分量流,这些数据分量将在该存储器和该至少一个通用寄存 器中的至少一个中进行排队。该第一条指令进一步指定将要传送的数
据分量的数量,并且基于作为该第二条指令的源操作数的该至少一个 通用寄存器,使来自该部分数据分量流的的多个数据分量条件出队。
根据另一方面,数据处理系统包括存储操作数的存储器和至少一 个通用寄存器。该处理器电路执行至少第一条指令和该第一条指令后 的第二条指令。该第一条指令在存储器和至少一个通用寄存器间传送 数据分量流,这些数据分量将在该存储器和该至少一个通用寄存器中 的至少一个中进行排队。该第一条指令进一步指定将要传送的数据分 量的数量,并且基于作为该第二条指令的目标操作数的该至少一个通 用寄存器,使来自该部分数据分量流的的多个数据分量条件入队。
根据另一方面,数据处理系统包括存储操作数的存储器、至少一 个通用寄存器和处理器电路。该处理器电路包括多条指令。该多条指 令中的第一条在存储器和至少一个通用寄存器间传送数据分量流,这 些数据分量将在该存储器和该至少一个通用寄存器中的至少一个中进 行排队。条件执行该数据分量流的一部分的入队和出队中的至少一个, 以响应该多条指令的第二条中的控制字段。
根据另一方面,数据处理系统包括存储操作数的存储器和多个通 用寄存器,其中,每个通用寄存器保存多个数据分量。处理器电路执 行一条或多条指令,该一条或多条指令中的至少一条在该存储器和该 多个通用寄存器中的至少两个间传送多个数据分量,其中,该至少一 条或多条指令指定将要在该多个通用寄存器中的至少两个中的每一个 和该存储器间传送的寄存器分量的数量。该一条或多条指令除了指定 将要传送的寄存器分量的数量外,还指定将加载或存储哪一个寄存器 分量。在另一种形式中,当在该多个通用寄存器中的至少两个中的每 一个和该存储器间仅传送该多个数据分量的子集时,用预定值填充任 何未指定的数据分量。
根据另一方面,在数据处理系统中传送数据分量的方法包括在存
储器中存储操作数。在多个通用寄存器的每一个中存储多个数据分量。 该数据处理系统执行一条或多条指令。该一条或多条指令中的至少一 条引起在该存储器和该多个通用寄存器中的至少两个间的多个数据分 量的传送。该至少一条或多条指令指定将要在该多个寄存器中的至少 两个中的每一个和该存储器间传送的寄存器分量的数量。
根据另一方面,数据处理系统包括存储操作数的存储器和多个通 用寄存器,其中,每个通用寄存器保存多个数据分量。处理器电路执
行一条或多条指令,该一条或多条指令中的至少一条在该存储器和该 多个通用寄存器中的至少两个间传送多个数据分量。该至少一条或多 条指令指定将要传送该多个通用寄存器中的至少两个中的哪些数据分 量。当仅传送多个数据分量的子集时,该处理器电路用预定值填充任 何未指定的数据分量。在一种形式中,由该至少一条或多条指令指定 的数据分量在该多个通用寄存器中的至少两个中连续排列。在另一种 形式中,由该至少一条或多条指令指定的数据分量在该多个通用寄存 器中的至少两个中不是连续排列。
根据另一方面,在数据处理系统中传送数据分量的方法包括在存 储器中存储操作数和在多个通用寄存器中的每一个中保存多个数据分 量。执行一条或多条指令,该一条或多条指令中的至少一条在该存储 器和该多个通用寄存器中的至少两个间引起多个数据分量的传送,其 中,至少一条或多条指令指定将要传送该多个通用寄存器中的至少两 个中的哪些数据分量。
根据另一方面, 一种数据处理系统包括存储操作数的存储器和多 个通用寄存器,其中,每一通用寄存器保存多个数据分量。处理器电 路执行一条或多条指令,该一条或多条指令中的至少一条在该存储器 和该多个通用寄存器中的至少两个间传送多个数据分量。该至少一条 或多条指令既指定将要在该多个寄存器中的至少两个中的每一个和该 存储器间传送的数据分量的数量,还进一步指定将要传送的数据分量
的总数。
根据另一方面,数据处理系统包括存储操作数的存储器和至少一 个通用寄存器。处理器电路执行一条或多条指令,该一条或多条指令 中的至少一条用于在该存储器和该至少一个通用寄存器间传送多个数 据分量,其中,该一条或多条指令指定(a)存储器中连续数据分量 间的第一部分中数据分量间的第一偏移;(b)将在该存储器和该至少 一个GPR间传送的数据分量的第一数量;以及(C)该存储器中数据分 量的第一部分和第二部分间的第二偏移。在一种形式中,该一条或多 条指令中的这一条还指定存储器中数据分量的数据分量大小。在另一 形式中,该一条或多条指令中的这一条还指定该存储器中数据分量的 大小,其独立于指定该至少一个通用寄存器中数据分量的大小。该处
理器电路基于该存储器中数据分量的大小,确定将要传送的数据分量 的总数。该处理器电路可基于该至少一个通用寄存器中数据分量的大 小,确定将要传送的数据分量的总数。该一条或多条指令中的这一条 可进一步指定将要在该存储器和该至少一个通用寄存器间传送的数据 分量的总数。该数据处理系统可进一步包括第一通用寄存器和第二通 用寄存器,其中,该一条或多条指令中的这一条在该存储器和第一通
用寄存器与第二通用寄存器间传送数据分量,以响应执行该一条或多
条指令中的该条指令。该一条或多条指令中的这一条指令可进一步指
定将要在该存储器和第一通用寄存器与第二通用寄存器间传送的数据
分量的总数。如果传送的数据分量的总数并没有完全填充该第二通用
寄存器,则处理器电路可用预定值填充任何剩余比特位置的一部分。
该一条或多条指令中的这一条指令可独立地指定将要在该存储器和该 第一与第二通用寄存器中的每一个间传送的数据分量的数量。如果传
送的数据分量的总数并没有完全填充该第二通用寄存器,则该处理器 电路可用预定值填充任何剩余比特位置的至少一部分。该一条或多条 指令中的这一条指令可进一步包括指示符,其中,该处理器电路使用 该第二偏移不超过一次,同时传送第一数量的数据分量。当该一条或 多条指令中的这一条指定仅使用该第二偏移一次时,该处理器电路可
利用循环缓冲发送存储器中的数据分量。该一条或多条指令中的这一 条可进一步包括指示符,其中,如果将要传送的数据分量的第一数量 是将要传送的数据分量的第一部分的两倍,则该处理器电路使用该第 二偏移多于一次。
根据另一方面,数据处理系统包括存储操作数的存储器和至少一 个通用寄存器。处理器电路执行一条或多条指令,该一条或多条指令 中的至少一条在该存储器和该至少一个通用寄存器间传送数据分量, 其中,该一条或多条指令的一条指定基数指示符,用于在该存储器和 该至少一个通用寄存器间以比特翻转的顺序执行传送一个或多个数据
根据另一方面, 一种使用多个寻址模式的方法提供存储操作数的 存储器。提供至少一个通用寄存器。执行一条或多条指令,该一条或 多条指令中的至少一条在该存储器和该至少一个通用寄存器间传送数 据分量。该一条或多条指令中的至少一条指定该存储器中连续数据分 量的第一部分中数据分量间的第一偏移。该一条或多条指令中的至少 一条指定将在该存储器和该至少一个通用寄存器(GPR)间传送的数据 分量的第一数量。该一条或多条指令中的至少一条可进一步指定该存 储器中数据分量的第一部分和第二部分间的第二偏移。该一条或多条 指令中的至少一条可用于进一步指定存储器中数据分量的数据分量大 小。该一条或多条指令中的至少一条可用于进一步指定该存储器中数 据分量的大小,其独立于指定该至少一个通用寄存器中数据分量的大 小。处理器基于该存储器中数据分量的大小,用于确定将要传送的数 据分量的总数。该处理器可基于该至少一个通用寄存器中数据分量的 大小,确定将要传送的数据分量的总数。该一条或多条指令中的至少 一条指令可用于进一步指定将要在该存储器和该至少一个通用寄存器 间传送的数据分量的总数。可提供第一通用寄存器和第二通用寄存器 并且在该存储器和第一通用寄存器与第二通用寄存器间传送数据分 量,以响应执行该一条或多条指令中的该条指令。该一条或多条指令
中的这一条指令可用于进一步指定将要在该存储器和第一通用寄存器 与第二通用寄存器间传送的数据分量的总数。在一种形式中,如果传 送的数据分量的总数并没有完全填充该第二通用寄存器,则用预定值 填充该第二通用寄存器中任何剩余的未填充的比特位置的至少一部 分。该一条或多条指令中的这一条指令可用于进一步独立地指定将要 在该存储器和该第一与第二通用寄存器中的每一个间传送的数据分量 的数量。在一种形式中,如果传送的数据分量的总数并没有完全填充 该第二通用寄存器,则利用诸如零的预定值填充任何剩余比特位置的 至少一部分。可在该一条或多条指令中的这一条中提供指示符,其中, 作为该指示符的响应,处理器仅使用该第二偏移一次,来传送第一数 量的数据分量。
根据另一方面,当该一条或多条指令中的这一条指定仅使用该第 二偏移一次时,则可利用循环缓冲,在该处理器的控制之下,发送存 储器中的数据分量。可在该一条或多条指令中的这一条中提供指示符, 其中,作为该指示符的响应,如果将要传送的第一数量的数据分量是 将要传送的存储器中数据分量的第一部分中的数据分量数量的两倍, 则该处理器使用该第二偏移多于一次。可该一条或多条指令的这一条 中提供基数指示符,用于在该存储器和该至少一个通用寄存器间以比 特翻转的顺序执行一个或多个数据分量的传送。
根据另一方面, 一种数据处理寻址方法包括提供存储操作数的存 储器和提供至少一个通用寄存器。执行一条或多条指令,该一条或多 条指令中的至少一条在该存储器和该至少一个通用寄存器间传送数据 分量。该一条或多条指令中的至少一条在该一条或多条指令的这一条 中指定基数指示符,该基数指示符在该存储器和该至少一个通用寄存 器间以比特翻转的顺序执行一个或多个数据分量的传送。
根据另一方面, 一种数据处理系统寻址方法包括提供存储操作数 的存储器和提供至少一个通用寄存器。提供处理器电路以执行一条或
多条指令。该一条或多条指令中的至少一条在该存储器和该至少一个 通用寄存器间传送数据分量,其中,该一条或多条指令中的一条执行 以比特翻转的顺序将预定数据分量存储至存储器中,并将该预定数据 分量传送至该至少一个通用寄存器。该一条或多条指令中的至少一条 进一步指定将要传送至该至少一个通用寄存器中的数据分量的数量。 在另一形式中,该一条或多条指令中的至少一条进一步指定该存储器 中数据分量的大小,其独立于指定该至少一个通用寄存器中数据分量 的大小。
根据另一方面, 一种数据处理系统寻址方法包括提供存储操作数 的存储器和提供至少一个通用寄存器。提供处理器电路以执行一条或 多条指令,该一条或多条指令中的至少一条在该存储器和该至少一个 通用寄存器间传送数据分量,其中,该一条或多条指令中的一条在该 存储器中以连续顺序存储预定数据分量,并且以比特翻转顺序将该预 定数据分量传送至该至少一个通用寄存器。
根据另一方面, 一种数据处理系统寻址方法包括提供存储操作数 的存储器和提供至少一个通用寄存器。提供处理器电路以执行一条或 多条指令,该一条或多条指令中的至少一条在该存储器和该至少一个 通用寄存器间传送数据分量,其中,该一条或多条指令中的一条在该 至少一个通用寄存器中执行以比特翻转顺序存储预定数据分量,并且 将该预定数据分量传送至该存储器。
根据另一方面, 一种数据处理系统寻址方法包括提供存储操作数 的存储器和提供至少一个通用寄存器。提供处理器电路以执行一条或 多条指令,该一条或多条指令中的至少一条在该存储器和该至少一个 通用寄存器间传送数据分量,其中,该一条或多条指令中的一条在该 至少一个通用寄存器中以连续顺序存储预定数据分量,并且以比特翻 转顺序将该预定数据分量传送至该存储器。
在前述说明中,参考特定实施例、示例和方面说明了本发明。然 而,本领域的普通技术人员明白,可进行各种修改和变化,而不脱离 权利要求说明的本发明的精神与范围。例如,框图可包括与已表示的 方框不同的方框,并且可具有更多或更少的方框,或不同的布置。另 外,作为另一示例,此处说明的指令可具有不同于那些已经说明的指 令的各种不同格式,并使用不同的控制字段和参数。每一条指令甚至 可作为多条指令执行。另外,作为另一示例,此处说明的寄存器可为 位于该数据处理系统任何地方的任何类型的存储电路。因此,说明书 与附图将视为说明意义,而不是限定意义,并且所有这样的改变将包 含在本发明的范围之内。
已经针对特定实施例说明了益处、优势和问题的解决方案。然而, 这些益处、优势和问题的解决方案以及使任何益处、优势、问题的解 决方案出现或变得更加显著的任何要素将不被视为任何或所有权利要 求的关键的、必须的或本质的特征或要素。如此处所使用,术语"包 括",或其任何变体,将涵盖非排它性的包涵,使得包括一系列要素 的过程、方法、物品或装置不仅包括那些要素,还可包括没有明确列 出的,或这些过程、方法、物品或装置固有的其它要素。
权利要求
1.一种数据处理系统,其包括存储操作数的存储器;至少一个通用寄存器,其中所述存储器不包括所述至少一个通用寄存器;以及执行一条或多条指令的处理器电路,所述一条或多条指令的至少一条用于在所述存储器和所述至少一个通用寄存器间传送数据分量,其中,所述至少一条或多条指令指定所述存储器中数据分量的大小,其与指定所述至少一个通用寄存器中数据分量的大小相分离且无关。
2. —种用于在数据处理系统中加载和存储数据分量的方法,其包括提供存储操作数的存储器;提供至少一个通用寄存器,其中所述存储器不包括所述至少一个 通用寄存器;以及执行一条或多条指令,所述一条或多条指令的至少一条引起在所 述存储器和所述至少一个通用寄存器间传送数据分量,其中,所述至 少一条或多条指令指定所述存储器中数据分量的大小,其与指定所述 至少一个通用寄存器中数据分量的大小相分离且无关。
3. —种数据处理系统,其包括存储器和用于执行数据处理指令的 处理器,至少一条数据处理指令包括指定存储在所述存储器中的数据 分量大小的控制信息,上述指定与指定存储在所述存储器外部的数据 处理系统中的至少一个存储位置中的数据分量的大小相分离且无关。
4. 一种数据处理系统,其包括 存储操作数的存储器;多个通用寄存器,其中,每个通用寄存器保存多个数据分量;以及 执行一条或多条指令的处理器电路,所述一条或多条指令中的至 少一条用于在所述多个通用寄存器中的至少两个和所述存储器间传送 多个数据分量,其中,所述至少一条或多条指令指定将要在所述多个 通用寄存器中的至少两个中的每一个和所述存储器间传送的数据分量 的数量,其中,所述一条或多条指令中的至少一条提供要存储到所述 存储器中或从所述存储器中加载的连续数据分量的第一部分中数据分 量间的第一偏移以及要存储到所述存储器中或从所述存储器中加载的 数据分量的第一部分和第二部分间的第二偏移。
5. —种在数据处理系统中传送数据分量的方法,其包括 在存储器中存储操作数;在多个通用寄存器的每一个中存储多个数据分量;以及 在所述数据处理系统中执行一条或多条指令,所述一条或多条指 令中的至少一条引起在所述多个通用寄存器中的至少两个和所述存储 器间的多个数据分量的传送,其中,所述至少一条或多条指令指定将 要在所述多个寄存器中的至少两个中的每一个和所述存储器间传送的 数据分量的数量,其中,所述一条或多条指令中的至少一条提供要存 储到所述存储器中或从所述存储器中加载的连续数据分量的第一部分 中数据分量间的第一偏移以及要存储到所述存储器中或从所述存储器 中加载的数据分量的第一部分和第二部分间的第二偏移。
6. —种数据处理系统,其包括 存储操作数的存储器;多个通用寄存器,其中,每一通用寄存器保存多个数据分量;以及执行一条或多条指令的处理器电路,所述一条或多条指令中的至 少一条用于在所述多个通用寄存器中的至少两个和所述存储器间传送 多个数据分量,其中,所述至少一条或多条指令指定将要传输所述多 个通用寄存器的至少两个中的每一个中的多个数据分量的哪个子集, 其中,所述一条或多条指令中的至少一条提供要存储到所述存储器中 或从所述存储器中加载的连续数据分量的第一部分中数据分量间的第 一偏移以及要存储到所述存储器中或从所述存储器中加载的数据分量 的第一部分和第二部分间的第二偏移。
7. —种在数据处理系统中传送数据分量的方法,其包括 在存储器中存储操作数;在多个通用寄存器的每一个中保存多个数据分量;以及执行一条或多条指令,所述一条或多条指令中的至少一条引起在 所述多个通用寄存器中的至少两个和所述存储器间传送多个数据分 量,其中,所述至少一条或多条指令指定将要传输所述多个通用寄存 器的至少两个中的每一个中的多个数据分量的哪个子集,其中,所述 一条或多条指令中的至少一条提供要存储到所述存储器中或从所述存 储器中加载的连续数据分量的第一部分中数据分量间的第一偏移以及 要存储到所述存储器中或从所述存储器中加载的数据分量的第一部分 和第二部分间的第二偏移。
8. —种数据处理系统,其包括存储操作数的存储器;多个通用寄存器,其中,每一通用寄存器保存多个数据分量;以及执行一条或多条指令的处理器电路,所述一条或多条指令中的至 少一条用于在所述多个通用寄存器中的至少两个和所述存储器间传送 多个数据分量,其中,所述至少一条或多条指令既指定将要在所述多 个寄存器中的至少两个中的每一个和所述存储器间传送的数据分量的 数量,还进一步指定将要传送的数据分量的总数,其中,所述一条或 多条指令中的至少一条提供要存储到所述存储器中或从所述存储器中 加载的连续数据分量的第一部分中数据分量间的第一偏移以及要存储 到所述存储器中或从所述存储器中加载的数据分量的第一部分和第二 部分间的第二偏移。
全文摘要
提供一种用于执行SIMD运算的数据处理系统及其方法。可使用各种加载与存储指令在寄存器文件(元件34)中的寄存器和存储器(元件12)间传送多个矢量分量。可使用cnt参数表示将向或从存储器传送的分量的总数,并且可使用rcnt参数表示向或从寄存器文件中的单个寄存器传送的矢量分量的最大数量。另外,这些指令可使用各种不同的寻址模式。可独立于该寄存器分量大小指定该存储器分量大小,使得指令中的源与目标的大小可不相同。通过一些指令,可发起矢量流,并条件入队或出队。可提供截短或舍入字段,使得在传送时可截短或舍入源数据分量。另外,可在传送时对源数据分量进行有符号或无符号扩展。
文档编号G06F9/318GK101373426SQ200810144568
公开日2009年2月25日 申请日期2004年8月30日 优先权日2003年9月8日
发明者威廉·C·莫耶, 布赖恩·杰夫里·卢卡斯, 肯特·唐纳德·莫特, 菲利普·E·马伊, 詹姆斯·M·诺里斯, 雷蒙德·B·埃西克四世 申请人:飞思卡尔半导体公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1