混合向量/标量寄存器文件的制作方法

文档序号:4581839阅读:259来源:国知局
专利名称:混合向量/标量寄存器文件的制作方法
技术领域
本发明涉及数据处理领域。更具体来说,本发明涉及带向量和标量数据处理寄存器的数据处理系统。
数据处理指令一般包含一个操作码部分和一个或多个寄存器指定字段。在有些系统中,可以将寄存器按向量寄存器或标量寄存器对待。一个向量寄存器指定一序列的寄存器,每个存储其自己的数据值,这些数据值在数据处理指令重复其对该序列中的每个数据值操作时,被单独地操作。相反,一个标量寄存器则是存储着单一值的、独立于其它寄存器而操作的单一的寄存器。
使用向量寄存器的数据处理指令比纯粹标量的操作有许多优点。所需要的指令带宽可以缩减,因为只要一条数据处理指令就能指定多个要执行的类似数据处理操作(这在诸如FIR滤波器的DSP功能中是普遍的)。就因其简单可取的单发布机(即每个周期提取并解码一条指令)而言,用多个并行地执行不同的向量指令的功能单元,能取得更高的性能。
附图中的

图16和17分别表示一个克雷(Cray)1处理器寄存器组和一个数字设备公司(Digital Equipment Corporation)的MultiTitan处理器寄存器组。这两个现有技术的处理器都提供向量和标量寄存器。
就克雷1来说,提供单独的向量和标量寄存器组10、12。16位指令提供的各个操作码,对应于在按向量或标量处理的指令中指定的寄存器的不同组合。这样的缺点是,需要提供更多的操作码来代表这些不同的组合。此外,由于向量和标量寄存器是在独立的寄存器组10、12中提供的,要确定将哪个寄存器组10、12用于指定的特定寄存器,至少需要将操作码部分地解码。这额外的解码要求对能够尽早读取寄存器中存储的数据值增加了困难。
克雷1处理器用3位的寄存器指定字段R1、R2、R3,使得能寻址到8个标量寄存器和8个向量寄存器。实际上,每个向量寄存器包含一组寄存器,它们每个能存储不同的数据值,每个都能被依次访问,而取决于长度寄存器16内存储的向量长度值和屏蔽寄存器18内存储的屏蔽位。然而,3位寄存器字段所允许的仅8个标量寄存器的限制,对于现代编译程序来说是个重大的缺陷。如果能有更多的寄存器为目标,这些编译程序就能生成更快的程序码。
MultiTitan处理器提供一个寄存器组20,其中的每个寄存器都可以按一个标量寄存器或一部分向量寄存器那样操作。MultiTitan处理器用一个32位指令来指定其数据处理操作。这么大的指令位空间允许指令本身包含字段VS2、VS3确定寄存器是向量还是标量的,包含向量的长度(Len)。尽管这个方法具有很大的灵活性,却有这样的缺点,即在许多情况下,如果不限制可用来提供一个丰富指令集的操作码空间,就没有足够的指令位空间可用来使向量/标量字段能被包含在指令内。此外,在指令本身内提供向量长度,使得如果不借助自修改代码,就难以对向量长度作全局改变。MultiTitan技术也相当不充分地利用其指令位空间,因为该技术将相等的指令位空间资源分配给实际上极不可能被使用的向量和标量寄存器的组合(例如V=SopS,一序列的向量寄存器被填充以对两个标量寄存器的操作的结果)。
本发明的一个目的是解决上述各系统的至少一些缺陷。
从一方面来说,本发明提供一种用于数据处理的装置,该装置包含一个有多个寄存器的寄存器组;以及一个用于译码数据处理指令的指令译码器,至少一条所述数据处理指令有至少一个指定要执行的操作的操作指定码和一个指定所述寄存器组内的一个第一寄存器的寄存器指定字段;其中所述指令译码器用一个给定的寄存器作为标量寄存器或向量寄存器来执行操作,以所述给定寄存器作为标量寄存器的执行,包含对存储在所述给定寄存器的一个操作数执行一次所述操作,以所述给定寄存器作为向量寄存器的执行,包含对存储在依赖所述给定寄存器的一个寄存器指定字段而选择的所述寄存器组的一个预定序列的寄存器中的操作数执行多次所述操作;和所述指令译码器响应所述第一寄存器指定字段并独立于所述操作指定码,确定要将所述第一寄存器作为向量寄存器还是标量寄存器用来执行所述操作。
本发明认识到可以用寄存器字段本身来指出要将该寄存器作为向量寄存器还是标量寄存器对待。这样就不需要对操作码进行译码,使得仅根据寄存器字段就较早地对寄存器进行存取,并且由于标量和向量寄存器二者都一起在一个寄存器组内提供,这样就使得它们的使用具有更大的灵活性。此外,用寄存器指定字段来编码寄存器是标量寄存器还是向量寄存器,为其它用途释放了指令位空间。实际上本发明的技术提供一种高效的指令编码方法,该编码方法又使指令位空间可用来使更大的寄存器组能被寻址。
在本发明的较佳实施例中,所述的至少一个所述数据处理指令有一个指定一个第二寄存器的第二寄存器指定字段;所述指令译码器用所述第二寄存器作为标量寄存器或向量寄存器来执行所述操作;和所述指令译码器响应所述第一寄存器指定字段,确定要将所述第二寄存器作为向量寄存器还是标量寄存器用来执行所述操作。
这种较佳实施例建立并利用一个相关关系-即第一寄存器是向量寄存器还是标量寄存器以及第二寄存器是向量寄存器还是标量寄存器。实际上已经发现有些组合是常用的,有些是不常用的。这一点是可以利用的,方法是支持常用的组合并用第一寄存器字段值编码它们,由此避免不得不单独地编码第二寄存器的性质(nature)。当实际上需要不常用的组合时,可以用额外的指令来满足。不可能的组合是足够地难得见到的,不必为每条指令编码第二寄存器的性质的好处,远超过偶尔的对为规定想要的不常用操作而提供额外指令的需要。
尽管可能在有些实施例中,该相关关系是当第一寄存器是标量寄存器时,第二寄存器是向量寄存器,已经发现,第一寄存器和第二寄存器有益的相关关系应当是,或者二者同为向量寄存器,或者二者同为向量寄存器。
本发明的原理可以有益地进一步用于较佳实施例,其中,所述至少一个数据处理指令有一个指定一个第三寄存器的第三寄存器指定字段;
所述指令译码器用所述第三寄存器作为标量寄存器或向量寄存器来执行所述操作;和所述指令译码器响应所述第二寄存器指定字段,确定要将所述第三寄存器作为向量寄存器还是标量寄存器用来执行所述操作。
这个理想的特征用第二寄存器指定字段来编码第三寄存器的向量或标量性质,由此节省更多的指令位空间。
用寄存器指定字段来编码寄存器的向量或标量性质,并非是使标量和向量寄存器的所有组合都能容易地被编码。对于非交换性(non-commutative)运算来说有一个特别的问题,非交换性操作中,VopS或SopV的次序是有差别的,而在寄存器字段内却没有为这两种可能提供单独的编码。这个问题可以在较佳实施例中解决,在较佳实施例中,当所述操作指定码没有对应于非交换性运算的非交换性码值时,至少成对地提供一些对应于相同的操作但具有相反的操作数顺序的所述非交换性码值。
向量长度和向量跨距(序列中寄存器号之间的间隔)可以在指令操作码内规定。然而,最好由存储在一个向量控制寄存器中的值来控制向量长度和向量跨距。这些长度和跨距对所使用的所有向量寄存器都普遍地适用。尽管这可能会被认为引入了不利的不灵活性,实际上,对混合长度和跨距值的需求是不常见的,本方法具有的无需自修改代码就能全局地改变向量长度和跨距的能力,远远抵销了这种缺点。
此外,向量控制寄存器中存储的长度值,可用来获得对是否某数据处理指令的所有寄存器都是标量寄存器的快速指示,方法是检测一个对应于一的长度值,因为在这种情况下,任何向量寄存器实际上将像标量寄存器一样操作。这种对全标量操作的早期指示,在解决时序限制的指令译码中是有用的。
可以以不同方式划分寄存器指定字段值,以指示寄存器是向量寄存器还是标量寄存器。然而,能够提供把寄存器指定字段值划分成分别编码不同含义的范围的快速指令译码是有益的。
实际上已经发现,提供多于标量寄存器的向量寄存器是有益的,因为向量寄存器因其性质而往往存储大量不同的值,而标量寄存器则常常存储被重复使用的值。特别地,发现该编码方法中向量寄存器与标量寄存器的比为3比1是一个合适的平衡。
应该明白,在所提供的能构成编译程序的目标寄存器的寄存器的数量与让寄存器字段的长度足以使用所有寄存器而需要的指令位空间之间,要达到一种平衡。已经找到的一种平衡是提供32个寄存器。
本发明的较佳实施例包含一个存储器和一个用于控制所述存储器与所述寄存器组内寄存器之间数据值的传送的传送控制器,所述传送控制器响应多个传送指令,在所述存储器与所述寄存器组内的一系列寄存器之间传送一系列数据值。
提供支持多个传送指令(即由一条指令传送许多字)的传送控制器,使得能用新数据高效地刷新寄存器组,不管正被加载或卸载的寄存器是不是向量寄存器。
尽管本发明能被用于许多不同类型的数据处理装置,已经发现它在浮点单元内特别有用。除主流数据处理系统外而额外提供的、诸如以浮点协处理器为形式的浮点单元,经常在想要使用一个支持向量和标量两种寄存器的大寄存器组时,面临着它们可用的指令位空间的限制。在这种情况下,本发明特别有用。
已经发现,经常需要的给定操作码的向量和标量寄存器的组合是可预测的,所以就乘法-累加运算而言,很适合本发明。
已经发现,经常需要的向量和标量的不同组合与本发明的向量/标量寄存器编码技术之间,有着较好的匹配,其中,第一寄存器是目的地寄存器,第二寄存器是第一源寄存器,第三寄存器是第二源寄存器。
寄存器资源的灵活性可以进一步提高,方法是安排数据存储槽(data slots)单个地代表单精度值或成对地代表双精度值。
译码的速度可以提高,方法是用给定寄存器内的值,直接指向要被用于向量寄存器或标量寄存器的第一寄存器,使得不必对数据处理指令内提供的值进行任何操作就能开始对这个寄存器的存取。
从另一方面来说,本发明提供一种数据处理的方法,该方法包含的步骤是在一个有多个寄存器的寄存器组中存储数据值;
用一个指令译码器译码数据处理指令,至少一条所述数据处理指令有至少一个指定要执行的操作的操作指定码和一个指定所述寄存器组内的一个第一寄存器的第一寄存器指定字段;其中所述指令译码器用一个给定的寄存器作为标量寄存器或向量寄存器来执行操作,以所述给定寄存器作为标量寄存器的执行,包含对存储在所述给定寄存器的一个操作数执行一次所述操作,以所述给定寄存器作为向量寄存器的执行,包含对存储在依赖所述给定寄存器的一个寄存器指定字段而选择的所述寄存器组的一个预定的寄存器序列中的操作数执行多次所述操作;和所述指令译码器响应所述第一寄存器指定字段并独立于所述操作指定码,确定要将所述第一寄存器作为向量寄存器还是标量寄存器用来执行所述操作。
现在将结合各附图,仅通过举例来说明本发明的实施例,附图中图1示意性地表示一个数据处理系统;图2表示一个支持标量和向量两种寄存器的浮点单元;图3的流程图表示,对于单精度操作来说,如何确定给定寄存器是向量寄存器还是标量寄存器;图4的流程图表示,对于双精度操作来说,如何确定给定寄存器是向量寄存器还是标量寄存器;图5表示在单精度操作期间将寄存器组划分成子集,每个子集内是环绕的;图6表示在双精度操作期间将寄存器组划分成子集,每个子集内是环绕的;图7A至7C分别表示从主处理器角度看的一条协处理器指令、从单和双精度协处理器角度看的该协处理器指令以及从单精度协处理器角度看的该协处理器指令;图8表示控制一个单和双精度协处理器的主处理器;图9表示控制一个单精度协处理器的主处理器;图10表示单和双精度协处理器内的、确定是否应当就所接收协处理器指令向主处理器返回一个接收信号的电路;图11表示单精度协处理器内的、确定是否应当就所接收协处理器指令向主处理器返回一个接收信号的电路;图12表示主处理器内的未定义指令异常处理;图13的框图表示按照本发明较佳实施例的一个协处理器的部件;图14的流程图表示按照本发明较佳实施例的寄存器控制和指令发布逻辑的操作;图15提供一例按照本发明较佳实施例的浮点寄存器的内容的实例;图16表示克雷1处理器内的寄存器组;和图17表示MultiTitan处理器内的寄存器组。
图1表示的数据处理系统22包含主处理器24、浮点单元协处理器26、高速缓冲存储器28、主存储器30和输入/输出系统32。主处理器24、高速缓冲存储器28、主存储器30和输入/输出系统32通过主总线34连接。协处理器总线36连接主处理器24与浮点单元协处理器26。
操作中,主处理器24(也称ARM核心)执行一个数据处理指令流,它们控制一般类型的数据处理操作,包括与高速缓冲存储器28、主存储器30和输入/输出系统32的交互作用。嵌入该数据处理指令流内的有协处理器指令。主处理器24识别这些协处理器指令为应当由附属的协处理器执行的类型。相应地,主处理器24将这些协处理器指令在协处理器总线36上发出,由任何附属协处理器从总线接收它们。在这种情况下,浮点单元协处理器26将将接受并执行它检测到的为它发出的任何接收的协处理器指令。这个检测是通过协处理器指令内的协处理器号字段进行的。
图2更详细地表示浮点单元协处理器26。浮点单元协处理器26包括一个由32个32位寄存器构成的寄存器组38(图2中显示的较少)。这些寄存器能单个地作为每个存储一个32位数据值的单精度寄存器操作,或者作为共同存储一个64位数据值的寄存器对操作。在浮点单元协处理器26内,提供一个流水线式的乘法累加单元40和一个加载存储控制单元42。在适当的情况下,乘法累加单元40和加载存储控制单元42能并发地操作,乘法累加单元40对寄存器组38内的数据值执行算术运算(包括乘法累加运算以及其它运算),而加载存储控制单元42则将乘法累加单元40不在使用的数据值经主处理器24发送到或发送出浮点单元协处理器26。
在浮点单元协处理器26内,被接收的协处理器指令被锁存在指令寄存器44内。在这个简略视图中,协处理器指令可视为是由操作码部分及随后的三个寄存器指定字段R1、R2和R3构成的(实际上在完整的指令中这些字段可以是以不同的方式分散分布的)。这些寄存器指定字段R1、R2和R3分别相当于寄存器组38内充当正在进行的数据处理操作的目的地、第一源和第二源的寄存器。向量控制寄存器46(它可以是具有额外功能的更大的寄存器的一部分)为可能由浮点单元协处理器26执行的向量操作存储一个长度值和一个跨距值。向量控制寄存器46可以根据向量控制寄存器加载指令用长度值和跨距值初始化和更新。向量长度值和跨距值在浮点单元协处理器46内全局适用,由此,不必借助自修改代码就能全局地对这些值进行动态改变。
寄存器控制与指令发布单元48、加载存储控制单元42和向量控制单元50可以共同认为是执行指令译码器功能的主要部分。寄存器控制与指令发布单元48响应操作码和三个寄存器指定字段R1、R2和R3,首先将初始寄存器存取(寻址)信号输出到寄存器组38,而不对操作码进行任何译码,也不需使用向量控制单元50。以这一方式直接利用初始的寄存器值,有助于获得更快的实现。如果指定了向量寄存器,向量控制单元50的作用是用3位的增量器(加法器)52来生成必要的寄存器存取信号序列。向量控制单元50根据向量控制寄存器46内存储的长度值和跨距值执行其对寄存器组38的寻址。提供一个寄存器记录板(scoreboard),用来进行寄存器锁定,使得流水线式乘法累加单元40和并发操作的加载存储控制单元42不会产生任何数据一致性问题(可以选择将寄存器记录板54视为寄存器控制与指令发布单元48的一部分)。
指令寄存器44内的操作码规定要执行的数据处理操作的性质(例如指令是否是加、减、乘、除、加载、存储…等等)。这与所指定的寄存器的向量或标量性质是无关的。这进一步简化了指令译码和乘法累加单元40的设置。第一寄存器指定值R1和第二寄存器指定值R2一起对操作码所确定的操作的向量/标量性质编码。该编码方法所支持的三个常见的情况是,S=S*S(例如由C编译程序从一个C代码程序块生成的基本随机数学)、V=VopS(例如为了缩放一个向量的元素)和V=VopV(例如诸如FIR滤波器和图形变换的矩阵操作)(注意这里的“op”指示一个通用操作,语法的形式为目的地=第二操作数op第一操作数)。也应当明白,有些指令(例如比较、与零或绝对值的比较)可以没有目的地寄存器(例如输出是条件标志),或者输入操作数较少(例如与零的比较只有一个输入操作数)。在这些情况下,有更多的操作码位空间可用来规定诸如向量/标量性质的选择,并且可以让每个操作数可使用全部范围的寄存器(例如,比较指令可以总是全标量的,不管是什么寄存器)。
共同执行指令译码器的功能的主要部分的寄存器控制与指令发布单元48和向量控制单元50,根据第一寄存器指定字段R1和第二寄存器指定字段R2,确定并控制所规定的数据处理操作的向量/标量性质。注意到如果向量控制寄存器46内存储的长度值指示的长度为1(相当于存储值零),则这可被用作纯标量操作的早期指示。
图3的流程图表示在单精度方式中用来根据寄存器指定值译码向量/标量性质的处理逻辑。在步骤56,检测向量长度是否被全程地设置为1(长度值等于零)。如果向量长度是1,则在步骤58中把所有寄存器视作标量寄存器。在步骤60,检测目的地寄存器R1是否在范围S0至S7内。如果是这样,则操作是全标量的,形式为S=SopS,正如步骤62中所示。如果步骤60返回“否”,则确定目的地是个向量寄存器,正如步骤64中所示。如果目的地是向量寄存器,则编码方法把第二操作数也作为一个向量寄存器。于是在这个阶段剩下的两种可能是V=VopS和V=VopV。这两个可能选择在步骤66进行区分,该步骤确定第一操作数是否S0至S7的其中之一。如果是这样,则操作是V=VopS;否则,操作就是V=VopV。这些状态分别在步骤68和70中确认。
应当注意,当向量长度被设置为1时,寄存器组的32个寄存器全部都可用来作为标量寄存器,因为操作的标量性质将在步骤58确认,而不依赖于步骤60的检测-后者限制可被用作目的地的寄存器的范围。在使用混合的向量和标量指令时,步骤60的检测对于识别全标量操作是有用的。也要注意,在混合的向量和标量方式下操作时,如果第一操作数是个标量,则它可能是S0至S7的任何一个;而如果第一操作数是个向量,则它可能是S8至S31的任何一个。在寄存器组内为是向量的第一操作数提供三倍数量的寄存器,是对在使用向量操作时保存数据值的序列所需的通常更多数量的寄存器的一种适应。
应当知道,人们希望进行的一种常用操作是图形变换。在一般的情况中,要进行的变换可以用一个4*4矩阵表示。在这种计算中对操作数的重复使用,意味着希望将矩阵值存储在可以按向量操作的寄存器中。同样,通常把一个输入像素值存储在4个寄存器中,这些寄存器还是应当能按向量操作,以利重复使用。矩阵运算的输出一般是存储在4个寄存器中的标量(累加各个向量行乘积)。如果希望加倍输送(double pump)输入和输出值,就要满足有24个(16+4+4)个向量寄存器和8个(4+4)标量寄存器的要求。
图4是一个与图3的流程图相对应的流程图,但这里表示的是双精度方式。如上所述,在双精度方式中,寄存器组38内的寄存器槽(slots)成对地工作,在逻辑寄存器D0至D15中存储16个64位数据值。在这种情况下,对寄存器的向量/标量性质的编码方法作了不同于图3中的编码方法的修改,步骤60和66的检测现在分别变成步骤72和74中的“目的地是D0至D3其中之一吗?”和“第一操作数是D0至D3其中之一吗?”尽管上述的对寄存器指定字段内寄存器的向量/标量性质的编码能显著节省指令位空间,它却对诸如减法和除法的非交换性运算产生一些困难。假定寄存器配置是V=VopS,非交换性运算的第一与第二操作数之间缺乏对称性的问题,无需额外的交换寄存器值的指令就能克服,方法是将指令集扩展得包含诸如SUB、RSUB和DIV、RDIV的操作码对,它们代表非交换性运算的两种不同的操作数的可能选择。
图5表示寄存器组38的子集内的向量的环绕。特别地,在单精度方式中,将寄存器组划分成地址为S0至S7、S8至S15、S16至S23和S24至S31的4个寄存器范围。这些范围相邻但不相交。参看图2,可以通过在向量控制单元50内采用一个3位增量器(加法器)52,来为这些含有8个寄存器的子集提供环绕功能。这样,当跨越子集界线时,增量器将绕回。通过在寄存器地址空间内将各子集在8个字边界上对齐,方便了这个简单的实现。
返回到图5,为了帮助理解寄存器的环绕,图中表示了一些向量运算。第一个向量运算指定起始寄存器S2、向量长度4(由向量控制寄存器46内的长度值3指示)和跨距1(由向量控制寄存器46内的跨距值0指示)。相应地,有了这些设置好的全程向量控制参数,当一条指令被执行时,指令被译码为将寄存器S2当作向量,然后分别用寄存器S2、S3、S4和S5内的数据值四次执行该指令。因为这个向量不跨越子集边界,所以没有向量回绕。
在第二个例子中,起始寄存器是S14,长度是6,跨距是1。这将导致指令从寄存器S14开始被执行6次。下一个使用的寄存器是S15。当寄存器再次按跨距递增时,这时被使用的寄存器不是S16,它将回绕到寄存器S8。指令然后进一步被执行3次,完成整个的S14、S15、S8、S9、S10和S11的序列。
图5的最后的例子显示起始寄存器为S25,长度为8,跨距为2。第一个被使用的寄存器是S25,紧接着是按跨距值2决定的S27、S29和S31。使用寄存器S31之后,下一个寄存器值将回绕到该子集的开始,由于跨距是2,所以越过寄存器24,而用寄存器S25执行运算。增量器52可采用3位加法器的形式,当在向量寄存器之间移动时,它将跨距加到当前值上。相应地,通过向加法器提供不同的跨距值,能调整跨距。
图6表示在双精度方式中寄存器组38的回绕。在这一方式中,寄存器子集包含D0至D3、D4至D7、D8至D11和D12至D15。在双精度方式中对起增量器52的作用的加法器的最小值输入是2-对应于双精度跨距1。双精度跨距为2时将要求向加法器输入4。图6中表示的第一个例子中,起始寄存器为D0,长度为4,跨距为1。这将得出一个向量寄存器序列D0、D1、D2和D3。本例中没有子集边界被跨越,所以没有回绕。在第二个例子中,起始寄存器为D15,长度为2,跨距为2。这将导致一个向量寄存器序列D15和D13。
参看图2,注意加载存储控制单元42在输出端有一个5位增量器,加载/存储多重操作不受限于对向量运用应用的寄存器回绕。这使单一的加载/存储多指令能按其需要访问许多连续的寄存器。
一个充分利用这个回绕方案的操作的例子是一个拆分成4个信号值和4个taps(分接头)的单元的FIR滤波器。如果语法R8-R11opR16-R19代表R8opR16、R9opR17、R10opR18和R11opR19,则FIR滤波器操作可以以如下方式进行将8个taps装入R8-R15并将8个信号值装入R16-R23R8-R11opR16-R19并将结果放入R24-R27R9-R12opR16-R19并将结果累加到R24-R27R10-R13opR16-R19并将结果累加到R24-R27R11-R14opR16-R19并将结果累加到R24-R27用新的taps再加载R8-R11R12-R15opR16-R19并将结果累加到R24-R27R13-R8opR16-R19并将结果累加到R24-R27(R15->R8回绕)R14-R9opR16-R19并将结果累加到R24-R27(R15->R8回绕)R15-R10opR16-R19并将结果累加到R24-R27(R15->R8回绕)用新的taps再加载R12至R15当taps用尽时,用新的数据再加载R16-R19R12-R15opR20-R23并将结果放入R28-R31R13-R8opR20-R23并将结果累加到R28-R31(R15->R8回绕)R14-R9opR20-R23并将结果累加到R28-R31(R15->R8回绕)R15-R10opR20-R23并将结果累加到R28-R31(R15->R8回绕)其余如上。
由以上所述应当注意到,加载是从多个累加(accumulates)到不同的寄存器,因此能并行地进行(即达到双缓冲)。
图7A示意性地表示主处理器24是如何看待一条协处理器指令的。主处理器用指令内字段76(它可能是拆分的)的一个位组合来将指令识别为协处理器指令。在标准ARM处理器指令集内,一条协处理器指令包括协处理器号字段78,主处理器附属的(各)协处理器用它来标识是否有特定的协处理器指令以它们为目标。不同类型的协处理器-诸如DSP协处理器(例如由ARM生产的Piccolo协处理器)或者浮点单元协处理器,可以分配不同的协处理器号,这样就能在一个系统中用同一协处理器总线36单独地寻址。协处理器指令也包括一个由协处理器使用的操作码和分别从协处理器寄存器中指定目的地、第一操作数和第二操作数的三个5位字段。在有些指令,诸如协处理器加载或存储指令中,主处理器至少部分地译码协处理器指令,以便协处理器与主处理器能共同完成所希望的数据处理操作。主处理器也可以响应在协处理器号内编码的数据类型,作为它在这种情况中进行的指令译码的一部分。
图7B表示支持双精度和单精度两种操作的协处理器是如何解释其接收的协处理器指令的。这种协处理器被分派以两个相邻的协处理器号,用协处理器号的3个最高有效位来标识它是不是目标协处理器。这样,协处理器的最低有效位对标识目标协处理器的目的来说是多余的,可用来规定要在执行该协处理器指令时使用的数据类型。在本例中,数据类型相当于是单精度还是双精度的数据大小。
可以注意到,在双精度方式中,有效地将寄存器的数目从32个缩减到16个。于是,就有可能减低寄存器字段的大小,但是那样的话,关于要使用哪个寄存器的解码,就不能直接从协处理器指令内已知位置中的自含字段(self-contained fields)得到,而要根据对协处理器指令的其它部分的解码而获得。这是不利的,会使协处理器的操作复杂化,可能降低协处理器的操作的速度。用协处理器号的最低有效位来编码数据类型,意味着操作码可以完全独立于数据类型,这也简化并加快了操作码的译码。
图7C表示只支持是图7B协处理器支持的数据类型的子集的单一数据类型的协处理器是如何解释协处理器指令的。在这种情况中,将整个协处理器号用来确定是否接受指令。这样,如果协处理器指令具有不受支持的数据类型,则它就对应于一个不同的协处理器号,将不被接受。主处理器24然后就能开始进行未定义指令的异常处理,仿真对不受支持的数据类型的处理。
图8表示的数据处理系统,包含起主处理器作用并通过协处理器总线82与支持单和双精度两种数据类型的协处理器84通信的ARM核心80。包含协处理器号在内的协处理器指令,当在指令流内被遇到时,被从ARM核心80在协处理器总线82上发出。协处理器84然后将该协处理器号与其自己的号作比较,如果匹配,就向ARM核心80发回一个接受信号。如果收不到接受信号,ARM核心80就识别出一个未定义的指令异常,然后求助在存储系统86中存储的异常处理程序码。
图9表示的是用仅支持单精度运算的协处理器88代替协处理器84而改变的图8的系统。在这种情况下,协处理器88仅识别一个协处理器号。于是,原始指令流内应当由图8的协处理器84执行的双精度指令,不被该单精度协处理器88接受。所以,如果希望执行相同的程序码,那么,存储系统86内的未定义异常处理程序码可包含一个双精度仿真例程。
应当注意到,尽管因需要仿真双精度指令而将减慢这些指令的执行速度,单精度协处理器88的可以比双精度协处理器84更小更便宜,如果双精度指令足够少的话,能获得纯粹的收益。
图10表示支持单和双精度并有两个相邻协处理器号的协处理器84内的指令锁存电路。在这种情况下,要将协处理器指令内协处理器号的3个最高有效位CP#[3∶1]与分配给该协处理器84的协处理器号作比较。本例中,如果协处理器号是10和11,则可以通过将协处理器号的最高有效位CP#[3∶1]对照二进制数101而进行这种比较。如果匹配,就向ARM内核80返回一个接受信号,然后将协处理器指令锁存起来供执行。
图11表示图9的单精度协处理器88内的等效电路。这种情况下,仅能识别一个协处理器号,缺省地采用单精度运算。为确定是否接受并锁存协处理器指令而作的比较,在整个4位协处理器号CP#[3∶0]与二进制1010这个唯一内置的协处理器号之间进行。
图12的流程图表示如何能触发图9实施例的未定义异常处理例程来运行双精度仿真程序码。这要通过检测(步骤90)导致未定义指令异常的指令是否是一个有二进制1011的协处理器号的协处理器指令来达到。如果是,则其打算作为一个双精度指令,所以可在步骤92被仿真,然后返回到主程序流。其它异常类型如果没有被步骤90捕获,可以由另外的步骤检测并处理。
图13表示用格式寄存器FPREG200来标识存储在寄存器组220的每个32位寄存器或数据存储槽中存储的数据的类型的信息。如上所述,每个数据存储槽可单个地作为用于存储一个32位数据值(1个数据字)的单精度寄存器,或者可以与另一个数据存储片配对,作为用于存储一个64位数据值(2个数据字)的双精度寄存器操作。按照本发明的较佳实施例,FPREG寄存器200被安排得能标识任何特定数据存储槽中存储的是单精度还是双精度数据。
如图13中所示,寄存器组220中的32个数据存储槽被安排得提供16对数据存储槽。在较佳实施例中,如果某第一数据存储槽中存储一个单精度数据值,则该对中的另一个数据存储槽将被安排得只存储一个单精度数据值,并且不与任何其它数据存储槽链接起来用于存储双精度数据值。这保证了任何一对特定数据存储槽都被安排得或者存储两个单精度数据值或者存储一个双精度数据值。该信息可以由与寄存器组220中的每对数据存储槽相关联的一个信息位来标识,因此在较佳实施例中,FPREG寄存器200被安排得存储16个用于标识在寄存器组220的每对数据存储槽中存储的数据的类型的信息位。应当知道,寄存器FPREG200因此可以以16位寄存器的形式实现,或者,为了与FPU协处理器26内其它寄存器的一致,可以体现为一个有16个备用信息位的32位寄存器。
图15表示寄存器组220内的6对数据存储槽,按照较佳实施例,它们可被用来存储6个双精度数据值或12个单精度数据值。图15中显示了一例可以在这些数据存储槽中存储的数据,DH代表双精度数据值的32个最高有效位,DL表示双精度数据值的32个最低有效位,S代表一个单精度数据值。
图15中也表示了按照本发明较佳实施例的FPREG寄存器200内的相应条目,FPREG寄存器200中存储的值“1”,指示所关联的一对数据存储槽中含有一个双精度数据值,而值“0”则用来指示相应的一对数据存储槽中至少有一个含有一个单精度数据值,或者两个数据存储槽都是未初始化的。因此,如果两个数据存储槽都是未初始化的,如果数据存储槽对中其中一个数据存储槽是未初始化的,另一个含有一个单精度数据值,或者如果数据存储槽对中两个都含有一个单精度数据值,则在FPREG寄存器200的相应位中将存储逻辑“0”值。
如上所述,较佳实施例的FPU协处理器26可以被用来处理单精度或双精度数据值,主处理器24发出的协处理器指令将标识任何特定指令是单精度指令还是双精度指令(见图7B和相关的说明)。如果某指令被协处理器接受,它将被传送到寄存器控制与指令发布单元48,供译码和执行。如果该指令是加载指令,寄存器控制与指令发布逻辑48将指令加载存储控制单元42从存储器检索所标识的数据并将该数据存储在寄存器组220的指定数据存储槽中。在这个阶段,协处理器将知道被检索的是单精度还是双精度数据值,加载存储控制单元42将相应地进行操作。所以,加载存储控制逻辑42将在路径225上把32位单精度数据值或64位双精度数据值传送到寄存器组输入逻辑230,供在寄存器组220中存储。
除了数据被加载存储控制单元42加载到寄存器组220外,数据也被提供到格式寄存器FPREG200,以便能添加必要的信息位,以标识接收数据的每对数据存储槽存储的是单精度还是双精度数据值。在较佳实施例中,该数据是在数据被加载到寄存器组中之前被存储在格式寄存器FPREG200中的,以便寄存器组输入逻辑230能用到该信息。
在较佳实施例中,寄存器组220中数据的内部格式是与外部格式相同的,因此在寄存器组220中,单精度数据值是按32位数据值存储的,双精度数据值是按64位数据值存储的。因为寄存器组输入逻辑230能访问FPREG格式寄存器200,所以它知道它接收的数据是单精度的还是双精度的,因此在这种实施例中,寄存器组输入逻辑230只是安排将在路径225上接收的数据存储在寄存器组220的适当的数据存储槽中。然而,如果在其它形式的实施例中,寄存器组内的内部表示不同于外部格式,则要将寄存器组输入逻辑230安排得能执行必要的转换。例如,数字一般被表示为1.abc…乘以某基数值的某次幂。由于效率的缘故,一般的单精度和双精度表示法不用一个数据位来代表小数点左边的1,该1被视为是隐含的。假设出于某个理由,寄存器组220内使用的内部表示要求要显式地表示出该1,则寄存器组输入逻辑230就要进行对数据的必要转换。在这种实施例中,数据存储槽一般要大于32位,以便能容纳由寄存器组输入逻辑230生成的额外数据。
除了将数据值加载到寄存器组220中,加载存储控制单元42也可以把数据加载到协处理器26的一个或多个系统寄存器中,例如用户状态与控制寄存器FPSCR210中。在较佳实施例中,FPSCR寄存器210含有用户可访问的配置位和异常状态位,在较佳实施例说明的最后提供的对浮点单元的结构说明中,将作更加详细的讨论。
如果寄存器控制与指令发布单元48接收到一个标识寄存器组220的特定数据存储槽中的内容要被存储到存储器的存储指令,则寄存器控制与指令发布逻辑48将受到相应的指令,必要的数据字被从寄存器组220读出,经寄存器组输出逻辑240到加载存储控制单元42。寄存器组输出逻辑240访问FPREG寄存器200的内容来确定所读出的数据是单精度还是双精度数据。它然后应用适当的数据转换,以逆转由寄存器组输入逻辑施加的任何数据转换,然后在路径235上把数据供给加载存储控制逻辑42。
按照本发明的较佳实施例,如果该存储指令是个双精度指令,则可以将协处理器26视为是在将指令施加到双精度数据值的第二操作方式下操作的。因为双精度数据值含有偶数个数据字,所以在第二操作方式下发出的任何存储指令一般要标识偶数个其内容要被存储到存储器的数据存储槽。然而,按照本发明的较佳实施例,如果指定了奇数个数据存储槽,则安排加载存储控制单元42读取FPREG寄存器200的内容,并首先将这些内容存储到存储器,再存储所标识的偶数个来自寄存器组220的数据存储槽。一般来说,要被传送的数据存储槽是用一个基址后随一个数目标识的,该基址标识寄存器组中某个数据存储槽,该数目指示从所标识的数据存储槽算起的要存储的数据存储槽的数量(即数据字的数量)。
所以,例如如果存储指令给出的基址是寄存器组220中的第一个数据存储槽,并规定33个数据存储槽,这将导致全部32个数据存储槽的内容被存储到存储器,但是由于所规定的数据存储槽的数目是奇数的,所以也将导致FPREG寄存器200的内容被存储到存储器。
通过这个方法,用一条指令就能把寄存器组的内容和标识在寄存器组220的各种数据存储槽中存储的数据类型的FPREG寄存器200的内容这两种内容存储到存储器。这就免得必须发布另外的指令来显式地存储FPREG寄存器200的内容,因此在向存储器存储或从存储器加载的过程中不会不利地影响处理速度。
在本发明另外的实施例中,可以将这个技术更进一步,以便如果需要的话,也能用单一指令使另外的系统寄存器,诸如FPSCR寄存器210,被存储到存储器。因此,考察有32个数据存储片的寄存器组220的例子,那么如上所述,如果在存储指令中标识了33个数据存储槽,则除了寄存器组220中的32个数据存储槽的内容外,FPREG寄存器200也将被存储到存储器。然而,如果标识了一个超过寄存器组中数据存储槽数的不同的奇数,例如35,则这可被加载存储控制单元42解释为,要求除了FPREG寄存器200和寄存器组220中的数据存储槽的内容外,也要把FPSCR寄存器210的内容存储到存储器。协处理器也可以包含其它的系统寄存器,例如标识已经在协处理器处理指令期间发生的异常的异常寄存器。如果在存储指令中标识了一个不同的奇数,例如37,则这可被加载存储控制单元42解释为,要求除了FPSCR寄存器210、FPREG寄存器200和寄存器组220的内容外,还要存储一个或多个异常寄存器的内容。
当启动存储或加载指令的程序码不知道寄存器组内容时,以及寄存器组内容只是临时被存储到存储器,供随后向寄存器组中检索时,这个技术特别有用。假设程序码知道寄存器组内容,则FPREG寄存器200的内容并非也需要存储到存储器。可能不知道寄存器组内容的程序码的典型例子是上下文切换代码(context switch code)和过程调用入口和出口例程。
在这种情况下,除了寄存器组的内容外,还可以把FPREG寄存器200的内容高效地存储到存储器中,如上所述,实际上,需要时也可以存储某些其它的系统寄存器。
当接收到随后的加载指令时,采用类似的过程。因此,加载存储控制单元42在接收到指定奇数个数据存储槽的双精度加载指令时,将会使FPREG寄存器200的内容被加载到FPREG寄存器200中,接着是由在该加载指令中标识的存储槽的数量所指出的任何系统寄存器的内容,接着使偶数个数据字被存储到寄存器组220的指定数据存储槽中。因此,考察前面讨论的例子,如果在加载指令中指定的数据存储槽的数目是33,则FPREG寄存器200的内容将被加载到FPREG寄存器200中,接着是32个数据存储槽的内容。类似地,如果指定的数据存储槽的数目是37,则除了上述内容外,任何异常寄存器的内容也将被加载到这些异常寄存器中。本领域的熟练人员显然明白,与特定的奇数相关联的特定操作完全是任意的,是可以随意改变的。
图14表示的是按照本发明较佳实施例的寄存器控制与指令发布单元48在执行存储和加载指令时的操作的流程图。首先,在步骤300,从指令读取数据字的数目(在较佳实施例中它等于数据存储槽的数目),以及在该指令中标识的第一寄存器号,即基址寄存器。然后在步骤310,确定该指令是不是双精度指令,如上所述,在这个阶段协处理器是能得到这个信息的,因为该指令标识它是双精度还是单精度指令。
如果该指令是双精度指令,则进程前进到步骤320,在这里确定指令中指定的字数是不是奇数。假设因本实施例的缘故,不采用除FPREG寄存器200外还选择性地传送各种系统寄存器的技术,那么,如果字数是奇数,这将表明FPREG寄存器200的内容应当被传送,于是在步骤325,FPREG寄存器200的内容被加载存储控制单元42传送。然后在步骤327将字数递减1,进程前进到步骤330。如果在步骤320确定字数是偶数,则进程直接前进到步骤330。
在步骤330,确定字数是否大于零。如果不是,该指令被视为完成,进程在步骤360退出。然而,如果字数大于零,则进程前进到步骤332,在此将一个双精度数据值(即两个数据存储槽的内容)传送到或传送出所指定的第一寄存器号。然后在步骤334,将字数递减2,在步骤336,将寄存器号递增1。如上所述,对于双精度指令来说,一个寄存器实际上由两个数据存储槽组成,因此将寄存器计数值递增1相当于将数据存储槽号递增2。
过程然后返回到步骤330,在此确定字数是否仍然大于零;如果是,则重复该进程。当字数达到零时,进程在步骤340退出。
如果在步骤310确定该指令不是双精度指令,则进程前进到步骤350,在此再次确定字数是否大于零。如果是,则进程前进到步骤352,在此将一个单精度数据值传送到或传送出在该指令中标识的第一寄存器号。然后在步骤354,将字数递减1,在步骤356,将寄存器号递增1,指向下一个数据存储槽。进程然后返回到步骤350,在此确定字数是否仍然大于零;如果是,则该进程一直重复,直到字数等于零的时候,此时,进程在步骤360退出。
以上方法在执行不知道寄存器组内容的程序码一例如上下文切换代码或过程调用和退出例程时,具有很大的灵活性。在这些情形中,操作系统是不知道寄存器的内容,同时希望不要必须根据寄存器的内容来区别对待寄存器。上述方法允许在编写这些程序码例程时用一条存储或加载指令指定奇数个数据字。如果协处理器要求使用寄存器内容信息,它将把指令中的奇数个数据字,解释为也要求向存储器存储或从存储器加载为标识寄存器组中数据的内容而需要的格式信息。这种灵活性避免了需要用特殊的操作系统软件才能支持要求寄存器内容信息的协处理器。
这个技术也避免了需要在程序码内的独立操作中加载和存储寄存器内容信息。因为在指令中包含了对加载和存储寄存器内容信息的选择,所以不需要另外访问存储器。这就缩短了程序码的长度并有可能节省时间。
下面给出一个综合了上述技术的浮点单元的结构说明。
1.介绍VFPv1是一个为实现作为用于ARM处理器模决的协处理器而设计的浮点系统(FPS)结构。这个结构的实现可以包含硬件或软件中的特征,某个实现也可以用软件来补充功能或提供IEEE754兼容性。本规范旨在用硬件和软件支持的组合来获得全部的IEEE754兼容性。
VFPv1使用两个协处理器号10被用于带单精度操作数的操作,而11则被用于带双精度操作数的操作。单精度与双精度数据之间的转换是用2条在源操作数协处理器空间中操作的转换指令完成的。
VFPv1结构的特点包括
·在带支持代码的硬件上与IEEE754完全兼容·32个单精度寄存器,每个都是作为源操作数或目的地寄存器可寻址的。
·16个双精度寄存器,每个都是作为源操作数或目的地寄存器可寻址的。(双精度寄存器与物理的单精度寄存器重叠)·向量方式能显著增加浮点代码密度和与加载和存储操作的并发性。
·4组的8个循环单精度寄存器或4组的4个循环双精度寄存器可增强dsp和图形操作。
·非正规处理选项选择IEEE754兼容性(有来自浮点仿真程序包的预定支持)或快速清零功能。
·旨在实现用于具有IEEE754可兼容的结果的完全流水线链接的乘法累加。
·具有FFTOSIZ指令的C、C++和Java的快速浮点向整数转换。
实现者可以选择完全用硬件来实现VFPv1或者使用硬件和支持程序码的组合。VFPv1可以完全以软件实现。
2.术语本规范使用下列术语自动异常-一种异常条件,它总是弹回到支持程序码,不管各异常启动位的值是什么。对哪些异常(如果有的话)是自动的的选择,是一种实现上的选择。参看节0,6.异常处理弹回-一个被报告给操作系统的异常,它将完全由支持程序码处理,而不调用用户陷阱处理程序或者中断正常的用户程序码流。
CDP-“协处理器数据处理”,对于FPS来说,CDP运算是算术运算而不是加载或存储操作。
ConvertToUnsignedInteger(Fm)(转换到无符号整数)-Fm中的内容向32位无符号整数值的转换。结果取决于最终舍入的舍入方式和对超出32位无符号整数的范围的浮点值的处理。如果浮点输入值是负的或者对32位无符号整数来说太大,则可能发生INVALID异常。
ConvertToSignedInteger(Fm)(转换到有符号整数)-Fm中的内容向32位有符号整数值的转换。结果取决于最终舍入的舍入方式和对超出32位无符号整数的范围的浮点值的处理。如果浮点输入值对32位有符号整数来说太大,则可能发生INVALID异常。
ConvertUnsignedIntToSingle/Double(Rd)(转换无符号整数到单/双精度)-将被解释为是个32位无符号整数的ARM寄存器(Rd)的内容向单或双精度浮点值的转换。如果目的地精度是单一的,则在转换操作中可能发生INEXACT异常。
ConvertSignedIntToSingle/Double(Rd)(转换有符号整数到单/双精度)-将被解释为是个32位有符号整数的ARM寄存器(Rd)的内容向单或双精度浮点值的转换。如果目的地精度是单一的,则在转换操作中可能发生INEXACT异常。
非正规化值-范围(-2Emin<x<2Emin)中的值的表示。在IEEE754的单和双精度操作数的格式中,非正规化值或日非正规值有一个零指数,并且前导的有效位是而不是1。IEEE754-1985规范要求用与标准操作数相同的精度来生成和操作非正规化操作数。
禁止的异常-在FPCSR中的相关异常允许(Exception Enable)位被设置为0的异常,称为是“禁止的”。IEEE754规范为这些异常定义了要被返回的正确结果。生成一个异常条件的操作可以弹回到支持程序码去生成IEEE754定义的结果。该例外将不被报告给用户异常处理程序。
允许的例外-相应的例外允许位被设置为1的例外。如果发生这个例外,就将进行到用户处理程序的陷阱。生成一个例外条件的操作可以弹回到支持程序码去生成IEEE754定义的结果。该例外然后将被报告给用户例外处理程序。
指数-浮点数的一个成分,一般在确定所代表的数的值时指示2的整数幂。指数有时称为带符号或无偏指数。
尾数-位于其隐含的二进制小数点右边的有效数位(significand)字段。
清零方式-在这个方式下,舍入后在范围(-2Emin<x<2Emin)内的所有值都按零处理,而不是转换成非正规化值。
高(Fn/Fm)-按存储器中表示的双精度值的高32位[63∶32]。
IEEE754-1985-“IEEE二进制浮点算术标准”(ANSI/IEEE标准754-1985,电力电子工程师协会,美国纽约州纽约市,邮政编码10017)。该标准经常被称为IEEE754标准,它为浮点系统定义数据类型、正确运算、例外类型与处理、以及错误界限。多数处理器在硬件上或者在硬件与软件的组合上依照该标准制造。
无穷大-一个用来代表∞的IEEE754特殊格式。指数将是该精度的最大值,有效数位将全部为零。
输入例外-给定操作的一个或多个操作数不受硬件支持的例外条件。该操作将弹回到支持程序码,以完成该操作。
中间结果-用来在舍入之前存储计算的结果的内部格式。这个格式可以有比目的地格式更大的指数字段和有效数位字段。
低(Fn/Fm)-按存储器中表示的双精度值的低32位[31∶0]。
MCR-“从ARM寄存器移到协处理器”,对于FPS来说,这包括在ARM寄存器与FPS寄存器之间传送数据或控制寄存器的指令。用一条MCR类的指令只能传送32个信息位。
MRC-“从协处理器移到ARM寄存器”,对于FPS来说,这包括在FPS寄存器与ARM寄存器之间传送数据或控制寄存器的指令。用一条MRC类的指令只能传送32个信息位。
NaN-“不是数字”,这是一个以浮点格式编码的符号实体。有两种NaN,一种是发信号的,一种是不发信号的,或日安静的。发信号的NaN如果被用作操作数,将导致一个无效操作数(Invalid Operand)异常。安静的NaN散布在几乎每个算术运算中而不发异常信号。NaN的格式有一个全部为1的指数字段,有效数位非零。要表示一个发信号的NaN,尾数的最高有效位为零;而安静的NaN将把该位设置为1。
保留的-控制寄存器或指令格式中的一个字段是“保留的”,如果该字段要由具体实现来定义,或者如果该字段的内容为非零时会产生不可预测的结果。这些字段被保留用于将来对结构的扩展或者是特定于具体实现的。具体实现不使用的所有保留的位,都必须被写成零并读成零。
舍入方式-IEEE754规范要求所有计算都要像是对无限精度那样进行,就是说,两个单精度值的积必须精确地计算到两倍于有效数位的位数的有效数位。要在目的地中表示这个值,经常要求对有效数位进行精度舍入。IEEE547标准规定四种舍入方式-舍入到最近的(RN)、舍入到零或日斩断(RZ)、舍入到正无穷大(RP)和舍入到负无穷大(RM)。第一种方式的完成方法是,在中间点进行舍入,相持情况向上舍入,如果它使有效数位的最低位为零,则使之成为“偶的”。第二种方法有效地去除有效数位右边的任何位,总是舍去,由C、C++和Java语言在整数转换中使用。后两种方式用于区间运算。
有效数位(Significand)-二进制浮点数的分量,由隐含的二进制小数点左边的显式或隐式前导位和右边的尾数字段组成。
支持程序码(Support Code)-为提供与IEEE754标准的兼容而补充硬件所必须使用的软件。支持程序码设计有两个组件一个例程库,它执行超出硬件的范围的操作-诸如超越计算,以及被支持的功能-诸如用不受支持的输入或可能产生异常的输入进行除法;一个异常处理程序的集合,它为符合IEEE754而处理异常条件。要求支持程序码执行补充的功能,以便仿真对不受支持的数据类型或数据表示(例如非正规值或十进制数据类型)的适当处理。可以编写例程来利用中间计算中的FPS-如果注意在例程的出口恢复用户的状态。
陷阱(Trap)-一个在FPSCR中设置了相应的异常允许位的例外条件。用户的陷阱处理程序将被执行。
未定义的-指出一条生成未定义的指令陷阱的指令。关于ARM异常的更详细信息,可参看ARM结构参考手册(ARM ArchitecturalReference Manual)。
不可预测的-不可靠的指令或控制寄存器字段值的结果。不可预测的指令或结果不得表示安全漏洞,或者停止或暂停处理器或系统的任何部分。
不受支持的数据-不被硬件处理、但弹回到支持程序码去完成的特定数据值。这些数据可包括无穷大、NaN、非正规值和零。具体实现可自由地选择这些值中的哪些将全部或部分地得到硬件上的支持,或者将要求支持程序码的辅助才能完成该操作。因处理不受支持的数据而产生的任何异常,都将被俘获到用户程序码-如果该异常的相应的异常允许位是置位的。
3.寄存器文件3.1导言该体系结构提供32个单精度和16个双精度寄存器,它们都是作为源或目的地操作数在整个定义的5位寄存器变址范围内可单个寻址的。
这32个单精度寄存器与这16个双精度寄存器是重叠的,就是说,向D5写入的一个双精度数据,将覆盖S10和S11的内容。编译程序或汇编语言程序员的工作就是要知道在重叠的实现中,寄存器使用在用寄存器来存储一个单精度数据与存储半个双精度数据之间的冲突。不提供硬件来保证寄存器的使用限于一种精度,如果违反了这一点,则结果就是不可预测的。
VFPv1提供在标量方式下或向量方式下对这些寄存器的访问。在标量方式下,用1个、2个或3个操作数寄存器来生成一个被写入目的地寄存器的结果;在向量方式下,所指定的操作数指的是一组寄存器。VFPv1支持在一条单精度操作数的指令中有多达8个元素的向量操作和一条双精度操作数的指令中有多达4个元素的向量操作。
表1LEN(长度)位编码
向量方式是通过向LEN字段写入非零值而被启动的。如果LEN字段含有0,FPS在标量方式下操作,寄存器字段被解释为对普通寄存器模型中的32个独立单精度寄存器或16个双精度寄存器寻址。如果LEN字段是非零的,FPS在向量方式下操作,寄存器字段被解释为对寄存器的向量寻址。参看表1中LEN字段的编码。
通过对目的地寄存器的说明,能得到一种不改变LEN字段而混合标量和向量操作的方法。在向量方式下如果目的地寄存器是在第一寄存器组(S0-S7或D0-D3)中,可以指定标量操作。更多的信息见节0。
3.2单精度寄存器的用法如果FPSCR中的LEN字段是0,就有编号为S0至S31的32个单精度寄存器可用。任何一个寄存器都可以被用作源或目的地寄存器。
3131 31 31 0
图表1.单精度寄存器图可以按图表1中所示的那样画出单精度(协处理器10)的寄存器图。
如果FPSCR中的LEN字段大于0,则该寄存器文件可以作为4个寄存器组,每组有8个循环寄存器,如图表2所示。第一组向量寄存器V0至V7与标量寄存器S0至S7重叠,根据为每个操作数选择的寄存器,按标量或向量来寻址。详情可参看节0,3.4寄存器的用法。
图表2.循环单精度寄存器例如,如果FPSCR中的LEN字段被设置为3,引用向量V10将导致在向量操作中包含S10、S11、S12和S13。类似地,V22会在操作中涉及S22、S23、S16和S17。当在向量方式下访问寄存器文件时按顺序排在V7之后的是V0;类似地,V8在V15之后,V16在V23之后,V24在V31之后。
3.3双精度寄存器的用法如果FPSCR中的LEN字段是0,则有16个双精度寄存器可用。630630
图表3.双精度寄存器图任何一个寄存器都可被用作源或目的地寄存器。可以按图表3中所示的那样画出寄存器图。
如果FPSCR中的LEN字段大于0,则有每组4个循环寄存器的4组中的4个标量寄存器和16个向量寄存器可用,如图表4所示。第一组向量寄存器V0至V3与标量寄存器S0至S3重叠。各寄存器是根据为每个操作数选择的寄存器,按标量或向量来寻址的。详情可参看节0,3.4寄存器的用法。 图表4.循环双精度寄存器如节0中单精度例子中的一样,该4组内的双精度寄存器是循环的。
3.4寄存器的用法支持标量和向量之间的3种操作(OP2可以是浮点协处理器所支持的任何二操作数操作;OP3可以是任何三操作数操作。)在以下说明中,将寄存器文件的“第一组”定义为单精度操作的寄存器S0-S7和双精度操作的D0-D3。
·标量D=OP2标量A或标量D=标量A OP3标量B或标量D=标量A*标量B+标量D·向量D=OP2标量A或向量D=标量A OP3向量B或向量D=标量A*向量B+向量D·向量D=OP2向量A或向量D=向量A OP3向量B或向量D=向量A*向量B+向量D3.4.1标量操作两种条件将导致FPS在标量方式下操作。1?FPSCR中的LEN字段是0。目的地和源寄存器,对于单精度操作来说可以是标量寄存器0至31中的任何一个,对于双精度操作来说可以是寄存器0至15中的任何一个。仅对在指令中明确指定的寄存器进行操作。2?目的地寄存器在寄存器文件的第一组中。源标量可以是任何其它寄存器。这个方式允许混合标量和向量操作而不必改变FPSCR中的LEN字段。
3.4.2涉及标量和向量源并以向量为目的地的操作要在这个方式下操作,FPSCR中的LEN字段要大于零,并且目的地寄存器不在寄存器文件的第一组中。标量源寄存器可以是寄存器文件的第一组中的任何寄存器,其余的任何寄存器可用作向量B。注意,如果源向量寄存器是向量B的成员,或者向量D与向量B重叠的元素数小于LEN,则操作结果是不可预测的;就是说,向量D和向量B必须或者是相同的向量或者所有的成员都完全不同。参看节0中的总结表。
3.4.3仅涉及向量数据的操作要在这个方式下操作,FPSCR中的LEN字段要大于零,并且目的地向量寄存器不在寄存器文件的第一组中。向量A向量的各个元素与向量B中的相应元素组合后被写入向量D。寄存器文件的第一组以外的寄存器都可用于向量A,而所有向量都可用于向量B。如第二种情形中一样,如果源向量与目的地向量重叠的元素数小于LEN,则操作结果是不可预测的。它们必须或者是相同的或者所有的成员都完全不同。参看节0中的总结表。
注意,对于FMAC系列的操作来说,目的地寄存器或向量总是累加寄存器或向量。
3.4.4.操作总结表以下各表表示单和双精度2个和3个操作数指令的寄存器使用选择。“任何”指的是对指定的操作数来说可使用该精度的所有寄存器。
表2.单精度3操作数寄存器的用法
表3.单精度2操作数寄存器的用法。
表4.双精度3操作数寄存器的用法
表5.双精度2操作数寄存器的用法。
4.指令集FPS指令可划分成三个类别·MCR和MRC-ARM与FPS之间的传送操作·LDC和STC-FPS与存储器之间的加载和存储操作·CDP-数据处理操作4.1指令并发性FPS结构规范的目的是在两个层次上的并发性流水线式功能单元和与CDP功能并行的加载/存储操作。通过支持与当前处理操作没有寄存器相关关系的加载和存储操作与这些操作并行执行,能获得显著的性能增益。
4.2指令串行化FPS指定一条指令使FPS忙-等待ARM,一直到所有当前执行的指令都完成并且每个的异常状态都已知。如果有异常等待处理,在ARM中,串行化指令将被中止,异常处理将开始。FPS中的串行化指令是·FMOVX-读或写一个浮点系统寄存器对浮点系统寄存器的任何读或写将被停止,直到当前指令完成。对系统ID寄存器(FPSID)的FMOCX将触发一个由在先的浮点指令引起的异常。(用FMOVX)对用户状态与控制寄存器(FPSCR)进行读/修改/写,可用来清除异常状态位(FPSCR[4∶0])。
4.3涉及整数数据的转换在FPS中,浮点与整数数据之间的转换是一个两个步骤的过程,由一条涉及整数数据的数据传送指令和一条进行转换的CDP指令组成。如果试图对FPS寄存器中整数格式的整数数据进行算术运算,结果将是不可预测的,应当避免任何这种操作。
4.3.1FPS寄存器中整数数据向浮点数据的转换整数数据可以用MCR FMOVS指令从任何ARM寄存器加载到浮点单精度寄存器中。然后可以用整-到-浮系列的运算将FPS寄存器中的整数数据转换成一个单精度或双精度数据值,并写入一个目的地FPS寄存器。如果不再需要该整数值,则目的地寄存器可以就是源寄存器。该整数可以是一个带符合的或无符合的32位量。
4.3.2FPS寄存器中的浮点数据向整数数据的转换FPS单精度或双精度寄存器中的值,可以用浮-到-整系列的指令转换成带符合的或无符合的32位整数格式。生成的整数被放置在目的地单精度寄存器中。可以用MRC FMOVS指令将整数数据存储到ARM寄存器。
4.4寄存器文件寻址在单精度空间(S=0)中操作的指令将指令字段中可用的5位来存取操作数。高4位包含在标记为Fn、Fm或Fd的操作数字段中;地址的最低有效位分别在N、M或D中。
在双精度空间(S=1)中操作的指令将只使用操作数地址的高4位。这4位包含在Fn、Fm和Fd字段中。N、M和D位在对应操作数字段含有操作数地址时必定含有0。
4.5MCR(从ARM寄存器转移到协处理器)MCR操作涉及FPS对ARM寄存器中的数据的传送或使用。这包括将单精度格式的数据从一个ARM寄存器或将双精度格式的数据从一对ARM寄存器转移到一个FPS寄存器,将一个带符号或无符号整数值从ARM寄存器加载到单精度FPS寄存器,用ARM寄存器的内容加载一个控制寄存器。
MCR指令的格式在图表5中给出。31 28 27 24 23 21 20 19 16 15 12 11 87 6 5 43 0
图表5MCR指令格式表6.MCR位字段定义
表7MCR操作码字段定义
注解FMOV[S,HD,LD]指令只支持32位数据操作。FMOVS操作只移动ARM寄存器或单精度寄存器中的数据。为了从2个ARM寄存器传送一个双精度操作数,FMOVLD和FMOVHD将分别转移低半部分和高半部分。
4.6MRC(从协处理器/比较浮点寄存器转移到ARM寄存器)MRC操作涉及将FPS寄存器中的数据传送到ARM寄存器。这包括将一个单精度值或将浮点值向整数转换的结果转移到一个ARM寄存器或者从一个双精度FPS寄存器转移到两个ARM寄存器,然后用前一次浮点比较操作的结果修改CPSR的状态位。
MRC指令的格式在图表6中给出。31 28 27 24 23 21 20 19 16 15 12 11 87 6 5 43 0
图表6MRC指令格式表8.MRC位字段定义
*对于FMOVX FPSCR指令,如果Rd字段含有R15(1111),则CPSR的高4位将被用生成的条件码更新。
表9.MRC操作码字段定义
注解参看对MCR FMOV指令的注解。
4.7LDC/STC(加载/存储FPS寄存器)LDC和STC操作在FPS与存储器之间传送数据。浮点数据可以以任一种精度在一次数据传送中或在多次数据传送中传送,ARM地址寄存器同时被更新或保持不变。支持满的下降堆栈和空的上升堆栈两种结构,以及在转移多操作中对数据结构的多操作数存取。参看表11对LDC和STC的各种选择的说明。
LDC和STC指令的格式在图表7中给出。31 28 27 25 2423 22 21 2019 1615 1211 8 70
图表7LDC/STC指令格式表10.LDC/STC位字段定义
4.7.1对加载和存储操作的通用注解加载和存储多个寄存器将通过寄存器文件而线性地进行,而无需像向量操作所使用的那样跨4个或8个边界回绕。对超过寄存器文件的结尾的加载的试图是不可预测的。
如果某双加载或存储多个(store multiple)的偏移量含有奇数的寄存器数17或更少,具体实现可以写另一个32位数据项或者读另一个32位数据项,但不要求这样做。这额外的数据项可被用来在寄存器被加载或存储时标识寄存器的内容。这在其中对该精度来说寄存器文件格式不同于IEEE754格式并且每个寄存器有要求在存储器中标识其的类型信息的实现中是有用的。如果偏移量是奇数的并且数目大于单精度寄存器的数目,这可被用来启动这些寄存器和所有系统寄存器的上下文切换。
表11.加载和存储寻址方式选择
4.7.2LDC/STC操作总结表12列举了LDC/STC操作码中P、W和U位的允许组合和每个有效操作的偏移量字段的功能。
表12LDC/STC操作总结
4.8CDP(协处理器数据处理)CDP指令包括涉及来自浮点寄存器文件的操作数,并生成将要写回到该寄存器文件的结果的所有数据处理操作。特别值得注意的是FMAC(链接的乘法-累加)操作,该操作将两个操作数相乘后加上第3个操作数。该操作与合并的乘法-累加操作的不同在于,在加上第3操作数之前,要对积进行IEEE舍入操作。这使得Java程序码能使用FMAC操作,与分别先乘后加的操作相比,提高乘法-累加操作的速度。
CDP组中有两条指令在将FPS寄存器中的浮点值向其整数值转换是是有用的。FFTOUI[S/D]用FPSCR中当前的舍入方式将单精度或双精度的内容转换成FPS寄存器中的无符号整数。FFTOSI[S/D]进行向带符号整数的转换。FFTOUIZ[S/D]和FFTOSIZ[S/D]执行相同的功能,但不考虑转换的FPSCR舍入方式,而是截去任何小数位。C、C++和Java要用FFTOSIZ[S/D]的功能来进行浮点到整数的转换。FFTOSIZ[S/D]指令提供这个功能,而不要求为转换而将FPSCR中的舍入方式位调整为RZ,这就将转换所需的周期数减到仅是FFTOSIZ[S/D]操作的周期数,节省了4至6个周期。
比较操作的执行,要使用CDP CMP指令,其后是MRC FMOVX FPSCR指令,它用生成的FPS标志位(FPSCR[31∶28])加载ARM CPSR标志位。如果比较操作数之一是NaN,也提供比较操作,而可有可无无效(INVALID)异常。如果比较操作数之一是NaN,FCMP和FCMPO将不发出INVALID信号,而FCMPE和FCMEO则要发出异常信号。FCMPO和FCMPEO将Fm字段中的操作数与0比较,相应地设置FPS标志。ARM标志N、Z、C和V在FMOVX FPSCR之后的含义有如下定义N小于Z等于C大于或等于或无序V无序CDP指令的格式在图表8中给出。31 28 27 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3.0
图表8CDP指令格式表13.CDP位字段定义
4.8.1操作码表14列举了CDP指令的主要操作码。所有助记符的格式均为[OPERATION][COND][S/D]表14.CDP操作码说明
4.8.2扩展的操作表15列举了可以用操作码字段中的扩展值使用的扩展操作。除串行化和FLSCB指令外,所有助记符的格式均为[OPERATION][COND][S/D]。扩展操作的指令编码的方法,与Fn操作数的寄存器文件内变址的方法相同,即{Fn[3∶0],N}。
表15.CDP扩展操作
*非可向量化的操作。忽略LEN字段,对指定寄存器进行标量操作。
5.系统寄存器FPSID含有FPS结构和实现定义的标识值。该字可被用来确定FPS的型号特征集和修订以及屏蔽集号。FPSID是只读的,对FPSID写数据是无效的。参看图表9中FPSID寄存器的布局。31 24 23 16 15 430
图表9.FPSID寄存器编码5.2用户状态与控制寄存器(FPSCR)FPSCR寄存器含有用户可访问的配置位和异常状态位。配置选择包括异常允许位、舍入控制、向量跨距和长度、非正规操作数和结果的处理、调试方式的使用。该寄存器供用户和操作系统代码配置FPS和查询已完成操作的状态。它必须在上下文切换期间保存和恢复。位31至28含有最近一条比较指令产生的标志值,可以通过读FPSCR来访问。图表10中展示了FPSCR。3130292827262524 23222120 19 18 16
15 14 13 1211 10 9 8 76 5 4 3 21 0
图表10.用户状态与控制寄存器(FPSCR)5.2.1比较状态和处理控制字节位31至28含有最近一次比较操作的结果,一些控制位用于规定特殊情况中FPS的算术响应。图表11给出了比较状态和处理控制字节的格式。3130292827262524
图表11.FPSCR比较状态和处理控制字节的格式表16.FPSCR比较状态和处理控制字节的字段定义
5.2.2系统控制字节系统控制字节控制舍入方式、向量跨距和向量长度字段。对各位的规定如图表12中所示。
VFPv1结构中包括一种寄存器文件跨距机制用于向量操作。如果跨距(STRIDE)位被设置为00,则向量操作中选择的下一个寄存器将是寄存器文件中紧接前一个寄存器之后的寄存器。正常的寄存器文件回绕机制不受跨距值的影响。跨距值11将使所有输入寄存器和输出寄存器递增2。例如,FMULEQS F8,F16,F24将执行下列非向量操作FMULEQS F8,F16,F24FMULEQS F10,F18,F26FMULEQS F12,F20,F28FMULEQS F14,F22,F30有效地使寄存器文件中表示乘数的操作数的寄存器跨越2个而不是1个寄存器。23 2221 20 19 18 16
图表12.FPSCR系统控制字节表17.FPSCR系统控制字节的字段定义
5.2.3异常允许字节异常允许字节占据位15∶8,含有对异常陷阱的允许。对这些位的规定如图表13中所示。这些异常允许位符合IEEE 754规范对处理浮点异常条件的要求。如果该位被置位,则该异常是允许的,如果当前指令上发生异常条件,FPS将向操作系统发出一个用户可见的陷阱信号。如果该位被清零,则该异常是不允许的,如果发生异常条件,FPS将不向操作系统发出用户可见的陷阱信号,但是将生成一个数学上合理的结果。异常允许位的缺省状态是不允许的。关于异常处理的详细内容请参看IEEE 754标准。
有些实现将生成一个向支持程序码的弹回,以便处理超出硬件能力的异常条件,即使异常不被允许时也是如此。这一般将是用户程序码不可见的。15 14 13 12 11 10 9 8
图表13.FPSCR异常允许字节表18FPSCR异常允许字节字段
5.2.4异常状态字节异常状态字节占据FPSCR的位7∶0,含有异常状态标志位。有5个异常状态标志位,每个对应一种浮点异常。这些位是“粘性的”,它们一旦被检测到的异常设置后,必须通过FMOVX向FPSCR的写或者FSERIALCL指令才能清除。对这些位的规定如图表14中所示。如果发生一个允许的异常,对应的异常状态位将不是自动设置的。按需要设置适当的异常状态位,是支持程序码的任务。有些异常可能是自动的,即,如果检测到异常条件,FPS将在后继浮点指令上弹回,而不管异常允许位是如何设置的。这就允许将IEEE 754标准所要求的一些更复杂的异常处理以软件而不是硬件来执行。一个例子是FZ位被设置为0时发生下溢条件。在这种情况下,正确的结果可能是一个取决于该结果的指数和舍入方式的非正规化数。FPS允许实现者选择响应,包括选择弹回并用支持程序码来生成正确的结果和将该值写到目的地寄存器。如果下溢异常允许位是置位的,用户的陷阱处理程序将在支持程序码完成操作后被调用。这个程序码可以改变FPS的状态并返回或停止该进程。
6.异常处理FPS在调试方式和正常方式这两种方式之一下操作。如果在FPSCR中DM位被置位,FPS在调试方式下操作。在这个方式中,FPS一次执行一条指令,与此同时,让ARM一直等待到知道该指令的异常状态。这将保障寄存器文件和存储器针对指令流保持准确,但要以大量增加执行时间为代价。FPS将在资源情况允许时从ARM接受新指令,当检测到异常条件时发出异常信号。对ARM的异常报告将总是针对浮点指令流保持准确,除非是跟在向量操作之后的与向量操作并行执行的加载或存储操作。在这种情况下,加载操作的寄存器文件的内容或者存储操作的存储器可以是不准确的。
6.1支持程序码FPS的实现可以选择符合IEEE754的硬件与软件支持的组合。对于不受支持的数据类型和自动异常,支持程序码将执行一致性硬件的功能,适当时将结果返回到目的地寄存器并在不调用用户的陷阱处理程序或者修改用户程序码的流的情况下返回给用户的程序码。在用户看来,只有硬件在负责浮点程序码的处理。弹回到支持程序码去处理这些特征功能,显著增加执行或处理该特征功能的时间,但这些情形在用户程序码、内置应用程序或编写良好的数字应用程序中一般极少发生。
支持程序码设计有两个组件一个例程库,它执行超出硬件的范围的操作-诸如超越计算,以及被支持的功能-诸如用不受支持的输入或可能产生异常的输入进行除法;一个异常处理程序的集合,它为符合IEEE754而处理异常陷阱。要求支持程序码执行补充的功能,以便仿真对不受支持的数据类型或数据表示(例如非正规值)的适当处理。可以编写例程来利用中间计算中的FPS-如果注意在例程的出口恢复用户的状态。
6.2异常报告和处理在标准方式中,异常将在异常条件被检测到后下一个浮点指令被发出时被报告给ARM。ARM处理器的状态、FPS寄存器文件和存储器在异常被捕获时,相对于引起异常的指令来说可能并不准确。支持程序码有足够的信息可用来正确地仿真该指令并处理该指令产生的任何异常。
在有些实现中,支持程序码可被用来处理一些或所有带包括无穷大、NaN、非正规数据和零的特殊IEEE754数据的操作。这样做的实现,将按不受支持的数据来引用这些数据,并以一般为用户程序码不可见的方式弹回到支持程序码,并以在目的地寄存器中的IEEE754规定的结果返回。从操作得出的任何异常都遵守IEEE754异常规则。这可包括如果相应的异常允许位置位时陷入到用户程序码。
IEEE754标准针对FPSCR中异常允许和禁止两种情况定义对异常条件的响应。VFPv1结构不规定为适当地符合IEEE754规范而使用的硬件与软件之间的界线。
6.2.1不受支持的操作和格式FPS不支持任何带十进制数据或者向十进制数据转换或从十进制数据转换的操作。这些操作是IEEE754标准所要求的,必须由支持程序码提供。如果要使用十进制数据,就要要求库例程来完成所需的功能。FPS没有十进制数据类型,不能被用来捕获使用十进制数据的指令。
6.2.1FPS被禁止或异常时FMOVX的使用在SUPERVISOR(管理器)或UNDEFINED(未定义)方式下执行的FMOVX指令,可以在FPS处于异常状态或被禁止(如果该实现支持禁止选择的话)时,读和写FPSCR或者读FPSID或FPREG,而不会引起向ARM发出异常信号。
尽管讨论了本发明的一些特定的实施例,显然本发明并不局限于此,在本发明的范围内可以进行许多修改和增补。例如,可以将后文的从属权利要求的特征与独立权利要求的特征作出各种组合,而不偏离本发明的范围。
权利要求
1.一种用于处理数据的装置,该装置包含一个有多个寄存器的寄存器组;和一个用于译码数据处理指令的指令译码器,至少一条所述数据处理指令有至少一个定义要执行的操作的操作指定码和一个指定所述寄存器组内的一个第一寄存器的第一寄存器指定字段;其中所述指令译码器用一个给定的寄存器作为标量寄存器或向量寄存器来执行操作,以所述给定寄存器作为标量寄存器的执行,包含对存储在所述给定寄存器的一个操作数执行一次所述操作,以所述给定寄存器作为向量寄存器的执行,包含对存储在依赖所述给定寄存器的一个寄存器指定字段而选择的所述寄存器组的寄存器的一个预定序列中的操作数执行多次所述操作;和所述指令译码器响应所述第一寄存器指定字段并独立于所述操作指定码,确定要将所述第一寄存器作为向量寄存器还是标量寄存器用来执行所述操作。
2.如权利要求1中所要求的装置,其中所述的至少一个所述数据处理指令有一个指定一个第二寄存器的第二寄存器指定字段;所述指令译码器用所述第二寄存器作为标量寄存器或向量寄存器来执行所述操作;和所述指令译码器响应所述第一寄存器指定字段,确定要将所述第二寄存器作为向量寄存器还是标量寄存器用来执行所述操作。
3.如权利要求2中所要求的装置,其中,当所述第一寄存器是标量寄存器时,所述第二寄存器是标量寄存器,并且当所述第一寄存器是向量寄存器时,所述第二寄存器是向量寄存器。
4.如权利要求2和3的任意一项中所要求的装置,其中所述至少一个数据处理指令有一个指定一个第三寄存器的第三寄存器指定字段;所述指令译码器用所述第三寄存器作为标量寄存器或向量寄存器来执行所述操作;和所述指令译码器响应所述第二寄存器指定字段,确定要将所述第三寄存器作为向量寄存器还是标量寄存器用来执行所述操作。
5.如前面的任意一项权利要求中所要求的装置,其中,所述的操作指定码有对应于非交换性运算的非交换性码值,至少成对地提供一些对应于相同的运算但具有相反的操作数顺序的所述非交换性码值。
6.如前面的任意一项权利要求中所要求的装置,包含一个向量控制寄存器,它存储着一个规定在所述给定寄存器是个向量寄存器时在要重复所述操作的所述预定寄存器序列中的寄存器的数目的长度值,所述长度值适用于所述数据处理指令中使用的所有向量寄存器。
7.如权利要求6中要求的装置,其中,所述指令译码器检测所述规定所述预定序列中的所述寄存器数目的长度值是否是一来提供在所述数据处理指令中使用的所有寄存器都是标量寄存器的指示。
8.如权利要求6或7的任意一项中所要求的装置,其中,所述向量控制寄存器存储一个规定在所述预定寄存器序列的所述寄存器之间的寄存器号的增量的跨距值,所述跨距值适用于所述数据处理指令中使用的所有向量寄存器。
9.如前面的任意一项权利要求中所要求的装置,其中,当所述第一寄存器指定字段在一个第一N个值的范围内时,所述第一寄存器是个向量寄存器;当所述第一寄存器值在一个与所述第一N个值的范围不同的第二M个值范围内时,所述第一寄存器是个向量寄存器。
10.如权利要求9中所要求的装置,其中,M>N。
11.如权利要求10中所要求的装置,其中,M=3*N。
12.如权利要求4中所要求的装置,其中,当所述第二寄存器指定字段在一个第一P个值的范围内时,所述第三寄存器是个向量寄存器;当所述第二寄存器值在一个与所述第一P个值的范围不同的第二Q个值范围内时,所述第三寄存器是个向量寄存器。
13.如权利要求12中所要求的装置,其中,P>Q。
14.如权利要求13中所要求的装置,其中,P=3*Q。
15.如前面的任意一项权利要求中所要求的装置,包含一个存储器和一个用于控制所述存储器与所述寄存器组内寄存器之间数据值的传送的传送控制器,所述传送控制器响应多个传送指令,在所述存储器与所述寄存器组内的一系列寄存器之间传送一系列数据值。
16.如前面的任意一项权利要求中所要求的装置,其中,所述寄存器组和所述指令译码器是一个浮点单元的一部分。
17.如权利要求16中所要求的装置,其中所述浮点单元包含一个用于执行乘法-累加运算的乘法-累加单元。
18.如前面的任意一项权利要求中所要求的装置,其中,将所述操作的结果写到起目的地寄存器作用的所述第一寄存器。
19.如权利要求2中所要求的装置,其中,所述第二寄存器作为存储所述操作的一个第一输入操作数的第一操作数寄存器。
20.如权利要求的装置, 其中,所述第三寄存器作为存储所述操作的一个第二输入操作数的第二操作数寄存器。
21.如前面的任意一项权利要求中所要求的装置,其中,所述寄存器组包含32个寄存器。
22.如前面的任意一项权利要求中所要求的装置,其中,所述寄存器可以个别地操作和被控制,以存储一个单精度值,或者成对地操作和被控制,以存储一个双精度值。
23.如前面的任意一项权利要求中所要求的装置,其中,所述给定寄存器指定字段在要用所述给定寄存器作为向量寄存器来执行所述操作时规定所述预定寄存器序列内的一个起始寄存器。
24.如前面的任意一项权利要求中所要求的装置,其中,所述指令译码器响应至少一个另外的数据处理指令,该指令中的所述操作码定义所述指令中指定的所述给定寄存器是一个向量寄存器还是一个标量寄存器,而与任何寄存器指定字段无关。
25.一种处理数据的方法,该方法包含的步骤是在一个有多个寄存器的寄存器组中存储数据值;用一个指令译码器译码数据处理指令,至少一条所述数据处理指令有至少一个指定要执行的操作的操作指定码和一个指定所述寄存器组内的一个第一寄存器的寄存器指定字段;其中所述指令译码器用一个给定的寄存器作为标量寄存器或向量寄存器来执行操作,以所述给定寄存器作为标量寄存器的执行,包含对存储在所述给定寄存器的一个操作数执行一次所述操作,以所述给定寄存器作为向量寄存器的执行,包含对存储在依赖所述给定寄存器的一个寄存器指定字段而选择的所述寄存器组的一个预定的寄存器序列中的操作数执行多次所述操作;和所述指令译码器响应所述第一寄存器指定字段并独立于所述操作指定码,确定要将所述第一寄存器作为向量寄存器还是标量寄存器用来执行所述操作。
全文摘要
浮点单元配备一个包含32个既可用作向量寄存器又可用作标量寄存器的寄存器的寄存器组。数据处理指令包括至少一个指向含有要在该操作中使用的数据值的寄存器的寄存器指定字段。通过在寄存器字段本身内对某寄存器要按向量寄存器还是按标量寄存器对待进行编码,能增加可用来编码更多操作码或容纳更多寄存器的指令位空间。此外,指令的一个寄存器的寄存器字段可以编码另一个寄存器是向量寄存器还是标量寄存器。一开始可以不管操作码如何,而用指令的寄存器字段内的值来访问寄存器,这更加易于译码。
文档编号G06F7/544GK1303501SQ99806659
公开日2001年7月11日 申请日期1999年3月9日 优先权日1998年5月27日
发明者C·N·欣德斯, D·V·雅加, D·T·马特尼, D·J·西尔 申请人:Arm有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1