CN1103961C - 协处理器的数据访问控制装置和方法 - Google Patents

协处理器的数据访问控制装置和方法 Download PDF

Info

Publication number
CN1103961C
CN1103961C CN98806108A CN98806108A CN1103961C CN 1103961 C CN1103961 C CN 1103961C CN 98806108 A CN98806108 A CN 98806108A CN 98806108 A CN98806108 A CN 98806108A CN 1103961 C CN1103961 C CN 1103961C
Authority
CN
China
Prior art keywords
register
instruction
coprocessor
memory
data
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CN98806108A
Other languages
English (en)
Other versions
CN1260054A (zh
Inventor
R·约克
D·J·西尔
D·赛姆斯
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
ARM Ltd
Original Assignee
Advanced Risc Machines Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Advanced Risc Machines Ltd filed Critical Advanced Risc Machines Ltd
Publication of CN1260054A publication Critical patent/CN1260054A/zh
Application granted granted Critical
Publication of CN1103961C publication Critical patent/CN1103961C/zh
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/34Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes
    • G06F9/355Indexed addressing
    • G06F9/3552Indexed addressing using wraparound, e.g. modulo or circular addressing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/30101Special purpose registers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/30105Register structure
    • G06F9/30109Register structure having multiple operands in a single register
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/30105Register structure
    • G06F9/30112Register structure comprising data of variable length
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/3012Organisation of register space, e.g. banked or distributed register file
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/32Address formation of the next instruction, e.g. by incrementing the instruction counter
    • G06F9/322Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address
    • G06F9/325Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address for loops, e.g. loop detection or loop counter
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/34Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes
    • G06F9/355Indexed addressing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3838Dependency mechanisms, e.g. register scoreboarding
    • G06F9/384Register renaming
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3877Concurrent instruction execution, e.g. pipeline, look ahead using a slave processor, e.g. coprocessor
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3877Concurrent instruction execution, e.g. pipeline, look ahead using a slave processor, e.g. coprocessor
    • G06F9/3879Concurrent instruction execution, e.g. pipeline, look ahead using a slave processor, e.g. coprocessor for non-native instruction execution, e.g. executing a command; for Java instruction set

Abstract

一个数字信号处理系统包括一个中央处理单元核(2),一个存储器(8)和一个协处理器(4),该协处理器使用协处理器存储器访问指令(例如LDC,STC)进行操作。在这些协处理器存储器访问指令(P,U,W,偏移值)中的该寻址方式信息不仅控制该中央处理单元核(2)所使用的寻址方式,还由该协处理器(4)使用以确定在所指示的传送中数据字的数量,使得协处理器(4)可以在适当的时候终止该传送。在一些总线系统中事先知道在一次传送中的数据字的数量也是有利的,诸如那些可以具有同步DRAM的总线系统。在该指令中的偏移字段可用于指示在由该中央处理单元核(2)在执行一个特定的指令时所提供的值中所进行的改变,并且也指示在该传送中的字的数量。这种装置可很好地适用于对诸如数字信号处理操作中的一个规则的数据组。如果不使用该偏移字段,则要传送的数据字的数量可缺省定为1。

Description

协处理器的数据访问控制装置和方法
技术领域
本发明涉及数据处理系统领域。更具体地,本发明涉及包括一个中央处理单元,一个存储器和一个协处理器的数据处理系统,其中,在该中央处理单元和该协处理器联合执行的指令的控制下在该存储器和该协处理器之间传送数据字。
背景技术
提供具有一个中央处理单元,一个存储器和一个诸如配备有英格兰剑桥的先进RISC机器公司(Advanced RISC Machines Limited)制造的ARM微处理器的协处理器的处理系统是众所周知的。在这种公知的系统中,该中央处理单元执行协处理器存储器访问指令(诸如一次协处理器加载或者一次协处理器存储),该指令用于产生用于提供给该存储器的适当的地址数据以及准备使该协处理器与该存储器直接进行数据字(数据传送的单位)的交换。一旦该中央处理单元将该开始地址信息提供给该存储器,则如果该数据字不经过该中央处理单元传输或者不需存储在该中央处理单元中而直接传到该协处理器,其效率是最高的。对于到该协处理器的这种直接传送,最好是该协处理器控制该数据传送的结束,这样可以将在每次传送中具有不同数目的字的不同的协处理器连接到该中央处理单元,而不必修改该中央处理单元。为了控制该数据传送的结束,该协处理器必须能够确定根据在该中央处理单元上执行的指令打算传送多少数据字。
一种可能是使得执行在该中央处理单元上的每个指令只传送一个数据字。这不论是对于代码、数据存储器带宽的使用还是指令存储器带宽的使用,其效率是十分低的,最好是使用突发模式传送,在该突发模式传送中将一个起始地址提供给存储器,存储器将一系列相邻的存储器单元中的数据字返回。利用这种突发模式传送,效率提高的同时带来了相应的困难,因为协处理器需要确定要将多少数据字进行传送,以便它能执行必要的控制以停止该传送。
众所周知,(例如在ARM浮点加速单元中)可以在该中央处理单元上执行的指令中分配一个数据位字段,将该数据位字段传递给该协处理器,向该协处理器指示要传送的数据字的数量。然而,在该中央处理单元上执行的指令中可用的位空间是有限的,如果在该指令中的数据位专用于向该协处理器传递数据字的数量,则将限制该指令中可用于其他字段的位空间,这些其它字段可用于指示有关数据传送的其他参数,比如在接着该指令的执行之后对在该中央处理单元中的地址指针进行改变。
S B Furber所著的“VLSI RISC体系结构和组织”(1989 MarcelDekker Inc.,New York XP002061358201970)第261至265揭示了一种协处理器指令,其包括控制该中央处理单元所使用的寻址方式的位,和由该协处理器使用的用于控制传送的数据字的数量的一个单独的不连续的位。
欧洲公开专利申请EP-A-0703529揭示了一种具有存储器访问指令的微处理器,关于该存储器访问指令,利用某些操作码,一个偏移值字段的一部分控制传送的字的数量,而不是使用一个偏移值。
发明概述
从本发明的一个方面可以看出,本发明提供了一种用于处理数据的装置,该装置包括:
一个中央处理单元,用于执行中央处理单元指令,以执行数据处理操作,所述中央处理单元指令包括协处理器存储器访问指令;
一个连接到所述中央处理单元用于保存数据字的存储器;以及
一个连接到所述中央处理单元和所述存储器的协处理器,在所述中央处理单元执行的所述协处理器存储器访问指令的控制下使用多个寻址方式中的一个寻址要由所述协处理器处理的所述存储器中的数据字;
其中,至少一个协处理器存储器访问指令包括寻址方式信息,该信息用于控制所述中央处理单元使用所述多个寻址方式中的哪一个来访问所述存储器,其特征在于:
所述协处理器使用所述寻址方式信息中的至少一部分来控制根据所述至少一个协处理器存储器访问指令在所述存储器和所述协处理器之间传送多少数据字;以及
所述至少一个协处理器存储器访问指令引用所述中央处理单元中保存一个地址值的寄存器,以及所述地址方式信息包括一个偏移字段,其中在执行所述至少一个协处理器存储器访问指令时从所述地址值和所述偏移值至少之一中确定所述存储器中要访问的一个开始地址。
本发明认识到,该多个位字段(其可以包括寄存器号和立即数)由中央处理单元使用以控制使用多个寻址模式中的哪一个,该多个位字段也用于向该协处理器指示(可能要结合其他因素,诸如在该指令中的其他字段,或者在控制寄存器中写入的值)要传送的数据字的数量。例如,已经发现,在大量的情况下,由该中央处理单元使用以控制用于该传送和/或改变地址指针的位字段信息与(或者可能与)要传送到该协处理器的数据字的数量有关,并且因此该位字段可以由该协处理器以及该中央处理单元读取。在该协处理器存储器访问指令中对同一位字段的重叠使用将在那些协处理器存储器访问指令中的位空间释放用于其他用途。进一步还认识到,在大多数情况下,要传送的数据字的数量落在少量的范畴内,因此利用本发明获得的代码密度和效率的改进带来的好处超过了提供一个专用的位字段用于向该协处理器指示要传送的数据字的数量所带来的完全的灵活性。
尽管中央处理单元可以以多种不同的方式控制寻址,但是在本发明的较佳实施例中,所述至少一个协处理器存储器访问指令引用所述中央处理单元中保存一个地址值的寄存器,以及所述地址方式信息包括一个偏移字段,其中在执行所述至少一个协处理器存储器访问指令时从所述地址值和所述偏移值至少之一中确定所述存储器中要访问的一个开始地址。
这种使用保存在该中央处理单元的一个寄存器中的一个地址指针提供了极大的灵活性,并且和该指令中的偏移字段结合简化了应用程序的编码。
在最好以协处理器对一批数据进行操作的时候,对于本发明的较佳实施例就是:对所述地址值的所述改变产生一个最终的地址值,该最终的地址值可以选择存回所述寄存器中。
已经发现,由所述协处理器使用所述偏移字段的至少一部分来控制在所述存储器和所述协处理器之间要传送多少数据字是极其方便的。
这种装置满足了现实生活中使用一个协处理器来对存储器中保存的数据执行数据处理操作的大多数要求。
有利的是,该寻址模式信息应该包括一个或者多个标记,所述标记用于控制使用所述多个寻址模式中的哪个模式,以及也用来控制在确定在所述存储器和所述协处理器之间要传送多少数据字时所述协处理器是否要使用所述偏移字段。
根据在该寻址模式信息中的其他标记位选择性地使用该偏移字段增加了协处理器可以用来控制所传送的数据字的数量时所用方式可用的选项数量,并且也使之有可能满足大量现实情况的要求,同时不要求该协处理器存储器访问指令中的其他位空间。
已经发现,要涵盖大多数所要求的操作的类型,该较佳实施例应该是这样的:在确定在所述存储器和所述协处理器之间要传送多少数据字时所述协处理器不使用所述偏移字段时,在所述存储器和所述协处理器之间传送一个固定数量的数据字。
控制该协处理器的一个补充的协处理器存储器访问指令模式的集合是:所述寄存器存储一个地址值Rn,一个数据字长度是WL个字节,以及所述偏移值是M,所述一个或者多个标记包括3个或者多个数值位,执行数值位选择所述至少一个协处理器存储器访问指令根据下列情况之一进行操作:
           传送开始          地址寄存器中           要传送的
            地址值             的最终值            数据字数量
(i)           Rn               Rn-(WL*M)           (固定数量)
(ii)          Rn               Rn                       M
(iii)         Rn               Rn+(WL*M)                M
(iv)          Rn-(WL*M)        Rn                       M
(v)           Rn-(WL*M)        Rn-(WL*M)                M
(vi)          Rn+(WL*M)        Rn                  (固定数量)
(vii)         Rn+(WL*M)        Rn+(WL*M)           (固定数量)
有利的是该协处理器存储器访问指令也包括多个标记,该多个标记包括:
(i)一个标记位P,它指示所述开始地址值是否是原先存储在所述寄存器中的所述地址值或者是由所述偏移字段所指示要改变的一个地址值;
(ii)一个标记位U,它指示所述改变是否从原先存储在所述寄存器中的所述地址值中加上或减去在所述偏移字段中指示的一个值;以及
(iii)一个标记位W,它指示在所述地址寄存器中的所述最终值是否应当存回所述寄存器中。
利用这样一组标记,通过提供这样一种逻辑可以将该协处理器配置成提供对其操作的快速和简单的控制,使所述协处理器计算P EORU以确定是否传送一个数据字或者M个数据字。
一个另外的可能性是在该寄存器是ARM程序计数器寄存器(PC或R15)时使传送的字的数量为1。这将修改确定对于P EOR(U OR(基寄存器是PC))传送一个字的逻辑电路。
尽管上面所讨论的对协处理器与一个中央处理单元和一个存储器的交互进行控制的特征可用于许多不同的领域(例如浮点协处理器),数据访问的相当的规则性使得本发明尤其适用于这样一些实施例,在这些实施例中,所述中央处理单元和所述协处理器执行数字信号处理操作,并且在所述存储器和所述协处理器之间传送的所述数据字包括来自存储在所述存储器中的一组系数值中的多个系数值。
从本发明的另一方面可以看出,本发明提供了一种处理数据的方法,所述方法包括下列步骤:
以一个中央处理单元执行中央处理单元指令,以执行数据处理操作,所述中央处理单元指令包括协处理器存储器访问指令;
将数据字保存在连接到所述中央处理单元的存储器中;以及
在由所述中央处理单元执行的协处理器存储器访问指令的控制下,利用所述多个寻址方式之一在所述存储器中寻址要由连接到所述中央处理单元和所述存储器的一个协处理器处理的数据字;
其中,至少一个所述协处理器存储器访问指令包括寻址方式信息,该信息用于控制所述中央处理单元使用所述多个寻址方式中的哪一个来访问所述存储器,其特征在于:
所述协处理器使用所述寻址方式信息中的至少一部分来控制根据所述至少一个协处理器存储器访问指令在所述存储器和所述协处理器之间传送多少数据字;以及
用所述至少一个协处理器存储器访问指令引用所述中央处理单元中保存一个地址值的寄存器,以及所述地址方式信息包括一个偏移字段,其中在执行所述至少一个协处理器存储器访问指令时从所述地址值和所述偏移值至少之一中确定所述存储器中要访问的一个开始地址。
附图说明
现在将参照附图通过举例描述本发明的实施例,其中:
图1示出数字信号处理装置的高层配置;
图2示出协处理器的输入缓冲器和寄存器配置;
图3示出通过协处理器的数据路径;
图4示出从寄存器中读取高或低位位的多路复用电路;
图5为示出较佳实施例中的协处理器所使用的寄存器重新映射逻辑的框图;
图6更详细地示出图5中所示的寄存器重新映射逻辑;
图7为示出块过滤算法的表;
图8图示了一个包括一个中央处理单元,一个存储器和一个用于执行协处理器存储器访问指令的系统;以及
图9是对应于图8的系统的操作流程图。
具体实施方式
在下列的描述中,第一节描述了这样一个系统,该系统包括一个中央处理单元,一个存储器和一个协处理器,该协处理器被设计成提供高速的数字信号处理功能。第二节描述了对第一节的系统的改进,其中将在第一节中的协处理器存储器访问指令进行了修改以增强该协处理器对要传送的数据字的数量进行容易的控制。
第一节
下面描述的系统是关于数字信号处理(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示出ARM 2与Piccolo 4,ARM 2发布控制信号到Piccolo4来控制向Piccolo 4传送数据以及从Piccolo 4传送数据字。指令高速缓冲存储器6存储Piccolo 4所需要的Piccolo程序指令字。单个DRAM存储器8存储ARM 2与Piccolo 4两者所需要的所有数据与指令字。ARM 2负责寻址存储器8及控制所有数据传送。只带单个存储器8及一组数据与地址总线的布置比需要多个存储器及高总线带宽的总线的典型DSP方法简单与低廉。
Piccolo执行来自控制Piccolo数据路径的指令高速缓冲存储器6的第二指令流(数字信号处理程序指令字)。这些指令中包含诸如乘-累加等数字信号处理型操作及诸如零开销循环指令等控制流指令。这些指令在保持在Piccolo寄存器10(见图2)中的数据上操作。这一数据是早先ARM 2从存储器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项与目标寄存器状态的所有可能组合。
目标,Rn,状态
目标ROB项状态 低一半空 高一半空
全寄存器,两半都有效 Rn.h<-entry.hRn.l<-entry.l项标记为空 Rn.l<-entry.lentry.l标记为空 Rn.l<-entry.hentry.h标记为空
全寄存器,高一半有效 Rn.h<-entry.h项标记为空 Rn.h<-entry.h项标记为空
全寄存器,低一半有效 Rn.l<-entry.l项标记为空 Rn.l<-entry.l项标记为空
半寄存器,两半都有效 Rn.l<-entry.lentry.l标记为空 Rn.l<-entry.letntry.l标记为空
半寄存器,高一半有效 Rn.l<-entry.h项标记为空 Rn.l<-entry.h项标记为空
总结一下,可以独立地从ROB重新填充寄存器的两半,ROB中的数据标记为以整个寄存器为目的地或以寄存器的底部一半为目的地的两个16位值。
用ARM协处理器指令将数据加载进ROB中。如何在ROB中标记数据取决于用哪一条协处理器指令来执行传送。下述ARM指令可用于以数据填充ROB:
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
提供了下列ARM指令用于配置ROB:
LDPA<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指令来代替。
例如,指令
LDP32W      X0,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中的任何全寄存器。例如指令,
MPR             X0,R3
将R3的内容传送到ROB中,将数据标记为指派给全寄存器X0。
由于ARM是内部小结尾(endian)的,将数据从ARM传送到Piccolo时不出现对结尾特定的表现。
MPRW指令将ARM寄存器Rn的内容放置在ROB中,将其标记为指派给16位Piccolo寄存器<dest>.l的两个16位数据项。对<dest>的限制与对LDPW指令的相同(即A0、X0、Y0、Z0)。例如指令,
MPRW            X0,R3
将R3的内容传送到ROB中,将数据标记为指派给X0.l的两个16位量。应指出对于带有1回绕的LDP16W,只能针对32位寄存器的底部一半。
至于MPR,在数据上不作用对于结尾特定的操作。
将LDP编码为: 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     110     P  U  N  W  1   Rn     DEST   PICCOLO1     SIZE/4
其中PICCOLO1为Piccolo的第一协处理器号(当前为8)。N位在LDP32(1)与LDP16(0)之间选择。
LDPW编码为: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     110 P  U  N  W  1     Rn  DES  WRA PICCOLO2    SIZE/4
其中DEST对于目的地寄存器A0、X0、Y0、Z0为0-3而WRAP对于回绕值1、2、4、8为0-3。PICCOLO2为Piccolo的第二协处理器号(当前为9)。N位在LDP32(1)与LDP16(0)之间选择。
将LDP16U编码为: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     110   P   U   0   W  1     Rn DES   01  PICCOLO2     00000001
其中DEST对于目的地组X、Y、Z为1-3。将LDPA编码为:31 30 29 28 27 25 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     1110     0000     0000     0000  PICCOLO1   000   0     BANK
其中BANK[3:0]用于在每组的基础上关闭不对齐模式。如果设置了BANK[1],则关闭组X上的不对齐模式。BANK[2]与BANK[3]分别关闭组Y与Z上的不对齐模式,如果设置的话。注意,这是CDP操作。
将MPR编码为: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     1110  0  1  0  0   DEST     Rn P1CCOLO1    000  1     0000
将MPRW编码为: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     1110  0  1  0  0 DEST     00     Rn PICCOLO2     000  1     0000
其中DEST对于目的地寄存器X0、Y0、Z0为1-3。
输出FIFO能保持多达8个32位值。它们是用下述(ARM)操作码之一从Piccolo传送的:
STP{<cond>}<16/32>    [Rn]{!},#<size>
MRP                Rn
第一个将来自输出FIFO的<size>/4个字保存在ARM寄存器Rn给定的地址上,如果!存在,变址Rn。为防止死锁,<size>不得大于输出FIFO的大小(本实现中为8项)。如果采用STP16变型,在存储器系统返回的数据上可出现对于结尾特定的表现。
MRP指令从输出FIFO中消除一个字并将其放置在ARM寄存器Rn中。对于MPR在数据上不作用对于结尾特定的操作。
STP的ARM编码为: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   110   P   U   N   W   0     Rn     0000  P1CCOLO1     SIZE/4
其中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 13 12 11 10 9 8 7 6 5 4 3 2 1 0
  COND     1110   0   1   0   1     0000     Rn PICCOLO1     000  1   0000
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指令存取。操作码为:
MPSR     Sn,Rm
MRPS     Rm,Sn
这些操作码在ARM寄存器Rm与专用寄存器Sn之间传送32位值。它们是作为协处理器寄存器传送在ARM中编码的: 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     1110     001  L     Sn     Rm   PICCOLO     000  1     0000
其中对于MPSR,L为0而对MRPS,L则为1。
寄存器S0包含Piccolo唯一的ID及修订版本代码。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
实现者 体系结构 部件号 修订版本
位[3:0]包含处理器的修订版本号。
位[15:4]包含以二进制编码的十进制格式的3位部件号:piccolo为0×500
位[23:16]包含体系结构版本:0×00=版本1
位[31:24]包含实现者商标的ASCII码:0×41=A=ARM有限公司
寄存器S1为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
 N  Z C  V  SN  SZ  SC  SV    保留 D  A  H  B  U  E
一级状态码标志(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
    程序计数器   0   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 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
  COND     1110     0000     0000     0000 PICCOLO1   000   0     0000
执行这一指令时出现以下情况:
-将所有寄存器标记为空(准备好重新填充)。
-清除输入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
  COND     1110     0001     0000     0000  PICCOLO1     000   0   0000
在执行时,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 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
  COND     1110     0010     0000     0000  PICCOLO1   000  0     0000
Picclol是通过执行PDISABLE指令禁止的:
PDISABLE;禁止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     1110     0011     0000     0000  PICCOLO1     000   0     0000
在执行这一指令时,出现以下情况:
-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 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
  COND     1110     011 L     0000   Rm PICCOLO1     000  1     0000
本节讨论控制Piccolo数据路径的Piccolo指令集。各指令为32位长。指令是从Piccolo指令高速缓冲存储器中读取的。
解码指令集是相当直观的。高6位(26至31)给出主操作码,位22至25为少数特定指令提供次要操作码。带灰色阴影的位当前不使用而为扩展保留(当前它们必须包含指定值)。
有11个主要指令类。这并不完全对应于提出在指令中的主操作码,这是为了便于解码某些子类。  3  3  2  2  2  2  2  2  2  2  2  2  1  1  1  1  1  1  1  1  1  1  9  8  7  6  5  4  3  2  1  01  0  9  8  7  6  5  4  3  2  1  0  9  8  7  6  5  4  3  2  1  0
  0           OPC  F  SD     DEST  S1  R1     SRC1               SRC2
  1     000     OPC  F  SD     DEST  S1  R1     SRC1               SRC2
  1     001  0  OP  F  SD     DEST  S1  R1     SRC1               SRC2
  1     0011
  1     010    OPC  F  SD     DEST  S1  R1     SRC1               SRC2_SHIFT
  1     011    00   F  SD     DEST  S1  R1     SRC1               SRC2_SEL   COND
  1     011    01
  1     011  1  OP  F  SD     DEST  S1  R1     SRC1               SRC2_SEL   COND
  1   10  0  OP  Sa  F  SD     DEST  A1  R1     SRC1               SRC2_MULA
  1   10  1  0
  1   10  1  OP  1  F  SD     DEST  A1  R1     SRC1  0  A0  R2     SRC2_REG  SCALE
  1      110
  1      11100  F  SD     DEST                IMMEDIATE_15 -/-
  1      11101
  1      11110  0  RFIELD_4  0  R1     SRC1   #INSTRUCTIONS_8
  1      11110  1  RFIELD_4                     #LOOPS_13   #INSTRUCTION_8
  1      11111  0   OPC                 REGISTER_LIS_16   SCALE
  1      11111     100                 IMMEDIATE_16   COND
  1      11111     101                   PARAMETERS_21
  1      11111     11 OP
上表中的指令具有以下名称:
标准数据运算
逻辑运算
条件加/减
未定义
移位
选择
未定义
并行选择
乘累加
未定义
双倍乘
未定义
移动带符号立即数
未定义
重复
重复
寄存器列表操作
转移
重新命名参数传送
停止/中断
在下面的节中详细描述各类指令的格式。对于大多数指令,源与目的地操作数字段是通用的并在单独的节中详细描述,寄存器重新映射也一样。
大多数指令需要两个源操作数;源1与源2。某些例外是饱和绝对值。
源1(SRC1)操作数具有以下7位格式:18     17     16     15     14     13     12
大小 再填充         寄存器号 高/低
字段元素具有下述含义:
-大小-指示要读的操作数大小(1=32位,0=16位)。
-再填充-规定读后应将寄存器标记为空的并能从ROB再填充。
-寄存器号-编码要读取的16个32位寄存器中哪一个。
-高/低-对于16位读指示读取32位寄存器的哪一半。对于32位操作数,置位时指示应互换两个16位一半。
  大小   高/低 存取的寄存器部分
    0     0 低16位
    0     1 高16位
    1     0 全32位
    1     1 全32位,两半交换
在汇编程序中通过在寄存器号上加上后缀来指定寄存器大小:l为低16位,h为高16位或。x为具有高与低16位交换的32位。
通用的源2(SRC2)具有以下三种12位格式之一:11     10     9      8      7      6      5      4      3      2      1     0
  0    S2   R2     寄存器号 高/低     标度
  1     0     ROT              IMMED_8
  1     1              IMMED_6     标度
图4示出根据高/低位与大小位将所选择的寄存器的适当的一半切换到Piccolo数据路径上的多路复用器装置。如果大小位指示16位,则符号扩展电路根据需要用0或1填充数据路径的高位。
第一种编码指定源为寄存器,这些字段具有与SRC1说明符相同的编码。标度(SCALE)字段指定要作用在ALU的结果上的标度。
    标度 操作
  3    2    1    0
  0    0    0    0     ASR#0
  0    0    0    1     ASR#1
  0    0    1    0     ASR#2
  0    0    1    1     ASR#3
  0    1    0    0     ASR#4
  0    1    0    1 保留
  0    1    1    0     ASR#6
  0    1    1    1     ASL#1
  1    0    0    0     ASR#8
  1    0    0    1     ASR#16
  1    0    1    0     ASR#10
  1    0    1    1 保留
  1    1    0    0     ASR#12
  1    1    0    1     ASR#13
  1    1    1    0     ASR#14
  1    1    1    1     ASR#15
带有循环编码的8位立即数允许生成可用8位值及2位循环表示的32位立即数。下表示出能从8位值XY生成的立即数值:
  循环 立即数
    00 0×000000XY
    01 0×0000XY00
    10 0×00XY0000
    11 0×XY000000
6位立即数编码允许使用6位不带符号的立即数(从0到63),以及作用在ALU的输出上的标度。
通用源2编码对于大多数指令变型是通用的。对这一规则存在一些例外,它们支持源2编码的有限子集或将其稍加修改:
-选择指令。
-移位指令。
-并行操作。
-乘累加指令。
-乘双倍指令。
选择指令只支持寄存器或6位不带符号立即数的一个操作数。由于这些位由指令的状态字段使用而得使该标度不可用。
                                       11      10       9       8       7       6       5       4       3       2       1      0
  0   S2    R2   寄存器号  高/低     状态
  1   1                 IMMED_6     状态
SRC2_SEL
移位指令只支持16位寄存器或1与31之间的5位无符号立即数的一个操作数。不能得到结果的标度。
                                         11      10      9      8      7      6      5      4        3       2       1       0
    0     0  R2 寄存器号 高/低     0     0     0     0
    1     0  0     0     0     0     0                  IMMED_5
SRC2_SHIFT
在并行操作情况中,如果指定寄存器作为操作数的源,则必须执行32位读。并行操作的立即数编码略为不同。它允许将一个立即数复制到32位操作数的两个16位一半中。并行操作可利用稍加限制范围的标度。
                                       11      10      9       8       7       6       5      4       3       2       1      0
  0   1    R2         寄存器号  高/低   SCALE_PAR
  1   0        ROT                  IMMED_8
  1   1              IMMED_6   SCALE_PAR
SRC2_PARALLEL
如果使用6位立即数,则总是将它复制到32位量的两个一半上。如果使用8位立即数,只有当循环指示应将8位立即数循环到32位量的顶部一半上时才复制。
   循环   立即数
    00 0×000000XY
    01 0×0000XY00
    10 0×00XY00XY
    11 0×XY00XY00
并行选择操作不使用标度;必须将这些指令的标度字段设置为0。
乘累加指令不允许指定8位循环立即数。该字段的位10用来部分地指定使用哪一累加器。源2蕴含16位操作数。
                                           11      10       9       8      7      6      5      4      3      2      1      0
  0   A0     R2    寄存器号  高/低     标度
  1   A0                IMMED_6     标度
SRC2_MULA
乘双倍指令不允许使用常量。只能指定一个16位寄存器。该字段的位10用来部分地指定使用哪一个累加器。
                                              11     10      9      8      7      6      5      4      3       2      1      0
    0     A0     R2   寄存器号  高/低     标度
SRC2_MULD
某些指令总是蕴含32位操作(如ADDADD),并在这些情况中应将大小位设置为1,高/低位用来有选择地互换32位操作数的两个16位一半。某些指令总是蕴含16位操作(如MUL)并应将大小位设置为0。而高/低位选择所使用的寄存器的哪一半(假定清除了失去的大小位)。乘累加指令允许独立说明源累加器与目的地寄存器。对于这些指令,大小位用来指示源累加器,而大小位则由指令类型为0来蕴含。
当读取16位值时(通过A或B总线)自动进行符号扩展将其扩展成32位量。如果读取48位寄存器(通过A或B总线),在总线上只出现底部32位。从而在所有情况中都将源1与源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           23          22          21         20        19
    F     SD     HL     DEST
这一基本编码有10种变型:汇编程序助记符                                      25          24          23          22          21          20        19
0 1 0 Dx
  1   1   0         Dx
  0   0   0         Dx
  1   0   0         Dx
  0   0   1         Dx_
  1   0   1         Dx
  0   1   1         0000
  1   1   1   0   0     00
  1   1   1   0   1     00
  1   1   1   1   0     00
  1   1   1   1   1     00
Dx                    1Dx                   ^2Dx.l                  3Dx.l                 ^4Dx.h                  5Dx.h                 ^6未定义.1(无寄存器写回16位)      7″″(无寄存器写回32位)    8.1^(16-位)输出        9^(32-位)输出          10
寄存器号(DX)指示正在寻址的是16个寄存器中哪一个。高/低位与大小位一起工作来寻址作为一对16位寄存器的各32位寄存器。大小位定义如何设置指令类型中所定义的适当标志,不论将结果是否写入寄存器组与/或输出FIFO,这允许构成比较及类似指令。带累加的加法类指令必须将结果写回寄存器。
下表示出各编码的表现:
编码 寄存器写 FIFO写 V标志
1 写整个寄存器 不写 32位溢出
2 写整个寄存器 写32位 32位溢出
3 写低16位到Dx.l 不写 16位溢出
4 写低16位到Dx.l 写低16位 16位溢出
5 写低16位到Dx.h 不写 16位溢出
6 写低16位到Dx.h 写低16位 16位溢出
7 不写 不写 16位溢出
8 不写 不写 32位溢出
9 不写 写低16位 16位溢出
10 不写 写32位 32位溢出
在所有情况中,任何操作写回寄存器或插入输出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 XO.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指令传递给在Piccolo 4内的指令解码器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指令将用户定义的重新映射指令放置在为存储这种用户定义的重新映射参数留出的寄存器中,然后将多路复用器编程为将这些寄存器的内容传递给寄存器重新映射逻辑。
在较佳实施例中,寄存器计数、基增量、基环绕及寄存器环绕参数取下表中确定的值之一:
    参数               描述
    REGCOUNT(寄存器计数) 它确定在上面执行重新映射的16位寄存器数并可取值0,2,4,8。REGCOUNT以下的寄存器是重新映射的,以上或等于REGCOUNT的是直接存取的。
    BASEINC(基增量) 这定义在各循环重复结束时将基指针增量多少个16位寄存器。在较佳实施例中它可取值1,2或4,虽然如果需要事实上它可取其它值,适当时可包含负值。
    BASEWRAP(基环绕) 它确定基计算的上限。基环绕模可取值2,4,8。
    REGWRAP(寄存器环绕) 它确定重新映射计算的上限。寄存器环绕模可取值2,4,8。REGWRAP可选择为等于REGCOUNT
参见图6,重新映射块56如何使用各种参数的示例如下(在本例中,逻辑与物理寄存器值是相对于特定组的):
if(逻辑寄存器<REGCOUNT)
物理寄存器=(逻辑寄存器+基)MOD REGCOUNT
else
物理寄存器=逻辑寄存器
end if
在循环结束处,在循环的下一次重复开始前,基更新逻辑58执行对基指针的下述更新:
基=(基+BASEINC)MOD BASEWRAP
在重新映射循环结束处,关闭寄存器重新映射,然后作为物理寄存器存取所有寄存器。较佳实施例中,任何一个时间上只有一个重新映射REPEAT(重复)是活跃的。循环还可嵌套,但在任何特定时刻只有一个循环能更新重新映射变量。然而如果需要,可以嵌套重新映射重复。
为了展示作为采用按照本发明的较佳实施例的重新映射机制的结果所达到的关于代码密度的好处,下面讨论典型的块过滤算法。首先参照图7讨论阻塞过滤器算法的原理。如图7中所示,将累加器寄存器A0配置成累加若干次乘法运算的结果,乘法运算为系数C0乘以数据项d0的乘法,系数c1乘以数据项d1的乘法,系数c2乘以数据项d2的乘法等。寄存器A1累加类似的乘法运算组的结果,但这时系数集合已移位使得c0现在乘以d1,c1乘以d2,c2乘以d3等。类似地,寄存器A2累加数据值乘以又向右移位一步的系数值的结果,使得c0乘以d2,c1乘以d3,c2乘以d4等。然后重复这一移位、乘及累加进程,将结果放在寄存器A3中。
如果不采用按照本发明的较佳实施例的寄存器重新映射,则需要下面的指令循环来执行块过滤指令:
      ;以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*c3
      MULA  A0,X0.l^,Y0.l,A0           ;a0+=d0*c0,及加载  d4
      MULA  A1,X0.h,Y0.l,A1            ;a1+=d1*c0MULA    A2,X1.l,Y0.l,A2          ;a2+=d2*c0MULA    A3,X1.h,Y0.l^,A3         ;a3+=d3*c0,及加载  c4MULA    A0,X0.h^,Y0.h,A0         ;a0+=d1*c1,及加载  d5MULA    A1,X1.l,Y0.h,A1          ;a1+=d2*c1MULA    A2,X1.h,Y0.h,A2          ;a2+=d3*c1MULA    A3,X0.l,Y0.h^,A3         ;a3+=d4*c1,及加载  c5MULA    A0,X1.l^,Y1.l,A0         ;a0+=d2*c2,及加载  d6MULA    A1,X1.h,Y1.l,A1          ;a1+=d3*c2MULA    A2,X0.l,Y1.l,A2          ;a2+=d4*c2MULA    A3,X0.h,Y1.l^,A3         ;a3+=d5*c2,及加载  c6MULA    A0,X1.h^,Y1.h,A0         ;a0+=d3*c3,及加载  d7MULA    A1,X0.l,Y1.h,A1          ;a1+=d4*c3MULA    A2,X0.h,Y1.h,A2          ;a2+=d5*c3MULA    A3,X1.l,Y1.h^,A3         ;a3+=d6*c3,及加载  c7NEXT
在本例中,将数据值放在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条乘累加指令。采用重新映射机制,将代码编写成如下所列:
以4个新数据值开始
ZERO{A0-A3}                       清零累加器
REPEAT  Z1,X++ n4 w4 r4,Y++ n4 w4 r4;Z1=〔系数的个数)
;对X与Y组进行重新映射
;重新映射这些组中四个16位寄存器
;在循环的每一次重复上将两组的基指针递增。
;当基指针到达该组中第四个寄存器时便绕回。
MULA    A0,X0.l^,Y0.l,A0         ;a0+=d0*c0,及加载  d4
MULA    A1,X0.h,Y0.l,A1          ;a1+=d1*c0
MULA    A2,X1.l,Y0.l,A2          ;a2+=d2*c0
MULA    A3,X1.h, Y0.l^,A3        ;a3+=d3*c0,及加载  c4
NEXT                                ;绕回到循环并进行重新映射
如上所述,第一步将四个累加器寄存器A0-A3设置成0。然后进入用‘重复’与‘下一个’操作码定界的指令循环。重复指令拥有与之关联的若干参数,它们是:
X++:指示对于X寄存器组基增量为“1”。
n4:指示寄存器计数为“4”,因此要重新映射前四个X组寄存器X0.l至X1.h
w4:指示对于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.h
X0.h成为X1.l
X1.l成为X1.h
X1.h成为X0.l(由于基环绕为“4”)
Y0.l成为Y0.h
Y0.h成为Y1.l
Y1.l成为Y1.h
Y1.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,10
ASR  #12至16
LSL  #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> 可以是[0_2_4_8]
      <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=0
0100 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=0
1101 LE  N=1_Z=1
1110 AL
1111  保留
由于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 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
 0     OPC  F  SD     DEST S1  R1     SRC1     SRC2
OPC指定指令的类型
操作(OPC):
100N0   dest=(src1+src2)(->>scale)(,N)
110N0   dest=(src1-src2)(->>scale)(,N)
10001   dest=SAT((src1+src2)(->>scale))
11001   dest=SAT((src1-src2)(->>scale))
01110   dest=(src2-src1)(->>scale)
01111   dest=SAT((src2-src1)(->>scale))
101N0   dest=(src1+src2+Carry)(->>scale)(,N)
111N0   dest=(src1-src2+Carry-1)(->>scale)(,N)
助记符:
100N0    ADD{N}       <dest>,<src1>,<src2>{,<scale>}
110N0    SUB{N}       <dest>,<src1>,<src2>{,<scale>}
10001    SADD         <dest>,<src1>,<src2>{,<scale>}
11001    SSUB         <dest>,<src1>,<src2>{,<scale>}
01110    RSB          <dest>,<src1>,<src2>{,<scale>}
01111    SRSB         <dest>,<src1>,<src2>{,<scale>}
101N0    ADC{N}       <dest>,<src1>,<src2>{,<scale>}
111N0    SBC{N}       <dest>,<src1>,<src2>{,<scale>}
汇编程序支持下述操作码
CMP<src1>,<src2>,
CMN<src1>,<src2>,
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则无效。对于这类指令,必须将结果写回寄存器-不允许目的地字段的不写回编码。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
 0  0  OPC  1  0 Sa   F   SD     DEST S1  R1     SRC1     SRC2
OPC指定指令的类型。下面的acc为(DEST[1:0])。Sa位指示饱和。
操作(OPC):
  0 dest={SAT}(acc+(src1+src2)){->>scale}
  1 dest={SAT}(acc+(src1-src2)){->>scale}
助记符
0  {S}ADDA   <dest>,<src1>,<src2>,<acc>{,<scale>}
1  {S}SUBA   <dest>,<src1>,<src2>,<acc>{,<scale>}
命令前面的S表示饱和。
标志:见上面。
包含的理由:
ADDA(加累计)指令对于用累加器每一周期求和整数数组的两个字是有用的(例如找出它们的平均值)。SUBA(减累计)指令在计算差之和(用于相关)中是有用的;它将两个独立的值相减并将差加到第三寄存器中。
带四舍五入的加法可用与<acc>不同的<dest>进行。例如,X0=(X1+X2+16384)>>15可通过将16384保持在A0中而在一个周期中完成。带四舍五入的常量的加法可用ADDA X0,X1,#16384,A0来完成。
对于((a_i*b_j)>>k)之和(在TrueSpeech中相当常用)的位精确实现:
标准Piccolo代码为:
MUL  t1,a_0,b_0,ASR#K
ADD  ans,ans,t1
MUL  t2,a_1,b_1,ASR#k
ADD  ans,ans,t2
这一代码有两个问题:它太长以及不是加到48位精度,因此不能用保护位。较好的解决方法为使用ADDA:
MUL  t1,a_0,b_0,ASR#k
MUL  t2,a_1,b_1,ASR#k
ADDA ans,t1,t2,3ns
这提高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
 0 0   OPC Sa   F   SD     DEST S1 R1     SRC1     SRC2
OPC定义操作操作(OPC):
000  desth=(src1.h+src2.h)->>{scale},
  dest.l=(src1.l+src2.l)->>{scale}
001  desth=(src1.h+src2.h)->>{scale},
  dest.l=(src1.l-src2.l)->>{scale}
100  dest.n=(src1.h-src2.h)->>{scale},
  dest.1=(src1.l+src2.l)->>{scale}
101  dest.h=(src1.h-src2.h)->>{scale},
  dest.1=(src1.l-src2.l)->>{scale}
如果置位了Sa位,各和/差是独立饱和的。助记符:
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>}
命令前的S表示饱和。汇编程序还支持
CMNCMN    <dest>,<src1_32>,<src2_32>{,<scale>}
CMNCMP    <dest>,<src1_32>,<src2_32>{,<scale>}
CMPCMN    <dest>,<src1_32>,<src2_32>{,<scale>}
CMPCMP    <dest>,<src1_32>,<src2 32>{,<scale>}它们是不带写回的标准指令生成的。
标志:
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
  0     11111   100   000     IMMEDIATE_16   COND
操作:
如果根据一级标志<cond>成立,用偏移量转移。
偏移量为带符号的16位字数。当前偏移的范围限制在-32768至+32767个字。
执行的地址计算是
目标地址=转移指令地址+4+偏移量
助记符:
B<cond><destination_label>
标志:不受影响。
包含的理由:
在大多数例程中高度有用。
条件加或减指令有条件地将src1加在src2上或从src1中减去src2。  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
 1    0010  OPC  F  SD     DEST S1  R1     SRC1     SRC2
OPC指定指令的类型。
操作(OPC):
如果(进位置位)temp=src1-src2否则temp=src1+src2
dest=temp{->>scale}
如果(进位置位)temp=src1-src2否则temp=src1+src2
dest=temp{->>scale}但是如果定标是左移位
则将(来自src1-src2或src1+src2的)进位的新值移位进底部中。
助记符:
0  CAS   <dest>,<src1>,<src2>,{,<scale>}
1  CASC  <dest>,<src1>,<src2>,{,<scale>}
标志:见上面:
包含的理由:
条件加或减指令使高效除法代码能构成。
例1:将X0中的32位不带符号值除以X1中的16位不带符号值(假设X0<(X1<<16)及X1.h=0)。
LSL  X1,X1,#15      ;上移除数
SUB  X1,X1,#0       ;置位进位标志
REPEAT#16
CASC X0,X0,X1,LSL#1
NEXT
在循环末尾,X0.l保持除法的商。取决于进位的值可从X0.h恢复余数。
例2:将X0中的32位正值除以X1中的32位正值,带早结束。
      MOV    X2,#0                ;清除商
      LOG    Z0,X0                ;X0可移位的位数
      LOG    Z1,X1                ;X1可移位的位数
      SUBS   Z0,Z1,Z0            ;X1向上移位因此1匹配
      BLT    div_end               ;X1>X0因此答数为0
      LSL    X1,X1,Z0            ;匹配前面的1
      ADD    Z0,Z0,#1            ;进行的测试数
      SUBS   Z0,Z0,#0            ;置位进位
      REPEAT Z0
      CAS    X0,X0,X1,LSL#1
      ADCN   X2,X2,X2
      NEXT
div_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
    011011  F  SD   DEST S1 R1     SRC1     101110000000
操作:
将dest设定为为了使位31与位30不同而src1中的值必须左移的位数。这是范围0-30中的一个值,但除外src1为-1或0的特殊情况,这时返回31。
助记符:
CLB  <dest>,<src1>
标志:
Z  如果结果为0,便置位。
N  是消除的。
C  如果src1为-1或0之一,便置位。
V  保持。包含的理由:正规化需要的步骤。设置了停止与断点指令用于停止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
 1     11111   11  OP     00000000000000000000000
OPC指定指令的类型。
操作(OPC):
0  Piccolo执行被停止并在Piccolo状态寄存器中置位停止
   位。
1  Piccolo执行停止,并在Piccolo状态寄存器中置位中断位,
   并中断ARM报告已到达断点。
助记符:
0  HALT
1  BREAK
标志:不受影响。
逻辑运算指令在32或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
 1     000  OPC  F  SD     DEST S1  R1     SRC1     SRC2
OPC编码要执行的逻辑运算操作(OPC):
00  dest=(src1 & src2){->>scale}
01  dest=(src1_src2){->>scale}
10  dest=(src1 &~src2){->>scale}
11  dest=(src1 ^src2){->>scale}助记符:
00    AND  <dest>,<src1>,<src2>{,<scale>}
01    ORR  <dest>,<src1>,<src2>{,<scale>}
10    BIC  <dest>,<src1>,<src2>{,<scale>}
11    EOR  <dest>,<src1>,<src2>{,<sc2le>}汇编程序支持下述操作码。
TST   <src1>,<src2>
TEQ   <src1>,<src2>
TST为禁止寄存器写的“与”。TEQ为禁止寄存器写的“EOR”。
标志:
Z        如果结果为全0,便置位
N、C、V  保持
SZ、SN、SC、SV  保持
包含的理由:
话音压缩算法采用组合位字段来编码信息。位屏蔽指令协助抽取/组合这些字段。
Max与Min操作指令执行最大与最小值运算。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
  0    101  OPC  1  F  SD     DEST S1  R1     SRC1     SRC2
OPC指定指令的类型。操作(OPC):0   dest=(src1<=src2)?src1:src21   dest=(src1>src2)?src1:src2助记符:0   MIN<dest>,<src1>,<src2>1   MAX<dest>,<src1>,<src2>标志: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位数据上执行最大值与最小值运算。  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
0 111 OP 1 F SD DEST S1 R1 SRC1 SRC2_PARALLEL
OPC指定指令的类型。操作(OPC):
0    dest.l=(src1.l<=src2.l)?src1.l:src2.l
     dest.h=(src1.h<=src2.h)?src1.h:src2.h
1    dest.1=(src1.l>src2.l)?src1.l:src2.l
     dest.h=(src1.h>src2.h)?src1.h:src2.h助记符:
0    MINMIN   <dest>,<src1>,<src2>
1    MAXMAX   <dest>,<src1>,<src2>
标志:
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 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
  1     11100  F  SD     DEST     IMMEDIATE_15 -/-     000
助记符
MOV  <dest>,#<imm_16>
汇编程序利用MOV指令提供非互锁的NOP(空操作)操作,即,NOP等效于MOV,#0。
标志:标志不受影响。
包含的理由:
初始化寄存器/计数器。
乘累加运算指令执行带符号乘法与累加或累减(de-accumulation),定标与饱和。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
 1     10  OPC Sa   F   SD     DEST   A1   R1     SRC1     SRC2_MULA
字段OPC指定指令的类型。
操作(OPC):
00  dest=(acc+(src1*src2)){->>scale}
01  dest=(acc-(src1*src2)){->>scale}
在各情况中,如果置位了Sa位,在写到目的地之前将结果饱和。
助记符:
00  {S}MULA <dest>,<src1_16>,<src2_16>,<acc>{,<scale>}
01  {S}MULS <dest>,<src1_16>,<src2_16>,<acc>{,<scale>}
命令前的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 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
 1     10  1  OPC  1  F  SD     DEST  A1  R1     SRC1  0 A0 R2     SRC2   SCALE
OPC指定指令的类型。操作(OPC):0  dest=SAT((acc+SAT(2*src1*src2)){->>scale})1  dest=SAT((acc-SAT(2*src1*src2)){->>scale})
助记符:
0    SMLDA<dest>,<src1_16>,<src2_16>,<acc>{,<scale>}
1    SMLDS<dest>,<src1_16>,<src2_16>,<acc>{,<scale>}
标志:见上节。
包含的理由:
G.729及使用小数算术运算的其它算法需要MLD指令。大多数DSP提供能在累加或写回之前在乘法器的输出上左移一位的小数模式。作为特定的指令支持它提供更大的编程灵活性。等价于某些G系列基本运算的名称为:
L_msu=>SMLDS
L_mac=>SMLDA
在左移一位时它们利用乘法器的饱和。如果需要一序列的小数乘累加而不损失精度,可采用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
    00011  OPC  F  SD     DEST S1  R1     SRC1    SRC2
OPC指定指令的类型。操作(OPC):0   dest=(src1*src2){->>scale}1   dest=SAT((src1*src2){->>scale})助记符:
0    MUL<dest>,<src1_16>,<src2>{,<scale>}
1    SMUL<dest>,<src1_16>,<src2>{,<scale>}
标志:见上节。
包含的理由:
许多处理需要带符号与饱和的乘法。
寄存器列表操作用来在一组寄存器上执行操作。提供了空与零指令用于在例程之前或之间复位选择的寄存器。提供了输出指令将列出的寄存器的内容存储到输出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
 1    11111   0     OPC   00     REGISTER_LIST_16   SCALE
OPC指定指令的类型。操作(OPC):000  对于(k=0;k<16;k++)如果置位了寄存器列表的位k,则将寄存器k标记为空。001  对于(k=0;k<16;k++)如果置位了寄存器列表的位k,则将寄存器k设置成包含0。010  未定义011  未定义100  对于(k=0;k<16;k++)如果置位了寄存器列表的位k,
 则将(寄存器k->>scale)写到输出FIFO中。101  对于(k=0;k<16;k++)如果置位了寄存器列表的位k,
 则将(寄存器k->>scale)写入到输出FIFO中并将寄存器
 k标记为空。110  对于(k=0;k<16;k++)如果置位了寄存器列表的位k,
 则将SAT(寄存器k->>scale)写到输出FIFO中。111  对于(k=0;k<16;k++)如果置位了寄存器列表的位k,
 则将SAT(寄存器k->>scale)写到输出FIFO中并将寄存
 器k标记为空。助记符:
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>}标志:
不受影响示例:
EMPTY    {A0,A1,X0-X3}
ZERO     {Y0-Y3}
OUTPUT   {X0-Y1}^汇编程序还支持语法
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
 1     11111     101   00     ZPARAMS     YPARAMS     XPARAMS
各PARAMS字段包含以下的项:
    6           5           4           3           2           1           0
    BASEWRAP     BASEINC     0        RENUMBER
这些项的含义如下:
    参数   说明
RENUMBER 要在其上执行重新映射的16位寄存器数,可取值0、2、4、8。RENUMBER以下的寄存器重新映射,以上的直接存取。
BASEINC 各循环结束时基指针增加的量。可取值1、2或4。
BASEWRAP 基环绕模可取值2、4、8。
助记符:
RMOV<PARAMS>,[<PARAMS>]<PARAMS>字段具有以下格式;
 <PARAMS>∷=<BANK><BASEINC>n<RENUMBER>w<BASEWRAP>
<BANK>∷=[X_Y_Z]
<BASEINC>∷=[++_+1_+2_+4]
<RENUMBER>∷=[0_2_4_8]
<BASEWRAP>∷=[2_4_8]
如果使用RMOV指令同时重新映射是活动的,其行为是UNPREDICTABLE(不可预测)。
标志:不受影响
重复指令提供硬件中的4个零周期循环。重复指令定义新的硬件循环。Piccolo为第一条重复指令利用硬件循环0,为嵌套在第一重复指令内的重复指令利用硬件循环1等等。重复指令不需要指定正在使用哪一个循环。重复循环必须严格嵌套。如果试图嵌套循环到大于4的深度,则行为是不可预测的。
各重复指令指定循环中的指令数(紧接在重复指令后面的)及通过循环的次数(它是常量或读自Piccolo寄存器)。
如果循环中的指令数较少(1或2)则Piccolo可用额外周期来建立循环。
如果循环计数是寄存器指定的,则蕴含32位存取(S1=1),但只认为底部16位是有效的并且数字是不带符号的。如果循环计数为0,则循环的操作是未定义的。采取循环计数的复制,因此立即可以重用该寄存器(甚至再填充)而不影响循环。
重复指令提供修改指定循环内的寄存器操作数的方式的机制。细节上面已描述过。
带有寄存器指定的循环数的重复的编码: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
 1     11110  0   RFIELD_4   00  0  R1     SRC1     0000  =INSTRUCTIONS_3
带固定的循环数的重复的编码: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
1     11110  1  RFIELD_4     #LOOPS_13   #INSTRUCTIONS_8
RFIELD操作数指定在循环内使用16种重新映射参数配置的哪一种。
RFIELD 重新映射操作
0 不执行重新映射
1 用户定义的重新映射
2..15 预置的重新映射配置TBD
汇编程序提供两个操作码REPEAT与NEXT来定义硬件循环,REPEAT在循环开始时而NEXT界定循环的结束,允许汇编程序计算循环体内的指令数。至于REPEAT,它只须作为常量或寄存器指定循环次数。例如:
      REPEAT     X0
      MULA       A0,Y0.1,Z0.1,A0
      MULA       A0,Y0.h^,Z0.h^,A0
      NEXT
这将执行两条MULA指令X0次。同时,
      REPEAT     #10
      MULA       A0,X0^,Y0^,A0
      NEXT
将执行10次乘累加。
汇编程序支持语法:
REPEAT # iterations[,<PARAMS>]以指定重复所用的重新映射参数。如果所需的重新映射参数等于预定义的参数组之一,则使用适当的REPEAT编码。如果不是,则汇编程序将生成RMOV来加载用户定义的参数,后面跟随REPEAT指令。见上面的节中的RMOV指令及重新映射参数格式的细节。
如果循环的重复次数为0则REPEAT的操作是不可预测的。
如果将指令字段的数字设置为0则REPEAT的操作是不可预测的。
循环只包含一条指令而该指令为转移时,则具有不可预测的表现。
从REPEAT循环界内转移到该循环的界外是不可预测的。
饱和绝对值指令计算源1的饱和的绝对值。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
  0     10011   F   SD     DEST  S1  R1     SRC1     100000000000
操作:
dest=SAT((src1>=0)?src1:-src1)。该值总是饱和的。具体地,0×80000000的绝对值为0×7fffffff而不是0×80000000!
助记符:
SABS<dest>,<src1>
标志:
Z  如果结果为0,便置位。
N  保持。
C  如果src1<0(dest=-src1情况),便置位。
V  如果出现饱和,便置位。
包含的理由:
在许多DSP应用中有用。
选择操作(条件传送)用来有条件地将源1或源2传送到目的地寄存器中。选择总是等效于传送。还有在并行加/减以后使用的并行操作。
注意为了实现的原因,可读取两个源操作数,如果其中之一为空,指令将停止,不管该操作数是否是严格需要的。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
1   011  OPC F  SD     DEST S1  R1     SRC1     SRC2_SEL
OPC指定指令的类型。
操作(OPC):
00  如果<cond>对一级标志成立则dest=src1否则dest=
    src2
01  如果<cond>对一级标志成立则dest.h=src1.h否则
    dest.h=src2.h
    如果<cond>对二极标志成立则dest.l=src1.l否则
    dest.l=src2.l
10  如果<cond>对一级标志成立则dest.h=src1.h否则
    dest.h=src2.h
    如果<cond>对二级标志成立则dest.l=src1.l否则
    dest.l=src2.l
11  保留
助记符
00    SEL<cond>      <dest>,<src1>,<src2>
01    SELTT<cond>    <dest>,<src1>,<src2>
10    SELTF<cond>    <dest>,<src1>,<src2>
11    不用
如果将寄存器标记为再填充,无条件将其再填充。汇编程序还提供下列助记符:
MOV<cond>        <dest>,<src1>
SELFT<cond>      <dest>,<src1>,<src2>
SELFF            <cond><dest>,<src1>,<src2>
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 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
 1     010  OPC  F  SD     DEST S1  R1     SRC1     SRC2_SEL
OPC指定指令的类型。操作(OPC):
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:src1 ROL-src2
助记符:
00    ASL<dest>,<src1>,<src2_16>
01    LSR<dest>,<src1>,<src2_16>
10    ASR<dest>,<src1>,<src2_16>
11    ROR<dest>,<src1>,<src2_16>
标志:
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 PICCOLO1的使用修改成允许访问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)。
组4:ROB输入数据。
-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 25 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   110   P   U   0   W   1     BASE     BANK  PICCOLO1     OFFSET
以下序列加载来自寄存器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
  COND     110   P   U   0 W   0     BASE     BANK   PICCOLO1     OFFSET
以下序列将所有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填充数据路径的高位。第二节
图8示出图1的系统的一个修改和扩展的版本。该中央处理单元核2包括一个指令译码器80,一个指令流水线82,一个寄存器组84和一个存储器控制器86。在操作中,由存储器控制器86从存储器8中检索CPU指令,并且提供给指令流水线82。指令沿着指令流水线82前进直到它们到达接近该指令译码器80的那一级。在该级,完成该指令的译码用于执行。该指令译码器80使用逻辑电路响应在该指令中的位字段,以提供控制信号,用于配置和驱动该中央处理单元核2的其他部分以执行该所需要的数据处理操作。在实际上,该中央处理单元核2包括许多功能块,诸如一个算术逻辑单元,一个乘法器,一个高速缓存和一个存储器管理单元。
在当前的情况下,在该指令译码器80解码一条协处理器存储器访问指令时,就在该寄存器组84中指定一个寄存器,该寄存器保存一个地址值,该地址值用作该存储器8中的一个存储单元的地址指针。通过该存储器控制器将该地址值驱动到至存储器8的地址总线上,以启动突发模式的传送。被传送的数据不用于中央处理单元核2,而是用于协处理器4。相应地,除了产生存储器8的适当的地址,该中央处理单元核2不响应在该存储器8和协处理器4之间的数据总线上确立的数据字。该指令译码器80也产生协处理器控制信号(CP Control),该信号被传递到协处理器4。这些协处理器控制信号向协处理器4指示一个协处理器存储器访问指令正在被执行,并且相应地该协处理器4应当采取适当的动作将数据驱动到数据总线上,或者从该数据总线上读取数据。传递到该协处理器4的协处理器控制信号包括正在执行的协处理器存储器访问指令中的寻址方式信息的至少一部分。更具体地说,至少将P标记,U标记和偏移值M传递到该协处理器4。
该协处理器4通过对这些位执行一个异或(EOR)操作译码P标记和U标记。根据这一异或操作的执行结果,协处理器确定在当前突发模式中要传送的数据字的数量是否由传递到它并且存储在该寄存器88中的偏移值M确定,或者是一个数据字的缺省值。该协处理器传送控制器90响应该寄存器88的输出和该异或操作的结果,以对在该数据总线上接收到的数据字进行计数,并且在接收到指定数量的数据字时,确立一个突发传送结束信号(be),该信号返回给该存储器8和该中央处理单元核2以终结由所执行的该协处理器存储器访问指令启动的传送。该协处理器4从该数据总线接收到的任何数据字被加载进该重定序缓冲区12,然后由该协处理器核92进行处理。作为一种替换,该协处理器4可将该突发长度直接提供给该存储器8(对于一些存储器,例如同步DRAM,这是有用的)。
图9示意了上述的一个协处理器存储器访问指令的操作。
该过程从步骤94开始,然后前进到步骤96,在该步骤中央处理单元读取嵌在该协处理器存储器访问指令中的寻址方式信息,而同时该协处理器读取这一同样的寻址方式的至少一部分,以从中确定在该次传送中的数据字的数量。
在步骤98,该CPU产生寻址开始地址,该地址被提供给存储器8。在步骤100,进行该存储器8和该协处理器4之间的直接的数据字的传送。在每次传送一个数据字时,该协处理器4在步骤102确定由该协处理器存储器访问指令指定的所有数据字是否已经被传送。
如果该传送没有完成,则该操作继续,在步骤104该中央处理单元核2执行任何对该地址的任何必要的更新,并且该流程返回到步骤100。
如果该次数据传送结束,则该系统前进到步骤106,在该步骤,协处理器通过确立该突发结束信号(be)终止该次传送,该信号被传递到存储器8和中央处理单元核2。在步骤108,中央处理单元核2通过该协处理器存储器访问指令指定的方式更新地址指针(这也可以在该过程中的另一点进行)。该过程在步骤110结束。
为了改进性能,该传送可以以一种更加并行的方式进行,例如该协处理器甚至在传送第一个字开始之前将向该中央处理单元指示是否要传送第二个数据字。
下面根据本发明的一个实施例详细描述各种协处理器存储器访问指令操作的细节。从控制传送的数据字的数量的角度来看,根据P标记和U标记的译码这些指令的所有操作可以总结成下面的地址传送模式中的一种。
          传送开始          在地址寄存器中           所传送的数据字
          地址值            的最后值                 的数量(i)           Rn                Rn-(WL*M)                1(ii)          Rn                Rn                       M(iii)         Rn                Rn+(WL*M)                M(iv)          Rn-(WL*M)         Rn                       M(v)           Rn-(WL*M)         Rn-(WL*M)                M(vi)          Rn+(WL*M)         Rn                       1(vii)         Rn+(WL*M)         Rn+(WL*M)                1
另外的一个可能性是在该基寄存器是ARM程序计数器寄存器(PC或R15)时使传送数据字的数量为1。这将修改对于P EOR(U或(基寄存器是PC))确定传送一个数据字的逻辑。将存储器的数据加载进该重定序缓冲区 格式总结
提供了用于以存储器的数据填充该重定序缓冲区的两个主要的指令格式:-LDP-LPM
这两种指令格式都被编码为ARM LDC指令。该LDP指令类总是从存储器传送一个32位的数据字。该LPM指令类可用于传送多个数据字。在该指令位模式的层次上,用所使用的寻址方式位区别LDP和LPM;对于LDP和LPM汇编程序语法使用不同的助记符,帮助人们编写或者阅读关于指向一个或多个字传送的代码。下列的格式可用于该两类指令:LDP{cond}[32|16]dest,addressLDP{cond}16U    bank,addressLPM{cond}[A|D][32|16]Rn{!},[<Rlist>]{,#<wordcount>}LPM{cond}[A|D]16      Rn{!},<bank0.1>,#<wordcount>其中{}      指示一个选项字段。cond    该ARM指令条件代码字段。32|16   指示该被加载的数据是否作为16位的数据,以及所采取的结尾特定的动作(见较早的有关STP 16和STP 32的描述),或者作为32位的数据。dest       指定Piccolo目的寄存器(A0-Z3)address    可以是:
       [Rn]
       [Rn,#+ve_offset]{!}
       [Rn],#-ve_offsetRn         是计算有效的ARM寄存器号的表达式。!         指示该所计算的地址应被回写到基寄存器。#+ve_offset是一个计算一个偏移值的表达式,该表达式可以表示为+<8_bit_offset>*4。这一偏移加值到该基寄存器上以形成该加载地址,即该地址被预变址。#-ve_offset是一个计算一个偏移值的表达式,该表达式可以表示为-<8_bit_offset>*4。该加载地址是基寄存器Rn的值,从Rn中减去该偏移值,并且将该结果回写到Rnbank        指示该3个非累加器Piccolo组之一(X|Y|Z)。A|D         指示先增(递增)或者后减(递减)寻址方式。<Rlist>     Piccolo寄存器号的一个递增表,用′{}′括起,例如{X0,X1}。对于Piccolo的第一个版本,最多可指定8个寄存器。该表可以通过该寄存器组的顶部而回绕。例如{Y2,Y3,A0,A1}是一个有效的寄存器表。bank0.1     指示4个16位Piccolo寄存器(A0.1|X0.1|Y0.1|Z0.1)中的一个。Wordcount   用于在一个所选定的寄存器范围内进行回绕加载,其指示传送的数据项的总数量。对于Piccolo的第一个版本,在一个LPM指令中可以传送不超过8个数据项。
在使用该<list>格式时,用<list>指定的寄存器表必须以(A0,X0,Y0,Z0)中的一个开始,并且该寄存器表可以指示1,2或者4个寄存器,即:
{X0}
{x0,x1}
{X0,X1,X2,X3}是X寄存器组的有效的<list>组合,<wordcount>必须大于(Rlist)的长度。LPM的指令的这一格式将传送总共<wordcount>个数据项,在到达<Rlist>的结尾时,对于在<Rlist>中的每个寄存器依次标记它们以回绕到该<Rlist>的开始。
在使用<bank0.1>格式时,对于Piccolo的第一个版本,<wordcount>可以在范围(1-8)。LPM指令的这一格式将加载2*<wordcount>个16位的数据项,标记寄存器<bank0.1>的所有数据。例子LDPNE32 A1,[R0]        ;如果Z标记=0,以mem(R0)加载A1,
                    ;将数据作为32位对待。LDP16 X0,[R0,#16]!   ;以mem(R0+16(字节)))加载X0,
                    ;回写R0+16到R0。将数据
                    ;作为压缩的16位对待。LDP32 Y2,[R0],#-4     ;以mem(R0)加载Y2,
                    ;回写(R0-#4)至R0。LDP16U X,[R0,#4]      ;以mem(R0+#4(字节))填充X组非对齐锁存器。LPMEQA32 R0!,{X2,X3,Y0,Y1}     ;如果Z标记=1,则在
                                ;存储器中从[R0]以上升
                                ;的顺序加载4个字,将它
                                ;们标记为寄存器X2,X3,
                                ;Y0,Y1。回写到R0。LPMA16 Ri!,{X0,X1},#8     ;在存储器从[R1]以上升的顺序
                          ;加载8个字的压缩的16位数据,
                          ;将它们标记为寄存器X0,X1,
                          ;X0,X1,X0,X1,X0,X1指令编码 LDP指令
LDP指令从存储器传送一个32位的字。这些指令中的一些执行回写,但是,根据汇编程序的语法,不用“!”进行标记,因为后变址总是隐含着回写。有两种变化:LDP{cond}[32|16]  dest,[Rn],#-ve_offsetLDP{cond}[32|16]  dest,[Rn,#+ve_offset]{!}该寻址方式由P,U和W位确定。在该指令中这些位分别是位24,23,和21。
使用组合P=0,U=0和W=1来编码下列格式的指令LDP{cond}[32|16]dest,[Rn],#-ve_offset
从地址[Rn]只传送一个字。在传送开始以后,将该基寄存器减少8_bit_offset*4。该N位指示LDP32(1)或者LDP16(0)。<8_bit_offset>编码mod(#-ve_offset)/4。对于向后经过数据结构每次提取一个特定的字,这一特殊的指令是有用的。类似的所希望的功能由其他的指令相配。3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+---+-------+-------+-------+---------------+| cond  |1 1 0|0 0|N|1 1|   Rn  | dest  | pic_1 |  8_bit_offset |+-------+-----+---+-+---+-------+-------+-------+---------------+组合P=1,U=1用于编码下列形式的指令LDP{cond}[32|16)dest,[Rn,#+ve_offset]{!}从地址[Rn+#+ve_offset]只传送一个字。如果该W位被设置,该基寄存器就递增8_bit_offset*4,即具有由所存在的可选项“!”指示的回写的形式。如果W=0,则不发生回写,“!”不存在。该N位指示LDP32(1)或者LDP16(0)。<8_bit_offset>编码#+ve_offset/4。Pic_1(和后面引用的Pic_2)是标识该协处理器是一个Piccolo协处理器的标识数字。Piccolo具有两个标识数字,它们根据所考虑的指令被使用。
 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+-------+-----+---+-+-+-+-------+-------+-------+---------------+
| cond  |1 1 0|1 1|N|W|1|  Rn   |  dest | pic_1 |  8_bit_offset |
+-------+-----+---+-+-+-+-------+-------+-------+---------------+LDP16ULDP16U指令用来填充3个非对齐保持锁存器中的一个。它具有下列变化:LDP{cond}U16  bank,[Rn],#-ve_offsetLDP{cond}U16  bank,[Rn,#+ve_offset]{!}该寻址方式由P和U位确定。组合P=0,U=0 and W=1用来编码下列形式的指令:LDP{cond}U16 dest,[Rn],#-ve_offset从地址[Rn]只传送一个字。在该传送之后,用#-ve_offset修改该基寄存器。3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+---+---+-------+---------------+| cond  |1 1 0|0 0|0|1|1|  Rn   |bnk|0 0| pic_2 |  8_bit_offset |+-------+-----+---+-+-+-+-------+---+---+-------+---------------+
<bnk>指示要开启非对齐方式的组。对于组X,Y或Z,它可取1-3。组合P=1和U=1用来编码下列形式的指令
LDP{cond}U16    dest,[Rn,#+ve_offset]{!}从地址[Rn+#+ve_offset]只传送一个字。如果设置了W位,用#+ve_offset修改该基寄存器。如果W=0,则没有回写。3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+---+---+-------+---------------+| cond  |1 1 0|1 1|0|W|1|  Rn   |bnk|0 0| pic_2 | 8_bit_offset  |+-------+-----+---+-+-+-+-------+---+---+-------+---------------+<bnk>指示要开启非对齐方式的组。对于组X,Y或Z,它可取值1-3。LPM指令LPM指令从存储器传送多个字。该指令具有下列变形:LPM{cond}[A|D][32|16]    Rn{!},[<RList>]LPM{cond}[A|D][32|16]    Rn{!},[<Rlist>],#<wordcount>LPM{cond}[A|D]16         Rn{!},<bank0.1>,#<wordcount>对于LPMA变形P=0,U=1,该指令被编码为:
 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+-------+-----+---+-+-+-+-------+-------+-------+---------------+
| cond  |1 1 0|0 1|N|W|1|  Rn   |basereg| pic_1 | 8_bit_offset  |
+-------+-----+---+-+-+-+-------+-------+-------+---------------+
其中:
该N位指定LPMA32(1)或者LPMA16(0)。
如果W=1,该W位指示basereg=offset*4向该基寄存器的回写。<basereg>指示在<Rlist>中的第一个Piccolo。<8_bit_offset>指示传送的寄存器的数量。对于LPMD变形P=1,U=0,该指令编码为3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+-------+-------+---------------+| cond  |1 1 0|1 0|N|W|1|  Rn   |basereg| pic_1 | 8 bit_offset  |+-------+-----+---+-+-+-+-------+-------+-------+---------------+LPM{cond}[A|D][32|16]Rn{!},<Rlist>,#<wordcount>
对于LPMA变形P=0,U=1,该指令(在这一实例中以及以后,使用该pic_2,bnk,和wrp格式)编码为:3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+---+---+-------+---------------+| cond  |1 1 0|0 1|N|W|1|  Rn   |bnk|wrp| pic_2 | 8_bit_offset  |+-------+-----+---+-+-+-+-------+---+---+-------+---------------+其中:
该N位指示LPMD32(1)或LPMD16(0)。
如果W=1,该W位指示basereg+offset*4向该基寄存器的回写。
<bnk>指示<Rlist>中的第一个寄存器,该寄存器必须位于一个组的一个基寄存器(即A0,X0,Y0或Z0)。其取值0-3以分别指示组A-Z。<wrp>指示回绕点,其可以取1-3,以分别表示一个2,4或8个16位寄存器的回绕值。<8_bit_offset>指示传送的数据项的数量。其可以取值<wordcount>/4。对于LPMD变形P=1,U=0,该指令编码为:3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+---+---+-------+---------------+| cond  |1 1 0|1 0|N|W|1|  Rn   |bnk|wrp| pic_2 | 8_bit_offset  |+-------+-----+---+-+-+-+-------+---+---+-------+---------------+LPM{cond}{A|D}16  Rn{!},<bank0.1>,#<wordcount>对于LPMA变形P=0,U=1,该编码为:3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+---+---+-------+---------------+| cond  |1 1 0|0 1|0|W|1|  Rn   |bnk|0 1| pic_2 | 8_bit_offset  |+-------+-----+---+-+-+-+-------+---+---+-------+---------------+其中:W位指示向基寄存器(1)的回写。<bnk>指示传送到的Piccolo组。其取值0-3以分别表示A,X,Y或Z组。<8_bit_offset>指示传送的数据项的数量。其取值<wordcount>/4。对于LPMD变形P=0,U=1,该编码为 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+---+---+-------+---------------+| cond  |1 1 0|0 1|0|W|1|  Rn   |bnk|0 1| pic_2 | 8_bit_offset  |+-------+-----+---+-+-+-+-------+---+---+-------+---------------+以ARM寄存器的数据加载该重定序缓冲区 格式总结提供该MPR指令格式以从一个ARM寄存器向该Piccolo重定序缓冲器传送一个数据字。下列格式可用于MPR指令:MPR{cond}  dest,RnMPR{cond}W  dest,Rn其中:{}      指示一个选项字段。cond    是该ARM指令条件代码字段。dest    指示Piccolo目标寄存器(A0-Z3)。Rn      是一个计算一个有效的ARM寄存器号的表达式。W       指示应当将从该ARM寄存器传送的数据作为两个16位的值处理,并且标记为Piccolo寄存器dest0.1。指令编码将MPR指令编码为一个ARM MCR指令。MPR{cond}  dest,Rn3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 87 6 5 4 3 2 1 0+-------+-------+-------+-------+-------+-------+-----+-+-------+| cond  |1 1 1 0|0 0 1 0|  dest |   Rn  | pic_1 |0 0 0|1|0 0 0 0|+-------+-------+-------+-------+-------+-------+-----+-+-------+MPR{cond}W dest,Rn 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-------+-------+-------+-------+-------+-----+-+-------+| cond  |1 1 1 0|0 0 1 0|  dest |   Rn  | pic_2 |0 0 0|1|0 0 0 0|+-------+-------+-------+-------+-------+-------+-----+-+-------+从输出FIFO向存储器存储数据 格式的总结提供两个主要的指令格式以从输出FIFO向存储器存储数据项。-STP-SPM将两个指令格式编码为ARM STC指令。该STP指令类总是从输出F FO向存储器存储一个32位的数据字。该SPM指令类可以用于向存储器存储多个字。下列格式可用于该两个指令:STP{cond}[32|16]  地址SPM{cond}[A|D][32|16]Rn{!},#<wordcount>其中:{}      指示一个选项字段。Cond    是该ARM指令条件代码字段。32|16   指示正在存储的数据是否作为16位数据处理,以及所采取的结尾特定的动作(见前面的描述),或者作为32位的数据。地址    可以是:
    [Rn]
    [Rn,#+ve_offset]{!}
    [Rn],#-ve_offsetRn      是一个计算一个有效的ARM寄存器号的表达式。!      指示所计算的地址是否回写到该基寄存器。#+ve_offset是一个计算一个偏移值的表达式,该偏移值可以表示为+<8_bit_offset>*4。将这一偏移值加到该基寄存器上以形成该存储地址。#-ve_offset  是一个计算一个偏移值的表达式,该偏移值可以表示为-<8 bit_offset>*4。将这一偏移值从该基寄存器上减去以形成该后存储地址。A|D             指示先增(增加)或者后减(减少)寻址方式。wordcount    指示传送的数据项的总数量。对于Piccolo的第一个版本,在一个SPM指令中可传送不超过8个数据项。指令编码 STP指令STP指令向存储器传送一个32位的字。其有两种变形:STP{cond}[32|16]    dest,[Rn],#-ve_offsetSTP{cond}[32|16]    dest,[Rn,#+ve_offset]{!}该寻址方式由P和U位确定。STP{cond}[32|16]    [Rn],#-ve_offset(P=0|U=0|W=1)组合P=0,U=0和W=1用于编码下列形式的指令:STP{cond}[32|16][Rn],#-ve_offset向地址[Rn]只传送一个字。在该传送发生后,将该基寄存器减少8_bit_offset*4。该N位指示STP32(1)或STP16(0)。不允许W=0的编码。<8_bit_offset>编码mod(#-ve_offset)/4。3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+---+-------+-------+-------+---------------+| cond  |1 1 0|0 0|N|1 0|   Rn  |0 0 0 0| pic_1 |  8_bit_offset |+-------+-----+---+-+---+-------+-------+-------+---------------+STP{cond}[32|16]  dest,[Rn,#+ve_offset]{!}(P=1|U=1)组合P=1和U=1用于编码下列形式的指令:
STP{cond}[32|16]dest,[Rn,#+ve_offset]{!)只传送一个字到地址[Rn+#+ve_offset]。如果设置了W位,将该基寄存器增加8_bit_offset*4。该N位指示STP32(1)或者STP16(0)。<8_bit_offset>编码#+ve_offset/4。3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 11 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-----+---+-+-+-+-------+-------+-------+---------------+| cond  |1 1 0|1 1|N|W|0|  Rn   |0 0 0 0| pic_1 |  8_bit_offset |+-------+-----+---+-+-+-+-------+-------+-------+---------------+SPM指令
     SPM指令从存储器传送多个字。其具有下列变形:SPM{cond}[A|D][32|16]  Rn{!},#<wordcount>SPM{cond}[A|D][32|16]  Rn{!},#<wordcount>
对于SPMA变形P=0,U=1,该指令编码为:
 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+-------+-----+---+-+-+-+-------+-------+-------+---------------+
| cond  |1 1 0|0 1|N|W|0|  Rn   |0 0 0 0| pic_1 | 8_bit_offset  |
+-------+-----+---+-+-+-+-------+-------+-------+---------------+其中:该N位指示SPMA32(1)或SPMA16(0)。该W位指示向基寄存器(1)的回写。<8_bit_offset>指示传送的数据项的数量。
对于LPMD变形P=1,U=0,该指令编码为:
 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+-------+-----+---+-+-+-+-------+---+---+-------+---------------+
| cond  |1 1 0|1 0|N|W|0|  Rn   |0 0 0 0| pic_1 | 8_bit_offset  |
+-------+-----+---+-+-+-+-------+---+---+-------+---------------+
其中:
该N位指示SPMD32(1)或SPMD16(0)。
从输出FIFO向ARM传送数据
格式的总结
提供该MRP指令以从输出FIFO向一个ARM寄存器传送一个数据字。下
列格式可用于该MRP指令:
MRP{cond}Rn
其中:
{}      指示一个选项字段。
cond    是该ARM指令条件代码字段。Rn    是计算一个有效的ARM寄存器号的表达式。指令编码该MRP指令编码为一个ARM MRC指令。MRP{cond}Rn3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 13 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0+-------+-------+-------+-------+-------+-------+-----+-+-------+| cond  |1 1 1 0|0 0 1 1|  dest |  Rn   | pic_1 |0 0 0|1|0 0 0 0|+-------+-------+-------+-------+-------+-------+-----+-+-------+保留的选项
在一个全面的层次上,将会注意到编码P=0,U=0和W=0是上述情况所不允许的,并且保留供将来使用。

Claims (12)

1.一种用于处理数据的装置,该装置包括:
一个中央处理单元(2),用于执行中央处理单元指令,以执行数据处理操作,所述中央处理单元指令包括协处理器存储器访问指令;
一个连接到所述中央处理单元用于保存数据字的存储器(8);以及
一个连接到所述中央处理单元和所述存储器的协处理器(4),在所述中央处理单元执行的所述协处理器存储器访问指令的控制下使用多个寻址方式中的一个寻址要由所述协处理器处理的所述存储器中的数据字;
其中,至少一个协处理器存储器访问指令包括寻址方式信息(P,U,W,M),该信息用于控制所述中央处理单元使用所述多个寻址方式中的哪一个来访问所述存储器,其特征在于:
所述协处理器使用所述寻址方式信息中的至少一部分(P,U,M)来控制根据所述至少一个协处理器存储器访问指令在所述存储器和所述协处理器之间传送多少数据字;以及
所述至少一个协处理器存储器访问指令引用所述中央处理单元中保存一个地址值的寄存器,以及所述地址方式信息包括一个偏移字段(M),其中在执行所述至少一个协处理器存储器访问指令时从所述地址值和所述偏移值至少之一中确定所述存储器中要访问的一个开始地址。
2.根据权利要求1的装置,其中对所述地址值的所述改变产生一个最终地址值,该最终地址值存回所述寄存器。
3.根据权利要求1或2的装置,其中所述协处理器使用所述偏移字段(M)的至少一部分,以控制在所述存储器和所述协处理器之间传送多少数据字。
4.根据权利要求3的装置,其中所述寻址方式信息包括一个或者多个标记(P,U),所述标记用于控制使用所述多个寻址方式中的哪个方式,以及也用来控制在确定在所述存储器和所述协处理器之间要传送多少数据字时所述协处理器是否要使用所述偏移字段。
5.根据权利要求4的装置,其中在确定在所述存储器和所述协处理器之间要传送多少数据字时所述协处理器不使用所述偏移字段时,在所述存储器和所述协处理器之间传送一个固定数目的数据字。
6.根据权利要求4的装置,其中所述寄存器存储一个地址值Rn,一个数据字长度是WL个字节,以及所述偏移值是M,所述一个或者多个标记
包括3个或者多个数值位,该数值位选择所述至少一个协处理器存储器访问指令以根据下列情况之一进行操作:
                  传送开始         地址寄存器         要传送的
                  地址值           中的最终值        数据字数量
(i)               Rn               Rn-(WL*M)        (固定数量)
(ii)              Rn               Rn                   M
(iii)             Rn               Rn+(WL*M)            M
(iv)              Rn-(WL*M)        Rn                   M
(v)               Rn-(WL*M)        Rn-(WL*M)            M
(vi)              Rn+(WL*M)        Rn               (固定数量)
(vii)             Rn+(WL*M)        Rn+(WL*M)        (固定数量)
7.根据权利要求6的装置,其中所述多个标记包括:
(i)一个标记位P,它指示所述开始地址值是否是原先存储在所述寄存器中的所述地址值或者是由所述偏移字段指示所改变的一个地址值;
(ii)一个标记位U,它指示所述改变是否是从原先存储在所述寄存器中的所述地址值加上或减去在所述偏移字段中指示的一个值;以及
(iii)一个标记位W,它指示在所述地址寄存器中的所述最终值是否应当存回所述寄存器中。
8.根据权利要求7的装置,其中所述协处理器计算P EOR U以确定是传送一个数据字还是M个数据字。
9.根据权利要求7的装置,其中所述寄存器可以是所述中央处理单元的一个程序计数寄存器PC,所述协处理器计算P EOR U(U OR(寄存器是PC))以确定是传送一个数据字还是M个数据字。
10.根据权利要求1、2、4-9之一的装置,所述中央处理单元和所述协处理器执行数字信号处理操作,并且在所述存储器和所述协处理器之间传送的所述数据字包括来自存储在所述存储器中的一组系数值的多个系数值。
11.根据权利要求5-9之一的装置,其中所述固定数目的数据字包括仅一个数据字。
12.一种处理数据的方法,所述方法包括下列步骤:
以一个中央处理单元执行中央处理单元指令,以执行数据处理操作,所述中央处理单元指令包括协处理器存储器访问指令;
将数据字保存在连接到所述中央处理单元的存储器中;以及
在由所述中央处理单元执行的协处理器存储器访问指令的控制下,利用所述多个寻址方式之一在所述存储器中寻址要由连接到所述中央处理单元和所述存储器的一个协处理器处理的数据字;
其中,至少一个所述协处理器存储器访问指令包括寻址方式信息,该信息用于控制所述中央处理单元使用所述多个寻址方式中的哪一个来访问所述存储器,其特征在于:
所述协处理器使用所述寻址方式信息中的至少一部分来控制根据所述至少一个协处理器存储器访问指令在所述存储器和所述协处理器之间传送多少数据字;以及
用所述至少一个协处理器存储器访问指令引用所述中央处理单元中保存一个地址值的寄存器,以及所述地址方式信息包括一个偏移字段(M),其中在执行所述至少一个协处理器存储器访问指令时从所述地址值和所述偏移值至少之一中确定所述存储器中要访问的一个开始地址。
CN98806108A 1997-06-10 1998-01-12 协处理器的数据访问控制装置和方法 Expired - Fee Related CN1103961C (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
GB9712041.1 1997-06-10
GB9712041A GB2326253A (en) 1997-06-10 1997-06-10 Coprocessor data access control

Publications (2)

Publication Number Publication Date
CN1260054A CN1260054A (zh) 2000-07-12
CN1103961C true CN1103961C (zh) 2003-03-26

Family

ID=10813904

Family Applications (1)

Application Number Title Priority Date Filing Date
CN98806108A Expired - Fee Related CN1103961C (zh) 1997-06-10 1998-01-12 协处理器的数据访问控制装置和方法

Country Status (12)

Country Link
US (1) US6002881A (zh)
EP (1) EP1010065B1 (zh)
JP (1) JP3681407B2 (zh)
KR (1) KR100505799B1 (zh)
CN (1) CN1103961C (zh)
DE (1) DE69801673T2 (zh)
GB (1) GB2326253A (zh)
IL (1) IL132681A (zh)
MY (1) MY116707A (zh)
RU (1) RU2195696C2 (zh)
TW (1) TW341689B (zh)
WO (1) WO1998057256A1 (zh)

Families Citing this family (65)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6505290B1 (en) * 1997-09-05 2003-01-07 Motorola, Inc. Method and apparatus for interfacing a processor to a coprocessor
US6041404A (en) * 1998-03-31 2000-03-21 Intel Corporation Dual function system and method for shuffling packed data elements
US6504495B1 (en) * 1999-02-17 2003-01-07 Arm Limited Clipping data values in a data processing system
KR100308618B1 (ko) * 1999-02-27 2001-09-26 윤종용 단일 칩 상의 마이크로프로세서-코프로세서 시스템을 구비한 파이프라인 데이터 처리 시스템 및 호스트 마이크로프로세서와 코프로세서 사이의 인터페이스 방법
US6446221B1 (en) * 1999-05-19 2002-09-03 Arm Limited Debug mechanism for data processing systems
JP4425377B2 (ja) * 1999-07-29 2010-03-03 株式会社ターボデータラボラトリー データ処理装置、および、データ処理方法
ATE475930T1 (de) * 1999-09-01 2010-08-15 Intel Corp Verzweigungsbefehl für einen mehrfachverarbeitungsprozessor
US7546444B1 (en) 1999-09-01 2009-06-09 Intel Corporation Register set used in multithreaded parallel processor architecture
WO2001016697A2 (en) * 1999-09-01 2001-03-08 Intel Corporation Local register instruction for micro engine used in multithreadedparallel processor architecture
US6588008B1 (en) * 2000-04-11 2003-07-01 International Business Machines Corporation Assembler tool for processor-coprocessor computer systems
KR100356013B1 (ko) * 2000-08-10 2002-10-12 한국전자통신연구원 암호처리를 위한 범용 프로세서와 암호처리 코프로세서의접속장치
US7681018B2 (en) 2000-08-31 2010-03-16 Intel Corporation Method and apparatus for providing large register address space while maximizing cycletime performance for a multi-threaded register file set
US20020053017A1 (en) * 2000-09-01 2002-05-02 Adiletta Matthew J. Register instructions for a multithreaded processor
TW495714B (en) * 2000-12-05 2002-07-21 Faraday Tech Corp Device and method for data access control and applied instruction format thereof
GB2372848B (en) * 2001-02-20 2004-10-27 Advanced Risc Mach Ltd Data processing using a coprocessor
US6633856B2 (en) * 2001-06-15 2003-10-14 Flarion Technologies, Inc. Methods and apparatus for decoding LDPC codes
US6938196B2 (en) * 2001-06-15 2005-08-30 Flarion Technologies, Inc. Node processors for use in parity check decoders
US7673223B2 (en) * 2001-06-15 2010-03-02 Qualcomm Incorporated Node processors for use in parity check decoders
US6848074B2 (en) 2001-06-21 2005-01-25 Arc International Method and apparatus for implementing a single cycle operation in a data processing system
US6961888B2 (en) 2002-08-20 2005-11-01 Flarion Technologies, Inc. Methods and apparatus for encoding LDPC codes
US20070234178A1 (en) * 2003-02-26 2007-10-04 Qualcomm Incorporated Soft information scaling for interactive decoding
US6957375B2 (en) * 2003-02-26 2005-10-18 Flarion Technologies, Inc. Method and apparatus for performing low-density parity-check (LDPC) code operations using a multi-level permutation
EP1597667A4 (en) * 2003-02-26 2009-01-14 Qualcomm Inc PROGRAMMABLE INFORMATION HITCHING FOR ITERATIVE DECODING
US7430652B2 (en) * 2003-03-28 2008-09-30 Tarari, Inc. Devices for performing multiple independent hardware acceleration operations and methods for performing same
US7231557B2 (en) * 2003-04-02 2007-06-12 Qualcomm Incorporated Methods and apparatus for interleaving in a block-coherent communication system
US7434145B2 (en) * 2003-04-02 2008-10-07 Qualcomm Incorporated Extracting soft information in a block-coherent communication system
US8196000B2 (en) * 2003-04-02 2012-06-05 Qualcomm Incorporated Methods and apparatus for interleaving in a block-coherent communication system
GB2402764B (en) * 2003-06-13 2006-02-22 Advanced Risc Mach Ltd Instruction encoding within a data processing apparatus having multiple instruction sets
US7237181B2 (en) * 2003-12-22 2007-06-26 Qualcomm Incorporated Methods and apparatus for reducing error floors in message passing decoders
CN100407690C (zh) * 2004-01-09 2008-07-30 华为技术有限公司 一种cpu与协处理单元通信的方法及系统
CN100405758C (zh) * 2004-01-20 2008-07-23 海信集团有限公司 可重构密码协处理器的移位模块
US7822032B1 (en) * 2004-03-30 2010-10-26 Extreme Networks, Inc. Data structures for supporting packet data modification operations
US7304996B1 (en) * 2004-03-30 2007-12-04 Extreme Networks, Inc. System and method for assembling a data packet
US7353364B1 (en) * 2004-06-30 2008-04-01 Sun Microsystems, Inc. Apparatus and method for sharing a functional unit execution resource among a plurality of functional units
US7167971B2 (en) * 2004-06-30 2007-01-23 International Business Machines Corporation System and method for adaptive run-time reconfiguration for a reconfigurable instruction set co-processor architecture
US7346832B2 (en) * 2004-07-21 2008-03-18 Qualcomm Incorporated LDPC encoding methods and apparatus
US7395490B2 (en) * 2004-07-21 2008-07-01 Qualcomm Incorporated LDPC decoding methods and apparatus
US7127659B2 (en) 2004-08-02 2006-10-24 Qualcomm Incorporated Memory efficient LDPC decoding methods and apparatus
US7689640B2 (en) * 2005-06-06 2010-03-30 Atmel Corporation Method and apparatus for formatting numbers in microprocessors
US7490223B2 (en) * 2005-10-31 2009-02-10 Sun Microsystems, Inc. Dynamic resource allocation among master processors that require service from a coprocessor
US7555514B2 (en) * 2006-02-13 2009-06-30 Atmel Corportation Packed add-subtract operation in a microprocessor
US7496893B2 (en) * 2006-06-15 2009-02-24 International Business Machines Corporation Method for no-demand composition and teardown of service infrastructure
US7805590B2 (en) * 2006-06-27 2010-09-28 Freescale Semiconductor, Inc. Coprocessor receiving target address to process a function and to send data transfer instructions to main processor for execution to preserve cache coherence
US7925862B2 (en) * 2006-06-27 2011-04-12 Freescale Semiconductor, Inc. Coprocessor forwarding load and store instructions with displacement to main processor for cache coherent execution when program counter value falls within predetermined ranges
US9020146B1 (en) * 2007-09-18 2015-04-28 Rockwell Collins, Inc. Algorithm agile programmable cryptographic processor
US8078836B2 (en) 2007-12-30 2011-12-13 Intel Corporation Vector shuffle instructions operating on multiple lanes each having a plurality of data elements using a common set of per-lane control bits
US8667254B1 (en) * 2008-05-15 2014-03-04 Xilinx, Inc. Method and apparatus for processing data in an embedded system
US8139583B1 (en) 2008-09-30 2012-03-20 Extreme Networks, Inc. Command selection in a packet forwarding device
GB2474901B (en) * 2009-10-30 2015-01-07 Advanced Risc Mach Ltd Apparatus and method for performing multiply-accumulate operations
CN101777037B (zh) * 2010-02-03 2013-05-08 中兴通讯股份有限公司 一种查找引擎实时系统内数据传输的方法和系统
JP5555514B2 (ja) * 2010-03-17 2014-07-23 ルネサスエレクトロニクス株式会社 プロセッサシステム
US9304774B2 (en) * 2011-02-04 2016-04-05 Qualcomm Incorporated Processor with a coprocessor having early access to not-yet issued instructions
US8605732B2 (en) 2011-02-15 2013-12-10 Extreme Networks, Inc. Method of providing virtual router functionality
JP5870994B2 (ja) 2011-03-04 2016-03-01 日本電気株式会社 デッドロック回避方法、デッドロック回避機構
US9372281B2 (en) * 2012-01-20 2016-06-21 Koc Solution Co., Ltd. Method for preparing thioepoxy-based optical material and polymerizable composition thereof
US9280344B2 (en) * 2012-09-27 2016-03-08 Texas Instruments Incorporated Repeated execution of instruction with field indicating trigger event, additional instruction, or trigger signal destination
US9069900B2 (en) * 2013-03-28 2015-06-30 Intel Mobile Communications GmbH Method for determining whether a machine code instruction of a machine code program is executed in the machine code program
CN105242909B (zh) * 2015-11-24 2017-08-11 无锡江南计算技术研究所 一种基于多版本代码生成的众核循环分块方法
KR102420897B1 (ko) * 2016-03-17 2022-07-18 에스케이하이닉스 주식회사 메모리 모듈, 이를 포함하는 메모리 시스템 및 그의 동작 방법
US10204044B2 (en) * 2016-05-18 2019-02-12 Sap Se Memory management process using data sheet
CN108268281B (zh) * 2017-01-04 2021-12-07 中科创达软件股份有限公司 处理器协同方法及电路
US11334355B2 (en) * 2017-05-04 2022-05-17 Futurewei Technologies, Inc. Main processor prefetching operands for coprocessor operations
GB2570729B (en) * 2018-02-06 2022-04-06 Xmos Ltd Processing system
KR20190118020A (ko) * 2018-04-09 2019-10-17 에스케이하이닉스 주식회사 반도체 장치
US11138009B2 (en) * 2018-08-10 2021-10-05 Nvidia Corporation Robust, efficient multiprocessor-coprocessor interface

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4943915A (en) * 1987-09-29 1990-07-24 Digital Equipment Corporation Apparatus and method for synchronization of a coprocessor unit in a pipelined central processing unit
EP0442041A2 (en) * 1990-01-18 1991-08-21 National Semiconductor Corporation Integrated digital signal processor/general purpose CPU with shared internal memory
US5193159A (en) * 1986-09-24 1993-03-09 Hitachi, Ltd. Microprocessor system

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0748179B2 (ja) * 1988-10-12 1995-05-24 日本電気株式会社 データ処理装置
JP2682469B2 (ja) * 1994-09-20 1997-11-26 日本電気株式会社 命令コード符号化方式

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5193159A (en) * 1986-09-24 1993-03-09 Hitachi, Ltd. Microprocessor system
US4943915A (en) * 1987-09-29 1990-07-24 Digital Equipment Corporation Apparatus and method for synchronization of a coprocessor unit in a pipelined central processing unit
EP0442041A2 (en) * 1990-01-18 1991-08-21 National Semiconductor Corporation Integrated digital signal processor/general purpose CPU with shared internal memory

Also Published As

Publication number Publication date
WO1998057256A1 (en) 1998-12-17
CN1260054A (zh) 2000-07-12
JP2002503370A (ja) 2002-01-29
EP1010065A1 (en) 2000-06-21
MY116707A (en) 2004-03-31
IL132681A0 (en) 2001-03-19
GB2326253A (en) 1998-12-16
RU2195696C2 (ru) 2002-12-27
IL132681A (en) 2003-07-31
EP1010065B1 (en) 2001-09-12
US6002881A (en) 1999-12-14
DE69801673D1 (de) 2001-10-18
GB9712041D0 (en) 1997-08-06
JP3681407B2 (ja) 2005-08-10
KR100505799B1 (ko) 2005-08-04
DE69801673T2 (de) 2002-08-29
TW341689B (en) 1998-10-01
KR20010013147A (ko) 2001-02-26

Similar Documents

Publication Publication Date Title
CN1103961C (zh) 协处理器的数据访问控制装置和方法
CN1135468C (zh) 对存储设备中信号数据字执行数字信号处理的方法和装置
CN1103959C (zh) 数据处理装置和操作数据处理装置的方法
CN1112635C (zh) 多媒体信号处理器中的单指令多数据处理方法及其装置
CN1117316C (zh) 采用多个向量寄存器组的单指令多数据处理方法及其装置
CN1246772C (zh) 处理器
CN1287270C (zh) 重启动翻译的指令
CN1625731A (zh) 具有多种长度指令集体系结构的可配置数据处理器
CN1244051C (zh) 对于处理数据的装置和方法
CN1226323A (zh) 数据处理装置寄存器
CN1186718C (zh) 微控制器指令集
CN1306697A (zh) 可变长度编码与解码的处理电路和处理方法
CN1104679C (zh) 数据处理装置和数据处理方法
CN1269052C (zh) 支持缩小代码长度的常量还原型处理器
CN1484787A (zh) 处理器流水线中的硬件指令翻译
CN1226325A (zh) 数据处理系统中的输入操作数控制
CN1862486A (zh) 数字信号处理器
CN1279435C (zh) 数字信号处理器
CN1137421C (zh) 可编程控制器
CN1491383A (zh) 使用协处理器的数据处理
CN1152300C (zh) 多媒体信号处理器中的单指令多数据处理方法及其装置
CN1226324A (zh) 数据处理系统寄存器控制
CN1227585C (zh) 计算机系统
CN1103467C (zh) 宏指令集对称式并行体系结构微处理器
CN1228711C (zh) 一种可重构寄存器堆及其构造方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20030326

Termination date: 20130112