CN1103959C - 数据处理装置和操作数据处理装置的方法 - Google Patents
数据处理装置和操作数据处理装置的方法 Download PDFInfo
- Publication number
- CN1103959C CN1103959C CN97198142A CN97198142A CN1103959C CN 1103959 C CN1103959 C CN 1103959C CN 97198142 A CN97198142 A CN 97198142A CN 97198142 A CN97198142 A CN 97198142A CN 1103959 C CN1103959 C CN 1103959C
- Authority
- CN
- China
- Prior art keywords
- register
- instruction
- logic
- remap
- remaps
- 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
Links
- 238000012545 processing Methods 0.000 title claims abstract description 48
- 230000003252 repetitive effect Effects 0.000 claims description 55
- 238000000034 method Methods 0.000 claims description 32
- 230000008859 change Effects 0.000 claims description 13
- 230000008569 process Effects 0.000 claims description 13
- 238000013461 design Methods 0.000 claims description 9
- 238000013507 mapping Methods 0.000 claims description 9
- 238000006243 chemical reaction Methods 0.000 claims description 5
- 238000010420 art technique Methods 0.000 abstract 1
- 101100534231 Xenopus laevis src-b gene Proteins 0.000 description 90
- 230000004087 circulation Effects 0.000 description 74
- 230000015654 memory Effects 0.000 description 45
- 229920006395 saturated elastomer Polymers 0.000 description 41
- 239000000872 buffer Substances 0.000 description 33
- 230000007246 mechanism Effects 0.000 description 24
- 238000006073 displacement reaction Methods 0.000 description 22
- 238000007792 addition Methods 0.000 description 15
- 230000001186 cumulative effect Effects 0.000 description 13
- 230000005540 biological transmission Effects 0.000 description 9
- 230000006870 function Effects 0.000 description 9
- 230000008901 benefit Effects 0.000 description 8
- 230000004048 modification Effects 0.000 description 8
- 238000012986 modification Methods 0.000 description 8
- PBLZLIFKVPJDCO-UHFFFAOYSA-N omega-Aminododecanoic acid Natural products NCCCCCCCCCCCC(O)=O PBLZLIFKVPJDCO-UHFFFAOYSA-N 0.000 description 8
- HJVCHYDYCYBBQX-HLTLHRPFSA-N (2s,3s,4e,6e,8s,9s)-3-amino-9-methoxy-2,6,8-trimethyl-10-phenyldeca-4,6-dienoic acid Chemical compound OC(=O)[C@@H](C)[C@@H](N)/C=C/C(/C)=C/[C@H](C)[C@@H](OC)CC1=CC=CC=C1 HJVCHYDYCYBBQX-HLTLHRPFSA-N 0.000 description 7
- 101001050286 Homo sapiens Jupiter microtubule associated homolog 1 Proteins 0.000 description 5
- 102100023133 Jupiter microtubule associated homolog 1 Human genes 0.000 description 5
- 238000012546 transfer Methods 0.000 description 5
- 230000006399 behavior Effects 0.000 description 4
- 230000014509 gene expression Effects 0.000 description 4
- 230000001373 regressive effect Effects 0.000 description 4
- GOLXNESZZPUPJE-UHFFFAOYSA-N spiromesifen Chemical compound CC1=CC(C)=CC(C)=C1C(C(O1)=O)=C(OC(=O)CC(C)(C)C)C11CCCC1 GOLXNESZZPUPJE-UHFFFAOYSA-N 0.000 description 4
- 230000009471 action Effects 0.000 description 3
- 238000001514 detection method Methods 0.000 description 3
- 238000010586 diagram Methods 0.000 description 3
- 230000005236 sound signal Effects 0.000 description 3
- 102000020897 Formins Human genes 0.000 description 2
- 108091022623 Formins Proteins 0.000 description 2
- 244000141353 Prunus domestica Species 0.000 description 2
- 238000009825 accumulation Methods 0.000 description 2
- 230000015572 biosynthetic process Effects 0.000 description 2
- 239000013256 coordination polymer Substances 0.000 description 2
- 230000008878 coupling Effects 0.000 description 2
- 238000010168 coupling process Methods 0.000 description 2
- 238000005859 coupling reaction Methods 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000001914 filtration Methods 0.000 description 2
- 230000006872 improvement Effects 0.000 description 2
- 238000013470 microfluidic resistive pulse sensing Methods 0.000 description 2
- 238000010606 normalization Methods 0.000 description 2
- 238000004321 preservation Methods 0.000 description 2
- 238000012360 testing method Methods 0.000 description 2
- 238000004804 winding Methods 0.000 description 2
- IUVCFHHAEHNCFT-INIZCTEOSA-N 2-[(1s)-1-[4-amino-3-(3-fluoro-4-propan-2-yloxyphenyl)pyrazolo[3,4-d]pyrimidin-1-yl]ethyl]-6-fluoro-3-(3-fluorophenyl)chromen-4-one Chemical compound C1=C(F)C(OC(C)C)=CC=C1C(C1=C(N)N=CN=C11)=NN1[C@@H](C)C1=C(C=2C=C(F)C=CC=2)C(=O)C2=CC(F)=CC=C2O1 IUVCFHHAEHNCFT-INIZCTEOSA-N 0.000 description 1
- 101000912181 Arabidopsis thaliana Cysteine synthase, mitochondrial Proteins 0.000 description 1
- 101100534229 Caenorhabditis elegans src-2 gene Proteins 0.000 description 1
- 241001269238 Data Species 0.000 description 1
- 229910002056 binary alloy Inorganic materials 0.000 description 1
- 230000000903 blocking effect Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 230000000052 comparative effect Effects 0.000 description 1
- 230000006835 compression Effects 0.000 description 1
- 238000007906 compression Methods 0.000 description 1
- 239000000470 constituent Substances 0.000 description 1
- 230000009133 cooperative interaction Effects 0.000 description 1
- 125000004122 cyclic group Chemical group 0.000 description 1
- 230000001351 cycling effect Effects 0.000 description 1
- 230000007812 deficiency Effects 0.000 description 1
- 230000001066 destructive effect Effects 0.000 description 1
- 230000010365 information processing Effects 0.000 description 1
- 230000000977 initiatory effect Effects 0.000 description 1
- 230000002045 lasting effect Effects 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 238000007726 management method Methods 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000002093 peripheral effect Effects 0.000 description 1
- 230000001915 proofreading effect Effects 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 238000012163 sequencing technique Methods 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
- 239000011800 void material Substances 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3005—Arrangements for executing specific machine instructions to perform operations for flow control
- G06F9/30065—Loop control instructions; iterative instructions, e.g. LOOP, REPEAT
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/3012—Organisation of register space, e.g. banked or distributed register file
- G06F9/3013—Organisation of register space, e.g. banked or distributed register file according to data content, e.g. floating-point registers, address registers
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30003—Arrangements for executing specific machine instructions
- G06F9/3004—Arrangements for executing specific machine instructions to perform operations on memory
- G06F9/30043—LOAD or STORE instructions; Clear instruction
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/30101—Special purpose registers
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/30105—Register structure
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/30098—Register arrangements
- G06F9/3012—Organisation of register space, e.g. banked or distributed register file
- G06F9/30134—Register stacks; shift registers
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
- G06F9/38—Concurrent instruction execution, e.g. pipeline or look ahead
- G06F9/3836—Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
- G06F9/3838—Dependency mechanisms, e.g. register scoreboarding
- G06F9/384—Register renaming
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Executing Machine-Instructions (AREA)
Abstract
根据本发明,提供了一种数据处理装置,它包括:用于存储要处理的数据项的多个寄存器;一个处理器,用于处理要应用于在所述多个寄存器中存储的数据项的指令;以及一个寄存器重映射逻辑,用于将一个预选的指令集中的逻辑寄存器引周转换到标识包含由所述处理器处理所需要的数据项的寄存器的一个物理寄存器引用。通过这一方法,为了将该重映射应用于所需的指令数目,只需将重映射指令执行一次。这与现有技术形成对比,其中,在重映射指令执行之后,该重映射将被应用于所有的后续指令,即不能选择所需数目的指令。本发明尤其有利于用于被设计成重复一个指令循环的装置中,该指令循环包括所述预选指令集。在这种情况下,用于管理该重复指令的循环硬件被设计成在每次重复该指令循环时更新该寄存器重映射逻辑,并且因此在执行该重复指令之前只执行用于配置该寄存器重映射逻辑的重映射指令一次。
Description
本发明涉及数据处理装置中的寄存器寻址,并且尤其涉及数字信号处理领域,尽管其应用并不限于数字信号处理。
通常将数字处理装置,比如微处理器,安排成将所接收的指令应用于从存储器中读取的数据项。在微处理器中设置有一个处理器核以处理指令,并且通常该微处理器具有多个寄存器,在处理器核需要数据项之前预先将这些数据项装入这些寄存器中。在微处理器接收到指令时,微处理器在将这些指令传递到处理器核进行处理之前通常将这些指令送到指令译码器。处理器核然后将所译码的指令应用于从其寄存器中读出的相关数据项。然后可以将所处理的指令的结果写回到一个寄存器中,或者直接提供给存储器,诸如高速缓存中。
在数据处理装置一种常见的情况是一个特定的数据项为多个指令所需要。因此这一数据项必须保存在一个寄存器中,直到所有这种指令都已被处理,并且这些指令必须都引用该数据项所位于的那个特定寄存器。另外,常见的是,通常要对一个指令范围(以下称之为一个指令循环)重复多次,以及某些数据项被该指令循环中的不同指令反复使用。在数字信号处理装置中一种尤其常见的情况是,诸如块过滤算法的算法包含需要重复多次的指令循环,以将这些指令应用于一组数据项。任一特定的数据项可以被该指令循环中的不同指令多次使用。
指令循环被大量用于相对复杂的算法和逻辑操作中,数字信号处理装置需要这些算法和操作以经常对大量的数据进行处理,以产生实时输出数据流。数字信号处理技术的通常应用包括需要在模拟音频信号和编码的用于发送的数字信号之间进行实时变换的移动电话。
一个指令通常包括一个或多个操作数,这些操作数标识包含该指令所要求的数据项的寄存器。例如,一个典型的指令可以包括两个源操作数和一个目的操作数,它们分别标识该指令所要求的两个数据项和该指令的结果应被存放的一个寄存器。在该指令构成如上所述要被反复应用于一组数据项的一个指令循环的一部分的情况下,有必要在每次执行该指令时使得每一指令的操作数引用正确的寄存器。这一要求通常意味着在该指令循环代码中该同一指令被多次产生以每次引用不同的寄存器。比如,如果将四个数据项装入寄存器中,一个指令作为一个指令循环的一部分被应用于这四个数据项的每一个,则该指令在该指令循环中被产生四次,该指令的操作数每次引用一个不同的寄存器。很显然,这对于代码密度具有不良的影响。
在微处理器设计中,在某些情况下使用逻辑寄存器引用的概念,并且然后将逻辑寄存器引用映射到实际寄存器引用,已经是众所周知的。比如,超标量处理器通常实现寄存器重命名以允许推测和不按顺序执行指令。该处理器具有的寄存器多于程序员模型所提供的,并且使用一个映射表将逻辑寄存器映射到它们当前的物理对等物上。在处理器推测性地执行指令时,它分配物理寄存器号以保存该结果。其他指令也可以推测性地读取这些结果。因此几个可能的指令流可以并行执行。在一些点上,该处理器将确定该多个流中的哪一个是正确的,通常这是根据一个条件分支的结果。在该映射表被永久性地更新时,任何不正确的寄存器形式被丢弃。进行寄存器重命名的目的是增加指令吞吐量,同时对程序员保持完全透明。很显然,对于上述代码密度问题它没有任何帮助。
作为使用逻辑和物理寄存器引用的另一个例子,先进微设备(Advanced Micro Device-AMD)的Am29200微处理器包括了192个通用寄存器。指定这些寄存器中的128个作为局部寄存器,并且还有一个寄存器作为局部寄存器堆栈指针,该堆栈指针寄存器提供到128个局部寄存器的一个偏移量。从而,在任一指令引用一个局部寄存器时,它使用该堆栈指针寄存器的值计算一个绝对寄存器号。因此,比如如果一个指令希望访问局部寄存器1(该局部寄存器序列开始于局部寄存器0),并且该堆栈指针指向绝对寄存器号131(根据Am29200的设计,在128个局部寄存器的序列中这实际是第4个寄存器),该指令实际上将访问由绝对寄存器号132标识的寄存器。
可以在Am29200微处理器上执行一个指令以改变堆栈指针寄存器的值,然后该堆栈指针寄存器修改后的值将被用于引用该局部寄存器的任一指令。对于每一个随后的指令,将使用由该指令所要求的到该128个局部寄存器中的绝对寄存器号的这一寄存器映射,直到执行另一指令来改变该堆栈指针寄存器。
因此,可以看出,在一个指令需要对于不同寄存器中的多个不同的数据项进行重复时,上述AMD设计允许某种程度的重映射。因此,每次在一个指令的操作数标识的寄存器映射到一个不同的局部寄存器时,要求发布一个单独的指令以改变堆栈指针寄存器的值。在某些情况下其带来的开销是很大的。比如在数字信号处理装置中常见的,需要对一个移位的数据项组多次重复一个指令循环。在该指令循环只包括很少数量的指令时,这一开销变得尤其不可接受,因为在循环重复之前,需要一个单独的指令来改变堆栈指针寄存器的值。因此,比如需要将一个指令重复10次以将之应用于数据项1至10,则在该指令每次执行之前,要求一个单独的指令来改变该堆栈指针寄存器值。因此一个只包含一个指令的指令循环实际上变成了具有两个指令的指令循环,很显然,该指令循环的执行增加了巨大的开销。
EP-A-0,696,772涉及一种控制一个寄存器文件技术,该寄存器文件提供对在一个特殊的任务或上下文中由一个算术逻辑单元执行的指令要访问的操作数的临时存储。该寄存器文件包括指定以第一个基地址开始的第一个寄存器组和以第二个基地址开始的第二个寄存器组的一个机构。然后提供一个寻址机构,该机构从一个指令中读取一个相对地址,确定该相对地址标识的是该第一寄存器组的一个寄存器还是该第二寄存器组中的一个寄存器,并从该相对地址计算要寻址的寄存器的绝对地址。
根据本发明,提供了一种数据处理装置,它包括:用于存储要处理的数据项的多个寄存器;一个处理器,用于处理要应用于在所述多个寄存器中存储的数据项的指令;一个寄存器重映射逻辑,用于将一个预选的指令集中的逻辑寄存器引用转换到标识包含由所述处理器处理所需要的数据项的寄存器的一个物理寄存器引用;用于定义要重复的一个指令范围的一个重复指令,所述指令范围包括所述预选指令集;以及用于管理该重复指令和被安排成周期性地更新该寄存器重映射逻辑的循环硬件,以改变由该寄存器重映射逻辑所施加的从逻辑寄存器引用到物理寄存器引用的变换。
根据本发明,提供寄存器重映射逻辑以对一个预选的指令集进行寄存器重映射。该重映射逻辑最好可由一个重映射指令进行配置,该重映射指令在所述预选指令集之前执行。可以设想该重映射指令可以直接标识为之进行寄存器重映射的该预选指令集。然而,在较佳实施例中,该由重映射指令配置的寄存器重映射逻辑可以由一个特定的情况在某些较迟的点触发,比如一个指令循环的开始。在这种情况下,将从该特定情形确定要对之进行寄存器重映射的预选指令集,比如该预选指令集可以是该指令循环中的所有指令。
通过这一方法,为了将该重映射应用于一个所需的指令集只需执行该重映射指令一次。这与该AMD微处理器的设计形成对比,其中,在改变堆栈指针寄存器中的值的指令之后,该同一重映射将被应用于所有的引用该局部寄存器的后续指令,并且如果该堆栈指针的值以及由此该重映射要被再次改变,将需要执行另一指令。
在较佳实施例中,该循环硬件通常可以被安排成在每次重复该指令范围时更新该寄存器重映射逻辑,使得每次重复该指令范围时进行从逻辑到物理寄存器引用的一个不同的重映射。
在较佳实施例中,该重复指令包括用于配置该寄存器重映射逻辑的一个或多个重映射参数。这些重映射参数最好使得从逻辑寄存器引用到物理寄存器引用的重映射依赖于由该重复指令定义的指令范围的特定重复。以此方式,由该寄存器重映射逻辑执行的重映射在每次重复该指令范围时被改变,而不要求发布一个单独的重映射指令。对于小的指令循环,这可以产生巨大的性能改进,这是因为,以前述的只包括一个指令的指令循环为例,该循环的每次重复只需要一个指令而不是使用根据AMD微处理器的现有方法所要求的两个指令。
在该重复指令包括一个或多个上述讨论的重映射参数时,可安排在执行该重复指令之前执行一个重映射指令以使用所述一个或多个重映射参数配置该寄存器重映射逻辑,所述重映射指令并不包括在由该重复指令定义的所述指令范围中。通过这一方法,在执行该重复指令之前只需要执行该重映射指令一次。然后,在执行该重复指令时,将由该循环硬件调用由该重映射指令定义的寄存器重映射逻辑。
该数据处理装置可以具有一个存储装置以存储至少一组预定义的重映射参数,每一组定义用于所述寄存器重映射逻辑的一个重映射配置。在这种情况下,如果包括在所述重复指令中的一个或多个重映射参数对应于所述预定义重映射参数组中的一组,则在所述较佳实施例中,使用用于该寄存器重映射逻辑的对应的重映射配置,而不要求执行一个重映射指令。
在较佳实施例中,该第一重映射参数标识由该寄存器重映射逻辑进行重映射的所述多个寄存器的若干寄存器,因为常见的情况是最好将重映射功能限制到该微处理器可用的寄存器的某一子集。通过使用该重复指令中的这一第一重映射参数,可以将该寄存器重映射逻辑限制到所需的寄存器子集。
该寄存器重映射逻辑最好使用一个基指针作为一个偏移值加到该逻辑寄存器引用,并且该重复指令包括一个第二重映射参数以标识在预定间隔用于递增该基指针的一个值,该预定间隔例如可以是每次重复的该指令范围。因此,可以使用该重复指令中的第二重映射参数以预定间隔,例如在每次重复该指令循环时,而自动改变由该寄存器重映射逻辑将逻辑寄存器引用映射到物理寄存器引用的方式。该重复指令最好还包括一个第三重映射参数以提供一个第一回绕值,并且如果在基指针递增期间,该基指针等于或超过该第一回绕值(wrap value),递增该基指针将回绕到一个新的偏移值。这将使得产生该基指针的一个周期模式。
进一步,该重复指令还可以包括一个第四重映射参数以提供一个第二回绕值,并且如果由基指针和逻辑寄存器引用的相加形成的寄存器引用等于或超过该第二回绕值,则将该寄存器引用回绕到一个新的寄存器引用。可以实际选择该第二回绕值使之等于标识要进行重映射的寄存器个数的该第一重映射参数,但也可以选择具有一个不同的值。可以使用这一第二回绕值以确保将该寄存器重映射逻辑限制到所希望的寄存器数目。
可以以任一适当的方式组织该多个寄存器,但是,在较佳实施例中,该多个寄存器包含多个寄存器组,该寄存器重映射逻辑被设计成在一个特定的寄存器组中的多个寄存器上进行重映射。因此,数据项可以存储在一个寄存器组中,而比如系数可以存储在另一个寄存器组中。利用这一方法,可以将该重映射逻辑设计成对每一寄存器组执行一次独立的重映射,从而可以比如独立于系数将数据项进行重映射。
通常一个指令可以包括多个操作数,每一操作数包括一个逻辑寄存器引用,在这种情况下可以将寄存器重映射逻辑设计成对于每一操作数执行一次独立的重映射。
如较前所提到的,该数据处理装置可以是用于处理数据的任一装置,但是在较佳实施例中,该装置是一个数字信号处理装置。数字信号处理涉及尤其从使用本发明中受益的指令循环的使用,因为对于这种指令循环,可以经常显著地提高代码密度和性能。
从第二方面看来,本发明提供了一种操作一个数据处理装置的方法,该方法包括以下步骤:(a)在多个寄存器中存储要处理的数据项;(b)从该多个寄存器中检索处理一个指令所需要的一个或多个数据项,如果该指令是一个预选指令集中的一个指令,包括利用寄存器重映射逻辑将所述指令中的一个逻辑寄存器引用转换到一个物理寄存器引用,以标识包括处理所述指令所需要的数据项的寄存器;(c)使用所检索的所述一个或多个数据项处理该指令;(d)定义要重复的一个指令范围,所述指令范围包括所述预选指令集;以及(e)利用循环硬件管理该重复指令和周期性地更新该寄存器重映射逻辑,以改变由该寄存器重映射逻辑所施加的从逻辑寄存器引用到物理寄存器引用的变换。下面参照附图以示例方式描述本发明的实施例,附图中:
图1示出数字信号处理装置的高层配置;
图2示出协处理器的寄存器配置的输入缓冲器;
图3示出通过协处理器的数据路径;
图4示出从寄存器中读取高或低位位的多路复用电路;
图5为示出较佳实施例中的协处理器所使用的寄存器重新映象逻辑的框图;
图6更详细地示出图5中所示的寄存器重新映象逻辑;以及
图7为示出块过滤算法的表。
下面描述的系统是关于数字信号处理(DSP)的。DSP可采取许多形式,但一般可以认为是需要高速(实时)处理大量数据的处理。这一数据通常表示某种模拟物理信号。DSP的好的实例便是用在数字移动电话中的,其中所接收与发送的无线电信号需要解码成模拟声音信号及将模拟声音信号编码(通常采用卷积、变换及相关运算)。另一实例是盘驱动器控制器,其中处理从盘头恢复的信号以产生头跟踪控制。
在上面的上下文中,下面是对基于与协处理器合作的微处理器核(在本例中为英国剑桥先进RISC机器有限公司设计的微处理器范围内的ARM核)的数字信号处理系统的描述。微处理器与协处理器的接口及协处理器体系结构本身是专门为提供DSP功能配置的。微处理器核将被称作ARM而协处理器称作Piccolo。ARM与Piccolo通常制造成包含作为ASIC的一部分的其它元件(如片上DRAM、ROM、D/A与A/D转换器等)的单一集成电路。
Piccolo为ARM协处理器,因此它执行一部分ARM指令集。ARM协处理器指令允许ARM在Piccolo与存储器之间传送数据(利用加载协处理器LDC及存储协处理器STC指令),以及向与从Piccolo传送ARM寄存器(利用传送到协处理器MCR及从协处理器传送的MRC指令)。观察ARM与Piccolo的协作交互作用的一种方式是ARM作为Piccolo数据的强有力的地址发生器工作,而使Piccolo有时间执行需要实时处理大量数据来产生对应的实时结果的DSP运算。
图1示出ARM2与Piccolo4,ARM2发布控制信号到Piccolo4来控制向Piccolo4传送数据以及从Piccolo4传送数据字。指令高速缓冲存储器6存储Piccolo4所需要的Piccolo程序指令字。单个DRAM存储器8存储ARM2与Piccolo4两者所需要的所有数据与指令字。ARM2负责寻址存储器8及控制所有数据传送。只带单个存储器8及一组数据与地址总线的布置比需要多个存储器及高总线带宽的总线的典型DSP方法简单与低廉。
Piccolo执行来自控制Piccolo数据路径的指令高速缓冲存储器6的第二指令流(数字信号处理程序指令字)。这些指令中包含诸如乘-累加等数字信号处理型操作及诸如零开销循环指令等控制流指令。这些指令在保持在Piccolo寄存器10(见图2)中的数据上操作。这一数据是早先ARM2从存储器8传送来的。指令流自指令高速缓冲存储器6;指令高速缓冲存储器6作为完全的总线主驱动数据总线。小的Piccolo指令高速缓冲存储器6为4线、每线16个字的直接映象高速缓冲存储器(64条指令)。在一些实现中,令指令高速缓冲存储器更大是值得的。
从而两个任务是独立运行的,ARM加载数据而Piccolo处理它。这允许在16位数据上持续的单周期数据处理。Piccolo具有使ARM预取顺序数据,在Piccolo需要它之前加载数据的数据输入机制(示出在图2中)。Piccolo能以任何次序存取加载的数据,随着老数据的最后一次使用自动地重新填充其寄存器(所有指令的每一源操作数都有一位来指示应重新填充源寄存器)。这一输入机制称作再定序缓冲器并包括输入缓冲器12。加载进Piccolo的每一个值(见下面通过LDC或MCR)携带有指定该值的目的地寄存器的标记Rn。标记Rn与数据字一起存储在输入缓冲器中。当通过寄存器选择电路14存取寄存器而指令指定要重新填充该数据寄存器时,便通过确立信号E来标记该寄存器。然后重新填充电路16用输入缓冲器12中以该寄存器为目的地的最老的加载值自动重新填充该寄存器。重定序缓冲器保持8个带标记的值。输入缓冲器12具有类似于FIFO的形式,但除外可从队列中央抽取数据字,而此后较晚存储的字向前传递来填充空位。距离输入最远的数据字便相应地是最老的,并在输入缓冲器12保持带有正确的标记Rn的两个数据字时便用它来确定应当用哪一个数据字来重新填充输入缓冲器12。
如图3中所示Piccolo通过将数据存储在输出缓冲器18(FIFO)中输出它。数据是顺序地写入FIFO中的,并由ARM以相同的次序读出到存储器8。输出缓冲器18保持8个32位值。
Piccolo通过协处理器接口(图1的CP控制信号)连接在ARM上。在执行ARM协处理器指令时,Piccolo能执行该指令;在执行该指令之前令ARM等待直到Piccolo就绪;或拒绝执行该指令。在最后一种情况中,ARM将引起未定义的指令异常。
Piccolo执行的最普通的协处理器指令为LDC与STC,它们分别通过数据总线向与从存储器8加载与存储数据字,而ARM生成所有地址。便是这些指令将数据加载到重定序缓冲器中并存储来自输出缓冲器18的数据。如果在LDC上输入重定序缓冲器中没有足够的空间来加载数据时,及如果在STC上输出缓冲器中没有足够的数据供存储,即ARM正在期待的数据不在输出缓冲器18中时,Piccolo将阻止ARM。Piccolo还执行ARM/协处理器寄存器传送使ARM能存取Piccolo的特定寄存器。
Piccolo从存储器取出其本身的指令来控制图3中所示的数据路径及从重定序缓冲器到寄存器及从寄存器到输出缓冲器18传送数据。Piccolo的执行这些指令的算术逻辑单元具有执行乘法、加法、减法、乘-累加、逻辑运算、移位与循环的乘法器/加法器电路20。在数据路径中还设置有累加/累减(decumulate)电路22及定标/饱和电路24。
Piccolo指令是初始时从存储器加载进指令高速缓冲存储器6中的,其中Piccolo能存取它们而不需要返回去存取主存储器。
Piccolo不能从存储器失败中恢复。因此,如果在虚拟存储器系统中使用Piccolo,在整个Piccolo任务中所有Piccolo数据都必须在物理存储器中。对于诸如实时DSP等Piccolo任务的实时性质,这不是重大的限制。如果出现存储器失败,Piccolo将停止并在状态寄存器S2中设置标志。
图3示出Piccolo的整体数据路径功能。寄存器组10使用3个读端口与2个写端口。利用一个写端口(L端口)从重定序缓冲器重新填充寄存器。输出缓冲器18是直接从ALU结果总线26更新的,从输出缓冲器18的输出是在ARM程序控制下的。ARM协处理器接口执行到重定序缓冲器中的LDC(加载协处理器)指令及从输出缓冲器18的STC(存储协处理器)指令,以及在寄存器组10上的MCR与MRC(传送ARM寄存器至/自CP寄存器)。
其余寄存器端口用于ALU。两个读端口(A与B)驱动输入到乘法器/加法器电路20,C读端口用于驱动累加器/累减器电路22输入。其余写端口W用于将结果返回给寄存器组10。
乘法器20执行16×16带符号或不带符号乘法,带有可选用的48位累加。定标器单元24能提供0至31位立即算术或逻辑右移,后面跟随可选用的饱和。移位器与逻辑单元20每一周期能执行一个移位或逻辑运算。
Piccolo具有称作D0-D15或A0-A3、X0-X3、Y0-Y3、Z0-Z3的16个通用寄存器。第一组四个寄存器(A0-A3)预定作为累加器并且是48位宽,额外的16位提供在许多连续的计算中对溢出的保护。其余寄存器为32位宽。
可将各Piccolo寄存器作为包含两个独立的16位值对待。位0至15包含低的一半,位16至31包含高的一半。指令能指定各寄存器特定的16位的一半作为源操作数,或可指定整个32位寄存器。
Piccolo还提供饱和的运算。如果结果大于目的地寄存器的大小,乘法、加法与减法指令的变型提供饱和的结果。当目的地寄存器为48位累加器时,将值饱和到32位(即无法饱和48位值)。在48位寄存器上没有溢出检测。由于会占用至少65536条乘法累加指令才能导致溢出所以这是合理的限制。
各Piccolo寄存器是标记为“空”(E标志,见图2)或包含值(不可能有半个寄存器是空的)之一的。初始时,将所有寄存器标记为空。在各周期上Piccolo试图用重新填充控制电路16将来自输入重定序缓冲器的值填充空的寄存器之一。此外如果将来自ALU的值写入寄存器便不再将它标记为“空”的。如果从ALU写入寄存器,同时有值等待从重定序缓冲器放置到该寄存器中,则结果是不确定的。如果对空寄存器进行读取,Piccolo的执行单元将停止。
输入重定序缓冲器(ROB)位于协处理器接口与Piccolo的寄存器组之间。用ARM协处理器传送将数据加载进ROB中。ROB包含若干32位值,各带有指示作为该值的目的地的Piccolo寄存器的标记。该标记还指示该数据应传送给整个32位寄存器还是只给32位寄存器的底部16位。如果数据的目的地为整个寄存器,则将该项的底部16位传送给目标寄存器的底部一半并将顶部16位传送给寄存器的顶部一半(如果目标寄存器为48位累加器则扩展符号)。如果该数据的目的地只是寄存器的底部一半(所谓“半寄存器”),首先传送底部16位。
寄存器标记总是参照物理目的地寄存器,不执行寄存器重新映射(见下面关于寄存器重新映射。)
在每一个周期上Piccolo试图如下地将数据项从ROB传送到寄存器组:
-检验ROB中各项并将标记与空寄存器比较,确定是否能从一部分或全部项对寄存器进行传送。
-从能进行传送的项组中,选择最老的项并将其数据传送给寄存器组。
-将该项的标记更新为标记该项是空的。如果只传送了该项的一部分,只将传送的部分标记为空的。
例如,如果目标寄存器完全是空的且选择的ROB项包含以整个寄存器为目的地的数据,便传送全部32位并标记该项为空的。如果目标寄存器的底部一半是空的而ROB项包含目的地为寄存器的底部一半的数据,则将该ROB项的底部16位传送给目标寄存器的底部一半并将ROB的底部一半标记为空的。
可以独立地传送任何项中的数据的高与低16位。如果没有项包含能传送给寄存器组的数据,该周期中不进行传送。下面的表描述目标ROB项与目标寄存器状态的所有可能组合。
目标,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
其中DEST对于目的地组X、Y、Z为1-3。将LDPA编码为: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
其中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
将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 | 110 | P | U | O | W | 1 | Rn | DES | 01 | PICCOLO2 | 00000001 |
COND | 1110 | 0000 | 0000 | 0000 | PICCOLO1 | X0 | 0 | BANK |
COND | 1110 | 0 | 1 | 0 | 0 | DEST | Rn | PICCOLO1 | 000 | 1 | 0000 |
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 | 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 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
其中对于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
COND | 1110 | 001 | L | Sn | Rm | PICCOLO | 000 | 1 | 0000 |
实现者 | 体系结构 | 部件号 | 修订版本 |
位[3:0]包含处理器的修订版本号。
位[15:4]包含以二进制编码的十进制格式的3位部件号:piccolo为0x500
位[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
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 | I | 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 | -4 | |||||||||||||||
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_LIST_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的结果上的标度。
带有循环编码的8位立即数允许生成可用8位值及2位循环表示的32位立即数。下表示出能从8位值XY生成的立即数值:
标度 | 操作 |
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 |
循环 | 立即数 |
00 | 0x000000XY |
01 | 0x0000XY00 |
10 | 0x00XY0000 |
11 | 0xXY000000 |
6位立即数编码允许使用6位不带符号的立即数(从0到63),以及作用在ALU的输出上的标度。
通用源2编码对于大多数指令变型是通用的。对这一规则存在一些例外,它们支持源2编码的有限子集或将其稍加修改:
-选择指令。
-移位指令。
-并行操作。
-乘累加指令。
-乘双倍指令。
选择指令只支持寄存器或6位不带符号立即数的一个操作数。由于这些位由指令的状态字段使用而得使该标度不可用。
11 10 9 8 7 6 5 4 3 2 1 0
SRC2_SEL
0 | S2 | R2 | 寄存器号 | 高/低 | 状态 |
1 | 1 | IMMED_6 | 状态 |
移位指令只支持16位寄存器或1与31之间的5位无符号立即数的一个操作数。不能得到结果的标度。
11 10 9 8 7 6 5 4 3 2 1 0
SRC2_SHIFT
0 | 0 | R2 | 寄存器号 | 高/低 | 0 | 0 | 0 | 0 | |||
1 | 0 | 0 | 0 | 0 | 0 | 0 | IMMED_5 |
在并行操作情况中,如果指定寄存器作为操作数的源,则必须执行32位读。并行操作的立即数编码略为不同。它允许将一个立即数复制到32位操作数的两个16位一半中。并行操作可利用稍加限制范围的标度。11 10 9 8 7 6 5 4 3 2 1 0
SRC2_PARALLEL
0 | 1 | R2 | 寄存器号 | 高/低 | SCALE_PAR | |
1 | 0 | ROT | IMMED_8 | |||
1 | 1 | IMMED_6 | SCALE_PAR |
如果使用6位立即数,则总是将它复制到32位量的两个一半上。如果使用8位立即数,只有当循环指示应将8位立即数循环到32位量的顶部一半上时才复制。
循环 | 立即数 |
00 | 0x000000XY |
01 | 0x0000XY00 |
10 | 0x00XY00XY |
11 | 0xXY00XY00 |
并行选择操作不使用标度;必须将这些指令的标度字段设置为0。
乘累加指令不允许指定8位循环立即数。该字段的位10用来部分地指定使用哪一累加器。源2蕴含16位操作数。
11 10 9 8 7 6 5 4 3 2 1 0
SRC2_MULA
0 | A0 | R2 | 寄存器号 | 高/低 | 标度 |
1 | A0 | IMMED_6 | 标度 |
乘双倍指令不允许使用常量。只能指定一个16位寄存器。该字段的位10用来部分地指定使用哪一个累加器。11 10 9 8 7 6 5 4 3 2 1 0
SRC2_MULD
0 | A0 | R2 | 寄存器号 | 高/低 | 标度 |
某些指令总是蕴含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
这一基本编码有10种变型:汇编程序助记符 25 24 23 22 21 20 19
Dx 1Dx ^2Dx.l 3Dx.l ^4Dx.h 5Dx.h ^6未定义.1(无寄存器写回16位) 7″″(无寄存器写回32位) 8.1^(16-位)输出 9^(32-位)输出 10
F | SD | HL | DEST |
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)指示正在寻址的是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以下的寄存器是重新映射的,以上或等于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.,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位,任何大于+0x7fff的值用+0x7fff代替,而任何小于-0x8000的值则用-0x8000代替。类似地饱和到32位用极限+0x7fffffff与-0x80000000。如果目的地寄存器为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编码值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 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,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
OPC定义操作操作(OPC):
0 | 0 | OPC | Sa | F | SD | DEST | S1 | R1 | SRC1 | SRC2 |
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.!=(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_13>,<src2_32>{,<scale>}
CMPCMP <dest>,<src1_39>,<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 | IMMEDLATE_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 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
OPC编码要执行的逻辑运算操作(OPC):
1 | 000 | OPC | F | SD | DEST | S1 | R1 | SRC1 | SRC2 |
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>{,<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 13 12 11 10 9 8 7 6 5 4 3 2 1 0
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保持
0 | 101 | OPC | 1 | F | SD | DEST | S1 | R1 | SRC1 | SRC2 |
包含的理由:
为了找出信号强度,许多算法扫描样本来找出样本的绝对值的最大/最小值。对此,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
OPC指定指令的类型。操作(OPC):
0 | 111 | OP | 1 | F | SD | DEST | S1 | R1 | SRC1 | SRC2_PARALLEL |
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>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
OPC指定指令的类型。操作(OPC):0 dest=SAT((acc-SAT(2*src1*src2))(->>scale})1 dest=SAT((acc-SAT(2*src1*src2)){->>scale})
1 | 10 | 1 | OPC | 1 | F | SD | DEST | A1 | R1 | SRC1 | 0 | A0 | R2 | 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 5 2 1 0
OPC指定指令的类型。操作(OPC):0 dest=(src1*src2){->>scale}1 dest=SAT((src1*src2){->>scale})助记符:
00011 | OPC | F | SD | DEST | S1 | R1 | SRC1 | SRC2 |
0 MUL<dest>,<src1_16>,<src2>{,<sca1e>}
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
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标记为空。助记符:
1 | 11111 | 0 | OPC | 00 | REGISTER_LIST_16 | SCALE |
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
各PARAMS字段包含以下的项:
1 | 11111 | 101 | 00 | ZPARAMS | YPARAMS | XPARAMS |
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 73 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 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 |
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.l,Z0.l,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)。该值总是饱和的。具体地,0x80000000的绝对值为0x7fffffff而不是0x80000000!
助记符:
SABS<dest>,<src1>
标志:
Z如果结果为0,便置位。
N保持。
C如果src1<0(dest=-src1情况),便置位。
V如果出现饱和,便置位。
包含的理由:
在许多DSP应用中有用。
选择操作(条件传送)用来有条件地将源1或源2传送到目的地寄存器中。选择总是等效于传送。还有在并行加/减以后使用的并行操作。
注意为了实现的原因,可读取两个源操作数,如果其中之一为空,指令将停止,不管该操作数是否是严格需要的。31 30 29 28 27 26 25 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
OPC指定指令的类型。操作(OPC):00 dest=(src2>=0)?src1<<src2:src1>>-src201 dest=(src2>=0)?src1>>src2:src1<<-src210 dest=(src2>=0)?src1->>src2:src1<<-src211 dest=(src2>=0)?src1 ROR src2:src1 ROL-src2
1 | 010 | OPC | F | SD | DEST | S1 | R1 | SRC1 | SRC2_SEL |
助记符:
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 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 | 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
以下序列将所有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数据
COND | 110 | P | U | 0 | W | 0 | BASE | BANK | PICCOLO1 | OFFSET |
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 (22)
1.一个数据处理装置,包括
用于存储要处理的数据项的多个寄存器;
一个处理器,用于处理要应用于在所述多个寄存器中存储的数据项的指令;
一个寄存器重映射逻辑,用于将一个预选的指令集中的逻辑寄存器引用转换到标识包含由所述处理器处理所需要的数据项的寄存器的一个物理寄存器引用;
用于定义要重复的一个指令范围和对于所述寄存器的一个被定义的子集使所述寄存器重映射逻辑被调用的一个重复指令,所述指令范围包括所述预选指令集;以及
用于管理该重复指令和被安排成周期性地更新该寄存器重映射逻辑的循环硬件,以改变由该寄存器重映射逻辑所施加的从逻辑寄存器引用到物理寄存器引用的变换。
2.根据权利要求1的数据处理装置,其中该寄存器重映射逻辑由一个重映射指令进行配置,该重映射指令被设计成在所述预选指令集之前进行处理。
3.根据权利要求1的数据处理装置,其中该循环硬件被设计成在每次重复该指令范围时更新该寄存器重映射逻辑。
4.根据权利要求1或3的数据处理装置,其中该重复指令包括用于配置该寄存器重映射逻辑的一个或多个重映射参数。
5.根据权利要求4的数据处理装置,其中在执行该重复指令之前执行一个重映射指令以使用所述一个或多个重映射参数配置该寄存器重映射逻辑,所述重映射指令并不包括在由该重复指令定义的所述指令范围中。
6.根据权利要求5的数据处理装置,其中还包括一个存储装置以存储至少一组预定义的重映射参数,每一组定义用于所述寄存器重映射逻辑的一个重映射配置,其中如果包括在所述重复指令中的一个或多个重映射参数对应于所述预定义重映射参数组中的一组,则使用用于该寄存器重映射逻辑的对应的重映射配置,而不要求执行该重映射指令。
7.根据权利要求4的数据处理装置,其中一个第一重映射参数标识由该寄存器重映射逻辑进行重映射的多个所述寄存器的若干寄存器。
8.根据权利要求4的数据处理装置,其中该寄存器重映射逻辑被设计成在所述多个寄存器的若干寄存器上执行重映射,该寄存器重映射逻辑使用一个基指针作为一个偏移值加到该逻辑寄存器引用,该重复指令包括一个第二重映射参数以标识以预定间隔用以递增该基指针的一个值。
9.根据权利要求8的数据处理装置,其中该重复指令包括一个第三重映射参数以提供一个第一回绕值,并且如果在基指针递增期间,该基指针等于或超过该第一回绕值,递增该基指针将回绕到一个新的偏移值。
10.根据权利要求8的数据处理装置,其中该重复指令包括一个第四重映射参数以提供一个第二回绕值,并且如果由基指针和逻辑寄存器引用的相加形成的寄存器引用等于或超过该第二回绕值,则将该寄存器引用回绕到一个新的寄存器引用。
11.根据权利要求1的数据处理装置,其中该所述多个寄存器包括多个寄存器组,该寄存器重映射逻辑被设计成在一个特定的寄存器组中的多个寄存器上进行重映射。
12.根据权利要求11的数据处理装置,其中将该寄存器重映射逻辑设计成对每一寄存器组执行一次独立的重映射。
13.根据权利要求1的数据处理装置,其中一个指令可以包括多个操作数,每一操作数包括一个逻辑寄存器引用,该寄存器重映射逻辑设计成对于每一操作数执行一次独立的重映射。
14.根据权利要求1的数据处理装置,其中该数据处理装置是一个数字信号处理装置。
15.一种操作数据处理装置的方法,该方法包括:
(a)在多个寄存器中存储要处理的数据项;
(b)从该多个寄存器中检索处理一个指令所需要的一个或多个数据项,如果该指令是一个预选指令集中的一个指令,包括利用寄存器重映射逻辑将所述指令中的一个逻辑寄存器引用转换到一个物理寄存器引用,以标识包括处理所述指令所需要的数据项的寄存器;
(c)使用所检索的所述一个或多个数据项处理该指令;
(d)执行用于定义要重复的一个指令范围和对于所述寄存器的一个被定义的子集使所述寄存器重映射逻辑被调用的一个重复指令,所述指令范围包括所述预选指令集;以及
(e)利用循环硬件管理该重复指令和周期性地更新该寄存器重映射逻辑,以改变由该寄存器重映射逻辑所施加的从逻辑寄存器引用到物理寄存器引用的变换。
16.根据权利要求15的方法,其中该循环硬件被设计成在每次重复该指令范围时更新该寄存器重映射逻辑。
17.根据权利要求15或16的方法,其中定义要重复的一个指令范围的步骤包括定义用于配置该寄存器重映射逻辑的一个或多个重映射参数。
18.根据权利要求17的方法,其中一个重映射指令被安排成在执行要重复的该指令范围之前执行以使用所述一个或多个重映射参数配置该寄存器重映射逻辑。
19.根据权利要求18的方法,其中还包括以下步骤:
存储至少一组预定义的重映射参数,每一组定义用于所述寄存器重映射逻辑的一个重映射配置;以及
如果所述一个或多个重映射参数对应于所述预定义重映射参数组中的一组,则使用对应的重映射配置用于该寄存器重映射逻辑,而不要求执行该重映射指令。
20.根据权利要求15的方法,其中该多个寄存器包括多个寄存器组,该方法包括在一个特定的寄存器组中的多个寄存器上进行重映射的步骤。
21.根据权利要求20的方法,还包括对每一寄存器组执行一次独立的重映射的步骤。
22.根据权利要求15的方法,其中一个指令包括多个操作数,每一操作数包括一个逻辑寄存器引用,该方法还包括对于每一操作数执行一次独立的重映射的步骤。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
GB9619823A GB2317464A (en) | 1996-09-23 | 1996-09-23 | Register addressing in a data processing apparatus |
GB9619823.9 | 1996-09-23 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1231740A CN1231740A (zh) | 1999-10-13 |
CN1103959C true CN1103959C (zh) | 2003-03-26 |
Family
ID=10800360
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN97198142A Expired - Fee Related CN1103959C (zh) | 1996-09-23 | 1997-08-22 | 数据处理装置和操作数据处理装置的方法 |
Country Status (9)
Country | Link |
---|---|
EP (1) | EP0927389B1 (zh) |
JP (1) | JP3645573B2 (zh) |
KR (1) | KR100500889B1 (zh) |
CN (1) | CN1103959C (zh) |
DE (1) | DE69718485T2 (zh) |
IL (1) | IL128211A0 (zh) |
MY (1) | MY121677A (zh) |
RU (1) | RU2193228C2 (zh) |
TW (1) | TW343318B (zh) |
Families Citing this family (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6950929B2 (en) * | 2001-05-24 | 2005-09-27 | Samsung Electronics Co., Ltd. | Loop instruction processing using loop buffer in a data processing device having a coprocessor |
JPWO2005078579A1 (ja) * | 2004-02-12 | 2007-10-18 | 松下電器産業株式会社 | プログラム変換装置およびプログラム変換方法 |
US8274518B2 (en) | 2004-12-30 | 2012-09-25 | Microsoft Corporation | Systems and methods for virtualizing graphics subsystems |
US7962731B2 (en) | 2005-10-20 | 2011-06-14 | Qualcomm Incorporated | Backing store buffer for the register save engine of a stacked register file |
US9710269B2 (en) | 2006-01-20 | 2017-07-18 | Qualcomm Incorporated | Early conditional selection of an operand |
JP5289688B2 (ja) * | 2006-07-05 | 2013-09-11 | ルネサスエレクトロニクス株式会社 | プロセッサシステム及びプロセッサシステムを動作させるオペレーティングシステムプログラムの処理方法 |
US8914619B2 (en) * | 2010-06-22 | 2014-12-16 | International Business Machines Corporation | High-word facility for extending the number of general purpose registers available to instructions |
CN102231180B (zh) * | 2011-07-30 | 2014-05-28 | 张鹏 | 处理器指令编码可重定义的方法 |
CN104137060B (zh) * | 2011-12-30 | 2018-03-06 | 英特尔公司 | 高速缓存协处理单元 |
US9588762B2 (en) * | 2012-03-15 | 2017-03-07 | International Business Machines Corporation | Vector find element not equal instruction |
US20130339656A1 (en) * | 2012-06-15 | 2013-12-19 | International Business Machines Corporation | Compare and Replace DAT Table Entry |
US10228941B2 (en) | 2013-06-28 | 2019-03-12 | Intel Corporation | Processors, methods, and systems to access a set of registers as either a plurality of smaller registers or a combined larger register |
US20150293767A1 (en) * | 2014-04-11 | 2015-10-15 | Fujitsu Limited | Rotating register file with bit expansion support |
RU2666458C1 (ru) * | 2017-11-27 | 2018-09-07 | Акционерное общество "МЦСТ" | Микропроцессор |
CN110350922A (zh) * | 2019-07-18 | 2019-10-18 | 南京风兴科技有限公司 | 一种二进制编码的寻址方法及寻址器 |
CN115858018B (zh) * | 2023-02-27 | 2023-05-16 | 珠海星云智联科技有限公司 | 一种嵌入式系统的自适应寄存器更新方法、设备及介质 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH04293124A (ja) * | 1991-03-20 | 1992-10-16 | Hitachi Ltd | データ処理プロセッサ |
US5655132A (en) * | 1994-08-08 | 1997-08-05 | Rockwell International Corporation | Register file with multi-tasking support |
-
1996
- 1996-10-08 TW TW085112298A patent/TW343318B/zh not_active IP Right Cessation
-
1997
- 1997-08-22 JP JP51437198A patent/JP3645573B2/ja not_active Expired - Fee Related
- 1997-08-22 CN CN97198142A patent/CN1103959C/zh not_active Expired - Fee Related
- 1997-08-22 RU RU99108433/09A patent/RU2193228C2/ru not_active IP Right Cessation
- 1997-08-22 IL IL12821197A patent/IL128211A0/xx not_active IP Right Cessation
- 1997-08-22 DE DE69718485T patent/DE69718485T2/de not_active Expired - Lifetime
- 1997-08-22 EP EP97937701A patent/EP0927389B1/en not_active Expired - Lifetime
- 1997-08-22 KR KR10-1999-7002442A patent/KR100500889B1/ko not_active IP Right Cessation
- 1997-08-30 MY MYPI97004024A patent/MY121677A/en unknown
Also Published As
Publication number | Publication date |
---|---|
MY121677A (en) | 2006-02-28 |
KR100500889B1 (ko) | 2005-07-14 |
JP2001505679A (ja) | 2001-04-24 |
KR20000048532A (ko) | 2000-07-25 |
CN1231740A (zh) | 1999-10-13 |
IL128211A0 (en) | 1999-11-30 |
TW343318B (en) | 1998-10-21 |
DE69718485D1 (de) | 2003-02-20 |
EP0927389B1 (en) | 2003-01-15 |
DE69718485T2 (de) | 2003-12-04 |
EP0927389A1 (en) | 1999-07-07 |
JP3645573B2 (ja) | 2005-05-11 |
RU2193228C2 (ru) | 2002-11-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1103961C (zh) | 协处理器的数据访问控制装置和方法 | |
CN1135468C (zh) | 对存储设备中信号数据字执行数字信号处理的方法和装置 | |
CN1103959C (zh) | 数据处理装置和操作数据处理装置的方法 | |
CN1117316C (zh) | 采用多个向量寄存器组的单指令多数据处理方法及其装置 | |
CN1112635C (zh) | 多媒体信号处理器中的单指令多数据处理方法及其装置 | |
CN1246772C (zh) | 处理器 | |
CN1287270C (zh) | 重启动翻译的指令 | |
CN1244051C (zh) | 对于处理数据的装置和方法 | |
CN1625731A (zh) | 具有多种长度指令集体系结构的可配置数据处理器 | |
CN1264085C (zh) | 一种用于执行多媒体应用的操作的装置、系统和方法 | |
CN1226323A (zh) | 数据处理装置寄存器 | |
CN1306697A (zh) | 可变长度编码与解码的处理电路和处理方法 | |
CN1104679C (zh) | 数据处理装置和数据处理方法 | |
CN1584824A (zh) | 一种基于cisc结构的微处理器构架及指令实现方式 | |
CN1269052C (zh) | 支持缩小代码长度的常量还原型处理器 | |
CN1484787A (zh) | 处理器流水线中的硬件指令翻译 | |
CN1226325A (zh) | 数据处理系统中的输入操作数控制 | |
CN1653447A (zh) | 报告NxM离散余弦变换的方法 | |
CN1862486A (zh) | 数字信号处理器 | |
CN1137421C (zh) | 可编程控制器 | |
CN1279435C (zh) | 数字信号处理器 | |
CN1491383A (zh) | 使用协处理器的数据处理 | |
CN1152300C (zh) | 多媒体信号处理器中的单指令多数据处理方法及其装置 | |
CN1226324A (zh) | 数据处理系统寄存器控制 | |
CN1227585C (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 | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20030326 Termination date: 20120822 |