背景技术
饱和运算用于图像处理、伺服控制等各种技术领域。所谓饱和运算就是判断运算结果是否落在预置的运算幅度之内,或者是否超过预置的运算幅度,在超过的情况下,对运算结果进行修正运算。
之所以需要这种饱和运算是为防止出现因运算发生使正负号反转而输出背离逻辑值的运算结果。在整数运算中,把最高位分配作符号用,而代表数值的正负。以16位运算为例,最高位的第15位变成符号位(此处,把最低位作为第0位)。一旦把最高位作这样的分配,运算中的进位最好停留在第14位之内,一旦出现从第14位向第15位的进位,“正数+正数”的计算结果就变成为“负数”而出现。
通过校验是否使符号位以上有变化,则可以检测有没有发生上述现象。在32位运算器中进行16位整数运算的情况下,第15位变成符号位,而第16位~第31位应该不变动。故,其上限值就变成32位带符号的整数0×00007FFF。另外,将其反演带符号的整数0×FFFF8000变为下限。当运算结果超过由此上限值和下限值构成的范围时,可以认为输出了不能以16位运算幅度代表的运算结果(对于运算结果超出预定的运算幅度的,在本说明书中,称作“运算结果已饱和”,对于运算结果落在预定的运算结果之内的,在本说明书中,称作“运算结果不饱和”)。
当进行这种饱和运算时,在处理过程中,在运算指令之后,首先举出***修正程序的方法。下面示出修正程序之一例,将它作为第1已有技术加以说明。再有,作为使用本程序时的规定,要把数据寄存器用于运算结果的存贮。在本程序中的指令是2操作数的标记,将左边、右边的操作数分别称作第1操作数、第2操作数。将第2操作数兼作传送指令的传送地址的指定和运算结果的存贮地址的指定。
指令1:CMP 上限值,D1
指令2:BCS NOT_CARRY
指令3:MOV 上限值,D1
指令4:BRA ENDNOT_CARRY:
指令5:CMP 下限值,D1
指令6:BCC END
指令7:MOV 下限值,D1
END:
对此程序的各指令按顺序加以说明,首先在指令1“CMP上限值,D1”中,将D1寄存器的值与上限值做比较。从由第2操作数所指示的寄存器D1的保持值减去在第1操作数中作为立即值所记述的上限值。在D1寄存器的保持值比上限值小的情况下,出现退位,使标志寄存器中的进位标志置位。
指令2中的“BCS”的“B”是指分支指令,“CS”是指“进位置位(Carry Set)”。一旦进位标志置位,从指令2执行向标记“NOT-CARRY”的分支。
比较的结果,当D1寄存器的值超过上限值时,转移到指令3,根据指令3“MOV上限值,D1”,将上限值传送到寄存器D1,对运算结果用上限值来修正。修正后,在指令4的无条件分支指令“BRA END”中,在代表饱和运算终止的END标记,结束通过分支的饱和运算。
以上是当寄存器D1的保持值超过上限值时的操作。接下来对于寄存器D1的保持值低于上限值的情况加以说明。当低于上限值时,在指令5“CMP下限值,D1”中,将D1寄存器的值与下限值做比较。此时的比较,是从由第2操作数所指示的寄存器D1的保持值减去在第1操作数中作为立即值所记述的下限值。在D1寄存器的保持值小于下限值时,发生退位,使标志寄存器中的进位标志置位。
由指令6,根据进位标志的置位,复位进行分支,在指令7的传送命令“MOV下限值,D1”中,由于将下限值传送给寄存器D1,对运算结果由下限值来修正,结束饱和运算。
以上就是修正程序中饱和运算的全部内容,但是在这种第1已有技术中的问题是一次饱和运算要***七条指令而使编码量增大。在把程序预先存储在ROM的情况下,使ROM的数量跟着编码量的增多而增加,从而提高了制造成本。这种编码量的多少,当然也使执行时间成为问题。上述修正程序中存在分支指令(指令2、指令4、指令6),在执行本修正程序时,不管是否饱和而必定发生分支,因此在引入流水线处理时,其处理效率显著降低。
由于在程序内设置了专用电路,而力图降低编码量并提高执行速度的技术,在特开平7-210368号公报中已有介绍。本说明中所介绍的技术作为第2已有技术,在下面加以说明。
图1是由本说明书所揭示的程序的内部结构,具备锁存电路51、52、54,存储着运算数据和运算结果并根据指令解读结果将其输出的寄存文件71,采用寄存文件71的输出进行运算的算术运算电路72,在这些方面,它与已有程序结构没有不同之处。
在本图中作为专用电路而设置的是饱和运算修正电路70,它位于算术运算电路72与数据总线之间。
饱和运算修正电路70的内部结构示于图2。如图2所示,饱和运算修正电路70由判断算术运算电路72的输出单元所表示的运算结果是饱和还是不饱和的饱和判断电路73、产生运算判断上限值及下限值的常数发生电路74、选择输出算术运算电路72的结果、由常数发生电路74所产生的上限值和下限值之中的一个值的多路转换器75构成。如上所述,由于饱和运算电路70设置在算术运算电路72的输出单元与数据总线之间,算术运算电路72的运算结果被锁存电路51锁存并由饱和判断电路73立刻判断该值是饱和还是不饱和,假若饱和,则输出上限值、下限值以替代运算结果的输出。
由于起动饱和运算修正电路70,本程序在图3提供了以一览表表示的指令置位。在该一览表的指令中“ADD D0,D1”、“SUB D0,D1”、“MUL D0,D1”是通常的运算指令,而其余的“ADDS16 D0,D1”、“SUBS16 D0,D1”、“MULS16 D0,D1”、“ADDS24 D0,D1”、“SUBS24 D0,D1”、“MULS24 D0,D1”完全是为饱和运算修正电路70而准备的指令。
“ADDS16 D0,D1”、“SUBS16 D0,D1”、“MULS16 D0,D1”是在算术运算电路72进行加法、减法、乘法的算术运算,并对其运算结果由饱和运算修正电路70进行16位幅度的饱和运算的带饱和运算的算术运算指令的命令。
“ADDS24 D0,D1”、“SUBS24 D0,D1”、“MULS24 D0,D1”是由算术运算电路72进行加法、减法、乘法的算术运算,并对其运算结果由饱和运算修正电路70进行24位幅度的饱和运算的带饱和运算的算术运算指令的命令。
例如,“ADDS16 D0,D1”是在算术运算电路72中由算术运算电路72执行寄存器D0,寄存器D1的保持值的加法运算,并对其运算结果由饱和运算修正电路70执行16位幅度的饱和运算。“SUBS16 D0,D1”是在算术运算电路72中由算术运算电路72执行寄存器D0、寄存器D1的保持值的减法运算,并对其运算结果由饱和运算修正电路70执行16位幅度的饱和运算。
在第1种已有技术中,每一次饱和运算必须使用包含分支指令的7条指令,在第2种已有技术中,由使用图3中所记载的指令中的某一条,在程序中可以一次完成算术运算和其运算结果的饱和运算。如此,在程序中可以用一条指令指示运算及对其运算结果的饱和运算,因而第2已有技术可以大幅度减少编码量。
参照定时图来说明,会加深对以上程序组成内容的操作的理解。参照图4所示的定时图,简单说明其操作。
解读结果若是带饱和运算的运算指令,首先在时刻T11由锁存电路51、锁存电路52锁存寄存文件71的保持值。一经锁存,算术运算电路72对锁存电路51、锁存电路52所锁存的保持值彼此间不做运算,输出运算结果。
在时刻T12,饱和判断电路73对运算结果与常数发生电路74所产生的上限值或下限值做比较,判断运算结果是否超出上限值或下限值。然后,多种转换器75根据饱和判断电路73的判断,当运算结果比前述上限值大时,选择前述上限值,当运算结果比前述下限值小时,选择前述下限值。在运算结果比前述上限值小或相等,但比前述下限值大时,则选择前述运算结果输出。
然后,把多路转换器75的输出作为运算结果存入寄存文件1。再有,在执行通常运算指令的情况下,控制多路转换器75,以便选择输出与前述判断结果无关的运算结果。
可是上述第2已有技术,由算术运算及其结果的饱和运算是由一条指令起动的,饱和运算修正电路70被设置在算术运算电路72与数据总线之间。像这样把饱和运算电路70被配置在算术电路72和数据总线之间,即使执行通常的运算指令,为从算术运算电路72向寄存文件71传送,也必须经由饱和运算修正电路70。
一般,将数据寄存器—算术运算电路—寄存文件间的路径称为最短路径,而本路径的传送时间在很大程度上受处理器的机器周期来决定。第2已有技术的构成,由于是用1条指令实现了饱和运算,则变为把饱和运算修正电路70设置在此最短路经上。由于采用了这种构成,处理器的机器周期大致由t1+t2决定(t1是算术运算电路72运算时所需的时间,t2是饱和判断电路73运算所需要的时间)。
由于该机器周期大致由t1+t2决定,有必要使处理器的时钟信号的周期受不能低于t1+t2时间的限制。由于这种限制,第2已有技术要牺牲处理器的速度性能。
另外,第2已有技术中的问题在于减少存储于ROM中的指令的编码量的同时需重新扩展诸如“ADDS24 D0,D1”、“SUBS24D0,D1”、“MULS24 D0,D1”的带饱和运算的运算指令,从而增加了指令数。该增加量同运算指令数与进行饱和处理的位幅度的种类之积相等,由于该指令数的增多,使指令解码、控制电路复杂化。
具体实施方式
实施方案1
下面参照附图对本发明的实施方案1加以说明。图6是表示第1实施方案的处理器内部结构图,如图所示,本处理器由RAM10、ROM11、指令读出电路12、解码器13、运算执行部14、地址总线17及数据总线18构成。
一旦由地址总线17输出写入目标的地址,RAM10将由数据总线18传送的数据写入由地址总线17指示的地址。一旦由地址总线17输出读出目标的地址,RAM10经数据总线18输出存储着的数据中的由该地址指出的数据。
一旦存储指令串,经地址总线输出读出目标的地址,ROM11从指令串中经数据总线输出由该地址指示的指令。在ROM11存储的指令串中混杂着传送指令、运算指令、分支指令等各种类别的指令。在运算指令中,又分为算术运算指令、逻辑运算指令、按位运算指令、饱和运算指令等类别。其中的各种算术运算指令以例如如图10所示的助记符号表现。
如图10所示,使加法指令、减法指令、乘法指令开始的算术运算指令分别具有第1操作数、第2操作数。第1操作数具有立即指定及寄存器随机指定2种寻址方式。而第2操作数的寻址方式只有寄存器直接指定方式。这是为了使第2操作数兼作运算结果存储目标的指定。
以加法指令“ADD D0,D1”为例,第1操作数成为寄存器D0,第2操作数成为寄存器D1。以加法指令“ADD imm,D1”为例,第1操作数成为立即值imm,第2操作数成为寄存器名D1。第2操作数,因为作为运算结果的存储目的地进行指定,在“ADD D0,D1”的情况下,规定把寄存器D0与寄存器D1的加法运算结果存储于寄存器D1。
饱和运算指令具有寄存器名字段和运算幅度字段,并指示以寄存器名字段指定的寄存器的保持值是否在运算幅度指定的运算幅度的范围内。此时,当保持值超过所述范围时,指示要把保持值用所述范围的上限值或下限值来修正的意旨,当未超过时,指示原样输出保持值的意旨。
寄存器名字段、运算幅度字段的大小各自为2位,关于其结构参照图11所示的饱和运算指令的格式。首先,当所述的饱和运算范围指定为16位时,把“00”指定给运算幅度字段,在上述范围指定为24位的情况下,把“01”指定给运算幅度字段。在把作为饱和运算对象的寄存器指定给寄存器D0的情况下,把“00”指定给寄存器名字段,当把饱和运算对象指定为寄存器D1时,把“01”指定给寄存器名字段。饱和运算指令的助记符号示于图10的图表的最下行。如该助记符号所示,饱和运算指令有“SAT16”、“SAT24”2种,并具有能指定寄存器D0~D2中任何一个的寄存器名。
关于ROM11中所存储的指令的特征内容只是以上几点,关于ROM11中所存储的指令串,应该注意的是算术运算指令和饱和运算指令之间存在以下说明的规则性。
这里所说的规则性,是将饱和运算指令设置在紧接算术运算指令之后,在饱和运算指令的寄存器名字段中,用与算术运算指令的第2操数中所记述的寄存器名共同的名来记述。其具体例,参照以下的[例1]、[例2]。(例1)
指令1:ADD D0,D1
指令2:SAT 16,D1(例2)
指令3:SUB D0,D1
指令4:SAT 24,D1
现在解释,该规则性有什么意义。因为在算术运算指令的第2操作数中指定了运算结果的存储目标的寄存器,紧接算术运算指令之后而设置的饱和运算指令的寄存器名字段中,记述着运算结果存储目标的寄存器名,紧接由算术运算指令进行算术运算之后,进行其运算结果是否在算术幅度的范围内的判断,根据需要对运算结果进行修正。
以上述(例1)进行说明,由D0寄存器的值与D1寄存器的值的加法运算,将D1寄存器中所存储的相加结果变为16位幅度的饱和运算的对象;以(例2)进行说明,由D0寄存器的值与D1寄存器的值进行相加,则把D1寄存器中所存储的相加结果变为24位幅度的饱和运算。
指令读出电路12具有依次生成读出目标地址由地址总线输出的程序计数器,由解码器13读出来自ROM11经数据总线输出的指令。
解码器13具有可以储备多个从数据总线来的读出指令的指令缓冲器及保持储备在指令缓冲器内的指令中变为解读对象的指令的指令寄存器,并解读存储于指令寄存器中的指令内容,对运算执行部14完成执行该指令的控制。在此处所称的控制过程中,必须加以特别说明的是以下所示的寄存器输出控制(1)、运算执行控制(2)及常数发生控制(3)。
寄存器输出控制(1)就是控制运算执行部14,以便输出由指令读出电路12读出的算术运算指令的第1、第2操作数或由饱和运算指令的寄存器名字段所指示的寄存器的保持值。运算执行控制(2)就是控制运算执行部14,以便执行由运算指令所指示的运算内容,常数发生控制(9)也是控制运算执行部14,以便产生由饱和运算指令所指示的运算幅度的上限值、下限值。控制(1)及控制(2)使解码器13在解读时执行算术运算指令,控制(1)及控制(3)让解码器在解读时执行饱和运算指令。控制(2)是在解读算术运算指令时产生的,而控制(3)是在解读饱和运算指令时产生的,因此,控制(2)与控制(3)存在相互排他性的关系。
地址总线17传送由指令读出电路输出的读出目标地址。
数据总线18当RAM输出数据时,传送由RAM10输出的数据。这里所传送的数据经过控制线C1、C2,传送到寄存文件1和内部总线15。
运算执行部14的内部结构示于图7。如图7所示,运算执行部14由寄存文件1、算术运算电路2、饱和运算修正电路3、锁存电路4、锁存电路5、锁存电路6、锁存电路7、内部总线15及内部总线16构成。虽然在这些构成部件与解码器13之间布满了用于控制(1)、(2)、(3)的控制信号线,但为了简化而省略图示。
寄存文件1具有三只32位幅度的数据寄存器D0~D2。在寄出器输出控制(1)中,若用解码器13指示一个或二个寄存器名,寄存文件1则输出所提供的寄存器名的寄存器的保持值。另外,寄存文件1通过总线C1保持数据总线18上所传送的值。
第1内部总线15传送由寄存文件1输出的寄存器的保持值。
第2内部总线16,加上寄存文件1中的寄存器的保持值,通过总线C2,传送由算术运算电路2输出的数据。
锁存电路4锁存由内部总线15所传送的寄存文件1的保持值。
锁存电路5锁存由内部总线16所传送的寄存文件1的保持值及从RQM10读出的保持值。
锁存电路6锁存由算术运算电路2输出的运算结果,并经数据总线输出。
锁存电路7锁存由饱和运算修正电路3输出的值,并经数据总线输出。
算术运算电路2由32位幅度的全加器、乘法器、桶形移相器等构成,解码器13受运算执行控制(2)进行运算。此处的算术运算电路2的输入端与锁存电路4、锁存电路5的输出端连接,基于运算执行控制(2),以由锁存电路4所锁存的寄存器的保持值和由锁存电路5锁存的寄存器的保持值为对象而进行运算。
由于算术运算电路2的输出端与锁存电路6的输入端相连接,由运算执行控制(2)的运算结果,其输出同时被锁存电路6锁存,而输出到数据总线。
例如,当根据解码器13的运算执行控制的运算内容是加法时,算术运算电路2将由锁存电路4锁存值与锁存电路5锁存值相加,将相加结果输出。另外,当由于解码器13的运算执行控制的运算内容是减法时,算术运算电路2将由锁存电路4锁存的值与锁存电路5锁存的值相减,将相减结果输出。
饱和运算修正电路3基于通过解码器13的常数发生控制(3)进行饱和运算。此处由于饱和运算修正电路3的输入端与锁存电路5的输出端相连接,基于常数发生控制(3)的运算结果,与其输出同时被锁存电路7锁存,并输出到数据总线(还有,虽未图示,在饱和运算修正电路3的输出目的地具备响应SAT16、SAT24的控制,收入饱和运算修正电路3的输出值的缓冲器)。
此时应该注意,与算术运算电路2通过锁存电路4、锁存电路5、锁存电路6与寄存文件1及数据总线相连接不同,饱和运算修正电路3之特点是通过锁存电路5、锁存电路7与寄存文件1及数据总线相连接的。这意味着,算术运算电路2及饱和运算修正电路3是分别并列连接在寄存文件1与数据总线之间的(这种并列连接的算术运算电路2及饱和运算修正电路3响应于“ADD”、“SUB”、“MUL”、SAT等指令内容(特别被称为操作内容),可以被看成是一个起动的块,因此以图来表现该操作块)。可是寄存文件—数据总线间的路径一般被称最短路径,但在本处理器的结构中,该最短路径中算术运算电路2、饱和运算修正电路3变为并列连接。
算术运算电路2、饱和运算修正电路3之所以是这样的并列设置,是因为控制(2)与控制(3)的排他性关系,在算术运算电路2起动期间,无须起动饱和运算修正电路3,同样,在饱和运算修正电路3起动期间,也无须起动算术运算电路2。饱和运算修正电路3的内部结构示于图8。如图8所示,饱和运算修正电路3由常数发生电路21、比较器22、比较器23及多路转换器24构成。在这些构成部件中,虽然连接有解码器的控制线,因它使图示变得复杂,而被省略了。
常数发生电路21产生运算幅度的上限值、下限值。这里的运算幅度,就是在常数发生控制(3)中由“SAT16 D0”、“SAT24 D0”的运算幅字段指示的运算幅度,由解码器13提供的。具体地讲,当解码器13的解读结果为“SAT16 D0”时,作为16位运算的上限值,产生32位带符号的整数0×00007FFF, 将它输出到比较器22及多路转换器24。与其同时,产生32位带符号的整数0×FFFF8000作为16位运算的下限值,并将它输出到比较23及多路转换器24。
在解读结果为“SAT24 D0”的情况下,产生0×007FFFFF作为24位运算的上限值,将它输出给比较器22。另外产生0×FF800000作为24位运算的下限值,并将它输出给比较器23。
比较器22将锁存电路5所锁存的值与常数发生电路21所产生的上限值做比较。从锁存的值减去常数发生电路21所产生的上限值,通过检测相减的结果是否产生进位或退位而完成此比较。通过对进位/退位的检测,当判断为锁存的值超过上限值时,向多路转换器24输出逻辑值“1”。当判断为锁存的值等于或小于上限值时,则向多路转换器24输出逻辑值“0”。
比较器23对锁存电路5所锁存的值与常数发生电路21所产生的下限值做比较。从锁存的值减去常数发生电路21所产生的上限值,通过检测相减的结果是否产生进位或退位而完成比较。通过对进位/退位的检测,当锁存的值超过下限值时,向多路转换器24输出逻辑值“0”。当锁存的值等于或小于下限值时,向多路转换器24输出逻辑值“1”。
多路转换器24,响应于比较器22、比较器23所输出的逻辑值的组合,选择输出常数发生电路21所产生的上限值、下限值和锁存电路5所锁存的寄存文件1的保持值中的一个值。
这里,当以比较器22输出的逻辑值为逻辑值x,以比较顺23输出的逻辑值为逻辑值y时,这些逻辑值的组合与多路转换器24的输出值的对应关系如图9的真值表所示。
依照图9,在比较器22的输出是“0”,比较器23的输出是“0”的情况下,多路转换器24输出锁存电路5所锁存的值(运算结果)。
依照图9,当比较器22的输出为“1”,比较器23的输出为“0”时,多路转换器24输出常数发生电路21所产生的上限值。一旦多路转换器24实行这种输出控制,仅在饱和的情况下才将在寄存文件1中保持的运算结果改写为修正值。
现在说明如上所述结构情况的运算执行部14的操作。
运算结果为饱和情况的操作
ROM11所存储的指令串的并行是“ADD D0,D1”-“SAT16 D0”的并行,它通过数据总线,借助于指令读出电路12,作为被解码器13所读出的(指令)。再有认为在寄存文件1中,在寄存器D0,D1中保持着D0=0×00001234,D1=0×00007654。
在定时T1,由解码器13解读“ADD D0,D1”,并把寄存器D0及寄存器D1的值输出给寄存文件。这些值分别由锁存电路4及锁存电路5进行锁存。经这样锁存后,将寄存器D0的值0×00001234和寄存器D1的值0×00007654用算术运算电路2进行相加,在时刻T2,相加结果0×00008888被锁存电路5、锁存电路6锁存。将锁存电路6锁存的值输出给数据总线,通过图7所示的路径C1,传送到寄存文件1,存入寄存器D1的区域。
因此,在时刻T2,变为把相加结果存入寄存文件1。将寄存器D0,D1的保持值、相加结果各自以十进制表示,则寄存器D0的值“0×00001234”表示为“4660”,寄存器D1的值“0×00007654”表示为“30292”。相加结果“0×00008888”表示为“-2184”。
经这些考虑后,当处于在定时T2将相加结果存入寄存文件1的状态时,规定由本处理器执行所谓的“4660+30292=-2184的计算。因为“4660+3292=+34952”,规定把偏离逻辑值的计算结果存入寄存文件1。
在定时T2,经对“SAT16 D0”的解读,常数发生电路21产生前述上限值0×00007FFF及前述下限值0×FFFF8000。比较器22将锁存电路5锁存的运算结果0×00008888与16位饱和运算指令所指示的16位运算幅度的上限值0×00007FFF做比较,比较器23将锁存电路5锁存的运算结果0×00008888与16位饱和运算指令所指示的下限值0×FFFF8000做比较。
由于运算结果0×00008888大于前述上限值0×00007FFF,作为多路转换器24的输出而选择输出前述上限值0×00007FFF。该输出被锁存电路7锁存,输出给数据总线。输出的值经路径C1传送给寄存文件1。经此传送,把存储于寄存文件1内的寄存器D1的运算结果0×00008888写入上限值0×00007FFF。“上限值0×00007FFF”若以十进制表示,是“+32767”,与正确的计算结果“34952”相比,存在着误差,与所存贮的“-2184”相比更不容易接近它的理论值。
运算结果为不饱和情况下的操作
ROM11所存储的指令串的并行是“ADD D0,D1”-“SAT16 D0”,通过解读器,借助于指令读出电路12作为由解码器13读出的(指令)。再有,寄存文件1的寄存器D0,D1的保持值是D0=0×00000234,D1=0×00007654。
在定时T1,经解码器13解读“ADD D0,D1”,向寄存文件1输出寄存器D0及寄存器D1的值。这些值分别由锁存电路4及锁存电路5锁存。经这样锁存后,算术运算电路2对寄存器D0的值0×00000234和寄存器D1的值0×00007654进行相加,由锁存电路5、6来锁存相加结果。
在定时T3,由锁存电路6锁存其相加结果,输出给数据总线。输出给数据总线的结果,经路径C1,传送给寄存文件1。因此,规定在定时T2把相加结果存入寄存文件1。
在定时T3解读“SAT16 D0”后,由常数发生电路产生前述上限值0×00007FFF和下限值0×FFFF8000。比较器22对锁存电路5锁存的运算结果0×00007888和16位饱和运算指令所指示的上限值0×00007FFF做比较,比较器23对锁存电路5锁存的运算结果0×00007888和16位饱和运算指令所指示的下限值0×FFFF8000做比较。
当判断运算结果0×00007888小于前述上限值0×00007FFF,而大于前述下限值0×FFFF8000时,多路转换器24把锁存电路5锁存的运算结果输出给数据总线。
根据以上这种实施方案,由于算术运算电路2没有连接在饱和运算修正电路3与寄存器之间,对于饱和运算处理不会延迟至把运算结果存入寄存器的时间。由于算术运算电路2-饱和运算修正电路3是并列连接在最短路径中,则大致上可以由算术运算电路2进行运算至把其结果保持在寄存器的时间t3和饱和运算修正电路3进行运算至把其结果保持在寄存器的时间t4中较长的一个时间决定时钟信号的周期。因此,基于时间t3、时间t4的较长的一个时间可以决定时钟信号的周期,因此不会因装配了饱和运算修正电路3而牺牲处理器的速度。
另外,对寄存器、数据总线而言,由于算术运算电路2及饱和运算修正电路3是并列连接的,可使控制算术运算电路2的指令与控制饱和运算修正电路3的指令相互独立。
由于饱和运算指令与运算指令是独立的,扩展到饱和运算功能的运算指令与为每种运算指令重新定义的情况相比,指令数可大幅度削减。
再有,虽然在本实施方案中进行了在16位幅度与24位幅度的2种位幅度的整数化,但上限值、下限值可以在上限值大于下限值的范围内取任意整数值。
另外,在本实施方案中,虽把上限值、下限值及饱和运算指令的第1操作数与前述上限值下限值的比较用带符号的整数表示,但也可以各自无符号的整数来表示。例如,把饱和的上限值用无符号的32位整数0×0000FFFF表示,把饱和的下限值用无符号的32位整数0×00000000表示,对前述第1操作数进行无符号的比较,以同样的方法,可以实现饱和运算。对其他位幅度也是同样的。
另外,在本实施方案中,指令2的操作数虽是一个,但把指令2的操作数做成第1操作数D1和第2操作数D2两个,设法把前述修正结果存储在前述第2操作数也是可以的。
第2实施方案
第2实施方案中的处理器的内部状态示于图14。在图14中,第2实施方案中的处理器由RAM10、指令读出电路12、ROM91、解码器93以及运算执行部94构成,分别将ROM11置换为ROM91,将解码器13置换为解码器93,将运算执行部14置换成运算执行部94。
这里,ROM91与ROM11的不同之处是存储包含可以指定32位长的运算幅度的饱和运算指令。即将在运算幅度字段中记述为“00”的16位运算幅度的指定与运算幅度字段中记述为“01”的24位运算幅度的指定相加,借助于在运算幅度字段中记述为“10”,可指定32位的运算幅度。
解码器93之与解码器13不同之处是在常数发生控制(3)中,使16位幅度的常数发生、24位幅度的常数发生的指示相加,在饱和运算指令的运算幅度字段中指定32位幅度的情况下,控制饱和运算修正电路63,以产生32位幅度的常数。
运算执行部94的内部结构示于图15。如图15所示,运算执行部94由寄存文件1、锁存电路4、5、6、7、算术运算电路62、饱和运算修正电路63、状态寄存9、内部总线15、内部总线16构成。其中与图7标有同一标号寄存文件1、锁存电路4、5、6、7、内部总线15、内部总线16与实施方案1的对应单元具有相同的结构。
算术运算电路62,除其内部结构中具有状态监视电路8之外,它与算术运算电路2具有相同结构。状态监视电路8是用监视算术运算电路2所进行的运算的内藏电路。在由状态监视电路8监视的项目中,与实施方案2有深刻关系的是溢出的监视(1)、进位的监视(2)、符号位的监视(3)。
溢出监视(1)就是监视是否发生自最高位位的溢出。在这里所说的最高位中,存在三种最高位,即32位运算中的最高位,24位运算中的最高位,16位运算中的最高位。
进位监视(2)就是监视是否发生向最高位的进位。符号监视(3)就是监视在运算结果中,最高位是否发生了符号反转。
状态寄存器9是表示每种在运算幅宽有无发生溢出、进位、符号反转,表示处理器的中断屏蔽电平、是否允许接受键中断的寄存器,其内部结构示于图16。如图16所示,状态寄存器9由V标志位、C标志位、N标志位、Z标志位、VX标志位、CX标志位、NX标志位、ZX标志位、VY标志位、CY标志位、NY标志位、ZY标志位、IM2标志位、IM1标志位、IMO标志位、IE标志位构成。
V标志位是表示在32位幅度中运算结果是否发生溢出的标志。
C标志位是表示在运算结果的第31位是否发生进位的标志。
N标志位是表示在32位的运算幅度中运算结果的符号是正号还是负号的标志。
VX标志位是表示在24位的运算幅度中运算结果是否发生溢出的标志。
CX标志位是表示在运算结果的第23位是否发生进位的标志。
NX标志位是表示在24位的运算幅度中运算结果的符号是正号还是负号的标志。
VY标志位是表示在16位的运算幅度中运算结果是否发生溢出的标志。
CY标志位是表示在运算结果的第15位是否发生进位的标志。
NY标志位是表示在16位的运算幅度中运算结果的符号是正号还是负号。
IM2-0标志位是表示处理器的中断屏蔽电平的标志(InterruputMask Flag)。
IE标志位是表示是否允许接受键中断的标志(InterruputEnable)。
饱和运算修正电路63与算术运算电路62并列连接于寄存文件1和数据总线之间的路径这一点上是与第1实施方案中的饱和运算修正电路3相同的,其内部结构是如图17所示那样构成。如图17所示,饱和运算修正电路63由常数发生电路81、82、83、多路转换路85、86、87构成。
常数发生电路81,在常数发生控制(3)中,一旦进行32位的运算幅宽的指定,就产生其上限值、下限值。32位运算的运算幅度的上限是32位的带符号的整数的上限值0×7FFFFFFF、下限值0×80000000,因此常数发生电路81在指定32位的运算幅度时,就产生这些上限值、下限值。
常数发生电路82,在常数发生控制(2)中,一进行24位的运算幅度的指定,就产生其上限值、下限值。24位运算的运算幅度的上限值是带符号的24位的整数的上限值0×007FFFFF,下限值0×00800000,因此常数发生电路82在指定24位的运算幅度时,就产生这些上限值、下限值。
常数发生电路83,在常数发生控制(3)中,一进行16位的运算幅度的指定,就产生其上限值、下限值。16位运算的运算幅度的上限值是带符号的16位的整数的上限值0×00007FFF,下限值0×00008000,因此常数发生电路83在指定16位的运算幅宽时,就产生这些上限值、下限值。
多路转换器85,根据V标志、N标志的设定值的组合,选择输出常数发生电路61所产生的3 2位带符号的整数的上限值0×7FFFFFFF、下限值0×80000000、由锁存电路5所锁存的寄存文件1的保持值之中的一个值。
这里,V标志、N标志的组合与由多路转换器85输出值的对应关系如图18的真值表所表示。
若依图18,在V标志的设定值为“1”,N标志的设定值为“0”的情况下,多路转换器85输出常数发生电路81所产生的上限值。
在V标志的设定值为“1”,N标志的设定值为“1”时,多路转换器85输出锁存电路81所产生的下限值。
再有,当V标志的设定值为“0”,N标志的设定值为“0”或“1”时,多路转换器85输出由锁存电路5锁存的运算结果。
多路转换器86,根据VX标志、NX的设定值的组合,选择输出常数发生电路61产生的32位带符号的整数的上限值0×007FFFFF,下限值0×00800000、由锁存电路5锁存的寄存文件1的保持值之中的一个值。
多路转换器87,根据VY标志,NY标志的设定值的组合,选择输出常数发生电路61产生的32位带符号的整数的上限值0×00007FFF、下限值0×00008000、由锁存电路5锁存的寄存文件1的保持值中的一个值。
一旦使处理器有以上的结构,监视溢出的发生、符号位的正负反转等、算术运算电路62中的运算时的内部状态的变化,基于这些可以实现饱和运算。
若这样的实施方案,由与算术运算电路62并列连接的饱和运算修正电路63进行饱和运算,由于算术电路62未连接在饱和运算修正电路63的输出与寄存器之间,不会由于饱和运算处理而延迟将运算结果存储至寄存器的时间。由于算术运算电路62-饱和运算修正电路63在最短路径中是并列连接的,时钟信号的周期大致可以由算术运算电路62进行运算至将其结果保持于寄存器的时间t3和饱和运算修正电路63进行运算至将其结果保持在寄存器的时间t4中的较长的那个时间决定。因此,由于时钟信号周期可以由时间t3、t4中较长的那个时间决定,由于设置了饱和判断电路73不会牺牲处理器的速度。
另外,在本实施方案中,检测向运算结果的最高位的溢出而生成V位,对运算结果的任意一位进行溢出检测,也可由饱和的上限值、下限值决定与其对应的值。
例如,若检测溢出在运算结果的最低位起的第16位,则设饱和的上限值为32位带符号的整数0×00007FFF,设下限值为32位带符号的整数0×FFFF8000,也可以按同样的方法实现16位的饱和运算。
而且,设该指令为SAT16,即使同时具备由本实施例所示的SAT32指令,至多可具备两条指令,同已有的具备与运算指令数的乘积数的指令情况相比,可以大幅度削减指令种类。
另外,虽然本实施方案中以带符号的整数表示饱和的上限值、下限值,也可以用无符号的整数代表。例如,从运算结果的最高位产生进位时,算术运算电路,把C位置位而输出,在未引起进位时,把C位复位而输出。
在运算为加法指令时,把A位置位而输出,运算为减法指令时,把A位复位而输出。
状态寄存器9分别把C位和A位的状态作为C标志、A标志而保持。
饱和的上限值由32位无符号的整数0×FFFFFFFF表示,饱和的下限值以32位无符号的整数0×00000000代表,在C标志被置位,A标志被置位的情况下,多路转换器选择前述上限值。
当C标志被置位,A标志被复位时,选择前述下限值,当C标志复位时,不管A标志状态如何,选择前述第1操作数输出,这样就可按相同方法实现饱和运算。
另外,在本实施方案中饱和运算指令的操作数虽是一个,将饱和运算指令的操作数由第1操作数D1和第2操作数D2代表,将前述修正结果存储于前述第2操作数也成。