高数据密度risc处理器的制作方法

文档序号:6419338阅读:227来源:国知局
专利名称:高数据密度risc处理器的制作方法
技术领域
本发明的背景1.本发明的领域本发明是针对微处理器系统;特别地,本发明是针对高性能的简化指令系统计算机(RISC)结构处理器,它实现指令宽度的高效使用。
2.背景技术的描述处理器指令系统的设计是一门建立良好的技术。大部分指令系统特征本身不是新的。可是,可以按照促进尖端技术的新而唯一的方式来合并个体特点。特别是当为一个不同于现有指令集的使用而使指令集设计优化时,在目标应用程序中使用执行该指令集的一个处理器时可以带来显著的改善。
指令集设计需要均衡许多竞争目标,包括编码各个算法所需要的机器代码的尺寸;用于新的算法和应用程序的指令集的可延展性和适应性;在此类算法上执行指令集的处理器的性能和功率消耗;执行该指令集的处理器的成本;对于多个处理器设备,该指令集随时间的适用性;执行该指令集的处理器的设计的复杂性;以及指令集作为从高阶的程序设计语言中编码的目标的适用性。
指令集对处理器性能有一个直接影响和两个间接影响。虽然作为编码的一个目标,指令集的适用性在这里也同样是一个因子,但是指令集直接确定IE,IE是实现一个给定算法所需要的指令数量。处理器性能的另外一个成分是时钟周期CP和每个指令的平均时钟CPI。这些首先是指令集实现的属性,但是指令集特点可能影响设备同时每个时钟遇见时间以及每个指令目标遇见时钟的性能。例如,一个编码选择可以命令与剩余的指令执行连续的附加逻辑,一个设备将通过增加每个时钟的时间或者通过增加一个附加管道级来对其编址,这通常将增加每个指令的时钟。
在八十年代和九十年代,开发了称为RISC的一种新指令集结构。它诞生于上述折衷方案的实现,即T=IE*CPI*CP在此,T是以秒为单位的程序执行时间而其他变量如上所述。RISC指令集让设备显著地改善CPI和CP而不必大量增加IE。RISC指令集改进了处理器的性能,降低了设计复杂性,在一个给定的性能水平上提供较低成本的处理器设备,并且非常适于高阶的程序设计语言的编码。
处理器体系结构团体从未就RISC的完全令人满意的定义达成一致意见,但是它通常包括下列属性的大部分固定尺寸指令字;在从具有16或者多个寄存器的一个通用寄存器堆中读出的操作码上执行算术和其他计算运算并且把结果写到同一寄存器堆中;对于源寄存器字段固定指令字中的位置以便寄存器堆访问可以与指令解码并行地发生;存储器访问主要地通过从存储器到寄存器的加载来完成,并且从寄存器储存到存储器(这与在计算指令中具有存储器操作码相对);少数(经常为1,通常小于4)方法用于计算存储器地址;避免那些使得指令的管道执行变难的特点(例如,一个给定的指令不止一次地使用一个硬件资源);以及避免需要微代码或其等价物的那些特点。不是所有被认为是RISC的处理器都包含以上全部要素,但是所有的都包含上面的大部分要素。
然而,早期RISC指令集在产生紧密(compact)机器代码上不是特别有效。特别是,RISC指令集通常需要比预先RISC指令集更多的位来编码一个应用程序。在总的解决方案成本中,一个应用程序的机器代码尺寸经常比处理器本身的成本更重要,因为需要大的存储器来保存该应用程序。在性能是最重要的许多应用程序中,RISC仍然是可接受的,但是具有RISC的优点又减小代码尺寸的指令集在许多其他处理器应用中将是实用的。
一些早期处理器指令集(IBM 7090,CDC 6600,DEC PDP6,GE635)由于它们被设计来由硬件直接执行,没有微代码,就像RISC一样,所以它们具有一些RISC特性。由于诸如字(与字节相对)寻址、有限的地址空间以及运算的特殊组合之类的特点,这些指令集的大部分不是很适合于现代高级语言和应用程序。大部分事实上打算用于汇编语言程序设计。一些还是基于36位数据字和指令宽度,并且36位指令对于码密度不是很好。一些是基于一个累加器和用于计算的存储器范例,其限制了性能。虽然本发明的一些个别特点可以被追溯到这几代机器,但是其中并无一个具有所期望的特性。
执行处理器的微代码的使用使得更复杂的指令集变得可行(IBM360,DEC PDP11,DEC VAX,Intel x86,LLNL S-1,Motorola68000)。因此,下一代处理器含有拥有优良码密度的复杂指令集,部分应归于复杂可变指令长度编码。可是,微代码处理器和它们的复杂指令集常常不适合于高性能。代替在一个硬件管道中直接的执行(其增加CPI),通过一台微引擎的迭代来执行复杂指令。各种不同格式的指令集设计在这个级显露出具有脱离一两个累加器而到通用寄存器结构或者堆栈结构的一种趋势。寄存器或者堆栈的设备成本已经变得足够低以致于指令集能够使用这些有益的格式。
正如上面所提及的,虽然RISC在性能上有显著的改善,但是RISC对于码密度却是一种阻碍。大多数RISC指令集基于定长32位的指令,而32位出现比所需要的多。并且,为了获得最佳码密度,一些可变长度编码是必需的。此时尽管具有代码尺寸优势,堆栈结构由于其低性能而逐渐消失,这表示出一个指令集既达到性能又达到代码尺寸目标是多么重要。
为了补偿RISC的代码尺寸的缺点,若干处理器设计者引入了他们的指令集的紧密编码。ARM的Thumb和MIPS的MIPS 16就是例子。两者都主要使用16位指令同时使用少数的32位指令。由于仅仅含有8个寄存器(增加IE)、隐含的源寄存器操作码的使用(增加CP或者CPI)、在指令字中常数的有限排列(增加IE)以及个别的寄存器操作码数目(对于大多数指令来说两个或者更少--增加IE),所以16位编码(它通过把每个指令的位数对分来提供较小代码)产生劣质性能。
Hitachi SH指令集类似于RISC,并且把代码尺寸作为一个目标。它从一个16位指令集开始,但是随后找到它需要增加32位指令。它具有16个寄存器,但是每个指令仍然具有至多两个寄存器字段(增加IE),并且具有十分有限的分支偏移。
我们所需要的是这样一种指令集设计,其提供RISC的性能和其他优点,并且也提供小成本有效的机器代码。为了不用过度的复杂性就简化高性能的设备,该指令集应该是不用微代码就可通过一个既简单又短的管道来直接执行。这里应该有一个足够数目的通用寄存器来达到优良的性能并且成为使编辑器最优化的一个适当目标。其他技术可以用来更进一步地简化代码尺寸。
本发明的另外一个目的是提供执行指令集的一种处理器,该指令集含有一起协作工作的指令,以便当使用具有每个指令有限的平均位数的指令编码时保持一个较少的用来表示一个程序所需要的指令的静态数量。在一个窄的指令字中提供一种指令常数的有效编码是本发明对现有技术的一部分贡献。
本发明的另外一个目的是提供一种处理器,该处理器对于普通的情况正好使用具有较长目标说明符的大多数实用的比较和形式来使用一种24位指令字编码比较和分支指令以便实现一种RISC指令集。
本发明的另外一个目的是提供一种处理器,执行具有一个降低开销循环性能的一般用途(例如相对于专门的,例如DSP)指令集,该性能减少了表示一个程序所需要的静态指令数量和循环以及执行该程序所需要的指令数量。
按照本发明的第一优选实施例,通过提供一种执行指令集的RISC处理器,实现了上述目的,它除了适合于上述的方程式T=IE*CPI*CP之外,在考虑下列代码尺寸方程式的情况下进行设计
S=IS*BI在此,S是以位为单位的程序指令的尺寸;IS是表示该程序所需要的静态指令数量(不是如早期那样一个执行所需要的数目);以及BI是每个指令的平均位数。
与RISC相比,本发明在极小地增加CP和CPI的同时既降低了BI又降低了IS。它具有同时增加和减少IE的特点。
利用这样的认识设计了本发明的这个方面它必须根据RISC原理在一个固定长度的高性能编码中提供优良的编码密度,包括具有加载/存储结构的一个通用寄存器。为了达到可仿效的编码密度,该实施例增加了没有对性能进行折衷的一种简单的可变长度编码。这个实施例还使处理器设备的成本最优化。
对当前的优选实施例的详细描述一种适于如本发明的优选实施例所述的执行指令集的处理器如

图1所示。通常,该处理器具有232个字节,即,4GB,用于指令和数据的虚拟存储器;一个32位程序计数器IPC;十六或者更多的的32位的通用寄存器;一个偏移地址寄存器SAR;一个32位循环开始地址寄存器LBEG,一个32位循环结束地址寄存器LEND,以及一个32位循环计数寄存器LCOUNT,所有这三个被在下面更详细描述的减少开销循环指令所使用。在Tensilica公司1999年“XtensaTM指令集(ISA)参考手册Rev 1.10”(下文中称为ISA手册)中对这种循环指令和其首选实现方案作了更为详细的描述。
更具体地,处理器的管道可以被分为五个基本级获取指令或称为I级100;对指令进行解码和访问寄存器或称为R级200;执行和寻址或称为E级300;访问内存或称为M级400;回写或称为W级500。在I级100,从内存中读取将被执行的指令;在R级200,获取的指令被解码并存入寄存器;然后在E级300,根据指令操作数由处理器的ALU332处理寄存器中的内容并控制解码的持续进行;在M级400,做任何必要的内存访问例如读取、存储等;最后指令的执行结果由指令操作数回写到通用寄存器中。
更明确地说,在I级100,根据保存在I级程序计数器IPC 104中的地址从指令缓存102中取出一个字。然后该字与从指令缓存RAMIC 102(与在下面描述的另外一个成分,指令缓存116,形成)中读取的最后一个字结合,该指令缓存RAM IC 102由排列单元ALIGN 108保存在最后取出寄存器LFETCH 106(last fetch register)中并且储存在R级指令寄存器RINST 202中。从主程序存储器通过级寄存器IREFILL 110到缓存RAM IC 102,缓存错过由存储器取出来处理并且利用寄存器IMISSA 112和标记缓存RAM ITAG 114相应地调整标记。复用器118选择缓存RAM IC 102的输出或者从主存储器直接取出的指令并且把所选择的数据输出到排列单元108,排列单元108将其与储存在最后取出寄存器106中的最后取出字连在一起并选择它的一个子集,如果必要的话,以便调整指令长度变化。标记比较器122检测缓存错过并提供其指示到I级控制器124,其控制该级的整个操作。
应该注意,虽然表示为元件104的整机线路在此被称为一个程序计数器,但是I级程序计数器104实际上不用于计数要取出的指令;而是用来计数字的。然而,在优选实施例中,诸如R级程序计数器204之类的后续程序计数器计数实际的指令。此外,本领域的技术人员容易理解,除I级计数器124之外,相应的R级控制器224、E级控制器324以及M级控制器424每个都控制它们各自级的整个操作。而且,R级状态寄存器203、E级状态寄存器303、M级状态寄存器403以及W级状态寄存器503每个都提供与它们各自的管道级中的指令有关的相关状态信息到各自的控制器,例如,不管该数据是否有效等等。另外,为了易于解释,诸如从级控制器到它们各自的复用器中运转的复用器选择线、时钟信号、例外向量地址等等之类的某些特点已经被省略;可是,它们的布局对于本领域的技术人员来说是很显然的。
虽然指令被提供给R级指令寄存器202,但是在下一地址产生部分126中的加法器128对当前字地址加1以便指向要被取出的下一字并且将它提供给复用器130,该复用器130把它反馈到指令程序计数器104。当一个循环指令(在下面详细描述)被执行时,它把一个开始循环地址加载入循环开始寄存器LBEG 132中,然后复用器130把开始地址提供给程序计数器104。还是使用于循环指令中,循环结束寄存器134提供由比较器136将其与当前地址进行比较的一个数值以便检测循环状态的结束并对循环索引寄存器LCOUNT 138减1。当计数为零时比较器140提供一指示到指令控制器124以便继续循环外的执行,否则,由减量器142对LCOUNT 138减1并通过复用器144将其传递(还用于加载寄存器)。最后,R级PC选择复用器146选择要被提供到E级300的地址值,在下面将详细对其进行描述。
储存在R级指令寄存器202中的指令由解码器201解码以便析取预确定参数字段并根据该指令操作码对紧邻的或者常数的字段进行解码。已经解码的指令被输送到E级指令解码寄存器302用于执行。平行于指令解码操作,把指令中的字段传送到寄存器堆206经加法器208-212来为窗口寄存器操作向其增加一个窗口基础值,在下面将对其详细描述。把一个加法器用于两个源寄存器字段的每一个和可能存在于指令中的一个目标寄存器字段。
在寄存器堆206中的值被读出并被供给复用器214和216然后供给E级S和T寄存器304和306。复用器214和216可以提供来自寄存器堆206中的值或者,如果所需要的数据尚未写入文件夹206中时,可以使用从E级提供的值(如下所述)。复用器214还可以接收来自指令解码器204中的一个常量值。
加法器218根据R级程序计数器201的内容和来自指令解码器204中的一个索引常数来计算一个已索引的目标地址并把结果存储在E级分支寄存器308中。根据通过复用器222的指令长度,加法器220通过向R级程序计数器201中的值加二或三来计算下一个指令地址并且如果不采用一个分支的话则把结果传给下一个PC寄存器310用于使用。
移到E级300,分路复用器318和320选择各个功能单元的操作码(分支326,移位/屏蔽330,ALU 332,AGEN 334,以及存储排列336)。在R级200中由分路程序块EBYP 314根据当前在各个寄存器228、230和232各自的E级300、M级400和W级500中的指令来计算该复用器选择,并通过EBYP 226将其输送。当从R级200中产生一个结果时,每个复用器318、320选择ET寄存器312或者ES寄存器316。复用器318和320的另外一个输入是来自M级400和W级500。
分支单元326使用来自复用器318和320的两个操作码来产生一个条件分支(taken/not-taken)判决,其在I级100和R级200分别被馈给控制器124和224,而且在其中混合选择。移位/屏蔽(Shift/Mask)单元330根据复用器328的输出来执行移位和析取指令。它使用来自复用器318和320的两个操作码以及来自解码指令寄存器EINSTD 302的屏蔽(mask)输入,该屏蔽输入也馈给M级指令寄存器MINSTD 402。对于常数移位从EINSTD 302中选择移位数目或者对于变量移位从ESAR 322中选择移位数目。对于E级300,ESAR 322包含ISA状态SAR。
ALU 332执行算术和逻辑功能,包括ADD,ADDI,ADDX2,SUB,AND,OR,XOR。根据复用器338中的指令类型把Shift/Mask单元330和ALU 332的输出进行复用并将其馈入MALU寄存器406中。地址产生单元AGEN 334计算寄存器操作码与来自EINSTD 302的解码指令中的偏移之和。该输出被发送给M级虚拟地址寄存器MVA 408。存储排列单元336把ET复用器318的输出移位0、8、16或者24个位置以便把存储数据排列入存储器的适当字节位置中。该输出被发送给M级存储数据寄存器MSD 410。
类似于先前的管道级,ECTL 324处理E级300的控制和在其中执行的指令状态的更新。E级指令地址程序计数器EPC 304被向前传送到M级指令地址程序计数器MPC 404用于例外处理。
管道的M级400处理下半部分的加载和存储指令,以及所有级的例外确定。MPC 404的输出被发送给WPC寄存器504。如果M级400中的指令被一个例外或者中断无效掉,则WPC 504的输出将被加载入一个表示为ISA的例外指令地址寄存器EPC[i](未表示)(不同于E级程序计数器EPC 304)中。如果必须重操作M级400中的指令(例如,由于一个缓存错过),则WPC寄存器504的内容被送回到I级100以便重新启动指令取出。
在此级中,一个移位或ALU指令简单地把数据从MALU 406转送到WALU 506。在此级,MALU 406的输出还被提供到分路复用器318和320以便提供一个偏移或者ALU指令的输出,该输出在它被写入寄存器堆以前由一个后续指令使用。在W级500中的加载指令读出数据缓存RAM和数据标记RAM。在W级500中的存储指令只读取数据标记RAM,数据缓存RAM写被推迟直到完成标记比较为止。非加载指令把任何未定的存储数据写到数据缓存RAM中。加载后跟着的到同一地址的一个存储需要一个特别的分路,因为该存储数据将不被写入数据缓存RAM中。
在其W级500中的一个加载指令把虚拟地址MVA 408的索引部分发送给数据标记RAM的地址输入端,并且还通过复用器422发送给直接映射数据缓存RAM DC 434的地址输出端,平行于DC 434的读取,把该地址与未定的存储虚拟索引和STVI 416中的有效位进行比较。如果,基于比较器428的输出,该读取是用于未定的存储的缓存索引,则复用器432选择该未定的存储数据缓冲器418的结果;否则,就选择DA读出数据。复用器432馈给加载排列电路436,其根据虚拟地址的较低两位来把加载数据移位0、8、16或者24,然后对于L8UI和L16UI指令分别从位7或者15伸展到零位,以及对于L16SI指令从比特位置15伸展到符号位。此结果由WLOAD 508锁住。通过比较器430把数据标记RAM的输出与来自MVA 408中的M级虚拟地址的高排序位进行比较,然后此hit/miss结果被发送给M级控制逻辑MCTL 424,它处理缓存错过和例外。最后,在WMA 510中捕获加载虚拟地址来处理缓存错过。
加载缓存错过使管道的I到M级中的指令无效。来自WMA 510中的加载地址被发送给外存储器。通过复用器412和STDATA 418使用WMA 510的低排序位把从那个存储器中读出的数据作为一个地址写入数据缓存RAM 424中。数据标记RAM 426通过复用器414被写而来自WMA 510中所捕获的高排序错过地址中的STADDR 420,与DTAG 420一起由MVA 408中的较低有效位进行编址。
在其W级500中的一个存储指令把存储地址和数据放入STADDR418和STDATA 420中。另外,访问数据标记RAM 426,然后该结果与MVA 408的高排序位进行比较以便确定存储地址是否是一个不定的。如果该存储在缓存中发现,那么在第一个非加载周期上,在STDATA 418中储存的地址处将把STDATA 418的内容写入数据缓存RAM 424中。当缓存错过再填充完成时,则指令取出单元从错过的那个加载指令开始再一次来开始取出指令。
这个实施例的数据缓存为write-thru,因此还要把存储地址和数据从STADDR 420和STDATA 418发送到一个写缓冲器438中,在那里保存它们直到它们被写给外存储器为止。
如果此时指令仍然有效,并且它是含有一个运算寄存器结果的一个指令的话,则WALU和WLOAD寄存器506和508的输出由复用器512来选择以便将其写入R级200中的寄存器堆206中。
处理器还具有一个6位位移数目寄存器,它用于提供传统的紧邻的移位,比如逻辑左移、逻辑右移以及算术右移,但是不提供在那里移位数目为一个寄存器操作码的单指令移位,因为直接的变量移位可以是一个关键的定时路径,并且简单的移位不能有效地伸展到较大的宽度。虽然漏斗移位可以被扩展,但是它们需要太多的操作码。通过在移位数是从SAR寄存器中产生的时提供一种漏斗移位,如本发明优选实施例所述的处理器解决了这些问题。一个漏斗移位之后,变量移位通过编辑器使用一个指令来合成以便计算通用寄存器中的移位数中的SAR。SAR值的有效范围是0到32,不是0到31,因此六个比特被用于寄存器中。
当然,给出在下面详细描写的并且在ISA手册中更详细描述了的指令集的叙述,对于本领域的技术人员来说,那些遵循本发明的各种其他处理器体系结构将变得容易明白。这些结构也意指在附加的权利要求的范围之内。
各种管道构造可以被使用在该处理器之中;然而,指令集的某些特点最好与某些设备类别一起工作,并且一个这样的类型通常如图2所示。此类型的结构最好可以与诸如浮点单元和DSP之类的主要计算单元一起使用,并且此管道结构的一个突出点在于在Dcache(图2中标记为DReg/DALU的位置中)后的此类单元它的布局提供此类单元的指令以便把一种存储器参考作为一个源操作码包括在内。这允许每个周期一个数据缓存参考与操作而不必需要每个周期的多指令的取出和执行。
通用指令集设计考虑许多指令集特点以增加处理器设备成本为代价来改善性能(通过降低IE)和代码尺寸(通过降低IS)。例如,"自增量"地址方式(其中基地址寄存器被读取然后被用一个加1地址重写)需要一个用于加载的第二寄存器堆写端口。"索引"编址方式(其中,两个寄存器之和被用来形成虚拟地址)需要三个用于存储的寄存器堆读出端口。优选实施例是适应于两个读取端口、一个写端口的一个寄存器堆,它是合理的性能所必需的最小量。
优选实施例具有增加了设备成本的一些特点,但是却避免了需要与额外的寄存器堆端口同样多的增加的那些特点。当设备每个周期执行多个指令时这尤其重要,因为端口数按比例放大处理器的最大执行性能(例如,二到8)。
为了保持性能,指令集必须支持至少两个源寄存器字段和一个不同的目标寄存器字段。否则IE和IS两个都增加。仅使码密度最优化的通用寄存器指令集有时被设计大约两个寄存器字段(例如,HitachiSH)一个只用于源的,和一个既用于源又用于目的地的。当通过降低BI,把IS中的增加抵消时,这减少了代码尺寸,但是却没有办法补偿IE的增加。指定较少寄存器的指令集使用较窄的寄存器字段,并从而降低BI,但是由于强加了更多可变的和临时的数值存储在存储器中从而增加了IE和IS并且因此需要额外的加载和存储指令。当只有码密度是一个优先级时,对于一个净存储,IS的增加可以通过BI的减少所抵消但是当还需要优良的性能时,这里没有办法补偿IE中的增加。
当寄存器数目增加时,IE和IS中的减少持平。一个指令集应该提供至少足够的寄存器以便到达收益递减点,即,以使寄存器计数中的另外增加不引起IE显著的相应减少,特别地,用于RISC性能水平,需要至少16个通用寄存器。此外,三个4位寄存器字段需要至少12位来编码。操作码和常数字段的位也是需要的,因此一个由一些处理器使用的16位编码还不够。
二十四位编码大多数现有技术已经不能实现代码尺寸和性能之间的适当均衡的一个原因是指令集设计者对诸如16和32位之类的某些指令尺寸已感觉不适。使用与处理器的数据字宽成简单比例的指令尺寸的确有优势。可是,稍微放宽一下这个限制具有显著的优点。
作为一个出发点,优选实施例使用一个24位固定长度编码,24位对于高性能是足够的同时对于指令还提供将降低IE的延展性和空间。替换实施例可以使用在18-28位范围内的编码,但是那些小于24位的将限制延展性并且限制分支范围。24位编码表示在BI中的25%的减少,因此代码尺寸来自大多数32位的RISC指令集。最后,把24位调节在具有32数据路径宽度的处理器中十分简单。
优选实施例使用4位寄存器字段,这是可接受的性能所需要的最小值和非常适合于一个24位指令字之中的最大值。许多RISC指令集使用32寄存器(5位寄存器字段)。在三个5位寄存器字段之后,24位指令只留下9位用于操作码和常数字段。短的常数字段可能导致分支、呼叫以及其他PC相对的参考的不适当排列。太少比特的操作码提供不充分的延伸性。因为这两个原因,一个具有5位寄存器字段的24位指令字是不理想的。在16和32通用寄存器之间的性能差别(由于IE的不同)(大约6%)不象8和16通用寄存器之间的差别那么大,并且足够小以致可以引入其他特点来补偿损失的性能(例如,复合指令和寄存器窗口--参见下面)。IS中的增加(也大约是6%)大于24位和32位编码之间的差值的偏移。
应该注意,具有5位寄存器字段的许多指令集不提供32通用寄存器用于编码。大多数致力于一个寄存器来保持为零,但是通过提供一些额外的指令操作码可以很容易地消除对一个零寄存器的需要。此外,其它寄存器经常被给定具体的用途,这通过在指令集中包括其他特点可以避免。例如,MIPS使用它的31个通用寄存器的两个用于例外处理代码,而一个用于全局区域指针,因此它实际上只有28个寄存器用于变量和暂时存储单元,只比一个具有4位寄存器字段和适宜的指令集特点的指令集多12。通过软件约定的通用寄存器划分呼叫者和被呼叫者保存寄存器是共同的,并且更进一步降低了大寄存器堆的应用程序优选实施例包括避免在下面更详细描述的这些特征。
复合指令为了降低IS和IE,优选实施例还提供单一的指令,其合并了RISC和其他指令系统中典型含有的多个指令的功能。一个简单的复合指令实例是左移并增/减。HP PA-RISC和DEC Alpha是提供这些运算的指令集的例子。编址算术和小常数的乘法经常使用这些组合,并且提供这些运算,在增加CP的一个潜在成本(由于计算管道级中的附加连续逻辑)时既降低IE又降低IS。可是,各种设备已经证明当把位移限制为0到3时,额外的逻辑不对CP有非常关键的约束。反过来,ARM指令系统提供随机的位移和增加,所以它的设备具有很差的CP。
右移经常被用来从一个较大的字中析取一个字段。为了一个未确认字段的析取,通常使用两个指令(或者左移后面跟着右移,或者右移之后与一个常数“与”)。优选实施例提供单个复合指令,extui,来执行此功能。它通过在一个位移之后接着与一个屏蔽(mask)“与”来实现,该屏蔽在指令字中以刚好4位的形式被编码来表示。extui的“与”部分逻辑上太琐碎以致在指令集中它的包含物不大可能增加设备的CP。这将不适合于一个指令来析取带符号字段,因此这一点不被包括在内。
大多数指令集,RISC等等(例如,ARM,DEC PDP11,DEC VAX,Intel x86,Motorola 68000,Sun SPARC,Motorola 88000)都使用一个比较指令,该比较指令设置了条件码(组),随后是一个测试该条件码(组)以便确定控制流向的一个条件分支指令。条件分支由有关大多数RISC指令集的10-20%的指令构成,并且每一个通常与比较指令配对,因此这种格式的指令集很浪费。即使旧的指令集经常是以一种条件转移的比较跳转格式为基础的,但是当分开比较和分支时,这也具有同样的缺点。
一些指令集(例如,Cray-1,MIPS,DEC Alpha,HP PA-RISC,以及Sun SPARC的新近的V9版本)提供一种复合比较和分支可能性的变化灵活性。Cray和DEC Alpha只提供运算寄存器和零和分支的比较。MIPS提供寄存器-零比较和寄存器-寄存器相等和不相等以及分支。HP PA-RISC提供寄存器-寄存器比较以及分支指令的一个十分完整的系统。
优选实施例提供最实用的复合比较与分支指令。选择正确的设置需要平衡每个比较和分支的应用程序与它所消耗的操作码空间,尤其是当目标为一种24位(与32位相对)编码时更是如此。其他指令系统缺乏这个测试。例如,HP PA-RISC提供几乎没有用(例如,从来不在加法后上溢)的若干复合比较和分支操作码,却省略了若干有用的操作码。为优选实施例选择的复合比较和分支指令的设置为A==0,A!=0,A<SO,A>=S0,A==B,A!=B,A<SB,A<UB,A>=SB,A>=UB,(A&B)==0,(A&B)!=0,(~A&B)=0,(~A&B)!=0,A==I,A!=I,A<SI,A<UI,A>=SI,A>=UI,bit B of A==0,bit B of A!=0,bit I of A==0.bit I of A!=0在此,A和B表示寄存器内容,在运算寄存器的一个关系算子上的"U"或者"S"后缀表示分别是无符号或者是带符号的寄存器内容的"无符号"或者"带符号"比较;在与零的一个关系算子上的后缀(例如A<SO)表示与零的无符号或者带符号比较;而I表示一个索引常数。
与分开的比较和分支指令系统相比较,甚至当与像MIPS以及DEC′Alpha之类的部分比较和分支指令系统相比较时,复合比较和分支降低了IE和IS。优选实施例可能需要增加CPI以便执行复合比较和分支,但是总的性能作用仍然有一个改善。
分开的比较和分支指令系统的主要优点是两个指令字可用于规定比较算符,比较操作码,以及分支目标,其对于每一个提供丰富的字段宽度分配。与此相反,复合比较和分支指令系统必须把所有这些压紧到单个指令字中,产生较小字段,并且需要机械处理那些不适合的数值(例如,具有较长范围的分支)。优选实施例把比较操作码、两个源寄存器字段以及一个8位PC相对偏移压紧到一个24位指令字中。8位目标说明符有时候不够,编辑器或者收集器需要使用围绕具有一个较长范围的无条件分支的相反特性的一个条件分支,它由优选实施例提供。这个情形当然增加IE和IS,这是所不希望的。由于这个原因,优选实施例还提供对零测试的一系列复合比较和分支,其是最普通的情况。这些复合比较和分支指令含有一个12位PC相对补偿,其提供比它们的同仁更大的范围。通过IE和IS中的改善来均衡提供两种形式的额外复杂性。优选实施例不提供对零的所有比较(省略小于等于零的寄存器以及大于零的寄存器),这与MIPS和DEC Alpha不同;此外,优选实施例提供对操作码空间与程序需要进行均衡的指令集。
只使用24位来编码所有指令的一个结果是指令字中的常数字段尺寸方面受限制。这能够潜在地增加IS和IE(虽然增加的IE可能通过把常数加载入循环外部的寄存器而被减少)。优选实施例以好几个方式解决这个问题。首先,它提供小的常数字段以便捕获最通用的常数。为了达到窄(例如,4位)常数字段的最大使用,指令集使用该字段来编码一个常量值而不是直接表示它。编码值是选自程序统计学的一个宽排列,作为N(例如,16)最频繁的常数。优选实施例在addi.n指令中使用此技术,在此,16的值被选择为-1以及1到15而不是0到15。增加0没有用(这里有一个单独的mov.n指令),而增加-1是共同的。beqi,bnei,blti,bgei指令还使用一个4位字段,其编码各种通用的常数。bltui和bgeui指令使用一种不同的编码,因为无符号比较具有一组不同的有用值。
最通用的常数通常是非常小,并且窄的字段捕获大部分期望值。可是,使用于逐位逻辑运算(例如,AND,OR,XOR等等)中的常数表示各种种类的位屏蔽,并且常常不适合在小的常数字段中。例如,具有在任何位置设置为一或者在任何位置设置为零的常数是很普通的。此外由1序列后面跟着0序列组成的位格式,和由0序列后面跟着1序列组成的位格式是很普通的。为此缘故,优选实施例具有这样的指令,其避免对把一个屏蔽直接地放进指令字中的需要。优选实施例中的示例是bbci和bbsi指令,其根据寄存器的说明位是否分别为零或者为一而进行分支。该位被作为一个编号而不是作为一个屏蔽给出。extui指令(早先描述过)完成一个位移,其跟随由一系列1后面跟着一系列0组成的一个屏蔽,在此1的数目是指令中的一个常数字段。
协处理器布尔寄存器和分支因为复合比较和分支如此压紧到一个指令字中,不宽于三十二位,上面列出的指令消耗可用指令字的显著的一部分。由于它们的频率和所导致的节省的关系,对于这些分支这是一个优良的折衷方案。
除了有关指令集的其他约束之外,设计要求指令集应该是可延伸的(允许增加新的数据类型),在严格成对的协处理器中利用一个特点。可是,一个短的指令字可能缺乏空间来增加其他数据类型的复合比较和分支指令,比如浮点,DSP等等。另外,对于每个协处理器实现它自己的复合比较和分支多半是不可能的。即使当单独的复合比较和分支指令的实现是可行的时,这多半也是浪费,因为对于许多应用程序来说,对此类数据类型的比较和分支没有对整数数据的频繁。
为此缘故,本发明的优选实施例使用一种不同的方法用于协处理器条件分支。在该优选实施例中,指令集包括一个任选的插件,其是任何协处理器插件的一个必要条件。此插件增加十六个单独的位布尔寄存器和因此测试这些布尔寄存器和分支的BF(如果为假的分支)与BT(如果为真的分支)指令。然后协处理器提供例如根据它们所支持的数据类型的比较来设置该布尔寄存器的指令。布尔寄存器和BF与BT指令被所有的协处理器共享,其使得有效利用了一个短指令字。
这是一个不同的新条件码--基于在如上所述的许多早先指令集中找到的比较和分支。早先的指令集在处理器与它的协处理器(例如,PowerPC)之间具有多个共享的多位条件码并且使用多个预先协处理器的单一位条件码(例如MIPS)。本发明的优选实施例使用多个共享的单一位条件码。
提供用于比较的多个目标(例如,在本发明的优选实施例中,MIPS,PowerPC)允许编辑器更自由地预定代码并且虑及了对在单个指令产生多个结果中的多个数据值进行比较的指令(例如,MIPSMDMX)。
在多个协处理器(该实施例)之间或者在处理器和它的协处理器之间(例如在PowerPC中)共享比较结果寄存器节省了用于测试比较结果所需要的操作码数目。这样还增加了提供在比较结果寄存器上执行逻辑运算的指令的可行性(例如在本发明的优选实施例中以及在PowerPC中)。
单比特比较结果寄存器的使用(本发明的优选实施例,MIPS)代替多比特(大多数其他ISA)增加了所需要的比较操作码的数目但是减少了所需要的分支操作码的数目。该优选实施例使用单比特比较结果(布尔)寄存器,因为分支指令也必须提供一个PC相对目标地址,因此增加分支操作码是更昂贵的除非那里有大量的协处理器。
总之,在复合比较和分支成为使代码尺寸最小化的一个重要技术时,保持小的BI的需要寻找一种适宜用于协处理器比较和分支的分解方法,因为需要不同的频率和不同的协处理器操作码数目。在分解比较和分支选择的范围之内,使用在协处理器之间共享的多个单位比较结果寄存器使得操作码空间被最有效使用。
加载和存储指令优选实施例的加载和存储指令使用一个具有8位常数补偿的指令格式,其从一个寄存器被加到一个基地址。首先,该优选实施例充分利用这8个位,其次当这不够时它提供一个简单的扩展方法。此外,优选实施例的四个加载/存储补偿被零扩展而不是符号扩展(在许多其他指令系统中所通用的),因为数值128到255比值-128到-1更通用。并且,因为大多数参考是来自一个排列基址寄存器中的排列地址,所以该偏移被适当地左移到参考尺寸。对于32位加载和存储的偏移移位为2,对于16位加载和存储的偏移位移为1而对于8位加载和存储的偏移不移位。大多数加载和存储是32位,因此此技术提供2个附加位的范围。
当在一个加载/存储指令(或者一个addi指令)中规定的8位常数偏移不够时,则该优选实施例提供addmi指令,其增加左移8位的它的8位常数。因此一个二指令序列具有16位的范围,8位来自addmi,而8位来自load/store/addi。另外,没有由上述的一个方法编码的常数必须通过单独的指令被加载入一个寄存器(此技术不适用于load/store指令,其只采用单个寄存器操作码,而不是两个,因此需要上述的addmi解决方案)。优选实施例提供两个方法来把常数加载入一个寄存器中。第一个是用于此目的的movi(在下面描述的短指令格式中为movi.n)指令。movi在指令字中的一个12位符号扩展对字段中表示它的常数。并且,向可变的一个寄存器分配一个常量值是独自通用的。
在32位或者更少的指令格式中,没有指令可以对一个随机的32位常数进行编码,因此需要其它方法来把运算寄存器设置为一个任意常数值。在其他指令系统中已经使用了至少两个方法,并且这些方法的任何一个可结合上面的技术来使用提供一个解决方案。第一个解决方案是提供使用每一指令中的多个常数一同合成一个32位常数的一对指令(例如,MIPS LUIIADDI,DEC Alpha,IBM PowerPC,在两个单独的指令中具有表示高16位和低16位的指令)。第二个解决方案(例如,MIPS浮点常数,MIPS 16,以及ARM Thumb)是提供一种简单的办法来与一个加载指令一起从存储器中读取常数。
对参考常数使用一个加载指令可以提供比使用指令序列更低的IS和IE,如果加载本身只需要单个指令的话。MIPS编辑器,例如,贡献31个通用寄存器的一个来把一个指针保持到(在其他所有事物之中)一个常数存储库中,在此保存4字节和8字节浮点常数。如果由此寄存器编址的区域小于64 KB,则该常数可以被单个加载指令参考因为MIPS具有64 KB的加载的补偿范围。对于一个一旦被参考的常数,32位加载指令加上32位常数与两个使用的指令字总的尺寸相同。如果该常数被引用两次或多次,则常数存储库提供较小的总尺寸。对于其他指令长度,折衷方案不同,比如优选实施例的24位尺寸,在此,对于一对24位指令,常数存储库加上加载为56位比48位)。但是,当一个常数被使用多次时,则常数存储库几乎总是一个较好的总尺寸解决方案。
对于本发明的优选实施例和其他实施例来说,致力于运算寄存器编址常数和其他数值的MIPS技术不是理想的,因为正如上面提及的,窄指令字通常提供小于32个寄存器,因此每个寄存器更有价值。此外,在窄指令集中的来自运算寄存器的可用偏移是有限的,因此单个寄存器提供只对一个小常数存储库(太小不可能实用)的访问。优选实施例(参见ISA手册中的L32R)在提供一个PC相对加载中采用许多指令集的解决方案(例如,PDP11,Motorola 68000,MIPS 16,ARMThumb),其可用于访问一个常数存储库。
用于加载随机常数的任何一个技术适用于本发明。优选实施例使用第二种技术,而一个替换实施例将使用多个指令,每一个包含该完整常数的一部分。一个24位指令字的替换实施例的一个具体例子将使一个指令把一个16位指令常数放入运算寄存器(16位常数+4位寄存器目标+4位操作码=24位)的高部中,并且第二要把一个16位符号常数加到运算寄存器(16位常数+4位寄存器源和目的地+4位操作码=24位)中。
减少开销循环指令优选实施例还提供在一些数字信号处理器(DSP)中可找到的一种循环特点,但是它在RISC处理器中没有找到。大多数RISC处理器使用它们现有的条件分支指令来创造循环而不是通过提供新的特征来实现该循环。此经济性使得处理器简单,但是增加了IE和CPI。例如,C循环for(i=0;i<n;i+=1){body}在优选实施例中将被编辑为<pre listing-type="program-listing"> movi.n a3,0 ∥initializei biti a2.1,done//no iterations if n<=0loop body&lt;!-- SIPO &lt;DP n="20"&gt; --&gt;&lt;dp n="d20"/&gt;addi.n a3,a3,1//i+=1blt a3,a2.loop //continue if i<n</pre>在每个迭代中有"循环开销"的两个指令,一个增加和一个条件分支。(没有优选实施例的比较和分支特点的话,则将需要三个指令的开销。)此无疑增加了IE。另外,由于管道以及/或者分支预计,在一些处理器设备中的一个采用条件分支可能需要比其他指令更多的周期来执行。从而CPI可能增加。在这种情况下,一些指令集把单个指令加到加1或者减1运算寄存器、比较和分支(例如,DEC PDP6,DECPDP11,IBM PowerPC)中来降低IE。IBM PowerPC指令的设备还把降低CPI作为目标。)当循环本体较小时循环开销的性能影响较高。许多编辑器使用称为循环展开的一个优化方案,在这种情况下来通过2或者更多迭代来扩展循环开销。在C中,例如,上述循环可以被变换为<pre listing-type="program-listing"> i=0; if(n>0) if((i&amp;amp;1)!=0){bodyi+=1;if(n==1)goto done; }do{bodyi+=1;bodyi+=1; }while(i<n); done;&lt;!-- SIPO &lt;DP n="21"&gt; --&gt;&lt;dp n="d21"/&gt; }</pre>有时候bodyi+=1;bodyi+=1;可以被替换为body(i)body(i+i)i+=2;当i+constant能够被折叠入主体的指令中时(例如,折叠入负载和储存指令的补偿中)所以每个迭代只需要一个增量。
用一个大于2的因子进行的循环展开是稀松平常的,用4和8也是很普通的(二的乘方具有一些优势)。要注意的是关于即使二展开的因子是所导致的代码尺寸的增加(在上述的例子中主体发生三倍)。在RISC处理器中达到性能的此技术的使用与有关代码尺寸上的性能和简单性上它们所强调的一致。
许多DSP,以及一些一般用途的处理器已经提供了其他办法来执行某些种类的循环。第一个方法是提供一个指令,其重复第二指令一个固定次数(例如,TI TMS32OC2x,Intel x86)。这有十分易于实现的优点。在它可适用的地方,通过消除重复地取出相同指令的需要,它除去循环开销,并且节省功率消耗。具有撤销指令的一些指令集要求处理器在循环期间不使用一个中断,其成为一个显著的限制。并且,单指令循环只有在有限的情况中是实用的,并且只有当重复的指令非常复杂具有多重效果,以使它在每一个迭代上操作在不同的数据上。
有关简单的重复指令的一个改善是能够以降低的或者零循环开销多次迭代指令块(例如,TI TMS32OC5X)。优选实施例提供此性能通过它的循环,loopgtz和loopnez指令。上述的第一个C循环将被编译成为下列指令<pre listing-type="program-listing"> movin a3,0 //i=O loopgtz a2,done//goto done if a2<=0,otherwise //set LCOUNT to a2-1,LBEG to loop, //and LEND to DONE,and then fall //into bodyloop body addi.n a3 a3,1 //i+=1 //the processor returns automatically //to loop when it reaches here(LEND)done</pre>优选实施例的循环指令的细节可以在ISA手册中找到。LCOUNT,LBEG,以及LEND寄存器在指令集中弄明白以使循环成为可中断的。它还允许这些寄存器被与其他指令执行并行地读和写(如果使用通用寄存器,则将需要增加寄存器堆读/写端口)。优选实施例规定在LCOUNT寄存器被测试以便给出影响指令取出的最长时间之后立即把LCOUNT寄存器减1。循环指令被希望允许优选实施例避免采用分支损失,其将与循环的条件分支编码相关。
a3(i)的增加不通过循环指令自动地被执行。这被作为一个单独的指令留下,如上所示,因为许多循环需要引入变量的不同数量的增量或者减量,特别是在强度减少最优化后。另外,有时候这些增量可以被折叠入协处理器地址模式中,比如自增量。最后,增加一个通用寄存器将在通用寄存器堆上需要额外端口(组)。
从上述的例子和讨论中可以看到,循环指令既减少IE又减少IS并且便于实现CPI的降低。当循环指令避免循环展开的需要时对IS的影响是最大的,但是甚至在展开情况下是存在的。然而,对于本领域的技术人员来说,很显然,这里存在附加的处理器设备成本,它是优选实施例中的这些指令的存在所需要的(例如,特别的寄存器,专用指令取逻辑)。
不测事件(Hazards)大多数指令集现在通过管道硬件来执行。管道的使用在指令执行过程中经常引起不测事件,其必须以硬件或者软件的形式来避免。例如,许多管道在管道的末尾(或者至少在管道的晚期)写寄存器堆。为了正确的操作,使用被写寄存器的后续指令作为一个源操作码必须或者等着读取寄存器堆直到值被写为止,或者被写的值必须被分路或者发送到该相关的指令,并且寄存器堆内容被忽略。
大多数处理器以硬件的形式提供对于它们的通用寄存器堆的相关检测并且延迟相关的指令直到结果可用然后在它被写入寄存器堆中以前把它分路到相关的操作中。以软件的形式延迟指令(通常通过插入NOP)将显著地增加代码尺寸(通过增加IS),同时没有分路将显著地降低性能。因此检测,停顿,以及分路硬件是有它的成本的价值的。
可是,对于不同于一般用途的寄存器堆的处理器状态,折衷方案可能不同,因为这样的寄存器常常很少被参考。一些指令集(例如,MIPS)因此转向特别的寄存器不测事件的软件处理(例如通过插入NOP来从使用中分离出写)。令人遗憾的是,这一点要求把管道的知识建入指令流中。
一个备选方案是使特别的寄存器写延迟所有后续指令以便避免不测事件。虽然这很简单并解决了问题,但是它也许是效率低的,因为该特别的寄存器写经常成群地发生(例如在一个关联转换或者中断后的恢复状态),并且那里经常没有理由延迟其他特别的寄存器写以及它们所依赖的指令。本发明的优选实施例采取一种混合近似法。它提供ISYNC,RSYNC,ESYNC以及DSYNC指令(细节请参见ISA手册),软件必须插入其中以便避免那些没有被硬件检测并避免的不测事件。不同的NOP的使用,这些指令停止直到所有特别的寄存器写完成为止。这允许单个独立实现的指令来完成什么将另外需要一个潜在大量的特定实现的NOP。它还允许程序设计员把特别的寄存器写集中在一起而不必停止使性能最佳化。
码密度选项优选实施例的指令系统包括一个核心指令集,其最好存在于指令集的所有设备中,以及一组可选指令插件,其可以或者不可以存在于一个给定的设备中。一个这样的插件是一个短指令格式,其通过减少BI来提供显著的代码尺寸减少,每一指令的平均位。当这些短格式指令存在时,优选实施例从一个固定长度(24位)指令集变化为一个具有两个指令尺寸的指令集(24位和16位)。替换实施例可以选择一种不同的指令集尺寸。例如,具有与24/16编码类似的码密度的一个备选方案是24/12,在此,有以短的形式的两个寄存器字段而不是三个。
因为短指令形式是可选的,所以为了改进代码尺寸,单独地使用这些形式;没有新的功能存在于这些指令中。可以被编码在16位中的指令集被选择作为将适合(或者可以被改变来适合,例如,通过减少常数字段宽度)统计上最频繁的指令。在大多数指令集中的最频繁的指令是加载、存储、分支、加法以及移动;这里正好有存在于优选实施例的16位编码中的指令。与完全为了降低BI的一个短格式的使用与诸如Motorola 68000、Intel x86和DEC VAX之类的其他可变长度指令集相反,在那些指令集处,每个指令具有一个编码,其主要取决于操作码的数目和操作码种类,而不是取决于使用的固定频率。
已知的具有与本发明类似的一个性质的唯一指令集是SiemensTricore,它具有一个32位基本格式和用于减少BI的一个16位短格式。不同于我们的发明,该基本格式太长而不能达到典型的BI,并且该短形式不是功能性的,因为它只提供两个寄存器字段,它强迫源和目标寄存器之一是相同的,或者源或者目标寄存器之一通过操作码来隐含。正如早先讨论的,隐含的源寄存器的使用可能增加设备的CP或者CPI。
早先说明过,一个只有16位的指令集提供不充足的性能和功能。大多数频繁的指令的16位编码避免了这个缺陷。因为只有大多数频繁的指令需要短编码,三个寄存器字段是有效的,并且窄常数字段可以捕获使用的一个非常小的部分。在三个4位字段留给寄存器说明符或者常数之后,表示一个应用程序所需要的大约一半指令可以以一种16位编码的形式被编码在可用的十六个操作码的恰好六个中。
16位编码密集指令选项的详细叙述可以在ISA手册的表26中找到,正如其中所示,可选指令集包括一个132i.n指令(加载32 bits。4位补偿);s32i.n(存储32位,4位补偿);mov.n(把一个寄存器的内容移到另外一个);add.n(把两个寄存器的内容相加);addi.n(把寄存器和紧邻的相加,在此,紧邻的是-1或者在1..15范围中);movi.n(用紧邻的加载寄存器,在此紧邻的是在-32...95);nop.n(无操作);break.n(中断);ret.n,retw.n(ret和retw);beqz.n(如果寄存器为零,则用6位无符号偏移发送分支);以及bnez.n(如果寄存器为非零,则用6位无符号偏移发送分支)。
一个替换实施例将使用上面提到的一种12位短格式。一个12位格式除了支持4位主要的操作码之外,只支持两个4位字段。这只支持没有偏移的加载和存储(有时称为字段中的寄存器间接寻址),和一个加法指令,在此目的地和一个源寄存器是相同的。这些限制不是象它们在其他情况中一样是对性能的限制,因为编辑器在适当的时候可自由使用更长的三个操作码格式。该限制防止12位格式象平常一样被使用,但是它的简化尺寸部分地进行了补偿。在30%的12位和70%的24位处,BI应为20.4位,几乎与50%的16位和50%的24位所达到的20.0位相同。这里有一些实现简单化,这是当一个格式是另外一个的一半尺寸时带来的,但是当指令尺寸和数据宽度的最大公约数(gcd)很小(对于24、12和32为4,而对于24、16和32为8)时这里有一些实现结果。在设备成本上整个两者大致相等,并且因此优选实施例是给出较好的代码尺寸的一个,它为24/16。
与24/12相比,24/16有一个附加码尺寸的缺点。分支补偿(通过指令地址的一个差值表示目标指令的指令常数)必须是所有指令尺寸的多个gcd。对于24/12是12而对于24/16为8。这个数字越大,则分支可以达到越长(以位为单位)。超过此范围的分支需要一个多次的指令序列,其增加了IS。
正如在大多数RISC中所发现的,当处理器设备每个周期执行多次指令时固定长度指令的最显著的优点出现。在此情形下,通常并行地对指令进行解码。利用可变长度指令,在第一个指令上必须完成足够的解码以便找到第二个的开端,以使解码可以对其进行在第二个指令上必须完成足够的解码以便找到第三个的开端,等等。这样可能增加CP。为了避免增加CP增加一个管道级将很可能增加CPI。通过解码每一个潜在的指令开始然后当来自前一指令的解码中的信息变得可用时选择现有的指令,一些设备得到一个早的开始。这无疑增加设备的成本。为了挑选出指令而增加一个管道级同样也增加成本。然而其他可能性,比如预先解码到指令缓存中还是可能的,但是全部都增加设备成本。
虽然优选实施例没有消除可变长度解码问题,但是通过首先只使用两个指令长度,其次通过使用单个指令位来区分两个长度,它使其尽可能简单。这将设备成本和有关CP的任何影响减到最少。最后,通过使短格式可选,当代码尺寸不是第一优先级时优选实施例使其能够消除成本和CP影响。
许多指令集按照低端在前格式或者高端在前格式字节顺序工作。达到此目的的技术例如在Weber等人的美国专利4,959,779中被描述。可是,具有可变尺寸的指令的指令集需要额外注意。MIPS指令集对于高端和低端在前格式字节顺序使用相同的指令格式,其是仅有的工作,因为指令都是一个尺寸。优选实施例对于高端和低端在前格式字节顺序规定不同的指令字以便保持特性确定指令尺寸所必需的位存在于最低数目编址字节(优选实施例中的最小可编址单元)中。
窗口寄存器选项另外一个可选插件是窗口寄存器选项。它被提供来降低IE和IS。IE的降低的性能提高还补偿了由于用16个寄存器代替32个所引起的IE的增加。寄存器窗口在一些其他处理器上得到,比如Sun SPARC。对于该主题的一个完整介绍,参见SPARC文件。名称"寄存器窗口"描述了典型的设备,在此指令中的寄存器字段规定当前窗口中的运算寄存器在一个较大的寄存器堆上。通过一个窗口基址寄存器来描述窗口的位置。
寄存器窗口避免了在过程入口和出口处节省和恢复寄存器的需要(其减小IS和IE)。这通过改变在这些点处的指针来实现,它本质上隐藏一些寄存器不被看见而暴露了新的一个。暴露的寄存器通常不包含有效数据,并且能被直接地使用。可是,当该暴露的寄存器包含有效数据(因为窗口已经移动太远以至于它已经绕回前一呼叫帧的寄存器),硬件检测到这一点并在执行继续之前把该有效寄存器存储到存储器中(这通常通过软件管理者的一个捕获来完成)。这被称为寄存器窗口上溢。当一个呼叫返回到一个帧(该帧的寄存器已经被储存到存储器)时,寄存器窗口下溢已经发生并且处理器最多加载来自存储器中的值(这通常也通过软件管理者的一个捕获来完成)。
以它们的物理寄存器堆的视点来看在呼叫者和被呼叫者之间重叠的寄存器窗口也避免可能在程序的变元在寄存器中传递时发生的变元逐渐移动(变元逐渐移动增加IS和IE)。最后寄存器窗口改变无损失点用于将一个可变的或者临时的数值分配到运算寄存器,并从而激励寄存器使用,其比使用一个存储位置更快更小(也减少IS和IE)。
在本发明的寄存器窗口和SPARC的之间主要区别是(1)SPARC具有窗口指针的一个固定增量16;(2)除窗口寄存器之外SPARC具有全局寄存器而优选实施例却没有;以及(3)在当前的窗口与上一窗口重叠在一起的条件下SPARC检测窗口上溢而优选实施例在运算寄存器的参考是上一窗口的一部分时检测窗口上溢。
从一个固定增量到一个可变增量的变化对保持低设备成本来说是重要的。它允许使用一个非常小的物理寄存器堆。例如,许多SunSPARC设备使用136个入口的一个物理寄存器堆,而优选实施例可能需要仅仅64个入口的运算寄存器堆来实现类似的窗口性能。对于可变的增量这里存在复杂性的增加,但是处理器设备成本中的差值可以为30%或者更多(这是简单的固定增量SPARC方法需要的较大寄存器的成本)。优选实施例规定新方法来检测上溢和下溢,并组织栈帧,如ISA手册中的详细描述。
表面上,由于需要连续地与读出的寄存器堆相加(虽然是短的一个),寄存器窗口机构似乎增加了CP(或者CPI)。(寄存器写不是一个问题,因为管道中有一个循环来完成加法。)可是,按照具有与运算寄存器堆的非窗口寄存器访问类似的定时的方法来执行寄存器窗口访问是可能的。例如,考虑一个64个寄存器的物理寄存器堆,对任何给定的指令来说一个16的窗口是可见的。在这种情况下,仅仅根据窗口指针,十六个641 muxes可用于选择十六个可见的寄存器然后这16个结果被如同一个16入口寄存器堆被访问。使用十六个641 muxes具有一个高设备成本。为此缘故,优选实施例规定窗口指针被限定为四的倍数,由于4的倍数减少成本。甚至在选择使用连续加法的设备中,这担保寄存器数目的两个位可用于立即开始寄存器堆访问,在访问中的一个稍后点处使用慢一点的和位(4位和2位输入之和)来开始。最后,在这两个设备之间的混合是可能的,具有中间的设备成本。
对于本领域的技术人员来说优选实施例的修改和变化将是显而易见的。这样的变化都在附加的权利要求定义的本发明的范围之内。
权利要求
1.一种处理器,包括至少十六个一般用途的寄存器;装置,用于访问一个存储器以便与寄存器交换数据;以及一个运算单元,用于处理来自该存储器的指令,基本上所有的指令都具有至多二十八位的一个长度;其中,至少一个指令具有一个操作码字段,指定一个常数操作数给该指令的一个字段,能够把任何一个一般用途的寄存器指定为一个源寄存器的一个源寄存器字段,以及能够把这些一般用途的寄存器中的任何一个指定为一个目标寄存器的一个目标字段;至少一个指令具有一个操作码字段、多个源寄存器字段-其每一个都能够把任何一个一般用途的寄存器指定为源寄存器、以及一个目标字段-其能够把任何一个一般用途的寄存器指定为一个目标寄存器;这些指令中的至少一个指令使运算单元执行多个复合运算,这些运算中的第一个运算是第一算法和一个逻辑运算中的一个,而这些运算中的第二个是一个第二算法运算和一个条件分支运算中的一个。
2.如权利要求1所述的处理器,其中指令包括第一组指令和第二组指令,第一组指令具有一个相同的第一固定指令长度而第二组指令具有一个相同的第二固定指令长度,第二固定指令长度不同于第一固定指令长度;且在一个操作码字段中对两个组是共同的一个给定位字段表示了一个组,含有那个位字段的一个指令属于该组。
3.如权利要求1所述的处理器,其中,第一个运算是在指令内由源寄存器字段表示的寄存器数值的一个比较,而第二个运算是响应于该比较结果的一个分支运算。
4.如权利要求1所述的处理器,其中第一个运算是由一个源寄存器字段表示的寄存器内容的一个逻辑左移,而第二个运算是有关移位寄存器内容和另一个源寄存器数值的一个算术运算。
5.如权利要求1所述的处理器,其中第一个运算是由一个源寄存器字段表示的寄存器内容的一个逻辑右移而第二个运算是关于由具有指令常数字段表示的一个数值的位移结果的一个逻辑"与"运算。
6.如权利要求1所述的处理器,其中至少一个指令使处理器执行起始于第一指令地址的指令直到到达第二指令地址为止,然后继续再一次在第一地址处执行并通过由指令的一个源寄存器字段表示的一个源寄存器的内容来重复若干次判定。
7.如权利要求1所述的处理器,其中该处理器包括至少一个指令,其具有在一个查询表中指定一个常量值的一个常数字段。
8.如权利要求1所述的处理器,进一步包括多个专用寄存器;以及装置,用于访问专用寄存器以便与一个协处理器在那里交换数据;其中,至少一个指令是一个条件分支,其响应于在专用寄存器中的数据为一个预定值。
9.如权利要求8所述的处理器,其中专用寄存器是单比特寄存器;以及用于访问的装置进一步用于在单比特寄存器和多个协处理器之间交换数据。
10.如权利要求1所述的处理器,进一步包括一个专用寄存器;以及状态指示装置,用于选择性地表示向专用寄存器的一个写执行还没有完成并且所有未定的专用寄存器的写执行已经完成;其中,指令集包括一个指令,该指令使运算单元延迟后续指令的执行直到状态指示装置指示所有未定的写执行已经完成。
11.一种处理器,包括在其中存储数据的多个寄存器;装置,用于访问一个存储器以便在存储器和寄存器之间交换数据;以及运算装置,用于执行来自存储器中的指令以便处理储存在寄存器中的数据;其中,多个指令具有多个寄存器字段,每个寄存器字段是至少四位宽;该指令每一个都包括一个负载、一个存储、一个关于相等的条件分支、一个关于不相等的条件分支以及一个算术运算中的至少一个,其每一个以至多二十八位的形式被编码;该运算装置用于响应于执行一个加载指令,相应于由该指令的源寄存器字段和加载指令的常数字段表示的寄存器的内容和,把数据载入到由来自一个存储位置中的加载指令的目标寄存器字段的内容指定的运算寄存器中;该运算装置用于响应于执行一个存储指令,在相应于由存储指令的第二源寄存器字段和存储指令的常数字段表示的运算寄存器的内容和的一个存储位置中存储来自由存储指令的第一源寄存器字段的内容来指定的寄存器中的数据;该运算装置用于响应于执行一个关于相等的条件分支指令,顺序地执行来自存储器中的指令,其开始于相应于当由关于不相等的条件分支指令指示的两个寄存器的内容相等时由关于相等的条件分支指令指示的一个相对偏移数值的一个位置处;该运算装置用于响应于执行一个关于不相等的条件分支指令,顺序地执行来自存储器中的指令,其开始于相应于当由关于不相等的条件分支指令指示的两个寄存器的内容不相等时由关于不相等的条件分支指令指示的一个相对偏移数值的一个位置处;以及该运算装置用于响应于执行一个算术指令,执行关于由算术指令的各个源寄存器字段指示的多个寄存器的内容的一个算术运算并且把它的结果存储在由算术指令的目标寄存器字段指示的运算寄存器中。
12.如权利要求11所述的处理器,其中;每一加载、存储、关于相等的条件分支、关于不相等的条件分支以及算术指令的一个源寄存器字段都在与每个指令的边界有关的一个相同位置中;且存储、关于相等的条件分支、关于不相等的条件分支以及算术指令的一个附加的源寄存器字段都在与每个指令的边界有关的一个附加的相同位置中。
13.如权利要求12所述的处理器,其中运算装置进一步地用于响应于一次执行一个循环指令而多次执行其他指令。
14.如权利要求13所述的处理器,其中以一个相同的第一固定长度来对加载、存储、关于相等的条件分支、关于不相等的条件分支以及算术指令中的每一个进行编码;以及运算装置,响应于以比第一固定长度短的一个相同第二固定长度编码的每个短加载、短存储、关于相等的短条件分支、关于不相等的短条件分支以及短算术指令的执行,执行各个加载、存储、关于相等的条件分支、关于不相等的条件分支以及算术指令的一个相应运算。
15.如权利要求13所述的处理器,其中运算装置包括一个窗口基址寄存器,其表示在一个寄存器堆内的一组寄存器;以及运算装置更进一步用于在寄存器堆中把寄存器组开窗口以使寄存器字段指示与一组寄存器中的一个窗口有关的寄存器。
16.如权利要求1所述的处理器,其中在一个子程序调用指令中通过一个常数表示窗口基址寄存器的相对增量。
17.一种处理器,包括在其中存储数据的多个寄存器;装置,用于访问一个存储器以便在存储器和寄存器之间交换数据;以及运算装置,用于执行来自存储器中的指令以便处理储存在寄存器中的数据;其中每个指令小于三十二位宽并且具有多个源寄存器字段和一个目标寄存器字段的多个指令,每个寄存器字段为至少四位宽;该运算装置用于响应于执行一个加载指令,相应于由该指令的源寄存器字段和加载指令的常数字段表示的一个运算寄存器的内容和,把数据载入到由来自一个存储位置中的加载指令的目标寄存器字段的一个指定的运算寄存器中;该运算装置用于响应于执行一个存储指令,在相应于由存储指令的第二源寄存器字段和由存储指令的常数字段表示的运算寄存器的内容和的一个存储位置中存储来自由存储指令的第一源寄存器字段的内容来指定的寄存器中的数据;以及该运算装置用于响应于执行一个条件分支指令,执行一个测试,并且,如果测试结果为真,则顺序地执行来自存储器中指令,其开始于一个位置处,该位置对应于当由条件分支指令指示的一个相对偏移数值,面向第一个组选定的测试包括两个源寄存器内容相等,两个源寄存器的内容不相等,两个源寄存器的位逻辑“与”等于零,两个源寄存器的位逻辑“与”不等于零,由第二源寄存器的内容指定的第一源寄存器的一位内容为零,由第二源寄存器的内容指定的第一源寄存器的一位内容为一,由该指令的一个字段指定的一个源寄存器的一位内容为零,由该指令的一个字段指定的一个源寄存器的一位内容为一,由该指令的一个字段指定的第一源寄存器的内容是小于第二源寄存器内容的二的补码,由该指令的一个字段指定的第一源寄存器的内容是大于等于第二源寄存器内容的二的补码,由该指令的一个字段指定的第一源寄存器的内容无符号小于第二源寄存器内容,由指令的一个字段指定的第一源寄存器的内容无符号大于等于第二源寄存器内容,一个源寄存器的内容和该指令的一个常数字段相等,一个源寄存器的内容和该指令的一个常数字段不相等,源寄存器的内容是小于该指令的一个常数字段的二的补码,一个源寄存器的内容是大于等于该指令的一个常数字段的二的补码,源寄存器的内容无符号小于该指令的一个常数字段,并且源寄存器的内容无符号大于该指令的一个常数字段。
18. 如权利要求17所述的处理器,其中,从第一组和第二组的其中之一选出来测试包括一个源寄存器的内容为零;一个源寄存器的内容为非零;一个源寄存器的内容为小于零的二的补码;并且一个源寄存器的内容为大于零的二的补码;其中,与零的每个比较表示一个偏移,其指明一个分支目标,该分支目标比把一个源寄存器与一个非零变元相比较的一个相应指令的偏移大。
19.如权利要求18所述的处理器,其中通过参考由字段值表示的查找表格中的一个位置,测试包括一个源寄存器与指令的一个常数字段的比较而形成该常数。
20.如权利要求19所述的处理器,其中所有的指令都小于三十二位长。
21.如权利要求20所述的处理器,包括以编码在较少位中的条件分支在内的并使用比对应的条件分支指令更短的一个相对偏移字段的并且包括作为源寄存器的内容的一个测试在内的指令为零而源寄存器的内容为非零。
全文摘要
一种RISC处理器实施一种指令集,它除了使执行一个程序所需要的指令数量、时钟周期以及每个指令的平均时钟数之间的关系最优化之外,还被适当设计以优化方程式S=IS
文档编号G06F9/308GK1348560SQ99815428
公开日2002年5月8日 申请日期1999年11月10日 优先权日1998年11月13日
发明者厄尔·A·基里安, 里卡多·E·冈扎尔斯, 艾什什·B·迪克西特, 莫妮卡·拉姆, 沃尔特·D·利奇顿斯坦, 克里斯托弗·罗文, 约翰·C·拉顿伯格, 罗伯特·P·威尔森 申请人:坦斯利卡公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1