CN1226323A - 数据处理装置寄存器 - Google Patents

数据处理装置寄存器 Download PDF

Info

Publication number
CN1226323A
CN1226323A CN97196714.8A CN97196714A CN1226323A CN 1226323 A CN1226323 A CN 1226323A CN 97196714 A CN97196714 A CN 97196714A CN 1226323 A CN1226323 A CN 1226323A
Authority
CN
China
Prior art keywords
register
bit
instruction
registers
piccolo
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.)
Pending
Application number
CN97196714.8A
Other languages
English (en)
Inventor
D·V·贾加尔
S·J·格拉斯
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 CN1226323A publication Critical patent/CN1226323A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/38Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
    • G06F7/48Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices
    • G06F7/57Arithmetic logic units [ALU], i.e. arrangements or devices for performing two or more of the operations covered by groups G06F7/483 – G06F7/556 or for performing logical operations
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/38Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
    • G06F7/48Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices
    • G06F7/544Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices for evaluating functions by calculation
    • G06F7/5443Sum of products
    • 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/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30036Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
    • 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
    • G06F9/30134Register stacks; shift 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/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
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/38Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
    • G06F7/48Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices
    • G06F7/499Denomination or exception handling, e.g. rounding or overflow
    • G06F7/49905Exception handling
    • G06F7/4991Overflow or underflow
    • G06F7/49921Saturation, i.e. clipping the result to a minimum or maximum value
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/38Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
    • G06F7/48Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices
    • G06F7/499Denomination or exception handling, e.g. rounding or overflow
    • G06F7/49994Sign extension

Abstract

提供了一个包括一个算术逻辑单元(20,22,24)的数据处理系统,该算术逻辑单元从M个X位寄存器中接收输入操作数以产生存储在N个Y位寄存器中的输出数据字,其中M/N=3,8< =Y-X< =16,并且3X=2Y。这一装置尤其适用于数字信号处理以及适用于在一个新的输入操作数被加载进一个寄存器之前多次使用每一个输入操作数的情况。

Description

数据处理装置寄存器
本发明涉及数据处理系统领域。更具体地说,本发明涉及包括多个寄存器的数据处理系统,这些寄存器用于保存来自所述数据处理装置中的算术逻辑单元的输入的操作数数据字和输出的数据字。
提供包括多个寄存器的数据处理系统是众所周知的,这些寄存器用于保存要处理的数据和结果数据。可以使用的数据处理寄存器的数量越多,可以存储在寄存器中的数据越多,从而对高速缓存和主存储器必须进行读或写的次数越少。简单地提供数量较多的寄存器的一个缺点是电路规模增加,其结果造成电路的复杂性和成本的增加,并且需要指定一个单个寄存器的位空间也增加,从而使得程序指令的密集度降低。
另一个考虑是每一个寄存器的位长度。增加寄存器的长度也能使得它们能够存储和处理更多数量的数据,但是其缺点是使复杂性和成本增加,并且即使是要处理的数据字的长度比较小,也会使得连续地写和读全寄存器所需的功率消耗增加。
从一个方面来看,本发明提供了一个数据处理装置,所述装置包括:
M个X-位寄存器,其中M是大于1的正整数,这些寄存器用于接收来自数据存储装置的相应的输入操作数数据字;
一个算术逻辑单元,用于对存储在所述X-位寄存器中的所述输入操作数数据字进行算术逻辑操作以产生输出数据字;
N个Y位寄存器,其中N是大于1的正整数,用于接收来自所述算术逻辑单元的所述输出数据字,其中
M/N=3,8<=Y-X<=16,并且3X=2Y。
本发明认识到,在特定情况下,其优点是在系统内提供非对称的寄存器资源。常见的情况是所有的数据处理寄存器具有同样的宽度。然而,在某些重要的应用中,比如在数字信号处理中,提供具有一种长度的多个寄存器以及具有与之不同的较宽的多个寄存器可以实现更好的整体性能。尤其是,提供较大的寄存器可用于接收算术逻辑单元的输出数据字,因为它提供了保护位,以增加的一个处理操作的循环次数允许溢出而不丢失信息。
另一个因素是X位寄存器和Y位寄存器的比值。3与1的比值其优点是适合在DSP系统中经常要求的相对普遍和需要的FFT操作的要求。
尽管用于接收输出数据字的宽寄存器提供了保护位用于保持精度,但是在将输出数据字从这些宽寄存器移出时,就需要确定是否应当保持这一精度。在本发明的一个较佳实施例中,所述算术逻辑单元响应包括一个量度字段的指令,该量度字段指定对由所述算术逻辑单元产生的一个输出数据字进行的一次右移操作。
在许多的实际应用例中,没有必要维护输出数据字的全精度,因此能够在输出数据字中指定一次写移位的指令以及一次算术操作尤其有用,因为在执行这种指令之后如果将该输出数据字从该寄存器中移出,该输出数据字将已经与输出数据总线正确对齐。
窄寄存器与宽寄存器个数的一个整数比值尤其有用。在诸如数字信号处理的应用中,在大多数操作所要求的输入操作数的数量与输出结果的数量之间经常有一个固定比值。窄寄存器数目和宽寄存器数目之间的一个整数关系可有效地利用所提供的寄存器资源。
通过提供一个输入缓冲器也能提高该系统的寄存器资源的使用效率,该输入缓冲器保存要加载进提供程序指令字的窄寄存器中的一个的输入操作数数据字,该程序指令字包括一个重填标志,用于指示一个特定的寄存器在它上一次被使用时应该从该输入缓冲器进行重填充。
从另一方面来看,本发明提供了一个使用上述数据处理装置的数字信号处理方法,其中所述算术逻辑单元执行一个卷积操作,一个相关操作和一个变换操作中的至少一个,存储在一个X位寄存器中的每一个输入操作数数据字在从所述数据存储设备重新加载所述X位寄存器之前被用在多个算术逻辑操作中。
下面参照附图以示例方式描述本发明的实施例,附图中:
图1示出数字信号处理装置的高层配置;
图2示出协处理器的寄存器配置的输入缓冲器;
图3示出通过协处理器的数据路径;
图4示出从寄存器中读取高或低位位的多路复用电路;
图5为示出较佳实施例中的协处理器所使用的寄存器重新映象逻辑的框图;
图6更详细地示出图5中所示的寄存器重新映象逻辑;以及
图7为示出块过滤算法的表。
下面描述的系统是关于数字信号处理(DSP)的。DSP可采取许多形式,但一般可以认为是需要高速(实时)处理大量数据的处理。这一数据通常表示某种模拟物理信号。DSP的好的实例便是用在数字移动电话中的,其中所接收与发送的无线电信号需要解码成模拟声音信号及将模拟声音信号编码(通常采用卷积、变换及相关运算)。另一实例是盘驱动器控制器,其中处理从盘头恢复的信号以产生头跟踪控制。
在上面的上下文中,下面是对基于与协处理器合作的微处理器核(在本例中为英国剑桥先进RISC机器有限公司设计的微处理器范围内的ARM核)的数字信号处理系统的描述。微处理器与协处理器的接口及协处理器体系结构本身是专门为提供DSP功能配置的。微处理器核将被称作ARM而协处理器称作Piccolo。ARM与Piccolo通常制造成包含作为ASIC的一部分的其它元件(如片上DRAM、ROM、D/A与A/D转换器等)的单一集成电路。
Piccolo为ARM协处理器,因此它执行一部分ARM指令集。ARM协处理器指令允许ARM在Piccolo与存储器之间传送数据(利用加载协处理器LDC及存储协处理器STC指令),以及向与从Piccolo传送ARM寄存器(利用传送到协处理器MCR及从协处理器传送的MRC指令)。观察ARM与Piccolo的协作交互作用的一种方式是ARM作为Piccolo数据的强有力的地址发生器工作,而使Piccolo有时间执行需要实时处理大量数据来产生对应的实时结果的DSP运算。
图l示出ARM2与Piccolo4,ARM2发布控制信号到Piccolo4来控制向Piccolo4传送数据以及从Piccolo4传送数据字。指令高速缓冲存储器6存储Piccolo4所需要的Piccolo程序指令字。单个DRAM存储器8存储ARM2与Piccolo4两者所需要的所有数据与指令字。ARM2负责寻址存储器8及控制所有数据传送。只带单个存储器8及一组数据与地址总线的布置比需要多个存储器及高总线带宽的总线的典型DSP方法简单与低廉。
Piccolo执行来自控制Piccolo数据路径的指令高速缓冲存储器6的第二指令流(数字信号处理程序指令字)。这些指令中包含诸如乘-累加等数字信号处理型操作及诸如零开销循环指令等控制流指令。这些指令在保持在Piccolo寄存器10(见图2)中的数据上操作。这一数据是早先ARM2从存储器8传送来的。指令流自指令高速缓冲存储器6;指令高速缓冲存储器6作为完全的总线主驱动数据总线。小的Piccolo指令高速缓冲存储器6为4线、每线16个字的直接映象高速缓冲存储器(64条指令)。在一些实现中,令指令高速缓冲存储器更大是值得的。
从而两个任务是独立运行的,ARM加载数据而Piccolo处理它。这允许在16位数据上持续的单周期数据处理。Piccolo具有使ARM预取顺序数据,在Piccolo需要它之前加载数据的数据输入机制(示出在图2中)。Piccolo能以任何次序存取加载的数据,随着老数据的最后一次使用自动地重新填充其寄存器(所有指令的每一源操作数都有一位来指示应重新填充源寄存器)。这一输入机制称作再定序缓冲冲器并包括输入缓冲器12。加载进Piccolo的每一个值(见下面通过LDC或MCR)携带有指定该值的目的地寄存器的标记Rn。标记Rn与数据字一起存储在输入缓冲器中。当通过寄存器选择电路14存取寄存器而指令指定要重新填充该数据寄存器时,便通过确立信号E来标记该寄存器。然后重新填充电路16用输入缓冲器12中以该寄存器为目的地的最老的加载值自动重新填充该寄存器。重定序缓冲器保持8个带标记的值。输入缓冲器12具有类似于FIFO的形式,但除外可从队列中央抽取数据字,而此后较晚存储的字向前传递来填充空位。距离输入最远的数据字便相应地是最老的,并在输入缓冲器12保持带有正确的标记Rn的两个数据字时便用它来确定应当用哪一个数据字来重新填充输入缓冲器12。
如图3中所示Piccolo通过将数据存储在输出缓冲器18(FIFO)中输出它。数据是顺序地写入FIFO中的,并由ARM以相同的次序读出到存储器8。输出缓冲器18保持8个32位值。
Piccolo通过协处理器接口(图1的CP控制信号)连接在ARM上。在执行ARM协处理器指令时,Piccolo能执行该指令;在执行该指令之前令ARM等待直到Piccolo就绪;或拒绝执行该指令。在最后一种情况中,ARM将引起未定义的指令异常。
Piccolo执行的最普通的协处理器指令为LDC与STC,它们分别通过数据总线向与从存储器8加载与存储数据字,而ARM生成所有地址。便是这些指令将数据加载到重定序缓冲器中并存储来自输出缓冲器18的数据。如果在LDC上输入重定序缓冲器中没有足够的空间来加载数据时,及如果在STC上输出缓冲器中没有足够的数据供存储,即ARM正在期待的数据不在输出缓冲器18中时,Piccolo将阻止ARM。Piccolo还执行ARM/协处理器寄存器传送使ARM能存取Piccolo的特定寄存器。
Piccolo从存储器取出其本身的指令来控制图3中所示的数据路径及从重定序缓冲器到寄存器及从寄存器到输出缓冲器18传送数据。Piccolo的执行这些指令的算术逻辑单元具有执行乘法、加法、减法、乘-累加、逻辑运算、移位与循环的乘法器/加法器电路20。在数据路径中还设置有累加/累减(decumulate)电路22及定标/饱和电路24。
Piccolo指令是初始时从存储器加载进指令高速缓冲存储器6中的,其中Piccolo能存取它们而不需要返回去存取主存储器。
Piccolo不能从存储器失败中恢复。因此,如果在虚拟存储器系统中使用Piccolo,在整个Piccolo任务中所有Piccolo数据都必须在物理存储器中。对于诸如实时DSP等Piccolo任务的实时性质,这不是重大的限制。如果出现存储器失败,Piccolo将停止并在状态寄存器S2中设置标志。
图3示出Piccolo的整体数据路径功能。寄存器组10使用3个读端口与2个写端口。利用一个写端口(L端口)从重定序缓冲器重新填充寄存器。输出缓冲器18是直接从ALU结果总线26更新的,从输出缓冲器18的输出是在ARM程序控制下的。ARM协处理器接口执行到重定序缓冲器中的LDC(加载协处理器)指令及从输出缓冲器18的STC(存储协处理器)指令,以及在寄存器组10上的MCR与MRC(传送ARM寄存器至/自CP寄存器)。
其余寄存器端口用于ALU。两个读端口(A与B)驱动输入到乘法器/加法器电路20,C读端口用于驱动累加器/累减器电路22输入。其余写端口W用于将结果返回给寄存器组10。
乘法器20执行16×16带符号或不带符号乘法,带有可选用的48位累加。定标器单元24能提供0至31位立即算术或逻辑右移,后面跟随可选用的饱和。移位器与逻辑单元20每一周期能执行一个移位或逻辑运算。
Piccolo具有称作D0-D15或A0-A3、X0-X3、Y0-Y3、Z0-Z3的16个通用寄存器。第一组四个寄存器(A0-A3)预定作为累加器并且是48位宽,额外的16位提供在许多连续的计算中对溢出的保护。其余寄存器为32位宽。
可将各Piccolo寄存器作为包含两个独立的16位值对待。位0至15包含低的一半,位16至31包含高的一半。指令能指定各寄存器特定的16位的一半作为源操作数,或可指定整个32位寄存器。
Piccolo还提供饱和的运算。如果结果大于目的地寄存器的大小,乘法、加法与减法指令的变型提供饱和的结果。当目的地寄存器为48位累加器时,将值饱和到32位(即无法饱和48位值)。在48位寄存器上没有溢出检测。由于会占用至少65536条乘法累加指令才能导致溢出所以这是合理的限制。
各Piccolo寄存器是标记为“空”(E标志,见图2)或包含值(不可能有半个寄存器是空的)之一的。初始时,将所有寄存器标记为空。在各周期上Piccolo试图用重新填充控制电路16将来自输入重定序缓冲器的值填充空的寄存器之一。此外如果将来自ALU的值写入寄存器便不再将它标记为“空”的。如果从ALU写入寄存器,同时有值等待从重定序缓冲器放置到该寄存器中,则结果是不确定的。如果对空寄存器进行读取,Piccolo的执行单元将停止。
输入重定序缓冲器(ROB)位于协处理器接口与Piccolo的寄存器组之间。用ARM协处理器传送将数据加载进ROB中。ROB包含若干32位值,各带有指示作为该值的目的地的Piccolo寄存器的标记。该标记还指示该数据应传送给整个32位寄存器还是只给32位寄存器的底部16位。如果数据的目的地为整个寄存器,则将该项的底部16位传送给目标寄存器的底部一半并将顶部16位传送给寄存器的顶部一半(如果目标寄存器为48位累加器则扩展符号)。如果该数据的目的地只是寄存器的底部一半(所谓“半寄存器”),首先传送底部16位。
寄存器标记总是参照物理目的地寄存器,不执行寄存器重新映射(见下面关于寄存器重新映射。)
在每一个周期上Piccolo试图如下地将数据项从ROB传送到寄存器组:
-检验ROB中各项并将标记与空寄存器比较,确定是否能从一部分或全部项对寄存器进行传送。
-从能进行传送的项组中,选择最老的项并将其数据传送给寄存器组。
-将该项的标记更新为标记该项是空的。如果只传送了该项的一部分,只将传送的部分标记为空的。
例如,如果目标寄存器完全是空的且选择的ROB项包含以整个寄存器为目的地的数据,便传送全部32位并标记该项为空的。如果目标寄存器的底部一半是空的而ROB项包含目的地为寄存器的底部一半的数据,则将该ROB项的底部16位传送给目标寄存器的底部一半并将ROB的底部一半标记为空的。
可以独立地传送任何项中的数据的高与低16位。如果没有项包含能传送给寄存器组的数据,该周期中不进行传送。下面的表描述目标ROB项与目标寄存器状态的所有可能组合。
目标,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>.l的底部一半。这是‘半寄存器’情况。
例如,指令
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
				
				<dp n="d10"/>
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 2625 24 23 22 21 20 19 18 17 1615 14 13 12 11 10 9 8 7  6  5  4  3  2  1  0
 COND     110 P  U N W  I    Rn DEST PICCOLO1     SIZE/4
其中PICCOLO1为Piccolo的第一协处理器号(当前为8)。N位在LDP32(1)与LDP16(0)之间选择。
LDPW编码为:31 30 29 28 27 2625 24 23 22 21 20 19 18 17 1615 14 13 12 11 10 9 8 7  6  5  4  3  2  1  0
 COND  110 P  U  N W  I     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 1716 1514 13 12 11 10 9 8 7  6  5  4  3  2  1  0
    COND     110  P  U  O W  I   Rn  DES 01  PICCOLO2     00000001
其中DEST对于目的地组X、Y、Z为1-3。
将LDPA编码为:31 30 29 28 27 26 25 24 23 22 2120 19 18 17 16 15 14 1312 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 1413 12 11 10 9 8 7  6  5  4  3  2  1  0
    COND     1110  0  1  0  0  DEST     Rn PICCOLO1  000  1     0000
将MPRW编码为:31 30 29 28 27 26 25 24 23 22  21 20 19 18 1716 15 1413 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 2827 26 25 24 23  22 21 20 19 18 17 1615 14 13 12 11 10 9 8 7  6  5  4  3  2  1  0
 COND     110  P  U  N  W  O     Rn     0000  PICCOLO1     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 1716 15 14 1312 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。Picco1o可在带有大结尾(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 2221 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 1716 15 14 13 12 11 10 9 8 7 6 5 4     3  2  1  0
    实现者     体系结构     部件号 修订版本
位[3∶0]包含处理器的修订版本号。
位[15∶4]包含以二进制编码的十进制格式的3位部件号:piccolo为0x500
位[23∶16]包含体系结构版本:0×00=版本1
位[31∶24]包含实现者商标的ASCⅡ码: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 1098 7 6 5  4  3  2  1  0
 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 1312 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 1312 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 2221 2019 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 2120 19 18 1716 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 1716 15 14 1312 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 0
1  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     #LOOPS13 #INSTRUCTION_8
    1     11111  0  OPC     REGISTER_LIST_16  SCALE
    1     11111     100     IMMEDIATE_16  CONO
    1     11111     101     PARAMETERS_21
    1     11111  11 OP
上表中的指令具有以下名称:
标准数据运算
逻辑运算
条件加/减
未定义
移位
选择
未定义
并行选择
乘累加
未定义
双倍乘
未定义
移动带符号立即数
未定义
重复
重复
寄存器列表操作
转移
重新命名参数传送
停止/中断
在下面的节中详细描述各类指令的格式。对于大多数指令,源与目的地操作数字段是通用的并在单独的节中详细描述,寄存器重新映射也一样。
大多数指令需要两个源操作数;源1与源2。某些例外是饱和绝对值。
源l(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 0x000000XY
    01 0x0000XY00
    10 0x00XY0000
    11 0xXY000000
6位立即数编码允许使用6位不带符号的立即数(从0到63),以及作用在ALU的输出上的标度。
通用源2编码对于大多数指令变型是通用的。对这一规则存在一些例外,它们支持源2编码的有限子集或将其稍加修改:
-选择指令。
-移位指令。
-并行操作。
-乘累加指令。
-乘双倍指令。
选择指令只支持寄存器或6位不带符号立即数的一个操作数。由于这些位由指令的状态字段使用而得使该标度不可用。
移位指令只支持16位寄存器或1与31之间的5位无符号立即数的一个操作数。不能得到结果的标度。
Figure A9719671400281
在并行操作情况中,如果指定寄存器作为操作数的源,则必须执行32位读。并行操作的立即数编码略为不同。它允许将一个立即数复制到32位操作数的两个16位一半中。并行操作可利用稍加限制范围的标度。
Figure A9719671400282
如果使用6位立即数,则总是将它复制到32位量的两个一半上。如果使用8位立即数,只有当循环指示应将8位立即数循环到32位量的顶部一半上时才复制。
   循环    立即数
    00  0x000000XY
    01  0x0000XY00
    10  0x00XY00XY
    11  0xXY00XY00
并行选择操作不使用标度;必须将这些指令的标度字段设置为0。
乘累加指令不允许指定8位循环立即数。该字段的位10用来部分地指定使用哪一累加器。源2蕴含16位操作数。
Figure A9719671400291
乘双倍指令不允许使用常量。只能指定一个16位寄存器。该字段的位10用来部分地指定使用哪一个累加器。
Figure A9719671400292
某些指令总是蕴含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种变型:
Figure A9719671400311
寄存器号(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 X0.h^,X1,X2,则锁存该值直到写第二个16位值。然后将两个值组合并作为一个32位数放入输出FIFO中。写入的第一个16位值总是出现在32位字的低位一半。将进入输出FIFO的数据标记为16或32位数据,以允许在大结尾系统上校正结尾。
如果在两次16位写之间写入32位值,则操作是未定义的。
重复指令内支持寄存器重新映射,允许重复指令访问寄存器的移动‘窗口’而不回绕循环。下面更详细地描述这一点。
在本发明的较佳实施例中,重复指令提供修改在循环中指定寄存器操作数的方式的机制。在这一机制下,要访问的寄存器是用指令中的寄存器操作数及在寄存器组中的编移量的一个函数来确定的。该偏移量是以可编程方式改变的,最好在各指令循环的末尾。该机制可独立地在位于X、Y与Z组中的寄存器上操作。在较佳实施例中,这一设施对于A组中的寄存器不能利用。
可使用逻辑与物理寄存器的概念。指令操作数为逻辑寄存器引用,然后将其映射到标识特定Piccolo寄存器10的物理寄存器引用。包含再填充在内的所有操作都在物理寄存器上操作。只在Piccolo指令流一侧出现寄存器重新映射-加载进Piccolo的数据总是指派给物理寄存器而不执行重新映射。
进一步参照图5讨论重新映射机制,图5为示出Piccolo协处理器4的若干内部部件的方框图。将ARM核2从存储器中检索到的数据项放在重定序缓冲器12中,而Piccolo寄存器10则以较早参照图2描述的方式从重定序缓冲器12再填充。将存储在高速缓冲存储器6中的Piccolo指令传递给在Piccolo4内的指令解码器50,在那里在将它们传递给Piccolo处理器核54之前进行解码。Piccolo处理器核54包含较早参照图3讨论的乘法器/加法器电路20、累加/累减电路22及定标/饱和电路24。
如果指令解码器50正在处理构成用重复指令标识的指令循环的一部分的指令,而该重复指令指示了应进行若干寄存器的重新映射,便利用寄存器重新映射逻辑52来执行必要的重新映射。可将寄存器重新映射逻辑52认为是指令解码器50的一部分,虽然熟悉本技术的人员清楚可将寄存器重新映射逻辑设置成完全与指令解码器50分开的实体。
指令中通常包含标识包含指令所需的数据项的寄存器的一个或多个操作数。例如,典型的指令可包含两个源操作数及一个目的地操作数,标识包含该指令所需的数据项的两个寄存器及应将指令的结果放入其中的寄存器。寄存器重新映射逻辑52从指令解码器50接收指令的操作数,这些操作数标识逻辑寄存器引用。根据逻辑寄存器引用,寄存器重新映射逻辑确定应不应施加重新映射,然后根据需要将重新映射作用在物理寄存器引用上。如果确定不应施加重新映射,便提供逻辑寄存器引用作为物理寄存器引用。稍后将详细讨论执行重新映射的较佳方式。
将来自寄存器重新映射逻辑的各输出物理寄存器引用传递给Piccolo处理器核54,使得随后处理器核能将指令作用在由物理寄存器引用标识的特定寄存器10中的数据项上。
较佳实施例的重新映射机制允许将各寄存器组分成两部分,即可以重新映射的寄存器部分及保持它们原来的寄存器引用不重新映射的寄存器部分。较佳实施例中,重新映射部分起始于重新映射的寄存器组的底部。
重新映射机制采用若干参数,这些参数将参照图6详细讨论,图6为示出寄存器重新映射逻辑22如何使用各种参数的方框图。应指出这些参数是相对于正在重新映射的组内的一点的给定值,这一点为例如该组的底部。
可认为寄存器重新映射逻辑52包括两个主要逻辑块,即重新映射块56及基更新块58。寄存器重新映射逻辑52采用提供加在逻辑寄存器引用上的偏移值的基指针,由基更新块58将这一基指针值提供给重新映射块56。
可用基起始(BASESTART)信号来定义基指针的初始值,例如这通常是零,虽然一些其它值也可指定。将这一基起始信号传递给基更新块58内的多路复用器60。在指令循环的第一次重复中,多路复用器60将基起始信号传递给存储单元66,而对于循环的后面的重复,由多路复用器60将下一基指针值提供给存储单元66。
将存储单元66的输出作为当前基指针值传递给重新映射逻辑56,并且还传递给基更新逻辑58内的加法器62的输入之一。加法器62还接收提供基增量值的基增量(BASEINC)信号。加法器62配置成将存储单元66所提供的当前基指针值增加该基增量值,并将结果传递给模电路64。
这一模电路还接收基环绕(BASEWRAP)值并将这一值与来自加法器62的输出基指针信号比较。如果增量后的基指针值等于或大于基环绕值,便将新基指针绕回到新的偏移值。这时模电路64的输出便是要存储在存储单元66中的下一基指针值。将这一输出提供给多路复用器60,并从那里到存储单元66。
然而,在存储单元66从管理重复指令的循环硬件接收到基更新(BASEUPDATE)信号之前不能将这一下一个基指针值存储在存储单元66中。循环硬件周期性地生成基更新信号,例如每当要重复指令循环时。当存储单元66接收到基更新信号时,存储单元便用多路复用器60提供的下一基指针值改写前一基指针值。以这一方式,提供给重新映射逻辑58的基指针值将改变成新基指针值。
要在寄存器组的重新映射的部分内存取的物理寄存器由包含在指令的操作数内的逻辑寄存器引用与基更新逻辑58提供的基指针值之和确定。这一加法是由加法器68执行的并将输出传递给模电路70。在较佳实施例中,模电路70还接收寄存器环绕值,如果来自加法器68的输出信号(逻辑寄存器引用与基指针值之和)超过寄存器环绕值,结果将环绕回到重新映射区的底部。然后将模电路70的输出提供给多路复用器72。
将寄存器计数(REGCOUNT)值提供给重新映射块56内的逻辑74,标识组中要重新映射的寄存器的数目。逻辑74将这一寄存器计数值与逻辑寄存器引用比较,并根据比较结果将控制信号传递给多路复用器72。多路复用器72作为其两个输入接收逻辑寄存器引用及模电路70的输出(重新映射的寄存器引用)。本发明的较佳实施例中,如果逻辑寄存器引用小于寄存器计数值,逻辑74便指令多路复用器72输出重新映射的寄存器引用作为物理寄存器引用。然而,如果逻辑寄存器引用大于或等于寄存器计数值,逻辑74便指令多路复用器直接输出逻辑寄存器引用作为物理寄存器引用。
如上所述,在较佳实施例中,重复指令调用重新映射机制。如稍后要详细讨论的,重复指令在硬件中提供四个零周期循环。这些硬件循环作为指令解码器50的一部分示出在图5中。每一次指令解码器50请求来自高速缓冲存储器6的指令时,高速缓冲存储器便将该指令返回给指令解码器,此时指令解码器判定返回的指令是否是重复指令。如果是,便配置硬件循环之一来处理该重复指令。
各重复指令指定循环中的指令数及环绕循环的次数(它是常量或读自Piccolo寄存器)。提供了两个操作码‘重复’(REPEAT)及下一个(NEXT)来定义硬件循环,‘下一个’操作码只用作分界符并不汇编成指令。重复从循环的起点开始,而‘下一个’界定循环的结束,允许汇编程序计算循环体中的指令数。在较佳实施例中,重复指令可包含要由寄存器重新映射逻辑52使用的诸如寄存器计数(REGCOUNT)、基增量(BASEINC)、基环绕(BASEWRAP)及寄存器环绕(REGWRAP)参数等重新映射参数。
可设置若干寄存器来存储寄存器重新映射逻辑所使用的重新映射参数。在这些寄存器内,可提供若干组预定义的重新映射参数,同时保留一些寄存器供存储用户定义的重新映射参数。如果用重复指令指定的重新映射参数等于预定义的重新映射参数组之一,则采用适当的重复编码,这一编码导致多路复用器之类将适当的重新映射参数直接从寄存器提供给寄存器重新映射逻辑。反之,如果重新映射参数与任何预定义的重新映射参数组都不同,则汇编程序生成重新映射参数传送指令(RMOV),它允许配置用户定义的寄存器重新映射参数,RMOV指令后面是重复指令。最好RMOV指令将用户定义的重新映射指令放置在为存储这种用户定义的重新映射参数留出的寄存器中,然后将多路复用器编程为将这些寄存器的内容传递给寄存器重新映射逻辑。
在较佳实施例中,寄存器计数、基增量、基环绕及寄存器环绕参数取下表中确定的值之一:
    参数                描述
    REGCOUNT(寄存器计数) 它确定在上面执行重新映射的16位寄存器数并可取值0,2,4,8。REGCOUNT以下的寄存器是重新映射的,以上或等于REGCOUNI的是直接存取的。
    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*c0
				
				<dp n="d35"/>
MULA   A2,X1.l,Y0.l,A2      ;a2+=d2*c0
MULA   A3,X1.h ,Y0.l^,A3   ;a3+=d3*c0 ,及加载c4
MULA   A0,X0.h^,Y0.h,A0    ;a0+=d1*c1,及加载d5
MULA   A1,X1.l,Y0.h,A1      ;a1+=d2*c1
MULA   A2,X1.h,Y0.h,A2      ;a2+=d3*c1
MULA   A3,X0.l,Y0.h^,A3    ;a3-=d4*c1,及加载c5
MULA   A0,X1,l^,Y1.l,A0    ;a0+=d2*c2,及加载d6
MULA   A1,X1.h,Y1.l,A1      ;a1+=d3*c2
MULA   A2,X0.l,Y1.l,A2      ;a2+=d4*c2
MULA   A3,X0.h,Y1.l^,A3    ;a3+=d5*c2,及加载c6
MULA   A0,X1.h^,Y1.h,AC    ;a0+=d3*c3,及加载d7

MULA   A1,X0.l,Y1.h,A1      ;a1+=d4*c3
MULA   A2,X0.h,Y1.h,A2      ;a2+=d5*c3
MULA   A3,X1.l,Y1.h^,A3    ;a3-=d6*c3,及加载c7
NEXT
在本例中,将数据值放在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位,任何大于+0x7fff的值用+0x7fff代替,而任何小于-0x8000的值则用-0x8000代替。类似地饱和到32位用极限+0x7fffffff与-0x80000000。如果目的地寄存器为48位,饱和仍然在32位上。
源操作数1可用下述格式之一:
<Srcl>将用作[Rn∶Rn.l}Rn.h∶ Rn.×][^]的简写。换言之,源说明符的所有7位都有效,并作为(可选择地互换的)32位值或16位符号扩展的值读取寄存器。对于累加器只读取底部32位。^指示寄存器再填充。
<srcl_16>是[Rn.l∶Rn.h][^]的简写。只能读取16位值。
<srcl_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编码值0xYZ000000、0x00YZ0000、0x0000YZ00、及0x000000YZ。循环是作为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 2019 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,ans
这提高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 dest.h=(src1.h+src2.h)->>{scale},
 dest.l=(src1.l+src2.l)->>{scale}001 dest.h=(src1.h+src2.h)->>{scale},
 dest.l=(src1.l-src2.l)->>{scale}
100 dest.h=(src1.h-src2.h)->>{scale},
 dest.l=(src1.l+src2.l)->>{scale}
101 dest.h=(src1.h-src2.h)->>{scale},
 dest.l=(src1.l-src2.l).>>{scale}
如果置位了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>,<stc2_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 141312 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+tsrc2
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中的一个值,但除外srcl为-1或0的特殊情况,这时返回31。
助记符:
CLB<dest>,<src1>
标志:
Z如果结果为0,便置位。
N是消除的。
C如果src1为-1或0之一,便置位。
V保持。
包含的理由:
正规化需要的步骤。
设置了停止与断点指令用于停止Piccolo的执行31   30 29 28 27 26 25 24 23 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     000000000000000000000000
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 2019 18 17 16 15 14 1312 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&amp;src2){->>scale}
01    dest=(src1∶src2){->>scale}
10    dest=(src1&amp;~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>{,<scale>}
汇编程序支持下述操作码。
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 1312 11 10 9 8 7 6 5 4 3 2 1 0
 0     101  OPC  I  F  SD     DEST S1  R1     SRC1     SRC2
OPC指定指令的类型。
操作(OPC):
0 dest=(src1<=src2)?src1:src2
1 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情况),置位C
V保持
包含的理由:
为了找出信号强度,许多算法扫描样本来找出样本的绝对值的最大/最小值。对此,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 2019 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     SRC1_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.l=(src1.l>stc2.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 2019 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 2120 1918 17 16 15 14 1312 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 2120 19 18 17 16 15 141312 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>{,<sca1e>}

1    SMUL   <dest>,<src_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 2726 25 24 23 22 21 20 19 18 17 16 1514 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_8
带固定的循环数的重复的编码: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    X0MULA      A0,Y0.l,Z0.l,A0MULA      A0,Y0.h^,Z0.h^,A0NEXT
这将执行两条MULA指令X0次。同时,
REPEAT    #10MULA      A0,X0^,Y0^,A0NEXT
将执行10次乘累加。
汇编程序支持语法:
REPEAT#iterations[,<PARAMS>]以指定重复所用的重新映射参数。如果所需的重新映射参数等于预定义的参数组之一,则使用适当的REPEAT编码。如果不是,则汇编程序将生成RMOV来加载用户定义的参数,后面跟随REPEAT指令。见上面的节中的RMOV指令及重新映射参数格式的细节。
如果循环的重复次数为0则REPEAT的操作是不可预测的。
如果将指令字段的数字设置为0则REPEAT的操作是不可预测的。
循环只包含一条指令而该指令为转移时,则具有不可预测的表现。
从REPEAT循环界内转移到该循环的界外是不可预测的。
饱和绝对值指令计算源1的饱和的绝对值。31   30 29 28 2726 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
    0     10011  F  SD     DEST S1  R1     SRC1     1000000000000
操作:
dest=SAT((src1>=0)?src1:-src1)。该值总是饱和的。具体地,0x80000000的绝对值为0x7fffffff而不是0x80000000!
助记符:
SABS<dest>,<src1>
标志:
Z如果结果为0,便置位。
N保持。
C如果src1<0(dest=-src1情况),便置位。
V如果出现饱和,便置位。
包含的理由:
在许多DSP应用中有用。
选择操作(条件传送)用来有条件地将源1或源2传送到目的地寄存器中。选择总是等效于传送。还有在并行加/减以后使用的并行操作。
注意为了实现的原因,可读取两个源操作数,如果其中之一为空,指令将停止,不管该操作数是否是严格需要的。
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<coad>        <dest>,<src1>,<src2>
01 SELTT<cond>      <dest>,<src1>,<src2>
10 SELTF<cond>      <dest>,<src1>,<src2>
11  不用
如果将寄存器标记为再填充,无条件将其再填充。汇编程序还提供下列助记符:
MOV<con>      <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 1312  11 10 9 8 7 6 5 4 3 2 1 0
    1     010  OPC  F  SD     DEST  S  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 2625 24 23  22 21 20 19 18 17 16 15 14 13 12 11 10 9 8   7 6 5 4 3 2 1 0
 COND  110  P  U  O  W  I     BASE     BANK  PIDCOLO1     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 1716 15 14 1312 11 10 9 8     7 6 5 4 3 2 1 0
COND 110 P U O W O 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填充数据路径的高位。

Claims (9)

1.一个数据处理装置,所述装置包括:
M个X-位寄存器,其中M是大于1的正整数,这些寄存器用于接收来自数据存储装置的相应的输入操作数数据字;
一个算术逻辑单元,用于对存储在所述X-位寄存器中的所述输入操作数数据字进行算术逻辑操作以产生输出数据字;
N个Y位寄存器,其中N是大于1的正整数,用于接收来自所述算术逻辑单元的所述输出数据字,其中
M/N=3,8<=Y-X<=16,并且3X=2Y。
2.根据权利要求1的装置,其特征在于M等于12,N等于4。
3.根据权利要求1的装置,其特征在于X等于32。
4.根据上述任一权利要求的装置,其特征在于所述算术逻辑单元响应包括一个量度字段的指令,该量度字段指定对由所述算术逻辑单元产生的一个输出数据字进行的一次右移操作。
5.根据上述任一权利要求的装置,其特征在于包括一个输入缓冲器,该输入缓冲器位于所述数据存储设备和所述X位寄存器之间,用于存储多个X位输入操作数数据字。
6.根据权利要求5的装置,其特征在于所述算术逻辑单元响应至少一个包括至少一个源寄存器字段的程序指令字,该源寄存器字段指定包括一个输入操作数数据字的所述X位寄存器中的一个,所述程序指令字还包括一个重填字段,用于指示应当从所述输入缓冲器重填所述源寄存器。
7.根据上述任一权利要求的装置,其特征在于包括一个输出缓冲器,该输出缓冲器位于所述数据存储设备和所述Y位寄存器之间,用于存储多个X位输出数据字。
8.根据权利要求7的装置,其特征在于所述算术逻辑单元响应至少一个包括至少一个目的寄存器字段的程序指令字,该目的寄存器字段指定所述Y位寄存器中的一个用作所述输出数据字的目的地,所述程序指令字还包括一个存储字段,用于指示所述输出数据字应当存储在所述输出缓冲器中。
9.一种使用上述任一权利要求的数据处理装置的数字信号处理方法,其中所述算术逻辑单元执行一个卷积操作,一个相关操作和一个变换操作中的至少一个,存储在一个X位寄存器中的每一个输入操作数数据字在从所述数据存储设备重新加载所述X位寄存器之前被用在多个算术逻辑操作中。
CN97196714.8A 1996-09-23 1997-08-22 数据处理装置寄存器 Pending CN1226323A (zh)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
GB9619824A GB2317465B (en) 1996-09-23 1996-09-23 Data processing apparatus registers.
GB9619824.7 1996-09-23
US08/727,777 US5969975A (en) 1996-09-23 1996-10-08 Data processing apparatus registers

Publications (1)

Publication Number Publication Date
CN1226323A true CN1226323A (zh) 1999-08-18

Family

ID=26310084

Family Applications (1)

Application Number Title Priority Date Filing Date
CN97196714.8A Pending CN1226323A (zh) 1996-09-23 1997-08-22 数据处理装置寄存器

Country Status (5)

Country Link
US (1) US5969975A (zh)
EP (1) EP0927388A1 (zh)
CN (1) CN1226323A (zh)
GB (1) GB2317465B (zh)
WO (1) WO1998012624A1 (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111128289A (zh) * 2018-10-31 2020-05-08 爱思开海力士有限公司 扫描链技术以及利用扫描链结构的方法

Families Citing this family (22)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6259456B1 (en) 1997-04-30 2001-07-10 Canon Kabushiki Kaisha Data normalization techniques
US6707463B1 (en) 1997-04-30 2004-03-16 Canon Kabushiki Kaisha Data normalization technique
AU744329B2 (en) * 1997-04-30 2002-02-21 Canon Kabushiki Kaisha Data normalization circuit and method
US6189094B1 (en) * 1998-05-27 2001-02-13 Arm Limited Recirculating register file
WO2000022511A1 (en) * 1998-10-09 2000-04-20 Koninklijke Philips Electronics N.V. Vector data processor with conditional instructions
GB2343970A (en) * 1998-11-20 2000-05-24 Advanced Risc Mach Ltd Arithmetic operations in a data processing system
JP3336986B2 (ja) * 1999-02-03 2002-10-21 日本電気株式会社 信号処理プロセッサ及びそれに用いる丸め機能付き積和演算器
JP2001044854A (ja) * 1999-07-29 2001-02-16 Fujitsu Ltd 符号化支援装置、復号化支援装置、無線送信機および無線受信機
WO2002091607A1 (de) * 2001-05-08 2002-11-14 Siemens Aktiengesellschaft Verfahren zur detektion von mehrwegsignalen
US7340495B2 (en) * 2001-10-29 2008-03-04 Intel Corporation Superior misaligned memory load and copy using merge hardware
US7140019B2 (en) * 2002-06-28 2006-11-21 Motorola, Inc. Scheduler of program instructions for streaming vector processor having interconnected functional units
US7159099B2 (en) * 2002-06-28 2007-01-02 Motorola, Inc. Streaming vector processor with reconfigurable interconnection switch
US6934938B2 (en) * 2002-06-28 2005-08-23 Motorola, Inc. Method of programming linear graphs for streaming vector computation
US7415601B2 (en) * 2002-06-28 2008-08-19 Motorola, Inc. Method and apparatus for elimination of prolog and epilog instructions in a vector processor using data validity tags and sink counters
US7689641B2 (en) * 2003-06-30 2010-03-30 Intel Corporation SIMD integer multiply high with round and shift
US7290122B2 (en) * 2003-08-29 2007-10-30 Motorola, Inc. Dataflow graph compression for power reduction in a vector processor
US7689640B2 (en) * 2005-06-06 2010-03-30 Atmel Corporation Method and apparatus for formatting numbers in microprocessors
US7945768B2 (en) * 2008-06-05 2011-05-17 Motorola Mobility, Inc. Method and apparatus for nested instruction looping using implicit predicates
US8615540B2 (en) * 2009-07-24 2013-12-24 Honeywell International Inc. Arithmetic logic unit for use within a flight control system
FR2953310B1 (fr) * 2009-11-30 2012-08-17 Commissariat Energie Atomique Operateur materiel d'additions/soustractions, processeur et terminal de telecommunication incluant un tel operateur
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
US11886377B2 (en) * 2019-09-10 2024-01-30 Cornami, Inc. Reconfigurable arithmetic engine circuit

Family Cites Families (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US3987291A (en) * 1975-05-01 1976-10-19 International Business Machines Corporation Parallel digital arithmetic device having a variable number of independent arithmetic zones of variable width and location
CA2003338A1 (en) * 1987-11-09 1990-06-09 Richard W. Cutts, Jr. Synchronization of fault-tolerant computer system having multiple processors
EP0389175A3 (en) * 1989-03-15 1992-11-19 Fujitsu Limited Data prefetch system
US5001662A (en) * 1989-04-28 1991-03-19 Apple Computer, Inc. Method and apparatus for multi-gauge computation
US5175863A (en) * 1989-10-23 1992-12-29 International Business Machines Corporation Signal data processing system having independently, simultaneously operable alu and macu
EP0843254A3 (en) * 1990-01-18 1999-08-18 National Semiconductor Corporation Integrated digital signal processor/general purpose CPU with shared internal memory
US5442769A (en) * 1990-03-13 1995-08-15 At&T Corp. Processor having general registers with subdivisions addressable in instructions by register number and subdivision type
US5197132A (en) * 1990-06-29 1993-03-23 Digital Equipment Corporation Register mapping system having a log containing sequential listing of registers that were changed in preceding cycles for precise post-branch recovery
US6230255B1 (en) * 1990-07-06 2001-05-08 Advanced Micro Devices, Inc. Communications processor for voice band telecommunications
JPH0683578A (ja) * 1992-03-13 1994-03-25 Internatl Business Mach Corp <Ibm> 処理システム、及びデータスループット制御方法
GB9226463D0 (en) * 1992-12-18 1993-02-10 Univ London Integrated circuits
DE69424626T2 (de) * 1993-11-23 2001-01-25 Hewlett Packard Co Parallele Datenverarbeitung in einem Einzelprozessor
US5640578A (en) * 1993-11-30 1997-06-17 Texas Instruments Incorporated Arithmetic logic unit having plural independent sections and register storing resultant indicator bit from every section
US5655132A (en) * 1994-08-08 1997-08-05 Rockwell International Corporation Register file with multi-tasking support

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111128289A (zh) * 2018-10-31 2020-05-08 爱思开海力士有限公司 扫描链技术以及利用扫描链结构的方法
CN111128289B (zh) * 2018-10-31 2024-01-19 爱思开海力士有限公司 扫描链技术以及利用扫描链结构的方法

Also Published As

Publication number Publication date
GB2317465B (en) 2000-11-15
GB9619824D0 (en) 1996-11-06
WO1998012624A1 (en) 1998-03-26
EP0927388A1 (en) 1999-07-07
GB2317465A (en) 1998-03-25
US5969975A (en) 1999-10-19

Similar Documents

Publication Publication Date Title
CN1226323A (zh) 数据处理装置寄存器
CN1135468C (zh) 对存储设备中信号数据字执行数字信号处理的方法和装置
CN1103961C (zh) 协处理器的数据访问控制装置和方法
CN1246772C (zh) 处理器
CN1112635C (zh) 多媒体信号处理器中的单指令多数据处理方法及其装置
CN1117316C (zh) 采用多个向量寄存器组的单指令多数据处理方法及其装置
CN1584824A (zh) 一种基于cisc结构的微处理器构架及指令实现方式
CN1186718C (zh) 微控制器指令集
CN1264085C (zh) 一种用于执行多媒体应用的操作的装置、系统和方法
CN1287270C (zh) 重启动翻译的指令
CN1244051C (zh) 对于处理数据的装置和方法
CN1625731A (zh) 具有多种长度指令集体系结构的可配置数据处理器
CN1472646A (zh) 适应性强具备最佳化功能的编译装置
CN1126030C (zh) 数据处理装置
CN1306697A (zh) 可变长度编码与解码的处理电路和处理方法
CN1103959C (zh) 数据处理装置和操作数据处理装置的方法
CN1497435A (zh) 处理器
CN1993709A (zh) 信号处理设备
CN1469241A (zh) 处理器、程序变换装置和变换方法以及计算机程序
CN1484787A (zh) 处理器流水线中的硬件指令翻译
CN1269052C (zh) 支持缩小代码长度的常量还原型处理器
CN1226324A (zh) 数据处理系统寄存器控制
CN1104679C (zh) 数据处理装置和数据处理方法
CN1862485A (zh) 数字信号处理器
CN1279435C (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
C02 Deemed withdrawal of patent application after publication (patent law 2001)
WD01 Invention patent application deemed withdrawn after publication