专利名称:数据处理系统中的输入操作数控制的制作方法
技术领域:
本发明涉及数据处理系统。更具体地,本发明涉及具有多个寄存器的数据处理系统,所述多个寄存器在程序指令字的控制下用于存储由算术逻辑单元操作的数据字。
提供程序指令以指定是否对存储在一个寄存器中的输入操作数进行操作,或者对存储在两个寄存器中的但作为一个输入操作数对待的一个输入操作数进行操作是众所周知的。
从本发明的一方面来看,本发明提供了用于数据处理的装置,所述装置包括用于存储要处理的数据字的多个寄存器,每一个所述寄存器具有至少N位的容量;以及一个算术逻辑单元,用于响应程序指令字执行由所述程序指令字指定的算术逻辑操作;其中所述算术逻辑单元响应至少一个程序指令字,该程序指令字包括(ⅰ)一个源寄存器位字段,它指定存储所述程序指令字的一个输入操作数数据字的所述多个寄存器中的一个源寄存器;(ⅱ)一个输入操作数长度标志,用于指定所述输入操作数数据字是否具有N位的长度或者N/2位的长度;以及(ⅲ)一个高/低位置标志,在所述输入操作数长度标志指示为一个(N/2)位的长度时,该高/低位置标志指示该输入操作数数据字位于所述源寄存器的高位位置和低位位置中的哪一个。
在数据处理中已经出现提高系统的数据通路宽度的趋势。早期的系统具有8位的数据通路。然后发展成为16位的数据通路,现在常见的是具有32位和64位数据通路。随着数据通路宽度的增加,数据处理系统中的寄存器的宽度也随之增加以与其匹配。本发明认识到,在要处理的数据字的宽度小于数据通路的宽度时,则使用一个全寄存器来存储这些字是对设备的寄存器资源的浪费。这种情况在加载/存储体系结构的机器中尤其如此,其中,要处理的所有数据必须在寄存器中,而且希望减少需要从高速缓存或主存储器中取出数据的次数。本发明认识到上述考虑,并且提供了使用一个输入操作数长度标志和一个高/低位置标志的方案以指示该输入操作数的长度和其存储于寄存器的哪一部分。依次方式,一个寄存器可以保存一个以上的输入操作数,从而更有效地利用了设备的寄存器资源,并且这些输入操作数仍可以单独地处理。
在利用一个N位数据总线将数据存储设备连接到寄存器时,本发明的这一优点得以增强。在这种情况下,可以利用数据总线一次传送两个操作数,从而更有效地利用了总线带宽,减少了出现性能瓶颈的可能性。在本发明的较佳实施例中,所述算术逻辑单元响应至少一个并行操作的程序指令字,在第一个(N/2)位输入操作数数据字上和第二个(N/2)位输入操作数数据字上执行单独的算术逻辑操作,这些输入操作数数据字分别存储在一个源寄存器中的高位位置和低位位置。
所提供的并行操作的程序指令字允许算术逻辑单元充分利用它的N位数据通路能力执行两个独立的计算,即使这些输入操作数在长度上小于最大的数据通路宽度。这极大地提高了该系统的数据处理能力,同时没有引起显著的其他开销。
可以进行的一个改进是所述算术逻辑单元具有一个信号通路,在算术逻辑操作中它起到位位置之间的进位链的作用,并且在执行一个并行操作的程序指令字时,所述信号通路在所述第一个(N/2)位输入操作数数据字和所述第二个(N/2)位输入操作数数据字之间断开。
虽然并行操作的程序指令字可以采取许多形式,但最好所述并行操作的程序指令字执行下列算术逻辑操作之一(ⅰ)并行加,其中执行两个并行的(N/2)位加;(ⅱ)并行减,其中执行两个并行的(N/2)位减;(ⅲ)并行移位,其中执行两个并行的(N/2)位移位操作;(ⅳ)并行加/减,其中并行执行一个(N/2)位加和一个(N/2)位减。
本发明的更进一步的改进是,在所述输入长度标志指示一个N位长度时,所述高/低位置标志指示在作为一个N位输入操作数数据字使用之前是否将存储在所述高位位置的那些位移动到所述低位位置,以及将存储在所述低位位置的那些位移动到所述高位位置。
在变换操作期间这一特征尤其有用。这一功能的极其有效的硬件实现包括至少一个多路转换器,该多路转换器响应所述高/低位置标志,选择向所述数据通路的低(N/2)位提供存储在所述源寄存器的高位位置和所述源寄存器的低位位置之一的一个(N/2)位输入操作数数据字。
为了处理带符号的运算而又没有不应有的复杂性,最好提供一个电路以在将一个(N/2)位输入操作数数据字输入到所述N位数据通路之前对其进行符号扩展。
从本发明的另一方面来看,本发明提供了用于数据处理的方法,所述方法包括以下步骤将要进行处理的数据字存储在多个寄存器中,每一个所述寄存器具有至少N位的容量;以及响应程序指令字执行由所述程序指令字指定的算术逻辑操作;其中至少一个程序指令字包括(ⅰ)一个源寄存器位字段,它指定存储所述程序指令字的一个输入操作数数据字的所述多个寄存器中的一个源寄存器;(ⅱ)一个输入操作数长度标志,用于指定所述输入操作数数据字是否具有N位的长度或者N/2位的长度;以及(ⅲ)一个高/低位置标志,在所述输入操作数长度标志指示为一个(N/2)位的长度时,该高/低位置标志指示该输入操作数数据字位于所述源寄存器的高位位置和低位位置中的哪一个。
下面参照附图以示例方式描述本发明的实施例,附图中
图1示出数字信号处理装置的高层配置;图2示出协处理器的寄存器配置的输入缓冲器;图3示出通过协处理器的数据路径;图4示出从寄存器中读取高或低位位的多路复用电路;图5为示出较佳实施例中的协处理器所使用的寄存器重新映象逻辑的框图;图6更详细地示出图5中所示的寄存器重新映象逻辑;以及图7为示出块过滤算法的表。
下面描述的系统是关于数字信号处理(DSP)的。DSP可采取许多形式,但一般可以认为是需要高速(实时)处理大量数据的处理。这一数据通常表示某种模拟物理信号。DSP的好的实例便是用在数字移动电话中的,其中所接收与发送的无线电信号需要解码成模拟声音信号及将模拟声音信号编码(通常采用卷积、变换及相关运算)。另一实例是盘驱动器控制器,其中处理从盘头恢复的信号以产生头跟踪控制。
在上面的上下文中,下面是对基于与协处理器合作的微处理器核(在本例中为英国剑桥先进RISC机器有限公司设计的微处理器范围内的ARM核)的数字信号处理系统的描述。微处理器与协处理器的接口及协处理器体系结构本身是专门为提供DSP功能配置的。微处理器核将被称作ARM而协处理器称作Piccolo。ARM与Piccolo通常制造成包含作为ASIC的一部分的其它元件(如片上DRAM、ROM、D/A与A/D转换器等)的单一集成电路。
Piccolo为ARM协处理器,因此它执行一部分ARM指令集。ARM协处理器指令允许ARM在Piccolo与存储器之间传送数据(利用加载协处理器LDC及存储协处理器STC指令),以及向与从Piccolo传送ARM寄存器(利用传送到协处理器MCR及从协处理器传送的MRC指令)。观察ARM与Piccolo的协作交互作用的一种方式是ARM作为Piccolo数据的强有力的地址发生器工作,而使Piccolo有时间执行需要实时处理大量数据来产生对应的实时结果的DSP运算。
图1示出ARM2与Piccolo4,ARM2发布控制信号到Piccolo4来控制向Piccolo4传送数据以及从Piccolo4传送数据字。指令高速缓冲存储器6存储Piccolo4所需要的Piccolo程序指令字。单个DRAM存储器8存储ARM2与Piccolo4两者所需要的所有数据与指令字。ARM2负责寻址存储器8及控制所有数据传送。只带单个存储器8及一组数据与地址总线的布置比需要多个存储器及高总线带宽的总线的典型DSP方法简单与低廉。
Piccolo执行来自控制Piccolo数据路径的指令高速缓冲存储器6的第二指令流(数字信号处理程序指令字)。这些指令中包含诸如乘-累加等数字信号处理型操作及诸如零开销循环指令等控制流指令。这些指令在保持在Piccolo寄存器10(见图2)中的数据上操作。这一数据是早先ARM2从存储器8传送来的。指令流自指令高速缓冲存储器6;指令高速缓冲存储器6作为完全的总线主驱动数据总线。小的Piccolo指令高速缓冲存储器6为4线、每线16个字的直接映象高速缓冲存储器(64条指令)。在一些实现中,令指令高速缓冲存储器更大是值得的。
从而两个任务是独立运行的,ARM加载数据而Piccolo处理它。这允许在16位数据上持续的单周期数据处理。Piccolo具有使ARM预取顺序数据,在Piccolo需要它之前加载数据的数据输入机制(示出在图2中)。Piccolo能以任何次序存取加载的数据,随着老数据的最后一次使用自动地重新填充其寄存器(所有指令的每一源操作数都有一位来指示应重新填充源寄存器)。这一输入机制称作再定序缓冲器并包括输入缓冲器12。加载进Piccolo的每一个值(见下面通过LDC或MCR)携带有指定该值的目的地寄存器的标记Rn。标记Rn与数据字一起存储在输入缓冲器中。当通过寄存器选择电路14存取寄存器而指令指定要重新填充该数据寄存器时,便通过确立信号E来标记该寄存器。然后重新填充电路16用输入缓冲器12中以该寄存器为目的地的最老的加载值自动重新填充该寄存器。重定序缓冲器保持8个带标记的值。输入缓冲器12具有类似于FIFO的形式,但除外可从队列中央抽取数据字,而此后较晚存储的字向前传递来填充空位。距离输入最远的数据字便相应地是最老的,并在输入缓冲器12保持带有正确的标记Rn的两个数据字时便用它来确定应当用哪一个数据字来重新填充输入缓冲器12。
如图3中所示Piccolo通过将数据存储在输出缓冲器18(FIFO)中输出它。数据是顺序地写入FIFO中的,并由ARM以相同的次序读出到存储器8。输出缓冲器18保持8个32位值。
Piccolo通过协处理器接口(图1的CP控制信号)连接在ARM上。在执行ARM协处理器指令时,Piccolo能执行该指令;在执行该指令之前令ARM等待直到Piccolo就绪;或拒绝执行该指令。在最后一种情况中,ARM将引起未定义的指令异常。
Piccolo执行的最普通的协处理器指令为LDC与STC,它们分别通过数据总线向与从存储器8加载与存储数据字,而ARM生成所有地址。便是这些指令将数据加载到重定序缓冲器中并存储来自输出缓冲器18的数据。如果在LDC上输入重定序缓冲器中没有足够的空间来加载数据时,及如果在STC上输出缓冲器中没有足够的数据供存储,即ARM正在期待的数据不在输出缓冲器18中时,Piccolo将阻止ARM。Piccolo还执行ARM/协处理器寄存器传送使ARM能存取Piccolo的特定寄存器。
Piccolo从存储器取出其本身的指令来控制图3中所示的数据路径及从重定序缓冲器到寄存器及从寄存器到输出缓冲器18传送数据。Piccolo的执行这些指令的算术逻辑单元具有执行乘法、加法、减法、乘-累加、逻辑运算、移位与循环的乘法器/加法器电路20。在数据路径中还设置有累加/累减(decumulate)电路22及定标/饱和电路24。
Piccolo指令是初始时从存储器加载进指令高速缓冲存储器6中的,其中Piccolo能存取它们而不需要返回去存取主存储器。
Piccolo不能从存储器失败中恢复。因此,如果在虚拟存储器系统中使用Piccolo,在整个Piccolo任务中所有Piccolo数据都必须在物理存储器中。对于诸如实时DSP等Piccolo任务的实时性质,这不是重大的限制。如果出现存储器失败,Piccolo将停止并在状态寄存器S2中设置标志。
图3示出Piccolo的整体数据路径功能。寄存器组10使用3个读端口与2个写端口。利用一个写端口(L端口)从重定序缓冲器重新填充寄存器。输出缓冲器18是直接从ALU结果总线26更新的,从输出缓冲器18的输出是在ARM程序控制下的。ARM协处理器接口执行到重定序缓冲器中的LDC(加载协处理器)指令及从输出缓冲器18的STC(存储协处理器)指令,以及在寄存器组10上的MCR与MRC(传送ARM寄存器至/自CP寄存器)。
其余寄存器端口用于ALU。两个读端口(A与B)驱动输入到乘法器/加法器电路20,C读端口用于驱动累加器/累减器电路22输入。其余写端口W用于将结果返回给寄存器组10。
乘法器20执行16×16带符号或不带符号乘法,带有可选用的48位累加。定标器单元24能提供0至31位立即算术或逻辑右移,后面跟随可选用的饱和。移位器与逻辑单元20每一周期能执行一个移位或逻辑运算。
Piccolo具有称作D0-D15或A0-A3、X0-X3、Y0-Y3、Z0-Z3的16个通用寄存器。第一组四个寄存器(A0-A3)预定作为累加器并且是48位宽,额外的16位提供在许多连续的计算中对溢出的保护。其余寄存器为32位宽。
可将各Piccolo寄存器作为包含两个独立的16位值对待。位0至15包含低的一半,位16至31包含高的一半。指令能指定各寄存器特定的16位的一半作为源操作数,或可指定整个32位寄存器。
Piccolo还提供饱和的运算。如果结果大于目的地寄存器的大小,乘法、加法与减法指令的变型提供饱和的结果。当目的地寄存器为48位累加器时,将值饱和到32位(即无法饱和48位值)。在48位寄存器上没有溢出检测。由于会占用至少65536条乘法累加指令才能导致溢出所以这是合理的限制。
各Piccolo寄存器是标记为“空”(E标志,见图2)或包含值(不可能有半个寄存器是空的)之一的。初始时,将所有寄存器标记为空。在各周期上Piccolo试图用重新填充控制电路16将来自输入重定序缓冲器的值填充空的寄存器之一。此外如果将来自ALU的值写入寄存器便不再将它标记为“空”的。如果从ALU写入寄存器,同时有值等待从重定序缓冲器放置到该寄存器中,则结果是不确定的。如果对空寄存器进行读取,Piccolo的执行单元将停止。
输入重定序缓冲器(ROB)位于协处理器接口与Piccolo的寄存器组之间。用ARM协处理器传送将数据加载进ROB中。ROB包含若干32位值,各带有指示作为该值的目的地的Piccolo寄存器的标记。该标记还指示该数据应传送给整个32位寄存器还是只给32位寄存器的底部16位。如果数据的目的地为整个寄存器,则将该项的底部16位传送给目标寄存器的底部一半并将顶部16位传送给寄存器的顶部一半(如果目标寄存器为48位累加器则扩展符号)。如果该数据的目的地只是寄存器的底部一半(所谓“半寄存器”),首先传送底部16位。
寄存器标记总是参照物理目的地寄存器,不执行寄存器重新映射(见下面关于寄存器重新映射。)在每一个周期上Piccolo试图如下地将数据项从ROB传送到寄存器组-检验ROB中各项并将标记与空寄存器比较,确定是否能从一部分或全部项对寄存器进行传送。
-从能进行传送的项组中,选择最老的项并将其数据传送给寄存器组。
-将该项的标记更新为标记该项是空的。如果只传送了该项的一部分,只将传送的部分标记为空的。
例如,如果目标寄存器完全是空的且选择的ROB项包含以整个寄存器为目的地的数据,便传送全部32位并标记该项为空的。如果目标寄存器的底部一半是空的而ROB项包含目的地为寄存器的底部一半的数据,则将该ROB项的底部16位传送给目标寄存器的底部一半并将ROB的底部一半标记为空的。
可以独立地传送任何项中的数据的高与低16位。如果没有项包含能传送给寄存器组的数据,该周期中不进行传送。下面的表描述目标ROB项与目标寄存器状态的所有可能组合。
总结一下,可以独立地从ROB重新填充寄存器的两半,ROB中的数据标记为以整个寄存器为目的地或以寄存器的底部一半为目的地的两个16位值。
用ARM协处理器指令将数据加载进ROB中。如何在ROB中标记数据取决于用哪一条协处理器指令来执行传送。下述ARM指令可用于以数据填充ROB<pre listing-type="program-listing"><![CDATA[LDP{<cond>}<16/32> <dest>,[Rn]{!},#<size>LDP{<cond>}<16/32>W <dest>,<wrap>,[Rn]{!},#<size> LDP{<cond>}16U <bank>,[Rn]{!} MPR{<cond>} <dest>,Rn MRP{<cond>} <dest>,Rn]]></pre>提供了下列ARM指令用于配置ROBLDPA<bank list>
前三条被汇编为LDC,MPR与MRP被汇编为MCR,LDPA被汇编为CDP指令。
上面<dest>代表Piccolo寄存器(A0-Z3),Rn代表一个ARM寄存器,<size>代表必须是4的非零倍数的固定字节数,而<wrap>代表常量(1、2、4、8)。用{}括起的字段为选用的。为了使传送能符合重定序缓冲器,<size>至多为32。在许多场合中,为了避免死锁,<size>将小于这一限制。<16/32>字段指示是否应将加载的数据作为16位数据对待并指示要采取的结尾(endian)特定的动作(见下面),或者是32位数据。
注1在下面的正文中,当引用LDP或LDPW时它指指令的16位与32位变型两者。
注2‘字’为来自存储器的32位块,它可包含两个16位数据项或一个32位数据项。
LDP指令传送若干数据项,将它们指派到一个全寄存器。这一指令将从存储器中地址Rn加载<size>/4个字,将它们插入ROB中。能传送的字数受下面的限制-量<size>必须是4的非零倍数;-<size>必须小于或等于特定实现的ROB的大小(在第一版本中为8个字,未来版本中保证不少于此)。
将传送的第一数据项标记为指派到<dest>的,第二数据项指派到<dest>+1等等(从Z3绕回到A0)。如果指定了!,则此后将寄存器Rn增量<size>。
如果采用LDP16变型,随着它们从存储器系统返回,在构成32位数据项的2个16位半字上执行对结尾(endian)特定的操作。详情见下面大结尾(Big Endian)与小结尾(Little Endian)支持。
LDPW指令传送若干数据项到一组寄存器。将传送的第一数据项标记为指派到<dest>,第二到<dest>+1,等等。当出现<wrap>传送时,将下一个传送的项标记为指派到<dest>,等等。<wrap>量是在半字的量指定的。
对于LDPW,适用下述限制-量<size>必须是4的非零倍数;-<size>必须小于或等于特定实现的ROB的大小(在第一版中为8个字,未来版本中保证不小于此);-<dest>可以是{A0、X0、Y0、Z0}之一;
-对于LDP32W,<wrap>可以是{2、4、8}个半字之一,对于LDP16W可以是{1、2、4、8}个半字之一;-量<size>必须大于2*<wrap>,否则不出现回绕而应用LDP指令来代替。
例如,指令LDP32WX0,2,[R0]!,#8将两个字加载进ROB中,将它们指派给整个寄存器X0。R0将被增量8。指令LDP32W X0,4,[R0],#16将四个字加载进ROB中,将它们标记为指派给X0,X1,X0,X1(按此次序)。R0不受影响。
对于LDP16W,可将<wrap>指定为1、2、4或8。1的回绕将导致所有数据标记为指派给目的地寄存器<dest>.1的底部一半。这是‘半寄存器’情况。
例如,指令LDP16W X0,1,[R0]!,#8将两个字加载进ROB中,将它们标记为指派给X0.l的16位数据。R0将被增量8。指令LDP16W X0,4,[R0],#16的表现类似于LDP32W实例,但是在它从存储器返回时在数据上执行对于结尾特定的操作除外。
LDP指令所有未使用的编码可为将来扩展保留。
LDP16U指令是为支持16位不对齐的数据的高效传送而提供的。LDP16U支持是为寄存器D4至D15(X、Y与Z组)提供的。LDP16U指令将一个32位数据字(包含两个16位数据项)从存储器传送到Piccolo中。Piccolo将丢弃这一数据的底部16位而将顶部16位存储在保持寄存器中。X、Y与Z组有一保持寄存器。一旦装填了组中的保持寄存器,如果将数据指派给该组中的寄存器,便改变了LDP{W}指令的表现。加载进ROB中的数据由保持寄存器与正在用LDP指令传送的数据的底部16位的连接构成。将正在传送的数据的高16位放入保持寄存器中entry<-data.l|holding_register
holding_register<-data.h这一操作模式一直持续到用LDPA指令关闭为止。保持寄存器并不记录目的地寄存器标记或大小。这一特征是从提供data.l的下一个值的指令获得的。
结尾的特定行为可永远出现在存储器系统返回的数据上。由于假定所有32位数据项在存储器中都是字对齐的,不存在等效于LDP16U的非16位指令。
LDPA指令用于关闭LDP16U指令起动的不对齐操作模式。可以在组X、Y、Z上独立关闭不对齐模式。例如指令,LDPA{X,Y}将关闭组X与Y上的不对齐模式。这些组的保持寄存器中的数据将被丢弃。
允许在不处于非对齐模式的组上执行LDPA,这将使该组在对齐模式中。
MPR指令将ARM寄存器Rn的内容放入ROB中,指派给Piccolo寄存器<dest>。目的地寄存器<dest>可以是范围A0-Z3中的任何全寄存器。例如指令,MPRX0,R3将R3的内容传送到ROB中,将数据标记为指派给全寄存器X0。
由于ARM是内部小结尾(endian)的,将数据从ARM传送到Piccolo时不出现对结尾特定的表现。
MPRW指令将ARM寄存器Rn的内容放置在ROB中,将其标记为指派给16位Piccolo寄存器<dest>.1的两个16位数据项。对<dest>的限制与对LDPW指令的相同(即A0、X0、Y0、Z0)。例如指令,MPRWX0,R3将R3的内容传送到ROB中,将数据标记为指派给X0.l的两个16位量。应指出对于带有1回绕的LDP16W,只能针对32位寄存器的底部一半。
至于MPR,在数据上不作用对于结尾特定的操作。
将LDP编码为
其中PICCOL01为Piccolo的第一协处理器号(当前为8)。N位在LDP32(1)与LDP16(0)之间选择。
LDPW编码为
其中DEST对于目的地寄存器A0、x0、Y0、Z0为0-3而WRAP对于回绕值1、2、4、8为0-3,PICCOL02为Piccolo的第二协处理器号(当前为9)。N位在LDP32(1)与LDP16(0)之间选择。
将LDP16U编码为
其中DEST对于目的地组x、Y、z为1-3。蛑LDPA编码为
其中BANK[3∶0]用于在每组的基础上关闭不对齐模式。如果设置了BANK[1],则关闭组X上的不对齐模式。BANK[2]与BANK[3]分别关闭组Y与z上的不对齐模式,如果设置的话。注意,这是CDP操作。
将MPR编码为
将MPRW编码为
其中DEST对于目的地寄存器x0、Y0、z0为1-3。
输出FIFO能保持多达8个32位值。它们是用下述(ARM)操作码之一从Piccolo传送的<pre listing-type="program-listing"><![CDATA[ STP{<cond>}<16/32>[Rn](!),#<size> MRP Rn]]></pre>第一个将来自输出FIFO的<size>/4个字保存在ARM寄存器Rn给定的地址上,如果!存在,变址Rn。为防止死锁,<size>不得大于输出FIFO的大小(本实现中为8项)。如果采用STP16变型,在存储器系统返回的数据上可出现对于结尾特定的表现。
MRP指令从输出FIFO中消除一个字并将其放置在ARM寄存器Rn中。对于MPR在数据上不作用对于结尾特定的操作。
STP的ARM编码为
其中N在STP32(1)与sTP16(0)之间选择。对于P、U与W位的定义,参见ARM资料手册。
MRP的ARM编码为31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 1312 11 10 9 8 7 6 5 4 3 2 1 0
Piccolo指令集内部假定小结尾(little endian)操作。例如,在存取作为两个16位的32位寄存器时,假定低一半占用位15至0。Piccolo可在带有大结尾(big endian)存储器或外围设备的系统中操作,因此必须注意以正确方式加载16位分组数据。
诸如ARM(如英国剑桥的先进RISC机器有限公司生产的ARM7微处理器)等Piccolo具有程序员能控制的‘BIGEND’配置管脚,控制可以是用可编程外围设备进行的。Piccolo利用该管脚来配置输入重定序缓冲器及输出FIFO。
当ARM将分组的16位数据加载到重定序缓冲器中时,它必须用LDP指令的16位格式指示这一点。这一信息与‘BIGEND’配置输入的状态组合以适当的次序将数据放置在保持锁存器与重定序缓冲器中。尤其是在大结尾模式中,保持寄存器存储加载的字的底部16位,并与下一次加载的顶部16位配对。保持寄存器内容永远结束在传送到重定序缓冲器中的字的底部16位中。
输出FIFO可包含分组16位或32位数据。程序员必须使用STP指令的正确格式以便Piccolo能保证将16位数据提供在数据总线的正确一半上。当配置成大结尾时,在使用16位格式的STP时,上与下16位两半互换。
Piccolo具有只能从ARM存取的4个专用寄存器。它们称作S0-S2。它们只能用MRC与MCR指令存取。操作码为<pre listing-type="program-listing"><![CDATA[ MPSR Sn,Rm MRPS Rm,Sn]]></pre>这些操作码在ARM寄存器Rm与专用寄存器Sn之间传送32位值。它们是作为协处理器寄存器传送在ARM中编码的
其中对于MPSR,L为0而对MRPS,L则为1。寄存器SO包含Piccolo唯一的ID及修订版本代码。
位[3∶0]包含处理器的修订版本号。
位[15∶4]包含以二进制编码的十进制格式的3位部件号piccolo为Ox500位[23∶16]包含体系结构版本0×00=版本1位[31∶24]包含实现者商标的ASCII码0×41=A=ARM有限公司寄存器S1为Piccolo状态寄存器。
一级状态码标志(N、Z、C、V)二级状态码标志(SN、SZ、SC、SV)E位Piccolo已被ARM禁止并已停止。
U位Piccolo遇到未定义的指令并已停止。
B位Piccolo遇到断点并已停止。
H位Piccolo遇到停止指令并已停止。
A位Piccolo遇到存储器失败(加载,存储或Piccolo指令)并已停止。
D位Piccolo检测到死锁条件并已停止(见下)。寄存器S2为Piccolo程序计数器31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
写入程序计数器起动Piccolo在该地址上执行程序(如果停止则离开停止状态)。复位时程序计数器是无定义的,因为Piccolo总是通过写入程序计数器起动的。
执行期间,Piccolo监视指令的执行及协处理器接口的状态。如果它检测到-Piccolo已停止运行等待重新装填寄存器或等待输出FIFO具有可利用的项。
-协处理器接口为忙等待,由于ROB中空间不够或输出FIFO中项不够。
如果检测到这两种状态,Piccolo置位其状态寄存器中的D位停止并拒绝ARM处理器指令,导致ARM进入未定义指令陷阱。
死锁状态的检测允许将系统构成为通过读取ARM与Piccolo程序计数器及寄存器至少能警告程序员已出现该状态及报告精确的故障点。应强调死锁只能由于不正确的程序或系统的另一部分破坏Piccolo的状态引发。死锁不能由数据不足或‘过载’引发。
可采用若干种操作从ARM控制Piccolo,它们是由CDP指令提供的。这些CDP指令只在ARM在特权状态中才接受。如果不在该状态中Piccolo将拒绝CDP指令而导致ARM处于未定义的指令陷阱。下面为可利用的操作-复位-进入状态访问模式-启动-禁止Piccolo可用PRESET指令在软件中复位。
PRESET;清除piccolo的状态将这一指令编码为31 30 29 28 27 26 25 24 23 22 21 2019 18 17 1615 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
执行这一指令时出现以下情况-将所有寄存器标记为空(准备好重新填充)。
-清除输入ROB。
-清除输出FIFO。
-复位循环计数器。
-将Pioccolo置于停止状态(将置位S2的H位)。
执行PRESET指令可占用若干周期来完成(对于本实施例2-3)。在正在执行它时,后面要在Piccolo上执行的ARM协处理器指令将处于忙等待。
在状态访问模式中,可使用STC及LDC指令保存与恢复Piccolo的状态(见下面关于从ARM访问Piccolo状态)。为了进入状态访问模式,必须首先执行PSTATE指令PSTATE 进入状态访问模式将这一指令编码为31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
在执行时,PSTATE指令将-停止Piccolo(如果它尚未停止),置位Piccolo的状态寄存器中的E位。
-配置Piccolo进入其状态访问模式中。
执行PSTATE指令可占用若干周期来完成,由于在停止以前Piccolo的指令流水线必须用完。当正在执行时,后面要在Piccolo上执行的ARM协处理器指令将是忙等待。
将PENABLE与PDISABLE指令用于快速上下文切换。当Piccolo被禁止时,只能访问专用寄存器0与1(ID与状态寄存器),并且只是从特权模式时。访问任何其它状态或从用户模式的任何访问将导致ARM未定义指令异常。禁止Piccolo导致它停止执行。当Piccolo已停止执行时,它通过置位状态寄存器中的E位来确认这一事实。
Piccolo是通过执行PENABLE指令启动的PENABLE;启动Piccolo将这一指令编码为31 30 29 28 27 26 25 24 23 22 21 2019 18 17 1615 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
>Picclol是通过执行PDISABLE指令禁止的PDISABLE;禁止Piccolo将这一指令编码为31 30 29 28 27 26 25 24 23 22 21 2019 18 17 1615 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
在执行这一指令时,出现以下情况-Piccolo的指令流水线将流完。
-Piccolo将停机及置位状态寄存器中的H位。
Piccolo指令高速缓冲存储器保持控制Piccolo数据路径的Piccolo指令。如果存在,它保证保持至少64条指令,起始在16个字边界上。下面的ARM操作码汇编进MCR中。其操作为强制高速缓冲存储器取出起始在指定地址上(必须是16字边界)的一行(16条)指令。即使高速缓冲存储器已保持有关于这一地址的数据也发生这一取出。
PMIR Rm在能执行PMIR之前Piccolo必须停止。
这一操作码的MCR编码为31 30 29 28 27 26 25 24 23 22 2120 19 18 17 1615 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
本节讨论控制Piccolo数据路径的Piccolo指令集。各指令为32位长。指令是从Piccolo指令高速缓冲存储器中读取的。
解码指令集是相当直观的。高6位(26至31)给出主操作码,位22至25为少数特定指令提供次要操作码。带灰色阴影的位当前不使用而为扩展保留(当前它们必须包含指定值)。
有11个主要指令类。这并不完全对应于提出在指令中的主操作码,这是为了便于解码某些子类。
上表中的指令具有以下名称标准数据运算逻辑运算条件加/减未定义移位选择未定义并行选择乘累加未定义双倍乘未定义移动带符号立即数未定义重复重复寄存器列表操作转移重新命名参数传送停止/中断在下面的节中详细描述各类指令的格式。对于大多数指令,源与目的地操作数字段是通用的并在单独的节中详细描述,寄存器重新映射也一样。
大多数指令需要两个源操作数;源1与源2。某些例外是饱和绝对值。
源1(SRC1)操作数具有以下7位格式1817 16 15 14 13 12
字段元素具有下述含义-大小-指示要读的操作数大小(1=32位,0=16位)。-再填充-规定读后应将寄存器标记为空的并能从ROB再填充。
-寄存器号-编码要读取的16个32位寄存器中哪一个。
-高/低-对于16位读指示读取32位寄存器的哪一半。对于32位操作数,置位时指示应互换两个16位一半。
在汇编程序中通过在寄存器号上加上后缀来指定寄存器大小l为低16位,h为高16位或.x为具有高与低16位交换的32位。
通用的源2(SRC2)具有以下三种12位格式之一1110 9 8 7 6 5 4 3 2 1 0
图4示出根据高/低位与大小位将所选择的寄存器的适当的一半切换到Piccolo数据路径上的多路复用器装置。如果大小位指示16位,则符号扩展电路根据需要用0或1填充数据路径的高位。
第一种编码指定源为寄存器,这些字段具有与SRC1说明符相同的编码。标度(SCALE)字段指定要作用在ALU的结果上的标度。
带有循环编码的8位立即数允许生成可用8位值及2位循环表示的32位立即数。下表示出能从8位值XY生成的立即数值
6位立即数编码允许使用6位不带符号的立即数(从0到63),以及作用在ALU的输出上的标度。
通用源2编码对于大多数指令变型是通用的。对这一规则存在一些例外,它们支持源2编码的有限子集或将其稍加修改-选择指令。
-移位指令。
-并行操作。
-乘累加指令。
-乘双倍指令。
选择指令只支持寄存器或6位不带符号立即数的一个操作数。由于这些位由指令的状态字段使用而得使该标度不可用。
移位指令只支持16位寄存器或1与31之间的5位无符号立即数的一个操作数。不能得到结果的标度。
在并行操作情况中,如果指定寄存器作为操作数的源,则必须执行32位读。并行操作的立即数编码略为不同。它允许将一个立即数复制到32位操作数的两个16位一半中。并行操作可利用稍加限制范围的标度。
如果使用6位立即数,则总是将它复制到32位量的两个一半上。如果使用8位立即数,只有当循环指示应将8位立即数循环到32位量的顶部一半上时才复制
<p>并行选择操作不使用标度;必须将这些指令的标度字段设置为0。
乘累加指令不允许指定8位循环立即数。该字段的位10用来部分地指定使用哪一累加器。源2蕴含16位操作数。
乘双倍指令不允许使用常量。只能指定一个16位寄存器。该字段的位10用来部分地指定使用哪一个累加器。
某些指令总是蕴含32位操作(如ADDADD),并在这些情况中应将大小位设置为1,高/低位用来有选择地互换32位操作数的两个16位一半。某些指令总是蕴含16位操作(如MUL)并应将大小位设置为0。而高/低位选择所使用的寄存器的哪一半(假定清除了失去的大小位)。乘累加指令允许独立说明源累加器与目的地寄存器。对于这些指令,大小位用来指示源累加器,而大小位则由指令类型为0来蕴含。
当读取16位值时(通过A或B总线)自动进行符号扩展将其扩展成32位量。如果读取48位寄存器(通过A或B总线),在总线上只出现底部32位。从而在所有情况中都将源l与源2转换成32位值。只有使用总线C的累加指令能存取累加器寄存器的整个48位。
如果置位再填充位,使用后便将该寄存器标记为空的并将由通常的再填充机制从ROB再填充(见关于ROB的节)。除非在进行再填充以前该寄存器再一次用作源操作数,Piccolo不会停止运行。在再填充的数据有效以前的最小周期数(最佳情况-数据等待在ROB头部)为1或2。因此建议在再填充请求后面的指令上不要使用再填充的数据。如果能避免在后面两条指令上使用操作数,应当这样做,由于这可防止深层流水线实现上的性能损失。
在汇编程序中通过在寄存器号上加上后缀“^”来指定再填充位。标记为空的寄存器段取决于寄存器操作数。可将各寄存器的两半标记为独立地再填充的(例如X0.l^只标记再填充X0的底部一半,X0^则标记再填充整个X0)。当再填充48位寄存器的顶部“一半”(位47:16)时,将16位数据写入位31:16并符号扩展到位47。
如果试图再填充同一寄存器两次(如ADD X0,X0^,X0^),只进行一次填充。汇编程序只允许语法ADD X1,X0,X0^。
如果在再填充一寄存器之前试图读该寄存器,Piccolo停止运行等待再填充该寄存器。如果标记寄存器为再填充,而在读取再填充的值之前更新了该寄存器,结果是不可预测的(例如ADD X0,X0^,X1是不可预测的,由于它标记X0再填充,然后通过将X0与X1之和放置在其中来再填充)。
4位标度字段编码14种标度类型-ASR#0,1,2,3,4,6,8,10-ASR#12至16-LSL#1并行最大/最小指令不提供标度,因此不使用源2的6位常量变型(汇编程序设置为0)。
在重复指令内支持寄存器重新映射,允许重复指令访问寄存器的移动‘窗口’而不回绕循环。下面更详细描述这一点。
目的地操作数具有以下7位格式25 24 2322 21 20 19
这一基本编码有10种变型
寄存器号(DX)指示正在寻址的是16个寄存器中哪一个。高/低位与大小位一起工作来寻址作为一对16位寄存器的各32位寄存器。大小位定义如何设置指令类型中所定义的适当标志,不论将结果是否写入寄存器组与/或输出FIFO,这允许构成比较及类似指令。带累加的加法类指令必须将结果写回寄存器。
下表示出各编码的表现
在所有情况中,任何操作写回寄存器或插入输出FIFO之前的结果为48位量。存在着两种情况如果写是16位的,通过选择底部16位[15:0]将48位量减少到16位量。如果指令饱和,则值将饱和在范围-2^15至2^15-1中。然后将16位值写回到指定的寄存器,如果设置了写FIFO位,则写到输出FIFO。如果将其写到输出FIFO,则将其保持到直到写入下一个16位值将这两个值配对并作为单一的32位值放入输出FIFO中时。
对于32位写,通过选择底部32位[31:0]将48位量减少到32位量。
对于32位与48位写两者,如果指令饱和,便将48位值转换成范围-2^31-1至2^31中的32位值。接着该饱和-如果执行写回到累加器,则写入整个48位。
-如果执行写回到32位寄存器,则写位[31:0]。
-如果指示写回到FIFO,又一次写位[31:0]。
目的地大小是由汇编程序在寄存器号后面用.l或.h指定的。如果不执行寄存器写回,则寄存器是不重要的,因此省略目的地寄存器来指示不写到寄存器或使用^来指示只写入输出FIFO。例如,SUB,X0,Y0等效于CMP X0,Y0而ADD^,X0,Y0将X0+Y0之值放入输出FIFO中。
如果输出FIFO没有值的空间,Piccolo停止运行等待空间成为可利用的。
如果写出16位值,例如ADD X0.h^,X1,X2,则锁存该值直到写第二个16位值。然后将两个值组合并作为一个32位数放入输出FIFO中。写入的第一个16位值总是出现在32位字的低位一半。将进入输出FIFO的数据标记为16或32位数据,以允许在大结尾系统上校正结尾。
如果在两次16位写之间写入32位值,则操作是未定义的。
重复指令内支持寄存器重新映射,允许重复指令访问寄存器的移动‘窗口’而不回绕循环。下面更详细地描述这一点。
在本发明的较佳实施例中,重复指令提供修改在循环中指定寄存器操作数的方式的机制。在这一机制下,要访问的寄存器是用指令中的寄存器操作数及在寄存器组中的编移量的一个函数来确定的。该偏移量是以可编程方式改变的,最好在各指令循环的末尾。该机制可独立地在位于X、Y与Z组中的寄存器上操作。在较佳实施例中,这一设施对于A组中的寄存器不能利用。
可使用逻辑与物理寄存器的概念。指令操作数为逻辑寄存器引用,然后将其映射到标识特定Piccolo寄存器10的物理寄存器引用。包含再填充在内的所有操作都在物理寄存器上操作。只在Piccolo指令流一侧出现寄存器重新映射-加载进Piccolo的数据总是指派给物理寄存器而不执行重新映射。
进一步参照图5讨论重新映射机制,图5为示出Piccolo协处理器4的若干内部部件的方框图。将ARM核2从存储器中检索到的数据项放在重定序缓冲器12中,而Piccolo寄存器10则以较早参照图2描述的方式从重定序缓冲器12再填充。将存储在高速缓冲存储器6中的Piccolo指令传递给在Piccolo4内的指令解码器50,在那里在将它们传递给Piccolo处理器核54之前进行解码。Piccolo处理器核54包含较早参照图3讨论的乘法器/加法器电路20、累加/累减电路22及足标/饱和电路24。
如果指令解码器50正在处理构成用重复指令标识的指令循环的一部分的指令,而该重复指令指示了应进行若干寄存器的重新映射,便利用寄存器重新映射逻辑52来执行必要的重新映射。可将寄存器重新映射逻辑52认为是指令解码器50的一部分,虽然熟悉本技术的人员清楚可将寄存器重新映射逻辑设置成完全与指令解码器50分开的实体。
指令中通常包含标识包含指令所需的数据项的寄存器的一个或多个操作数。例如,典型的指令可包含两个源操作数及一个目的地操作数,标识包含该指令所需的数据项的两个寄存器及应将指令的结果放入其中的寄存器。寄存器重新映射逻辑52从指令解码器50接收指令的操作数,这些操作数标识逻辑寄存器引用。根据逻辑寄存器引用,寄存器重新映射逻辑确定应不应施加重新映射,然后根据需要将重新映射作用在物理寄存器引用上。如果确定不应施加重新映射,便提供逻辑寄存器引用作为物理寄存器引用。稍后将详细讨论执行重新映射的较佳方式。
将来自寄存器重新映射逻辑的各输出物理寄存器引用传递给Piccolo处理器核54,使得随后处理器核能将指令作用在由物理寄存器引用标识的特定寄存器10中的数据项上。
较佳实施例的重新映射机制允许将各寄存器组分成两部分,即可以重新映射的寄存器部分及保持它们原来的寄存器引用不重新映射的寄存器部分。较佳实施例中,重新映射部分起始于重新映射的寄存器组的底部。
重新映射机制采用若干参数,这些参数将参照图6详细讨论,图6为示出寄存器重新映射逻辑22如何使用各种参数的方框图。应指出这些参数是相对于正在重新映射的组内的一点的给定值,这一点为例如该组的底部。
可认为寄存器重新映射逻辑52包括两个主要逻辑块,即重新映射块56及基更新块58。寄存器重新映射逻辑52采用提供加在逻辑寄存器引用上的偏移值的基指针,由基更新块58将这一基指针值提供给重新映射块56。
可用基起始(BASESTART)信号来定义基指针的初始值,例如这通常是零,虽然一些其它值也可指定。将这一基起始信号传递给基更新块58内的多路复用器60。在指令循环的第一次重复中,多路复用器60将基起始信号传递给存储单元66,而对于循环的后面的重复,由多路复用器60将下一基指针值提供给存储单元66。
将存储单元66的输出作为当前基指针值传递给重新映射逻辑56,并且还传递给基更新逻辑58内的加法器62的输入之一。加法器62还接收提供基增量值的基增量(BASEINC)信号。加法器62配置成将存储单元66所提供的当前基指针值增加该基增量值,并将结果传递给模电路64。
这一模电路还接收基环绕(BASEWRAP)值并将这一值与来自加法器62的输出基指针信号比较。如果增量后的基指针值等于或大于基环绕值,便将新基指针绕回到新的偏移值。这时模电路64的输出便是要存储在存储单元66中的下一基指针值。将这一输出提供给多路复用器60,并从那里到存储单元66。
然而,在存储单元66从管理重复指令的循环硬件接收到基更新(BASEUPDATE)信号之前不能将这一下一个基指针值存储在存储单元66中。循环硬件周期性地生成基更新信号,例如每当要重复指令循环时。当存储单元66接收到基更新信号时,存储单元便用多路复用器60提供的下一基指针值改写前一基指针值。以这一方式,提供给重新映射逻辑58的基指针值将改变成新基指针值。
要在寄存器组的重新映射的部分内存取的物理寄存器由包含在指令的操作数内的逻辑寄存器引用与基更新逻辑58提供的基指针值之和确定。这一加法是由加法器68执行的并将输出传递给模电路70。在较佳实施例中,模电路70还接收寄存器环绕值,如果来自加法器68的输出信号(逻辑寄存器引用与基指针值之和)超过寄存器环绕值,结果将环绕回到重新映射区的底部。然后将模电路70的输出提供给多路复用器72。
将寄存器计数(REGCOUNT)值提供给重新映射块56内的逻辑74,标识组中要重新映射的寄存器的数目。逻辑74将这一寄存器计数值与逻辑寄存器引用比较,并根据比较结果将控制信号传递给多路复用器72。多路复用器72作为其两个输入接收逻辑寄存器引用及模电路70的输出(重新映射的寄存器引用)。本发明的较佳实施例中,如果逻辑寄存器引用小于寄存器计数值,逻辑74便指令多路复用器72输出重新映射的寄存器引用作为物理寄存器引用。然而,如果逻辑寄存器引用大于或等于寄存器计数值,逻辑74便指令多路复用器直接输出逻辑寄存器引用作为物理寄存器引用。
如上所述,在较佳实施例中,重复指令调用重新映射机制。如稍后要详细讨论的,重复指令在硬件中提供四个零周期循环。这些硬件循环作为指令解码器50的一部分示出在图5中。每一次指令解码器50请求来自高速缓冲存储器6的指令时,高速缓冲存储器便将该指令返回给指令解码器,此时指令解码器判定返回的指令是否是重复指令。如果是,便配置硬件循环之一来处理该重复指令。
各重复指令指定循环中的指令数及环绕循环的次数(它是常量或读自Piccolo寄存器)。提供了两个操作码‘重复’(REPEAT)及下一个(NEXT)来定义硬件循环,‘下一个’操作码只用作分界符并不汇编成指令。重复从循环的起点开始,而‘下一个’界定循环的结束,允许汇编程序计算循环体中的指令数。在较佳实施例中,重复指令可包含要由寄存器重新映射逻辑52使用的诸如寄存器计数(REGCOUNT)、基增量(BASEINC)、基环绕(BASEWRAP)及寄存器环绕(REGWRAP)参数等重新映射参数。
可设置若干寄存器来存储寄存器重新映射逻辑所使用的重新映射参数。在这些寄存器内,可提供若干组预定义的重新映射参数,同时保留一些寄存器供存储用户定义的重新映射参数。如果用重复指令指定的重新映射参数等于预定义的重新映射参数组之一,则采用适当的重复编码,这一编码导致多路复用器之类将适当的重新映射参数直接从寄存器提供给寄存器重新映射逻辑。反之,如果重新映射参数与任何预定义的重新映射参数组都不同,则汇编程序生成重新映射参数传送指令(RMOV),它允许配置用户定义的寄存器重新映射参数,RMOV指令后面是重复指令。最好RMOV指令将用户定义的重新映射指令放置在为存储这种用户定义的重新映射参数留出的寄存器中,然后将多路复用器编程为将这些寄存器的内容传递给寄存器重新映射逻辑。
在较佳实施例中,寄存器计数、基增量、基环绕及寄存器环绕参数取下表中确定的值之一
为了展示作为采用按照本发明的较佳实施例的重新映射机制的结果所达到的关于代码密度的好处,下面讨论典型的块过滤算法。首先参照图7讨论阻塞过滤器算法的原理。如图7中所示,将累加器寄存器A0配置成累加若干次乘法运算的结果,乘法运算为系数C0乘以数据项d0的乘法,系数c1乘以数据项d1的乘法,系数c2乘以数据项d2的乘法等。寄存器A1累加类似的乘法运算组的结果,但这时系数集合已移位使得c0现在乘以d1,c1乘以d2,c2乘以d3等。类似地,寄存器A2累加数据值乘以又向右移位一步的系数值的结果,使得c0乘以d2,c1乘以d3,c2乘以d4等。然后重复这一移位、乘及累加进程,将结果放在寄存器A3中。
如果不采用按照本发明的较佳实施例的寄存器重新映射,则需要下面的指令循环来执行块过滤指令<pre listing-type="program-listing"><![CDATA[以4个新数据值开始ZERO{A0-A3};清零累加器REPEAT Z1;Z1=(系数个数/4);在第一轮进行下面四个系数;a0+=d0*c0+d1*c1+d2*c2+d3*c3;a1+=d1*c0+d2*c1+d3*c2+d4*c3;a2+=d2*c0+d3*c1+d4*c2+d5*c3;a3+=d3*c0+d4*c1+d5*c2+d6*c3MULA A0,x0.l^,Y0.l,A0;a0+=d0*c0,及加载d4MULA A1,X0.h,Y0.l,A1;a1+=d1*c0MULAA2,X1.l, Y0.l,A2 ;a2*=d2*c0MULAA3,X1.h,Y0.l^,A3 ;a3+=d3*c0,及加载c4MULAA0,X0.h^,Y0.h,A0 ;a0+=d1*c1,及加载d5MULAA1,X1.l,Y0.h,A1 ;a1+=d2*c1MULAA2,X1.h,Y0.h,A2 ;a2+=d3*c1MULAA3,X0.l,Y0.h^,A3 ;a3+=d4*c1,及加载c5MULAA0,X1.l^,Y1.l,A0 ;a0+=d2*c2,及加载d6MULAA1,X1.h,Y1.l,A1 ;a1+=d3*c2MULAA2,X0.l,Y1.l,A2 ;a2+=d4*c2MULAA3,X0.h,Y1.l^,A3 ;a3+=d5*c2,及加载c5MULAA0,X1.h^,Y1.h,A0 ;a0+=a3*c3,及加载d7MULAA1,X0.l,Y1.h,A1 ;a1+=d4*c3MULAA2,X0.h,Y1.h,A2 ;a2+=d5*c3MULAA3,X1.l,Y1.h^,A3 ;a3+=d6*c3,及加载c7NEXT]]></pre>
在本例中,将数据值放在X寄存器组中而将系数值放在Y寄存器组中。作为第一步,将四个累加器寄存器A0、A1、A2与A3设置为零。一旦复位了累加器寄存器,便进入指令循环,该循环是用‘重复’(REPEAT)及‘下一个’(NEXT)指令定界的。值Z1确定指令循环应重复的次数,为了下面将要讨论的原因,它实际上等于系数(c0,c1,c2等)的个数除以4。
指令循环包括16条乘累加指令(MULA),在第一次通过循环之后这些提令将导致在寄存器A0,A1,A2,A3中包含上述重复与第一条MULA指令之间的代码中所示的计算结果。为了说明乘累加指令如何操作,我们将考虑前四条MULA指令。第一条指令将X组寄存器0的第一或低16位的数据值乘以Y组寄存器0中的低16位,并将结果加到累加器寄存器A0中。同时用再填充位标记X组寄存器0的低16位,这指示该寄存器的该部分现在可用新数据值再填充。以这一方式标记是因为从图7中可看出,一旦将数据项d0乘以系数c0(由第一条MULA指令表示),对于其余块过滤指令d0便不再需要,因此能用新数据值取代。
然后第二条MULA指令将X组寄存器0的第二或高16位乘以Y组寄存器0的低16位(这表示图7中所示的乘法d1×c0)。类似地,第三与第四条MULA指令分别表示乘法d2×c0及d3×c0。从图7中可见,一旦执行过这四个计算,系数c0便不再需要,因此用再填充位标记寄存器Y0.l使它能用另一系数(c4)改写。
下面四条MULA指令分别表示计算d1×c1、d2×c1、d3×c1与d4×c1。一旦执行过d1×c1,便用再填充位标记寄存器x0.h,因为不再需要d1。类似地,一旦执行过全部四条指令,便将寄存器Y0.h标记为供再填充,因为不再需要系数c1。类似地,下面四条MULA指令对应于计算d2×c2、d3×c2、d4×c2及d5×c2,而最后四条指令则对应于计算d3×c3、d4×c3、d5×c3及d6×c3。
在上述实施例中,由于寄存器是不能重新映射的,各乘法运算必须用操作数中指定的所需特定寄存器明显地再生。一旦执行过16条MULA指令,便能为系数c4至c7及数据项d4至d10重复这一指令循环。并且由于每一次重复该循环在四个系数值上操作。所以系数值的数目必须是4的倍数并必须计算Z1=系数数/4。
通过采用按照本发明的较佳实施例的重新映射机制,可以极大地缩小指令循环,使得它只包含4条乘累加指令而不是否则所需要的16条乘累加指令。采用重新映射机制,将代码编写成如下所列<pre listing-type="program-listing"><![CDATA[;以4个新数据值开始ZERO{A0-A3} ;清零累加器REPEAT Z1,X++n4 w4 r4,Y++ n4 w4 r4;Z1=(系数的个数);对X与Y组进行重新映射;重新映射这些组中四个16位寄存器;在循环的每一次重复上将两组的基指针递增。;当基指针到达该组中第四个寄存器时便绕回。MULAA0,X0.l^,Y0.l,A0 ;a0+=d0*c0,及加载d4MULAA1,X0.h,Y0.1,A1 ;a1+=d1*c0MULAA2,X1.l,Y0.l,A2 ;a2+=d2*c0MULAA3,x1.h,Y0.l^,A3 ;a3+=d3*c0,及加载c4NEXT ;绕回到循琢并进行重新映射]]></pre>
如上所述,第一步将四个累加器寄存器A0-A3设置成0。然后进入用‘重复’与‘下一个’操作码定界的指令循环。重复指令拥有与之关联的若干参数,它们是X++指示对于X寄存器组基增量为“1”。
n4指示寄存器计数为“4”,因此要重新映射前四个X组寄存器X0.l至X1.hw4指示对于X寄存器组基环绕为“4”r4指示对于X寄存器组寄存器环绕为“4”Y++指示对于Y寄存器组基增量为“1”n4指示寄存器计数为“4”因此要重新映射前4个Y组寄存器Y0.l至Y1.h。
w4指示对于Y寄存器组基环绕为“4”r4指示对于Y寄存器组寄存器环绕为“4”还应指出,现在值Z1等于系数数目而不是先有技术示例中等于系数数目/4。
对于指令循环的第一次循环,基指针值为0,因此无重新映射。然而下一次执行循环时,对于X与Y组基指针值都将是“1”,因此将操作数重新映射如下X0.l成为X0.hX0.h成为X1.lX1.l成为X1.hX1.h成为X0.l(由于基环绕为“4”)Y0.l成为Y0.hY0.h成为Y1.lY1.l成为Y1.hY1.h成为Y0.l(由于基环绕为“4”)因此,在第二次重复时可看出,四条MULA指令实际上执行较早讨论的不包含本发明的重新映射的示例中用第五至第八条MULA指令所指示的计算。类似地,第三与第四次重复通过循环执行前面用先有技术代码的第九至第12及第13至第16条MULA指令执行的计算。
因此可以看出上述代码执行与先有技术代码完全相同的块过滤算法,但将循环体内的代码密度改进了一个因子4,由于只需要提供4条指令而不是先有技术所需的16条。
通过采用按照本发明的较佳实施例的寄存器重新映射技术,能实现下述优点1.改进代码密度;2.在一定场合中隐藏从标记寄存器为空到Piccolo的重定序缓冲器再填充该寄存器的等待时间。这可以以增加代码大小的代价通过解开循环来达到。
3.能存取可变数目的寄存器-通过改变执行的循环重复次数,可改变存取的寄存器数目;以及4.便于算法展开。对于适当的算法,程序员可为算法的第n阶段生成一段代码,然后利用寄存器重新映射将公式应用在一个滑动数据组上。
很明显可以不脱离本发明的范围对上述寄存器重新映射机制作出某些改变。例如,有可能为寄存器组10提供比程序员在指令操作数中所能指定的更多的物理寄存器。这些额外的寄存器不能直接存取,而寄存器重新映射机制能利用这些寄存器。例如,考虑早先讨论的X寄存器组具有程序员可利用的4个32位寄存器并因而可用逻辑寄存器引用指定8个16位寄存器的示例。有可能使X寄存器组实际上包含例如6个32位寄存器,在这一情况中将有4个附加的16位寄存器不能由程序员直接存取。然而,这四个额外的寄存器能被重新映射机制利用,借此为存储数据项提供附加的寄存器。
可使用以下的汇编程序语法>>表示逻辑右移,或者在移位操作数为负时左移(见下面<lscale>)。
->>表示算术右移,或者在移位操作数为负时左移(见下面<scale>)。
ROR表示循环右移SAT(a)表示a的饱和值(取决于目的地寄存器的大小饱和到16或32位)。具体地,为了饱和到16位,任何大于+0×7fff的值用+0×7fff代替,而任何小于-0×8000的值则用-0×8000代替。类似地饱和到32位用极限+0×7fffffff与-0×80000000。如果目的地寄存器为48位,饱和仍然在32位上。
源操作数1可用下述格式之一<Src1>将用作[Rn|Rn.l|Rn.h| Rn.×][^]的简写。换言之,源说明符的所有7位都有效,并作为(可选择地互换的)32位值或16位符号扩展的值读取寄存器。对于累加器只读取底部32位。^指示寄存器再填充。
<src1_16>是[Rn.l|Rn.h][^]的简写。只能读取16位值。
<src1_32>是[Rn|Rn.X][^]的简写。只能读取32位值,高与低一半有选择地互换。
<src_2>(源操作数2)可以是下述格式之一<src2>是三种选项的简写-形式[Rn|Rn.l|Rn.h|Rn.x][^]的源寄存器,加上最终结果的标度(<scale>)。
-可选择的移位的8位常量(<immed_8>),但无最终结果的标度。
-6位常量(<immed_6>)加上最终结果的标度(<scale>)。
<src2_maxmin>与<src2>相同但不允许定标。
<src2_shift>提供<src2>的有限子集的移位指令。见上述详细情况。
<src2_par>在<src2_shift>方面对于指定第三操作数的指令<acc>四个累加器寄存器[A0|A1|A2|A3]中任何一个的简写。读取全部48位。不能指定再填充。
目的地寄存器具有格式<dest>它是[Rn|Rn.l|Rn.h|.l|][^]的简写。不带“ .”扩展写入整个寄存器(在累加器情况中为48位)。在不需要写回到寄存器的情况中,所使用的寄存器是不重要的。汇编程序支持省略目的地寄存器来指示不需要写回,或用“.l”来指示不需要写回,但应设置标志,犹如结果为16位量。^表示将值写到输出FIFO中。
<scale>表示若干算术标度。可以利用的有14种标度ASR#0,1,2,3,4,6,8,10ASR#12至16LSL#1
<immed-8>代表不带符号的8位立即值。这包含循环左移0,8,16或24的一个字节。因此能为任何YZ编码值0×YZ000000、0×00YZ0000、0×0000YZ00、及0×000000YZ。循环是作为2位的量编码的。
<imm_6>代表不带符号的6位立即数。
<PARAMS>用来指定寄存器重新映射并具有下述格式<BANK><BASEINC>n<RENUMBER>w<BASEWRAP>
<BANK> 可以是[X|Y|Z]<BASEINC> 可以是[++|+1|+2|+4]<RENUMBER> 可以是
<BASEWRAP> 可以是[2|4|8]表达式<cond>为下述状态码中任何一种。注意编码与ARM稍有不同,因为不带符号的LS与HI码已被更有用的带符号的上溢/下溢测试所替代。Piccolo上的V与N标志的设置与ARM的不同,因此从状态测试到标志检验的翻译与ARM也不同。
0000 EQ Z=0上一次结果为0。
0001 NE Z=1上一次结果非0。
0010 CS C=1在移位/最大操作后使用。
0011 CC C=00100 MI/LT N=1 上一次结果为负0101 PL/GE N=0 上一次结果为正0110 VS V=1 上一次结果带符号溢出/饱和0111 VC V=0 上一次结果无溢出/饱和1000 VP V=1&N=0 上一次结果正溢出1001 VN V=1&N=1 上一次结果负溢出1010 保留1011 保留1100 GT N=0&Z=01101 LE N=1|Z=11110 AL1111 保留由于Piccolo处理带符号的量,弃掉不带符号的LS与HI状态而用描述任何溢出的方向的VP与VN来代替。由于ALU的结果为48位宽,MI与LT现在执行相同功能,类似地PL与GE。这留下3个空槽供未来扩展。
除非另有说明,所有运算都是带符号的。
一级与二级状态码各包含N-负。
Z-零。
C-进位/不带符号溢出。
V-带符号溢出。
算术指令可分成两类并行与“全宽度”。“全宽度”指令只设置一级标志,而并行运算符根据结果的高与低16位一半设置一级与二级标志。
在已施加定标但写到目的地之前,N、Z与V标志是根据整个ALU结果计算的。ASR将总是减少存储结果所需位数,而ASL则增加位数。为了防止在施加ASL定标时Piccolo截尾48位结果,将位数限制在必须进行零检测与溢出上。
N标志是假设正在进行带符号算术运算时计算的。这是因为在发生溢出时,结果的最高位是C标志或N标志之一,这取决于输入操作数是带符号还是不带符号的。
V标志指示作为将结果写到选择的目的地的结果是否出现任何精度损失。如果选择了不写回,仍然蕴含‘大小’,并正确地设置溢出标志。在下述情况中出现溢出-当结果不在范围-2^15至2^15-1中时写入16位寄存器。
-当结果不在范围-2^31至2^31-1中时写入32位寄存器。
并行加/减指令在结果的高与低一半上独立地设置N、Z与V标志。
当写入累加器时和写入32位寄存器一样设置V标志。这是允许饱和指令使用累加器作为32位寄存器。
饱和绝对值指令(SABS)在输入操作数的绝对值不符合指定的目的地时也设置溢出标志。
进位标志由加与减指令设置并由MAX/MIN、SABS及CLB指令用作‘二进制’标志。包含乘法运算在内的所有其它指令保留进位标志。
对于加与减运算,根据目的地是32还是16位宽,进位便是由位31或位15或结果生成的。
根据如何设置标志,可将标准算术指令分成若干类型在加与减指令的情况中,如果N位是置位的则保持所有标志。如果N位不置位则将标志更新如下如果全48位结果为0便置位Z。
如果全48位结果中位47置位(是负的)则置位N。
如果下述条件之一成立则置位V目的地寄存器为16位而带符号的结果放不进16位寄存器中(不在范围-2^15<=x<2^15内)。
目的地寄存器为32/48位寄存器而带符号的结果放不进32位中。
如果在求和<src1>与<src2>时从位31有进位或者从<src1>减去<src2>时位31不出现借位,则如果<dest>为32或48位寄存器时便置位C标志(与ARM上的所期望的相同进位值)。如果<dest>为16位寄存器,则如果和的位31进位便置位C标志。
保留二级标志(SZ、SN、SV、SC)。
在从48位寄存器执行乘法或累加指令的情况中。
如果全48位结果为0便置位Z。
如果全48位结果中位47置位(是负的),则置位N。
如果(1)目的地寄存器为16位而带符号的结果放不进16位寄存器(不在范围-2^15<=x<2^15内)或(2)目的地寄存器为32/48位寄存器而带符号的结果放不进32位中,便置位V。
保留C。
保留二级标志(SZ、SN、SV、SC)。
下面讨论包含逻辑运算、并行加与减、最大与最小、移位等在内的其它指令。
加与减指令将两个寄存器相加或相减,定标该结果,然后存储回到一个寄存器。将操作数作为带符号的值对待。对于非饱和变型,标志更新是供选用的,并可通过在指令尾部附加一个N来抑制标志更新。31 30 29 28 2726 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OPC指定指令的类型操作(OPC)<pre listing-type="program-listing"><![CDATA[100N0dest=(src1+src2)(->>scale)(,N)110N0dest=(src1-src2)(->>scale)(,N)10001dest=SAT((src1+src2)(->>scale))11001dest=SAT((src1-src2)(->>scale))01110dest=(src2-src1)(->>scale)01111dest=SAT((src2-src1)(->>scale))101NOdest=(src1+src2+Carry)(->>scale)(,N)111NOdest=(src1-src2+Carry-1)(->>scale)(,N)助记符100NOADD{N} <dest>,<src1>,<src2>{,<scale>}110NOSUB{N} <dest>,<src1>,<src2>{,<scale>}10001SADD<dest>,<src1>,<src2>{,<scale>}11001SSUB<dest>,<src1>,<src2>{,<scale>}01110RSB <dest>,<src1>,<src2>{,<scale>}01111SRSB<dest>,<src1>,<src2>{,<scale>}101N0ADC{N} <dest>,<src1>,<src2>{,<scale>}111N0SBC{N} <dest>,<src1>,<src2>{,<scale>}]]></pre>汇编程序支持下述操作码<pre listing-type="program-listing"><![CDATA[ CMP <src1>,<src2>, CMN <src1>,<src2>,]]></pre>CMP为减法,它设置标志并禁止寄存器写。CMN为加法,它设置标志并禁止寄存器写。
标志上面已讨论过.包含的理由在移位/最大/最小操作之后将进位插入寄存器底部ADC是有用的。它也用来进行32/32位除法。它也提供扩充精度加法,N位加法给出更精密的标志控制,特别是进位。这使得32/32位除法能在每位2个周期上进行。
G.729等需要饱和的加与减。
增量/减量计数器。RSB对于计算移位是有用的(x-32-x是常用运算)。对于饱和的求反(用在G.729中)需要饱和的RSB。
加/减累计指令执行带累计与定标/饱和的加法与减法。与乘累加指令不同,不能独立于目的地寄存器指定累加器号。目的地寄存器的底部两位给出要累计到其中的48位累加器号acc,因此ADDA x0,x1,x2,A0与ADDA A3,x1,x2,A3是有效的,而ADDA x1,x1,x2,A0则无效。对于这类指令,必须将结果写回寄存器-不允许目的地字段的不写回编码。
OPC指定指令的类型。下面的acc为(DEST[1:0])。Sa位指示饱和。
操作(OPC)<pre listing-type="program-listing"><![CDATA[ 0 dest={SAT}(acc+(src1+src2))(->>scale} 1 dest=(SAT)(acc+(src1-src2)){->>scale}]]></pre>助记符<pre listing-type="program-listing"><![CDATA[ 0{S}ADDA <dest>,<src1>,<src2>,<acc>{,<scale>} 1{S}SUBA <dest>,<arc1>,<src2>,<acc>{,<scale>}]]></pre>命令前面的S表示饱和。
标志见上面。
包含的理由ADDA(加累计)指令对于用累加器每一周期求和整数数组的两个字是有用的(例如找出它们的平均值)。SUBA(减累计)指令在计算差之和(用于相关)中是有用的;它将两个独立的值相减并将差加到第三寄存器中。
带四舍五入的加法可用与<acc>不同的<dest>进行。例如,X0=(X1+X2+16384)>>15可通过将16384保持在A0中而在一个周期中完成。带四舍五入的常量的加法可用ADDA X0,X1,#16384,A0来完成。
对于((a_i*b_j)>>k)之和(在TrueSpeech中相当常用)的位精确实现标准Piccolo代码为<pre listing-type="program-listing"><![CDATA[ MUL t1,a_0,b_0,ASR#K ADD ans,ans,t1 MUL t2,a_1,b_1,ASR#k ADD ans,ans,t2]]></pre>这一代码有两个问题它太长以及不是加到48位精度,因此不能用保护位。较好的解决方法为使用ADDA<pre listing-type="program-listing"><![CDATA[ MUL t1,a_0,b_0,ASR#k MUL t2,a_1,b_1,ASR#k ADDA ans,t1,t2,ans]]></pre>这提高25%速度并保持48位精度。
并行加/减指令在成对保持在32位寄存器中的两个带符号的16位量上执行加法与减法。一级状态码标志从高16位的结果设置,而二级标志则从低位一半更新。只能指定32位寄存器作为这些指令的源,虽然这些值是可以半字互换的。将各寄存器的各个一半作为带符号的值对待。计算与定标是不损失精度完成的。因此ADD ADD X0,X1,X2,ASR#1将在X0的高位与低位一半中产生正确的平均值。为必须置位Sa位的各指令提供了选用的饱和。31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
<p>OPC定义操作操作(OPC)<pre listing-type="program-listing"><![CDATA[ 000 dest.h=(src1.h+src2.h)->>{scale}, dest.l=(src1.l+src2.l)->>{scale} 001 dest.h=(src1.h+src2.h)->>{scale}, dest.l=(src1.l-src2.l)->>{scale} 100 dest.h=(src1.h-src2.h)->>{scale}, dest.l=(src1.l+src2.l)->>{scale} 101 dest.h=(src1.h-src2.h)->>{scale}, dest.l=(src1.l-src2.l)->>{scale}]]></pre>如果置位了Sa位,各和/差是独立饱和的。助记符<pre listing-type="program-listing"><![CDATA[ 000{S}ADDADD<dest>,<src1_32>,<src2_32>{,<scale>} 001{S}ADDSUB<dest>,<src1_32>,<src2_32>{,<scale>} 100{S}SUBADD<dest>,<src1_32>,<src2_32>{,<scale>} 101{S}SUBSUB<dest>,<src1_32>,<src2_32>{,<scale>}]]></pre>命令前的S表示饱和。汇编程序还支持<pre listing-type="program-listing"><![CDATA[ CMNCMN <dest>,<src1_32>,<src2_32>{,<scale>} CMNCMP <dest>,<src1_32>,<src2 32>{,<scale>} CMPCMN <dest>,<src1_32>,<src2_32>{,<scale>} CMPCMP <dest>,<srcl_32>,<src2_32>{,<scale>}]]></pre>它们是不带写回的标准指令生成的。
标志C如果在相加两个高16位一半时从位15进位,便置位。
Z如果高16位一半之和为0,便置位。
N如果高16位一半之和为负,便置位。
V如果高16位一半的带符号的17位和不能装入16位中(定标后),便置位。
类似地为低16位一半置位SZ、SN、SV与SC。
包含的理由并行加与减指令对于在保持在单个32位寄存器中的复数上执行运算是有用的。它们用在FFT(快速傅里叶变换)核心中。它对于16位数据的简单矢量加法/减法也是有用的,允许在一个周期中处理两个元素。
转移(条件)指令允许控制流中的条件改变。Piccolo占用三个周期来执行所取的转移。31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0<
操作如果根据一级标志<cond>成立,用偏移量转移。
偏移量为带符号的16位字数。当前偏移的范围限制在-32768至+32767个字。
执行的地址计算是目标地址=转移指令地址+4+偏移量助记符B<cond><destination_label>
标志不受影响。
包含的理由在大多数例程中高度有用。
条件加或减指令有条件地将src1加在src2上或从src1中减去src2。3130 29 28 27 26 25 24 22 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OPC指定指令的类型。
操作(OPC)如果(进位置位)temp=src1-src2否则temp=src1+src2dest=temp{->>scale}如果(进位置位)temp=src1-src2否则temp=src1+src2dest=temp{->>scale}但是如果定标是左移位则将(来自src1-src2或src1+src2的)进位的新值移位进底部中。
助记符<pre listing-type="program-listing"><![CDATA[ 0CAS <dest>,<src1>,<src2>,{,<scale>} 1CASC <dest>,<src1>,<src2>,{,<scale>}]]></pre>标志见上面包含的理由条件加或减指令使高效除法代码能构成。
例1将X0中的32位不带符号值除以X1中的16位不带符号值(假设X0<(X1<<16)及X1.h=0)。
LSL X1,X1,#15;上移除数SUB X1,X1,#0;置位进位标志REPEAT#16CASC X0,X0,X1,LSL#1NEXT在循环末尾,X0.l保持除法的商。取决于进位的值可从X0.h恢复余数。
例2将X0中的32位正值除以X1中的32位正值,带早结束。
MOVX2,#0 ;清除商LOGZ0,X0 ;X0可移位的位数LOGZ1,X1 ;X1可移位的位数SUBS Z0,Z1,Z1 ;X1向上移位因此1匹配BLTdiv_end ;X1>X0因此答数为0LSLX1,X1,Z0 ;匹配前面的1ADDZ0,Z0,#1 ;进行的测试数SUBS Z0,Z0,#0 ;置位进位REPEAT Z0CASX0,X0,X1,LSL#1ADCN X2,X2,X2NEXTdiv_end在结束处,X2保持商而余数可从X0恢复。
计数前导位指令使数据能正规化。31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
操作将dest设定为为了使位31与位30不同而src1中的值必须左移的位数。这是范围0-30中的一个值,但除外src1为-1或0的特殊情况,这时返回31。
助记符CLB<dest>,<src1>
标志Z如果结果为0,便置位。
N是消除的。
C如果src1为-1或0之一,便置位。
V保持。
包含的理由正规化需要的步骤。
设置了停止与断点指令用于停止Picco1o的执行31 30 29 28 27 2625 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OPC指定指令的类型。
操作(OPC)0 Piccolo执行被停止并在Piccolo状态寄存器中置位停止位。
1 Piccolo执行停止,并在Piccolo状态寄存器中置位中断位,并中断ARM报告已到达断点。
助记符0 HALT1 BREAK标志不受影响。
逻辑运算指令在32或16位寄存器上执行逻辑运算。将操作数作为不带符号值对待。31 3029 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0<
>OPC编码要执行的逻辑运算操作(OPC)<pre listing-type="program-listing"><![CDATA
]></pre>汇编程序支持下述操作码;<pre listing-type="program-listing"><![CDATA[ TST <src1>,<src2> TEQ <src1>,<src2>]]></pre>
TST为禁止寄存器写的“与”。TEQ为禁止寄存器写的“EOR”。
标志Z如果结果为全0,便置位N、C、V保持SZ、SN、SC、SV保持包含的理由话音压缩算法采用组合位字段来编码信息。位屏蔽指令协助抽取/组合这些字段。
Max与Min操作指令执行最大与最小值运算。3130 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OPC指定指令的类型。
操作(OPC)<pre listing-type="program-listing"><![CDATA[ 0 dest=(src1<=src2) src1:src2 1 dest=(src1>src2) src1:src2]]></pre>助记符<pre listing-type="program-listing"><![CDATA[ 0MIN<dest>,<src1>,<src2> 1MAX<dest>,<src1>,<src2>]]></pre>标志Z如果结果为0,便置位。
N如果结果为负,便置位。
C对于Max如果src2>=src1(dest=src1情况),置位C对于Min如果src2>=src1(dest=src2情况),置位CV保持包含的理由为了找出信号强度,许多算法扫描样本来找出样本的绝对值的最大/最小值。对此,MAX与MIN是无价之宝。取决于要找出信号中第一还是最后的最大值,操作数src1与src2可以互换。
MAX X0,X0,#0将X0转换成从下面修剪掉的正数。
MIN X0,X0,#255从上面修剪掉。这对于图形处理有用。
并行指令中的Max与Min运算在并行的16位数据上执行最大值与最小值运算。
OPC指定指令的类型。操作(OPC)<pre listing-type="program-listing"><![CDATA
]></pre>
标志Z如果结果的高16位为0,便置位。
N如果结果的高16位为负,便置位。
C对于Max如果src2.h>=src1.h(dest=src1情况),置位C对于Min如果src2.h=src1.h(dest=src2情况),置位C。
V保持。
SZ、SN、SC、SV类似地为低16位一半置位。
包含的理由关于32位Max及Min。
传送长立即数操作指令允许将寄存器设置成任何带符号的16位、符号延伸的值。两条这种指令能将32位寄存器设置成任何值(通过顺序存取高位与低位一半)。对于寄存器之间的传送见选择操作。31 3029 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
助记符MOV<dest>,#<inm_16>
汇编程序利用MOV指令提供非互锁的NOP(空操作)操作,即,NOP等效于MOV,#0。
标志标志不受影响。
包含的理由初始化寄存器/计数器。
乘累加运算指令执行带符号乘法与累加或累减(de-accumulation),定标与饱和。31 30 29 28 27 26 25 24 23 22 21 20 19 18 1716 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
<p>字段OPC指定指令的类型。
操作(OPC)<pre listing-type="program-listing"><![CDATA[ 00 dest=(acc+(src1*src2)){->>scale} 01 dest=(acc-(src1*src2)){->>scale}]]></pre>在各情况中,如果置位了Sa位,在写到目的地之前将结果饱和。
助记符<pre listing-type="program-listing"><![CDATA[ 00{S}MULA <dest>,<src1_16>,<src2-16>,<acc>{,<scale>} 01{S}MULS <dest>,<src1_16>,<src2_16>,<acc>{,<scale>}]]></pre>命令前的S指示饱和。
标志见上节。
包含的理由对于FIR代码需要单周期持续的MULA。MULS用在FFT蝶形电路中。对于带四舍五入的乘法MULA也是有用的。例如通过将16384保持在另一累加器(例如A1)中可在一个周期中完成A0=(X0*X1+16384)>>15。对于FFT核心还需要不同的<dest>与<acc>。
乘双倍运算(Multiply Double Operation)指令执行单符号乘法,在累加或累减、定标与饱和之前将结果加倍。31 30 29 28 27 26 25 24 23 22 21 20 19 18 1716 15 14 13 1211 10 9 8 7 6 5 4 3 2 1 0
OPC指定指令的类型。
操作(OPC)<pre listing-type="program-listing"><![CDATA[ 0 dest=SAT((acc+SAT(2*src1*src2)){->>scale}) 1 dest=SAT((acc-SAT(2*src1*src2)){->>scale})]]></pre>
助记符<pre listing-type="program-listing"><![CDATA[ 0 SMLDA <dest>,<src1_16>,<src2_16>,<acc>{,<scale>} 1 SMLDS <dest>,<src1_16>,<src2_16>,<acc>{,<scale>}]]></pre>标志见上节。
包含的理由G.729及使用小数算术运算的其它算法需要MLD指令。大多数DSP提供能在累加或写回之前在乘法器的输出上左移一位的小数模式。作为特定的指令支持它提供更大的编程灵活性。等价于某些G系列基本运算的名称为<pre listing-type="program-listing"><![CDATA[ L_msu=>SMLDS L_mac=>SMLDA]]></pre>在左移一位时它们利用乘法器的饱和。如果需要一序列的小数乘累加而不损失精度,可采用MULA,其和保持在33.14格式中。必要时,可在结束时利用左移及饱和转换到1.15格式。
乘法运算指令执行带符号乘法,及选用的定标/饱和。将源寄存器(只是16位)作为带符号数对待。31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OPC指定指令的类型。
操作(OPC)<pre listing-type="program-listing"><![CDATA[ 0dest=(src1*src2){->>scale} 1dest=SAT((src1*src2){->>scale})]]></pre>助记符
<pre listing-type="program-listing"><![CDATA[ 0MUL<dest>,<src1_16>,<src2>{,<scale>} 1SMUL<dest>,<src1_16>,<src2>{,<scale>}]]></pre>标志见上节。
包含的理由许多处理需要带符号与饱和的乘法。
寄存器列表操作用来在一组寄存器上执行操作。提供了空与零指令用于在例程之前或之间复位选择的寄存器。提供了输出指令将列出的寄存器的内容存储到输出FIFO中。31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OPC指定指令的类型。操作(OPC)<pre listing-type="program-listing"><![CDATA
]></pre>助记符<pre listing-type="program-listing"><![CDATA[ 000 EMPTY<register_list> 001 ZERO <register_list> 010 Unused 011 Unused 100 OUTPUT <register_list>{,<scale>} 101 OUTPUT <register_list>^{,<scale>} 110 SOUTPUT <register_list>{,<scale>} 111 SOUTPUT <register_list>^{,<scale>}]]></pre>标志不受影响示例<pre listing-type="program-listing"><![CDATA[ EMPTY{A0,A1,X0-X3} ZERO {Y0-Y3} OUTPUT {X0-Y1}^]]></pre>汇编程序还支持语法OUTPUT Rn在这一情况中,利用MOV^,Rn指令输出一个寄存器。EMPTY指令将停止直到所有要清空的寄存器包含有效数据
(即不空)。
寄存器列表操作不得在重新映射REPEAT(重复)循环内使用。
输出(OUTPUT)指令最多只能指定输出8个寄存器。
包含的理由例程结束后,下一个例程期望所有寄存器是空的以便它能从ARM接收数据。需要EMPTY指令来做到这一点。在执行FIR或过滤器之前,需要将所有累加器及部分结果清零。ZERO(零)指令协助做到这一点。通过取代一系列单个寄存器传送,两者都设计成改善代码密度。包含OUTPUT(输出)指令通过取代一系列MOV^,Rn指令来改善代码密度。
提供了重新映射参数传送指令RMOV来允许配置用户定义的寄存器重新映射参数。
该指令编码如下31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0<
各PARAMS字段包含以下的项654321 0<
>这些项的含义如下<
助记符<pre listing-type="program-listing"><![CDATA[ RMOV<PARAMS>,[<PARAMS>]<PARAMS>字段具有以下格式 <PARAMS>∷=<BANK><BASEINC>n<RENUMBER>w<BASEWRAP><BANK> ∷=[X|Y|Z] <BASEINC>∷=[++|+1|+2|+4] <RENUMBER>∷=
<BASEWRAP>∷=[2|4|8]]]></pre>如果使用RMOV指令同时重新映射是活动的,其行为是UNPREDICTABLE(不可预测)。
标志不受影响重复指令提供硬件中的4个零周期循环。重复指令定义新的硬件循环。Piccolo为第一条重复指令利用硬件循环0,为嵌套在第一重复指令内的重复指令利用硬件循环1等等。重复指令不需要指定正在使用哪一个循环。重复循环必须严格嵌套。如果试图嵌套循环到大于4的深度,则行为是不可预测的。
各重复指令指定循环中的指令数(紧接在重复指令后面的)及通过循环的次数(它是常量或读自Piccolo寄存器)。
如果循环中的指令数较少(1或2)则Piccolo可用额外周期来建立循环。
如果循环计数是寄存器指定的,则蕴含32位存取(S1=1),但只认为底部16位是有效的并且数字是不带符号的。如果循环计数为0,则循环的操作是未定义的。采取循环计数的复制,因此立即可以重用该寄存器(甚至再填充)而不影响循环。
重复指令提供修改指定循环内的寄存器操作数的方式的机制。细节上面已描述过。
带有寄存器指定的循环数的重复的编码31 3029 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
<p>带固定的循环数的重复的编码31 30 29 28 27 26 25 24 32 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
RFIELD操作数指定在循环内使用16种重新映射参数配置的哪一种。
汇编程序提供两个操作码REPEAT与NEXT来定义硬件循环,REPEAT在循环开始时而NEXT界定循环的结束,允许汇编程序计算循环体内的指令数。至于REPEAT,它只须作为常量或寄存器指定循环次数。例如<pre listing-type="program-listing"><![CDATA[ REPEAT X0 MULA A0,Y0.l,Z0.l,A0 MULA A0,Y0.h^,Z0.h^,A0 NEXT]]></pre>这将执行两条MULA指令X0次。同时,<pre listing-type="program-listing"><![CDATA[ REPEAT#10 MULA A0,X0^,Y0^,A0 NEXT]]></pre>将执行10次乘累加。
汇编程序支持语法
REPEAT#iterations[,<PARAMS>]以指定重复所用的重新映射参数。如果所需的重新映射参数等于预定义的参数组之一,则使用适当的REPEAT编码。如果不是,则汇编程序将生成RMOV来加载用户定义的参数,后面跟随REPEAT指令。见上面的节中的RMOV指令及重新映射参数格式的细节。
如果循环的重复次数为0则REPEAT的操作是不可预测的。
如果将指令字段的数字设置为0则REPEAT的操作是不可预测的。
循环只包含一条指令而该指令为转移时,则具有不可预测的表现。
从REPEAT循环界内转移到该循环的界外是不可预测的。
饱和绝对值指令计算源1的饱和的绝对值。
操作dest=SAT((Src1>=0) src1:-src1)。该值总是饱和的。具体地,0x80000000的绝对值为0x7fffffff而不是0x80000000!助记符SABS<dest>,<src1>
标志Z如果结果为0,便置位。
N保持。
c如果src1<0(dest=-src1情况),便置住。
V如果出现饱和,便置住。
包含的理由在许多DSP应用中有用。
选择操作(条件传送)用来有条件地将源1或源2传送到目的地寄存器中。选择总是等效于传送。还有在并行加/减以后使用的并行操作。
注意为了实现的原因,可读取两个源操作数,如果其中之一为空,指令将停止,不管该操作数是否是严格需要的。31 30 29 28 27 26 25 2423 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OPC指定指令的类型。
操作(OPC)<pre listing-type="program-listing"><![CDATA
]></pre>助记符<pre listing-type="program-listing"><![CDATA[ 00SEL<cond> <dest>,<src1>,<src2> 01SELTT<cond> <dest>,<src1>,<src2> 10SELTF<cond> <dest>,<src1>,<src2> 11不用]]></pre>如果将寄存器标记为再填充,无条件将其再填充。汇编程序还提供下列助记符
<pre listing-type="program-listing"><![CDATA[ MOV<cond><dest>,<src1> SELFT<cond><dest>,<src1>,<src2> SELFF<cond><dest>,<src1>,<src2>]]></pre>MOV<cond>A,B等效于SEL<cond>A,B,A。通过互换src1与src2及使用SELTF、SELTT得到SELFT及SELFF。
标志保持所有标志以便可以执行一序列选择。
包含的理由用于在线作出简单决定而无须依靠转移。用于Viterbi算法及在样本或矢量中扫描最大元素时。
移位操作指令提供逻辑左与右移,算术右移及循环指定的量。认为移位量是取自寄存器内容的低8位的-128与+127之间的带符号整数或者在范围+1至+31中的立即数。负数量的移位导致反方向上移位ABS(移位量)。
将输入操作数符号扩展到32位;在写回前将得出的32位输出符号扩展到48位从而写到48位寄存器表现合理。31 3029 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OPC指定指令的类型。
操作(OPC)<pre listing-type="program-listing"><![CDATA[ 00 dest=(src2>=0) src1<<src2:src1>>-src2 01 dest=(src2>=0) src1>>src2:src1<<-src2 10 dest=(src2>=0) src1->>src2:src1<<-src2 11 dest=(src2>=0) src1 ROR src2:src1ROL-src2]]></pre>
助记符<pre listing-type="program-listing"><![CDATA[ 00ASL<dest>,<src1>,<src2_16> 01LSR<dest>,<src1>,<src2_16> 10ASR<dest>,<src1>,<src2_16> 11ROR<dest>,<src1>,<src2_16>]]></pre>标志Z如果结果为0,便置位。
N如果结果为负,便置位。
V保持C设置成移位出来的最后一位的值(和在ARM上一样)寄存器指定的移位的行为为-LSL移位32得出结果0,C设置为src1的位0。
-LSL移位32以上得出结果0,C设置为0。
-LSR移位32得出结果0,C设置为src1的位31。
-LSR移位32以上得出结果0,C设置为0。
-ASR移位32或以上得出用src1的位31填充及C设置为src1的位31。
-ROR移位32具有结果等于src1并将C设置成src1的位31。
-ROR移位n位,其中n大于32,给出执行ROR移位n-32位相同的结果;因此从n中重复减去32直到该量在1至32范围中为止,见上。
包含的理由用2的幂乘/除。位与字段抽取。串行寄存器。
将未定义的指令在指令集清单中陈述如上。它们的执行将导致Piccolo停止执行,并置位状态寄存器中的U位,及禁止它本身(似乎清除了控制寄存器中的E位)。这允许截获指令集的任何未来扩充并在现有实现上有选择地仿真。
从ARM访问Piccolo状态如下。状态访问模式用来观察/修改Piccolo的状态。为两种目的设置这一机制-上下文切换。
-调试。
通过执行PSTATE指令将Piccolo置于状态访问模式中。这一模式允许用一序列STC与LDC指令保存及恢复所有Piccolo状态。当进入状态访问模式时,将Piccolo协处理器ID PICCOL01的使用修改成允许访问Piccolo的状态。有7组Piccolo状态。可以用单一的LDC或STC加载与存储特定组中的所有数据。
组0专用寄存器。
-一个32位字,包含Piccolo ID寄存器的值(只读)。
-一个32位字,包含控制寄存器的状态。
-一个32位字,包含状态寄存器的状态。
-一个32位字,包含程序计数器的状态。
组1通用寄存器(GPR)-16个32位字,包含通用寄存器状态。
组2累加器-4个32位字,包含累加器寄存器的高32位(注意,为了恢复的目的,以GPR状态进行复制是必要的-否则会蕴含该寄存器组上的另一次写使能)。
组3寄存器/Piccolo ROB/输出FIFO状态。
-一个32位字,指示哪些寄存器标记为再填充(每一个32位寄存器2位)。
-8个32位字,包含ROB标签的状态(存储在位7至0中的8个7位项)。
-3个32位字,包含不对齐的ROB锁存器的状态(位17至0)。
-一个32位字,指示输出移位寄存器中哪些槽包含有效数据(位4表示空,位3至0编码所用项的号码)。
-一个32位字,包含输出FIFO保持锁存器的状态(位17至0)。
组4ROB输入数据。
-8个32位数据值。
组5输出FIFO数据。
-8个32位数据值。
组6循环硬件。
-4个32位字,包含循环起始地址。
-4个32位字,包含循环结束地址。
-4个32位字,包含循环计数(位15至0)。
-一个32位字,包含用户定义的重新映射参数及其它重新映射状态。
LDC指令用于在Piccolo在状态访问模式中时加载Piccolo状态。BANK字段指示正在加载哪一个组。31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
以下序列加载来自寄存器R0中的地址的所有Piccolo状态。
LDP B0,[R0],#16!;专用寄存器LDP B1,[R0],#64!;加载通用寄存器LDP B2,[R0],#16!;加载累加器LDP B3,[R0],#56!;加载寄存器/ROB/FIFO状态LDP B4,[R0],#32!;加载ROB数据LDP B5,[R0],#32!;加载输出FIFO数据LDP B6,[R0],#52!;加载循环硬件STC指令用于在Piccolo在状态访问模式中时存储Piccolo状态。BANK字段指定正在存储哪一个组。31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
以下序列将所有Piccolo状态存储到寄存器R0中的地址。
STP B0,[R0],#16!;保存专用寄存器STP B1,[R0],#64!;保存通用寄存器STP B2,[R0],#16!;保存累加器STP B3,[R0],#56!;保存寄存器/ROB/FIFO状态STP B4,[R0],#32!;保存ROB数据STP B5,[R0],#32!;保存输出FIFO数据
STP B6,[R0],#52!;保存循环硬件调试模式-Piccolo需要响应与ARM所支持的相同的调试机制,即软件通过Demon与Angel,以及带有嵌入的ICE的硬件,下面是调试Piccolo系统的若干机制-ARM指令断点。
-数据断点(观察点)。
-Piccolo指令断点。
-Piccolo软件断点。
ARM指令与数据断点是由ARM嵌入的ICE模块处理的;Piccolo指令断点是由Piccolo嵌入的ICE模块处理的;Piccolo软件断点是由Piccolo核处理的。
硬件断点系统可配置成使ARM与Piccolo两者都有断点。
软件断点由Piccolo指令(停机或中断)处理,导致Piccolo停止执行,进入调试模式(置位状态寄存器中的B位)及禁止本身(似乎已用PDISABLE指令禁止Piccolo)。程序计数器保持有效,允许恢复断点地址。Piccolo不再执行指令。
单步进Piccolo可通过在Piccolo指令流上设定一个断点接一个断点来完成。
软件调试-Piccolo提供的基本功能便是在状态访问模式中通过协处理器指令加载与保存所有状态到存储器中的能力。这允许调试程序将所有状态保存在存储器中,读取与/或更新它及恢复到Piccolo中。Piccolo存储状态机制是非破坏性的,即Piccolo的存储状态操作不会破坏任何Piccolo内部状态。这意味着Piccolo在转储其状态之后不首先再一次恢复它便能重新起动。
要确定找出Piccolo高速缓冲存储器的状态的机制。
硬件调试-硬件调试由Piccolo的协处理器接口上的扫描链提供。然后可将Piccolo置于状态访问模式中并通过该扫描链检验/修改其状态。
Piccolo状态寄存器包含单一的位来指示它已执行了断点指令。在执行断点指令时,Piccolo置位状态寄存器中的B位,并停止执行。为了能查询Piccolo,调试程序必须启动Piccolo并通过在能出现随后的存取之前写入其控制寄存器而将其置于状态访问模式中。
图4示出响应高/低位及大小位将选择的寄存器的适当的一半切换到Piccolo数据路径上的多路复用器配置。如果大小位指示16位,则符号扩展电路用适当的0或1填充数据路径的高位。
权利要求
1.一个用于数据处理的装置,所述装置包括用于存储要处理的数据字的多个寄存器,每一个所述寄存器具有至少N位的容量;以及一个算术逻辑单元,用于响应程序指令字执行由所述程序指令字指定的算术逻辑操作;其中所述算术逻辑单元响应至少一个程序指令字,该程序指令字包括(ⅰ)一个源寄存器位字段,它指定存储所述程序指令字的一个输入操作数数据字的所述多个寄存器中的一个源寄存器;(ⅱ)一个输入操作数长度标志,用于指定所述输入操作数数据字是否具有N位的长度或者N/2位的长度;以及(ⅲ)一个高/低位置标志,在所述输入操作数长度标志指示为一个(N/2)位的长度时,该高/低位置标志指示该输入操作数数据字位于所述源寄存器的高位位置和低位位置中的哪一个。
2.根据权利要求1的装置,还包括一个N位数据总线,用于在一个数据存储设备和所述多个寄存器之间传送数据字。
3.根据权利要求2的装置,还包括一个输入缓存器,用于从所述N位数据总线接收数据字以及将所述N位数据字提供给所述多个寄存器。
4.根据前述任一权利要求的装置,其中所述算术逻辑单元响应至少一个并行操作的程序指令字,在第一个(N/2)位输入操作数数据字上和第二个(N/2)位输入操作数数据字上执行单独的算术逻辑操作,这些输入操作数数据字分别存储在一个源寄存器中的高位位置和低位位置。
5.根据权利要求4的装置,其中所述算术逻辑单元具有一个信号通路,在算术逻辑操作中它起到位位置之间的进位链的作用,并且在执行一个并行操作的程序指令字时,所述信号通路在所述第一个(N/2)位输入操作数数据字和所述第二个(N/2)位输入操作数数据字之间断开。
6.根据权利要求4或5的装置,其中所述并行操作的程序指令字执行下列算术逻辑操作之一(ⅰ)并行加,其中执行两个并行的(N/2)位加;(ⅱ)并行减,其中执行两个并行的(N/2)位减;(ⅲ)并行移位,其中执行两个并行的(N/2)位移位操作;(ⅳ)并行加/减,其中并行执行一个(N/2)位加和一个(N/2)位减。
7.根据前述任一权利要求的装置,其中在所述输入长度标志指示一个N位长度时,所述高/低位置标志指示在作为一个N位输入操作数数据字使用之前是否将存储在所述高位位置的那些位移动到所述低位位置,以及将存储在所述低位位置的那些位移动到所述高位位置。
8.根据前述任一权利要求的装置,其中所述算术逻辑单元具有一个N位的数据通路。
9.根据权利要求8的装置,还包括至少一个多路转换器,该多路转换器响应所述高/低位置标志,选择向所述数据通路的低(N/2)位提供存储在所述源寄存器的高位位置和所述源寄存器的低位位置之一的一个(N/2)位输入操作数数据字。
10.根据权利要求8或9的装置,还包括一个电路,以在将一个(N/2)位输入操作数数据字输入到所述N位数据通路之前对其进行符号扩展。
11.一种处理数据的方法,所述方法包括以下步骤将要进行处理的数据字存储在多个寄存器中,每一个所述寄存器具有至少N位的容量;以及响应程序指令字执行由所述程序指令字指定的算术逻辑操作;其中至少一个程序指令字包括(ⅰ)一个源寄存器位字段,它指定存储所述程序指令字的一个输入操作数数据字的所述多个寄存器中的一个源寄存器;(ⅱ)一个输入操作数长度标志,用于指定所述输入操作数数据字是否具有N位的长度或者N/2位的长度;以及(ⅲ)一个高/低位置标志,在所述输入操作数长度标志指示为一个(N/2)位的长度时,该高/低位置标志指示该输入操作数数据字位于所述源寄存器的高位位置和低位位置中的哪一个。
全文摘要
一个数据处理系统包括多个寄存器(10)和一个算术逻辑单元(20,22,24),该数据处理系统中的程序指令字具有一个源寄存器位字段Sn,它指定存储一个输入操作数数据字的一个寄存器;一个输入操作数长度标志,用于指定所述输入操作数数据字是否具有N位的长度或者N/2位的长度;以及一个高/低位置标志,如果一个输入操作数的长度较小时,该高/低位置标志指示该输入操作数存储在位于所述源寄存器的高位位置和低位位置中的哪一个。该算术逻辑单元最好也能够执行并行操作的程序指令字,以独立操作存储在一个寄存器的相应的各半部分中的(N/2)位输入操作数数据字。
文档编号G06F9/34GK1226325SQ9719672
公开日1999年8月18日 申请日期1997年8月22日 优先权日1996年9月23日
发明者D·V·贾加尔, S·J·格拉斯 申请人:Arm有限公司