下面结合附图详细说明本发明中处理器的实施例。在本说明书中,“指令”的含义是本处理器能够同时并列译码和执行的全部代码,“操作”的含义是用于指定本处理器能够并列执行的数字运算、逻辑运算、传送和分支等处理单元或其他处理单元的代码。
(实施例1)
作为实现上述第一目的的处理器,实施例1中的处理器的特征在于具有通过将分开设置在多个指令中的常量的各个部分累积到专用寄存器中并同时进行存储,使其还原成原来的1个常量的功能。
(指令格式)
首先,说明本处理器执行译码的指令结构。
本处理器是采用VLIW体系结构的处理器(以下称“VLIW处理器”),对32位定长指令进行译码并执行之。
图2(a)表示本发明相关的处理器所执行的指令50的字段构成。图2(b)到图2(d)表示16种指令格式。图2(b)表示能够同时指定3种操作的指令格式,图2(c)表示能够同时指定2种操作的指令格式,图2(d)表示能够同时指定1种操作的指令格式。
这个指令50的长度为32位,由8个4位字段(从高位起,P0.0字段51、P1.0字段、…、P3.2字段58)构成。而且,将P2.0字段53-P2.2字段55作为一组总称为第一运算字段59,将P3.0字段56-P3.2字段58作为一组总称为第一运算字段60。
在图2(b)-图2(d)中,“const”为常量,根据利用的操作类型而表示立即数、绝对地址、位移量等数字常量和字符常量。“op”表示用于指定操作类型的操作码,“Rs”表示作为源操作数的寄存器,“Rd”表示作为目的操作数的寄存器,“cc”表示用于指定将本处理器具备的专用32位寄存器(图4所示的常量寄存器36)的存储值作为分支目的地的绝对地址或相对地址(位移量)的分支操作的操作码。
而且,这些代码后面附加的数字表示第一运算字段59及第二运算字段60的哪种操作被使用。例如,如果是格式码为“6”的指令格式下,则将设置在P1.0字段52中的4位常量“const1”与设置在P2.1字段54中的4位常量“const2”结合在一起,作为8位常量,表示对应于第一运算字段59的操作码“op1”的源操作数。
后面没有附加数字的常量“const”表示被存储在本处理器具备的专用32位寄存器(图4所示的常量寄存器36)中的常量。例如,设置在格式码为“0”的指令格式中的P1.0字段52中的4位常量“const”是被隐含指定的常量寄存器36中所存储的常量。
图3说明由图2所使用的3种操作码“cc”、“op1”及“op2”分别指定的具体操作。
4位操作码“cc”指定16种分支操作中的一种。每一种分支操作由分支条件和分支形式决定。分支条件包括等于(“eq”)、不等于(“neq”)、大于(“gt”)等。分支形式包括将上述常量寄存器36的存储值作为分支目的地的绝对地址的分支形式(在助记符后没有附加“i”)和将其作为分支目的地的相对地址的分支形式(在助记符后附加有“i”)。例如,操作码“eq”表示在以前的比较结果相等时进行取决于绝对地址指定的操作,操作码“eqi”表示在以前的比较结果相等时进行取决于相对地址指定的操作。
4位操作码“op1”包括指定属于“add”(加法运算)、“sub”(减法运算)、“mul”(乘法运算)、“and”(逻辑积)、“or”(逻辑和)等算术逻辑运算中的一种操作的情况和指定属于“mov”(字(32位)数据传送)、“movh”(半字数据的传送)、“movb”(字节数据的传送)等寄存器与寄存器之间传送中的一种操作的情况。
4位操作码“op2”除了与上述操作码“op1”相同的算术逻辑运算及寄存器与寄存器间传送的情况之外,还包括指定属于“1d”(从存储器向寄存器装入一个字数据)、“st”(从寄存器向存储器存储字数据)等寄存器与存储器间传送中的一种操作的情况。
下面,说明图2(a)中所示的各个字段51、52、59、60的特征。
P0.0字段51是用于设置规定此指令50的格式的42位格式码的字段,具体地说,就是规定图2(b)-图2(d)所示的16种指令格式中的一种。
P1.0字段52是用于设置常量或分支用操作码的字段。
常量被设置在这个P1.0字段52中的情形(格式码=0,1,4-9的情况)包括该常量作为常量寄存器36中的存储对象的情形(格式码=0,1,4,5)和该常量构成第一运算字段59或第二运算字段60的操作码的一部分的情形(格式码=5,7,8,9,B)。而且,在作为常量寄存器36中存储的对象的情形下,又包括只有这4位常量被存储的情形(格式码=0,1)和第一运算字段59或第二运算字段60中设置的12位常量被同时存储的情形(格式码=4,5)。
另一方面,在将分支用的操作码“cc”设置在这个P1.0字段52中的情形(格式码=2,3,A)中,意味着将存储在常量寄存器36中的常量作为分支目的地的绝对地址或相对地址(位移量)来进行分支。
第一运算字段59设置用于指定与本处理器和外部(存储器)的数据传送无关的操作(算术逻辑运算、寄存器间的数据传送)的操作码组(源操作码和目的操作码)或常量。
第二运算字段60除了上述第一运算字段59的功能外,还设置用于指定伴随于本处理器和外部(存储器)的数据传送的操作(寄存器与存储器间的数据传送)的操作码组。
并且,在本诺曼处理器中不需要同时执行两种以上分支操作和本处理器与外部存储器的操作数输入输出端口(图4中的操作数存取部件40)被限定为1个的基础上,对上述不同种类操作的各个字段进行分配。
这里,图2(b)-图2(d)所示的指令格式具有以下特征。
第一,由常量“const”可知,常量被存储在常量寄存器36中的指令格式有以下3种形式。
(1)格式码为“0”或“1”的情形:
通过此指令,P1.0字段52中设置的4位常量被存储在常量寄存器36中。
(2)格式码为“4”的情形:
通过此指令,P1.0字段52-P2.2字段55中设置的16位常量被存储在常量寄存器36中。
(3)格式码为“5”的情形:
通过此指令,P1.0字段52和P3.0字段56-P3.2字段58中设置的16位常量被存储在常量寄存器36中。
第二,本处理器能够在一个指令中最多指定3种操作,但在该场合下,从图2(b)所示的3种操作所使用的指令格式可知,这3种操作为如下组合中的任一种。
(1)将4位常量设置在常量寄存器36中的操作与两种通用操作(格式码为“0”,“1”)的组合
(2)将常量寄存器36中的设置值作为绝对地址或相对地址来进行分支的操作与两种通用操作(格式码为“2”,“3”)的组合
由此,虽然本处理器的指令只有32位,但具有能够最多同时指定3种操作的、高编码效率的字段结构。
(处理器的硬件结构)
下面说明本处理器的硬件结构。
图4是依据实施例1的处理器硬件结构的方框图。
如上所述,本处理器为最多能并列执行三种操作的VLIW处理器,顺序由指令寄存器10、译码部件20和执行部件30构成。
指令寄存器10是用于保存从指令读取部件39发送的一个指令的32位寄存器。
译码部件20用于对保存在指令寄存器10中的指令进行译码并将对应于该译码结果的控制总线输出到执行部件30,顺序由格式译码器21和指令译码器22构成。
指令译码器22又由用于对保存在P1.0字段12中的操作码“cc”进行译码并根据译码结果控制PC部件33的分支译码器23、用于对保存在P2.0字段13中的操作码进行译码并根据译码结果控制第一运算部件37的第一运算译码器24及用于对保存在P3.0字段16中的操作码进行译码并根据译码结果控制第二运算部件38和操作数存取部件40的第二运算译码器25构成。
通过对保存在P0.0字段11中的4位格式码进行译码,格式泽码器21指定保存在指令寄存器10中的指令格式为图2(b)-图2(d)所示的16种中的哪一种,根据该结果允许或禁止分支译码器23、第一运算译码器24和第二运算译码器25的译码操作并对执行部件30的常量寄存器控制部件32进行操作。
上述译码器21、23-25基本上在一个时钟周期内对一种操作进行译码并将控制信号提供给执行部件。连接指令寄存器10和执行部件30的26位常量信号线26是用于将设置在指令寄存器10中的常量和操作数传送到执行部件30的总线。
执行部件30是根据译码部件20的译码结果并列执行最多三种操作的电路单元,由执行控制部件31、PC部件33、寄存器组34、第一运算部件37、第二运算部件38、指令读取部件39及操作数存取部件40构成。关于该执行部件30中的常量寄存器控制部件32、PC部件33及常量寄存器36,在其它的附图中示出其具体结构。
执行控制部件31是根据译码部件20的执行结果控制执行部件30的各个组成部分33-40的控制电路和配线的总称,除常规处理器具备的构成部件(定时控制、操作许可禁止控制、状态管理、插入控制等电路)之外还具有本处理器中特有的常量寄存器控制部件32。常量寄存器控制部件32根据格式译码器21的指示,进行将保存在指令寄存器10中的4位或16位常量(const)存入常量寄存器36中的控制。
在分支译码器23的控制下,PC(程序计数器)部件33将存有下面应执行译码指令的外部存储器(图中未示)上的地址输出到指令读取部件39中。
指令读取部件39通过32位IA(指令地址)总线及32位ID(指令数据)总线,从图中未示的外部存储器中取出指令块,并在将其存入内部指令高速缓冲存储器的同时,将与PC部件33输出的地址相对应的指令提供给指令寄存器10。
寄存器组34由15个32位通用寄存器35和1个32位常量寄存器36构成。根据第一运算译码器24及第二运算译码器25的译码结果,被存储在这16个寄存器35、36中的值被传送到第一运算部件37及第二运算部件38中执行运算,或在通过第一运算部件37及第二运算部件38之后被传送到寄存器组34或操作数存取部件40中。另外,存在常量寄存器36中的值除了用于第一运算部件37及第二运算部件38的运算之外,还被传送到PC部件33中用于生成作为分支目的地的有效地址。
第一运算部件37内部具有对2个32位数据执行算术逻辑运算的ALU和执行乘法运算的乘法器,并在第一运算译码器24的控制下执行2种操作(算术逻辑运算和寄存器间的传送)。
与第一运算部件37相同,第二运算部件38内部也具有对2个32位数据执行算术逻辑运算的ALU和执行乘法运算的乘法器,并在第二运算译码器25的控制下执行2种操作(算术逻辑运算和寄存器间的传送)。
操作数存取部件40是用于在第二运算译码器的控制下,在寄存器组34和图中未示的外部存储器之间传送操作数的电路,其内部包括用于存储该操作数和操作数地址的缓冲器。具体地说,例如,在操作数“1d”被设置在指令寄存器10的P3.1字段16中的情况下,置于外部存储器中的1个字数据经过操作数存取部件40而被装入寄存器组34中的任一寄存器中,而在操作数“st”被设置的情况下,寄存器组34中的任一寄存器的存储值被存入外部存储器中。
如图所示,上述PC部件33、寄存器组34、第一运算部件37、第二运算部件38及操作数存取部件40通过内部总线(L1总线、R1总线、L2总线、R2总线、D1总线、D2总线)相连接。L1总线及R1总线分别被连接到第一运算部件37的2个输入端口,L2总线及R2总线分别被连接到第二运算部件38的2个输入端口,D1总线及D2总线分别被连接到第一运算部件37和第二运算部件38的输出端口。
(常量寄存器36及其外围电路的具体结构)
下面,详细说明常量寄存器36及其外围电路。
图5是表示常量寄存器36及其外围电路具体结构和连接关系的方框图。图中的固定值(“0”)27意味着表示常量“0”的4条信号线的固定连接。
常量寄存器控制部件32由5个3输入选择器32a-32e和3个4输入选择器32f-32h构成,常量寄存器36由8个4位寄存器36a-36h构成。而且,每个输入输出数据为并列4位数据。
常量寄存器控制部件32通过依据来自格式译码器21及指令译码器22的控制信号控制上述4个输入选择器32a-32h,利用如下所示的4种存储方法之一将保存在指令寄存器10中的常量或零存入常量寄存器36中。
图6(a)-图6(d)说明了4种存储方法。
图6(a)示出了保存在P0.0字段11中的值为“0”或“1”并由格式译码器21进行译码时的存储方法。这相当于只将设置在P1.0字段12中的4位常量存入常量寄存器36中时的情形。
具体地说就是在将保存在常量寄存器36中的数据以4位为单位向高位移位的同时,将保存在指令寄存器10的P1.0字段12中的4位常量存入常量寄存器36的最低的4位寄存器36h中。
图6(b)示出了保存在P0.0字段11中的值为“4”并由格式译码器21进行译码时的存储方法。这相当于将设置在P1.0字段12-P2.2字段15中的16位常量存入常量寄存器36中时的情形。
具体地说就是在将保存在常量寄存器36的低16位36e-36h中的数据移至高16位36a-36d的同时,将保存在指令寄存器10的P1.0字段12-P2.2字段15中的16位常量存入常量寄存器36的低16位36e-36h中。
图6(c)示出了保存在P0.0字段11中的值为“4”并由格式译码器21进行译码时的存储方法。这相当于将设置在P1.0字段12和P3.0字段16-P3.2字段18中的16位常量存入常量寄存器36的低16位36e-36h中时的情形。
具体地说就是在将保存在常量寄存器36的低16位36e-36h中的数据移至高16位36a-36d的同时,将保存在指令寄存器10的P1.0字段12和P3.0字段16-P3.2字段18中的16位常量存入常量寄存器36的低16位36e-36h中。
图6(d)示出了保存在P0.0字段11中的值为“2”、“3”或“A”并由格式译码器21进行泽码,或在常量寄存器(R15)被指定到P2.1字段14、P2.2字段15、P3.2字段17及P3.3字段18中的至少一个且由指令译码器22进行译码时的存储方法。这相当于在由P1.0字段12中设置的分支操作、第一运算字段59及第二运算字段60中的至少一种操作使用(读出)常量寄存器36的存储值之后,使常量寄存器36中全为零(常量寄存器36清零)时的情形。
具体地说就是在常量寄存器36的存储值被读到PC部件33、第一运算部件37及第二运算部件38中的任一个之后,在常量寄存器36的32位中都存入常数“0”。
在使用常量寄存器36之后将其清零,是为了保证在常量寄存器36中经常存入经零扩展的值。这里所谓的零扩展就是在具有的数值的有效位数不满足规定的位数时,用零覆盖高于该有效位的全部位的处理。
如上所述,在指令寄存器10的P0.0字段11中的值为“0”、“1”、“4”、“5”时,一边对已经存在常量寄存器36中的常量移位,一边将新的常量存入常量寄存器36中。而且,一旦常量寄存器36的存储值被读出使用,则其内容就被消除。据此,常量寄存器36能够接连不断地累积存入的常量直到其内容被读出时为止。
(PC部件33的具体结构)
下面说明PC部件33的具体结构。
图7示出了PC部件33的具体结构的方框图。
PC部件33由作为表示常数“4”的固定配线的固定值(“4”)33a、2输入选择器33b、加法器33c、用于保存下一执行译码的指令地址的PC33d及4输入选择器33e构成。
利用此PC部件33,通过选择器33b、33e在来自译码部件20的控制信号的控制下的操作,将以下3种值之一作为有效地址从选择器33e输出到指令读取部件39中。
(1)PC33d的内容相加“4”后的值
这相当于没有分支顺序执行时,即在译码执行的指令中没有指定分支操作时的情形。在一个指令的长度为4字节(32位)的基础上与“4”相加。
(2)常量寄存器36的内容与PC33d的内容相加后的值
这相当于在将常量寄存器36的内容作为相对地址进行分支时,例如,在由P1.0字段12指定根据相对地址的分支时由分支译码器23进行译码的情形。
(3)常量寄存器36的内容
这相当于在将常量寄存器36的内容作为绝对地址进行分支时,例如,在由P1.0字段12指定根据绝对地址的分支时由分支译码器23进行译码的情形。
如上所述,由于PC部件33在构成上包括专用加法器33c并可直接利用保存在常量寄存器36中的值,所以第一运算部件37及第二运算部件38的运算能够独立并行,且能够进行对将常量寄存器36的存储值作为绝对地址或相对地址的分支的执行控制。
(处理器的操作)
下面说明译码执行具体指令时本处理器的操作。
图8是表示32为常量的处理示例的流程图。
在本图中,示出了这样的处理:求出寄存器R0与R1的存储值之差(步骤S80),将该结果与寄存器R2的存储值相乘(步骤S81),再将该结果与32位常量“0x87654321”(16进制的“87654321”)相加(步骤S82、S83),最后将寄存器R3清零(步骤S85)。
图9示出了在本处理器中进行图8所示的处理内容的程序示例。
该程序由3个指令71-73构成。1行相当于1个指令,用各字段中设置的助记符表示各个指令的内容。常量全部用16进制表示。“fmtn(n=0-F)”表示格式码“n”,“Rn(n=0-15)”表示寄存器组34中的1个寄存器。“R15”表示常量寄存器36。
图10是表示在执行图9所示的程序时本处理器的操作的时序图。
本图中示出了时钟周期、通用寄存器R0-R3及常量寄存器R15的内容、经过4条总线L1、R1、L2、R2的数据。利用上述图9和图10,说明本处理器对各指令71-73的操作。
(指令71)
在指令71被装入指令寄存器10中时,本处理器进行图10中时钟周期t0-t1所示的操作。
格式码译码器21从指令寄存器10的P0.0字段11中的值(“fmt4”)判断出这个指令为格式码为“4”的双操作指令,并控制用于并列执行以下2种操作的执行部件30。
(1)第一操作
常量寄存器控制部件32通过控制内部的8个选择器32a-32h,利用图6(b)所示的存储方法,将P1.0字段12-P2.2字段15中保存的16位常量(0x8765)存储到常量寄存器36的低16位中。其结果是,如图10中时钟周期t0-t1所示,常量寄存器R15的内容从“0x00000000”变为“0x00008765”。
(2)第二操作
第二运算部件38以通用寄存器R0的内容(“0x33333333”)和通用寄存器R1的内容(“0x22222222”)作为输入,进行减法运算,然后将该运算结果再次存入通用寄存器R0中。其结果是,如图10中时钟周期t0-t1所示,通用寄存器R0的内容从“0x33333333”变为“0x11111111”。
(指令72)
接着,在指令72被装入指令寄存器10中时,本处理器进行图10中时钟周期t1-t2所示的操作。
与上述指令71相同,格式码译码器21从指令寄存器10的P0.0字段11中的值(“fmt4”)判断出这个指令为格式码为“4”的双操作指令,并控制用于并列执行以下2种操作的执行部件30。
(1)第一操作
常量寄存器控制部件32通过控制内部的8个选择器32a-32h,利用图6(b)所示的存储方法,将P1.0字段12-P2.2字段15中保存的16位常量(0x4321)存储到常量寄存器36的低16位中。其结果是,如图10中时钟周期t1-t2所示,常量寄存器R15的内容从“0x00008765”变为“0x87654321”。
(2)第二操作
第二运算部件38以通用寄存器R2的内容(“0x00000004”)和通用寄存器R0的内容(“0x11111111”)作为输入,进行乘法运算,然后将该运算结果再次存入通用寄存器R0中。其结果是,如图10中时钟周期t1-t2所示,通用寄存器R0的内容从“0x11111111”变为“0x44444444”。
(指令73)
最后,在指令73被装入指令寄存器10中时,本处理器进行图10中时钟周期t2-t3所示的操作。
格式码译码器21从指令寄存器10的P0.0字段11中的值(“fmt7”)判断出这个指令为格式码为“7”的双操作指令,并控制用于并列执行以下2种操作的执行部件30。
(1)第一操作
第一运算部件37以常量寄存器R15的内容(“0x87654321”)和通用寄存器R0的内容(“0x44444444”)作为输入,进行加法运算,然后将该运算结果再次存入通用寄存器R0中。其结果是,如图10中时钟周期t2-t3所示,通用寄存器R0的内容从“0x44444444”变为“0xCBA98765”,常量寄存器R15的内容被清除。
(2)第二操作
第二运算部件38以分别设置在P1.0字段12和P3.1字段17中的8位常量(“0x00”)作为输入,不进行任何运算后存入通用寄存器R3中。其结果是,如图10中时钟周期t2-t3所示,通用寄存器R3的内容从“0xFEDCBA98”变为“0x00000000”。
如上所述,在本处理器中,32位常量“0x87654321”在被分开设置在2条指令71和72中并在常量寄存器36中一边顺序移位,一边被存储之后,被第3条指令73利用。由此,通过3条指令执行了图8的流程图所示的处理。
下面,利用其他处理16位常量的程序来说明本处理器的操作。
图11示出了处理16位常量的程序示例。
该程序由5个指令74-78构成。
本处理器对各指令74-78的操作如下所述。
(指令74)
在指令74被装入指令寄存器10中时,格式码译码器21从指令寄存器10的P0.0字段11中的值(“fmt0”)判断出这个指令为格式码为“0”的3操作指令,并控制用于并列执行以下3种操作的执行部件30。
(1)第一操作
常量寄存器控制部件32通过控制内部的8个选择器32a-32h,利用图6(a)所示的存储方法,将P1.0字段12中保存的4位常量(”0x8”)存储到常量寄存器36的最低4位寄存器36h中。
(2)第二操作
第一运算部件37以通用寄存器R6的值为输入,不进行任何运算后存入通用寄存器R1中。
(3)第三操作
同样地,第二运算部件38以通用寄存器R7的值为输入,不进行任何运算后存入通用寄存器R2中。
(指令75)
同样地,在指令75被装入指令寄存器10中时,格式码译码器21判断出这个指令为格式码为“0”的3操作指令,并控制用于并列执行以下3种操作的执行部件30。
(1)第一操作
常量寄存器控制部件32通过控制内部的8个选择器32a-32h,利用图6(a)所示的存储方法,将P1.0字段12中保存的4位常量(“0x7”)存储到常量寄存器36的最低4位寄存器36h中。其结果是在常量寄存器36的低8位中设置常量“0x87”。
(1)第二操作
第一运算部件37以通用寄存器R0和R1的值为输入,进行加法运算后将其结果再次存入通用寄存器R1中。
(2)第三操作
同样地,第二运算部件38以通用寄存器R0和R2的值为输入,进行加法运算后将其结果再次存入通用寄存器R2中。
(指令76、指令77)
同样地,通过执行指令76、77,常量“0x8765”被设置在常量寄存器36的低16位中。
(指令78)
在指令78被装入指令寄存器10中时,本处理器执行与图9所示的指令73相同的操作。
如上所述,在本处理器中,16位常量“0x8765”在被分开设置在4条指令74-77中并在常量寄存器36中一边顺序移位,一边被存储之后,被第5条指令78利用。
(与常规处理器的比较)
下面,说明在常规处理器中执行与上述图9及图11所示的处理器相同的内容的处理时的情况,并与实施例1的处理器进行比较。这里所谓的常规处理器就是不具有用于累积和存储分开设置的常量的装置,如依据实施例1的处理器的常量寄存器36和常量寄存器控制部件32并执行32位定长指令的处理器。
图12(a)表示常规处理器所执行的指令字段的定义,图12(b)表示该指令格式。即,常规处理器能够执行3种双操作指令101-103和1种单操作指令104。
图13是在常规处理器中进行与图9所示的程序内容相同的处理,即图8的流程图所示的处理的程序示例。
比较图13和图9可知,常规处理器所用的程序比依据实施例1的处理器所用的程序多2个指令。
而且,指令105、106中包含nop码,由于指令106利用了指令105的运算结果,所以不能并列执行这些指令。而在将1个常量“0x87654321”分成高16位和低16位两部分并设置于常量寄存器Ri中的情况下,不能在1个32位指令中同时没置设定指令的操作码和32位常数。
同样地,图14是在常规处理器中进行与图11所示的程序内容相同的处理的程序示例。
比较图14和图11可知,常规处理器所用的程序比依据实施例1的处理器所用的程序多1个指令。
如上所述,利用依据实施例1的处理器,即使16位和32位常数被分开设置在多个指令中,也可以通过在常量寄存器36中累积并存储这些常数将其还原为原来的常数,并在分支和算术运算等操作中使用。即,即使是在指令中生成的区域较小,由于能够将常量分开进行覆盖,从而与在常规处理器中执行时相比,程序的代码长度被缩小了。
(常量寄存器36的外围电路的变形例)
下面对图5所示的常量寄存器36的外围电路的几个变形例进行说明。
(第一变形例)
图15是表示依据第一变形例的常量寄存器36的外围电路的结构及其连接关系的方框图。
图5的常量寄存器控制部件32具有将常量寄存器36作为移位寄存器的功能,但与图15的常量寄存器控制部件32将常量寄存器作为并列输入寄存器的功能是不同的。具体地说,常量寄存器控制部件90和格式译码器21的连接以及常量寄存器控制部件90的构成要素与图5所示的不同。
常量寄存器控制部件90由存储位计数器91和8个8输入选择器90a-90h构成。存储位计数器91为3位计数器,以半字节(4位)为单位表示该时刻累积在常量寄存器36中的常量的有效位数。
在常量寄存器控制部件90从格式译码器21中接收表示将保存在指令寄存器10中的常量进行存储的指示时,通过参照该时刻的存储位计数器91的值,将该常量存到常量寄存器36的适当位置上,然后更新存储位计数器91。在从格式译码器21或指令译码器22中接收表示读出用于任何操作的常量寄存器36的存储值的通知时,使常量寄存器36全部为0,然后存储位计数器91清零。
具体地说,常量寄存器控制部件90在从格式译码器21接收表示P0.0字段11的值为“0”或“1”的指示时,控制选择器90a-90h以便利用对应于该时刻存储位计数器91的值为0-7、分别示于图16(a)-图16(h)的存储方法,将P1.0字段12中的1个半字节常量存入常量寄存器36中,然后存储位计数器91加1。
同样地,常量寄存器控制部件90在从格式译码器21接收表示P0.0字段11的值为“4”的指示时,控制选择器90a-90h以便利用对应于该时刻存储位计数器91的值为0-7、分别示于图17(a)-图17(h)的存储方法,将P1.0字段12-P2.2字段15中的4个半字节常量存入常量寄存器36中,然后存储位计数器91加4。
同样地,常量寄存器控制部件90在从格式译码器21接收表示P0.0字段11的值为“5”的指示时,控制选择器90a-90h以便利用对应于该时刻存储位计数器91的值为0-7、分别示于图18(a)-图18(h)的存储方法,将P1.0字段12、P3.0字段16-P3.2字段18中的4个半字节常量存入常量寄存器36中,然后存储位计数器91加4。
而且,常量寄存器控制部件90在从格式译码器21接收表示P0.0字段11的值为“2”、“3”或“A”的指示或从指令译码器22接收表示执行将常量寄存器36的存储值作为操作数的操作的指示的情况下,如图19中的常量寄存器36所示,32位的常数“0”被存入常量寄存器36中,然后存储位计数器91被清零。
如上所述,利用依据第一变形例的常量寄存器控制部件90,与上述常量寄存器控制部件32的相同之处在于,分开设置在多个指令中的常量经过在常量寄存器36中被累积和存储,还原成原来的常量。
但与上述常量寄存器控制部件32的不同之处在于,后面执行的指令中设置的常量被存入常量寄存器36的高位中。从而,为了在此变形例的处理器中执行图8中流程图所示的处理,需要在图9所示的程序中调换指令71的常数“0x8765”和指令72的常数“0x4321”。
(第二变形例)
下面说明第二变形例。
图20是表示依据第二变形例的常量寄存器36的外围电路的结构及其连接关系的方框图。
第二变形例在一边将常量寄存器36的存储值移位,一边累积新的常量这一点上,与图5所示的相同,但在存入常量寄存器36之前对常量进行符号扩展以及即使在常量寄存器36的存储值被读出之后,常量寄存器36也不清零这两点上是不相同的。
所谓符号扩展就是在具有的数值的有效位数不满足规定的位数时,将该数值的最高位看作符号位,并用与该符号位相同的逻辑值覆盖高数位的处理。
在指令寄存器10中设置的常量为常量寄存器36的存储值被读出后最先存入的值的情况下,符号扩展控制部件191控制常量寄存器控制部件190以便于在符号扩展之后将该常量存入常量寄存器36中,在非上述情况时,控制常量寄存器控制部件190以便于将未经符号扩展的该常量存入常量寄存器36中。为此,符号扩展控制部件191内部包括用于存储1位读出标记的读出标记存储部件192,并根据来自格式译码器21和指令译码器22的指示,更新读出标记存储部件192。
图21是表示读出标记存储部件192的值的变化的状态迁移图。
符号扩展控制部件191在从格式译码器21和指令译码器22接收到常量寄存器36的存储值被读出的通知时,在读出操作之后将读出标记存储部件192设为“1”,在从格式译码器21和指令译码器22接收到指令寄存器10中设置的常量被存入常量寄存器36中的通知时,在存储操作后将读出标记存储部件192设为“0”。符号扩展控制部件191在将新的常量存入常量寄存器36中时,参照读出标记存储部件192,当其值为“1”时,在进行符号扩展后将该常量存入常量寄存器36中。
在图20中,从选择器190h和190e的输出端开始分支并与其它选择器相连的信号线为相当于各自输出4位中的最高位的信号线。
图22(a)-22(f)是表示第二实施例中的常量寄存器36和读出标记存储部件192的值的变化的状态迁移图。
图22(a)表示它们在常量寄存器36中存储的常量“0x87654321”被读出后的内容,图22(b)-22(e)表示它们在4位常数”0x8”、”0x7”、”0x6”、”0x5”被顺序存储后的内容,图22(f)表示它们在图22(e)中的常量”0xFFFF8765”被读出后的内容。
由此,在本第二变形例中,通过由符号扩展控制部件191根据读出标记存储部件192来管理有无进行符号扩展的必要,分开设置在多个指令中的常量被累积和存储在常量寄存器36中,并被还原为经符号扩展的原来的常量。
(第三变形例)
下面说明第三变形例。
图23是依据第三变形例的常量寄存器36的外围电路结构及连接关系的方框图。
第三变形例与上述第二变形例相比较,在一边将常量寄存器36的存储值移位一边累积新的常量以及进行符号扩展这两点上是相同的,但在将常量存入常量寄存器36中时不进行扩展处理、在从常量寄存器36读出常量时进行扩展处理这一点上是不相同的。
与图5所示的外围电路及其连接关系相比较时,在第三变形例中没有设计用于将常量寄存器36全部存为0的结构,但添加了新的扩展控制部件291及零/符号扩展控制部件293。
除了不对常量寄存器36清零以外,常量寄存器控制部件290进行与图5所示的常量寄存器控制部件32相同的操作。
在常量寄存器36中所存储的常量被读出时,扩展控制部件291控制零/符号扩展部件293以对该常量适当地进行零扩展或符号扩展。为此,扩展控制部件291内部具有由三位计数器构成的存储位计数器292。存储位计数器292用于以半字节为单位存储累积在常量寄存器36中的常量的有效位数。扩展控制部件291在从格式译码器21接收到新的常量被存入常量寄存器36中的通知时,将该常量的位数(半字节为单位的位数)的存储位计数器292加1,在从格式译码器21或指令译码器22接收到常量寄存器36的存储值被读出的通知时将存储位数器292复位。
扩展控制部件291将用于根据指令译码器22的指示指定扩展形式(零扩展或符号扩展)的1位控制信号和用于表示存储位计数器292的值的3位控制信号输出到零/符号扩展部件293。
零/符号扩展部件293将从常量寄存器36输出的32位存储值作为输入,根据来自扩展控制部件291的扩展形式和有效位数(半字节单位的位数),进行零扩展或符号扩展。具体地说,如果由扩展控制部件291指定的扩展形式为符号扩展,则根据输入的存储值,将相当于扩展控制部件291所通知的有效位数的最高位的位逻辑值复制到高于该有效位数的全部位中并输出所得到的值,另一方面,如果扩展形式为零扩展,则输出全部高位为零的值。
例如,输入的存储值为“0x87654321”,在扩展控制部件291所通知的扩展形式为符号扩展且有效位数为4个半字节的情况下,零/符号扩展部件293输出“0x00004321”。
由此,依据本第三变形例,分开设置在多个指令中的常量通过被累积和存储在常量寄存器36中而被还原为原来的常量,并在进行零扩展或符号扩展之后被应用到分支和运算等操作中。
(第四变形例)
下面说明第四变形例。
图24是依据第四变形例的常量寄存器36的外围电路结构及连接关系的方框图。
第四变形例与图5所示的相比较,在一边将常量寄存器36的存储值移位一边累积新的常量这一点上是相同的,但在移位的方向和对常量寄存器36的存储位置上是不相同的。具体地说,在将常量寄存器36的存储值从高数位向低数位移位的同时,将指令寄存器10中设置的新的常量存入常量寄存器36的高数位。还有,在常量寄存器36的存储值被读出后对常量寄存器36清零这一点上与图5所示的相同。
比较图24和图5可知,它们的连接关系与位方向对称,所用的附图标记相同。
通过第四变形例,可以利用较少的存储次数在常量寄存器36中设置使全部低数位为零的数值。例如,在常量寄存器36被清零后设置新的32位常数“0x87650000”时,如果按照图5所示的连接,则需要存入两个16位常数“0x8765”和“0x0000”,但如果按照图24所示的连接,则只存入一个16位常数“0x8765”即可。这在设置使小数点以后全部为零的固定小数点数值的情况下非常方便。
(第五变形例)
下面说明第五变形例。
依据第五变形例的处理器与上述实施例1相比较,在一边将常量寄存器36的存储值移位一边累积新的常量这一点上是相同的,但在具有将能够连结被直接指定作为第一运算字段59的源操作数的常量和已经存入常量寄存器36中的常量而生成的新的32位常量作为第一运算字段59的实际源操作数,并将其提供给第一运算部件37的功能上不同。
下面具体说明与上述实施例1的不同点。
图25是依据第五变形例的常量寄存器36的外围电路结构及连接关系的方框图。
读出标记存储部件28是用于存储常量寄存器36的内部状态的1位存储器,用于分析是否应对常量寄存器36清零。
图28是表示读出标记存储部件28的值的变化的状态迁移图。在常量寄存器36的存储值被读出且向常量寄存器36进行常量存储的情况下,读出标记存储部件28的值被设为“1”。在读出标记存储部件28的值为“1”的状态下,在指定存储常量的操作时,通过常量寄存器控制部件490的控制使常量寄存器36的内容在常量被设定之前被清零。然后,读出标记存储部件28的值被设为“0”。
通过留意上述读出标记存储部件28,能够在存储新的常量时判断有无清零的必要,并没有必要在使用常量寄存器36的值的时刻对常量寄存器36清零。由此,使如下所示的常量寄存器36的全部存储值的再利用成为可能。
依据本变形例的处理器针对图2所示的各种格式的指令,根据读出标记存储部件28的值执行以下不同操作。依据本变形例的处理器将读出标记存储部件28的值设为“1”并将其作为初始状态。
关于格式码(P0.0字段11的存储值)“0”:
(1)读出标记存储部件28的值为“1”时
首先,执行第一运算字段59中指定的“op1”。源操作数为“Rs1”,目标操作数为“Rd1”。
与此同时,执行第二运算字段60中指定的“op2”。源操作数为“Rs2”,目标操作数为“Rd2”。
接着,P1.0字段52中指定的“const”被存入常量寄存器36的36h,36a-36g被清零。然后,读出标记存储部件28的值设为“0”。
(2)读出标记存储部件28的值为“0”时
首先,执行第一运算字段59中指定的“op1”。源操作数为“Rs1”,目标操作数为“Rd1”。
与此同时,执行第二运算字段60中指定的“op2”。源操作数为“Rs2”,目标操作数为“Rd2”。
接着,由于常量寄存器36的36b-36h被向左移4位到36a-36g,所以P1.0字段52中指定的“const”被存入常量寄存器36的36h。读出标记存储部件28的值仍为“0”。
关于格式码“1”
(1)读出标记存储部件28的值为“1”时首先,执行第一运算字段59中指定的“op1”。目标操作数为“Rd1”,源操作数为P2.1字段54中指定的4位常量“const1”。
与此同时,执行第二运算字段60中指定的“op2”。源操作数为“Rs2”,目标操作数为“Rd2”。
接着,P1.0字段52中指定的“const”被存入常量寄存器36的36h,36a-36g被清零。然后,读出标记存储部件28的值设为“0”。
(2)读出标记存储部件28的值为“0”时
首先,执行第一运算字段59中指定的“op1”。目标操作数为“Rd1”,源操作数为连接常量寄存器36的36b-36h和P2.1字段54中指定的4位常量“const1”而成的32位常量。由于常量寄存器36的内容被读出,故读出标记存储部件28的值设为“1”。
与此同时,执行第二运算字段60中指定的“op2”。源操作数为“Rs2”,目标操作数为“Rd2”。
接着,由于此时读出标记存储部件28的值为“1”,所以P1.0字段52中指定的“const”被存入常量寄存器36的36h,36a-36g被清零。然后,读出标记存储部件28的值没为“0”。
关于格式码“2”:
(1)读出标记存储部件28的值为“1”时
首先,执行第一运算字段59中指定的“op1”。源操作数为“Rs1”,目标操作数为“Rd1”。
与此同时,执行第二运算字段60中指定的“op2”。源操作数为“Rs2”,目标操作数为“Rd2”。
接着,判断是否满足P1.0字段52中指定的“cc”操作的分支条件,如果满足,则根据PC部件33中的常量寄存器36的内容求出分支目的地的地址,并将其存入PC(程序计数器)中。
读出标记存储部件28的值仍为“1”。
(2)读出标记存储部件28的值为“0”时
首先,执行第一运算字段59中指定的“op1”。源操作数为“Rs1”,目标操作数为“Rd1”。
与此同时,执行第二运算字段60中指定的“op2”。源操作数为“Rs2”,目标操作数为“Rd2”。
接着,判断是否满足P1.0字段52中指定的“cc”操作的分支条件,如果满足,则根据PC部件33中的常量寄存器36的内容求出分支目的地的地址,并将其存入PC(程序计数器)中。
最后,读出标记存储部件28的值设为“1”。
关于格式码“3”:
(1)读出标记存储部件28的值为“1”时
首先,执行第一运算字段59中指定的“op1”。目标操作数为“Rd1”,源操作数为P2.1字段54中指定的4位常量“const1”。
与此同时,执行第二运算字段60中指定的“op2”。源操作数为“Rs2”,目标操作数为“Rd2”。
接着,判断是否满足P1.0字段52中指定的“cc”操作的分支条件,如果满足,则根据PC部件33中的常量寄存器36的内容求出分支目的地的地址,并将其存入PC(程序计数器)中。
读出标记存储部件28的值仍为“1”。
(2)读出标记存储部件28的值为“0”时
首先,执行第一运算字段59中指定的“op1”。目标操作数为“Rd1”,源操作数为P2.1字段54中指定的4位常量“const1”。
与此同时,执行第二运算字段60中指定的“op2”。源操作数为“Rs2”,目标操作数为“Rd2”。
接着,判断是否满足P1.0字段52中指定的“cc”操作的分支条件,如果满足,则根据PC部件33中的常量寄存器36的内容求出分支目的地的地址,并将其存入PC(程序计数器)中。
最后,读出标记存储部件28的值设为“1”。
关于格式码“4”:
(1)读出标记存储部件28的值为“1”时
首先,执行第二运算字段60中指定的“op2”。源操作数为“Rs2”,目标操作数为“Rd2”。
接着,将P1.0字段52-P2.2字段55中指定的16位常量“const”存入常量寄存器36的低16位36e-36h,36a-36d被清零。然后读出标记存储部件28的值为“0”。
(2)读出标记存储部件28的值为“0”时
首先,执行第二运算字段60中指定的“op2”。源操作数为“Rs2”,目标操作数为“Rd2”。
接着,由于常量寄存器36的低16位36e-36h被移位到36a-36d,所以P1.0字段52-P2.2字段55中指定的16位常量“const”被存入常量寄存器36的低16位36e-36h。读出标记存储部件28的值仍为“0”。关于格式码“5”:
(1)读出标记存储部件28的值为“1”时
首先,执行第一运算字段59中指定的“op1”。源操作数为“Rs1”,目标操作数为“Rd1”。
接着,将P1.0字段52和P3.0字段56-P3.2字段58中指定的16位常量“const”存入常量寄存器36的低16位36e-36h,36a-36d被清零。然后读出标记存储部件28的值为“0”。
(2)读出标记存储部件28的值为“0”时
首先,执行第一运算字段59中指定的“op1”。源操作数为“Rs1”,目标操作数为“Rd1”。
接着,由于常量寄存器36的低16位36e-36h被移位到36a-36d,所以P1.0字段52和P3.0字段56-P3.2字段58中指定的16位常量“const”被存入常量寄存器36的低16位36e-36h。读出标记存储部件28的值仍为“0”。关于格式码“6”:
(1)读出标记存储部件28的值为“1”时
首先,执行第一运算字段59中指定的“op1”。目标操作数为“Rd1”,源操作数为连接P1.0字段52中指定的4位常量“const1”和P2.1字段54中指定的4位常量“const1”而成的8位常量。
与此同时,执行第二运算字段60中指定的“op2”。源操作数为“Rs2”,目标操作数为“Rd2”。
(2)读出标记存储部件28的值为“0”时
首先,执行第一运算字段59中指定的“op1”。目标操作数为“Rd1”,源操作数为连接常量寄存器36的低24位36c-36h、P1.0字段52中指定的4位常量“const1”和P2.1字段54中指定的4位常量“const1”而成的32位常量。由于常量寄存器36的内容被读出,故读出标记存储部件28的值设为“1”。
与此同时,执行第二运算字段60中指定的“op2”。源操作数为“Rs2”,目标操作数为“Rd2”。
关于格式码“7”:
(1)读出标记存储部件28的值为“1”时
首先,执行第一运算字段59中指定的“op1”。源操作数为“Rs1”,目标操作数为“Rd1”。
与此同时,执行第二运算字段60中指定的“op2”。目标操作数为“Rd2”,源操作数为连接P1.0字段52中指定的4位常量“const1”和P3.1字段57中指定的4位常量“const1”而成的8位常量。
(2)读出标记存储部件28的值为“0”时
首先,执行第一运算字段59中指定的“op1”。源操作数为“Rs1”,目标操作数为“Rd1”。
与此同时,执行第二运算字段60中指定的“op2”。目标操作数为“Rd2”,源操作数为连接常量寄存器36的低24位36c-36h、P1.0字段52中指定的4位常量“const1”和P3.1字段57中指定的4位常量“const1”而成的32位常量。由于常量寄存器36的内容被读出,故读出标记存储部件28的值设为“1”。
关于格式码“8”:
(1)读出标记存储部件28的值为“1”时
首先,执行第一运算字段59中指定的“op1”。目标操作数为“Rd1”,源操作数为连接P1.0字段52中指定的4位常量“const1”和P2.1字段54中指定的4位常量“const1”而成的8位常量。
与此同时,执行第二运算字段60中指定的“op2”。目标操作数为“Rd2”,源操作数为P3.1字段57中指定的4位常量“const2”。
(2)读出标记存储部件28的值为“0”时
首先,执行第一运算字段59中指定的“op1”。目标操作数为“Rd1”,源操作数为连接常量寄存器36的低24位、P1.0字段52中指定的4位常量“const1”和P2.1字段54中指定的4位常量“const1”而成的32位常量。由于常量寄存器36的内容被读出,故读出标记存储部件28的值设为“1”。
与此同时,执行第二运算字段60中指定的“op2”。目标操作数为“Rd2”,源操作数为P3.1字段57中指定的4位常量“const2”。关于格式码“9”:
(1)读出标记存储部件28的值为“1”时
首先,执行第一运算字段59中指定的“op1”。目标操作数为“Rd1”,源操作数为P2.1字段54中指定的4位常量“const1”。
与此同时,执行第二运算字段60中指定的“op2”。目标操作数为“Rd2”,源操作数为连接P1.0字段52中指定的4位常量“const2”和P3.1字段57中指定的4位常量“const2”而成的8位常量。
(2)读出标记存储部件28的值为“0”时
首先,执行第一运算字段59中指定的“op1”。目标操作数为“Rd1”,源操作数为连接常量寄存器36的低28位36b-36h和P1.0字段52中指定的4位常量“const1”而成的32位常量。由于常量寄存器36的内容被读出,故读出标记存储部件28的值设为“1”。
与此同时,执行第二运算字段60中指定的“op2”。目标操作数为“Rd2”,源操作数为连接P1.0字段52中指定的4位常量“const2”和P3.1字段57中指定的4位常量“const2”而成的8位常量。
关于格式码“A”:
(1)读出标记存储部件28的值为“1”时
首先,执行第二运算字段60中指定的“op2”。目标操作数为“Rd1”,源操作数为连接P2.0字段53-P2.2字段55中指定的12位常量“const2”和P3.1字段57中指定的4位常量“const2”而成的16位常量。
接着,判断是否满足P1.0字段52中指定的“cc”操作的分支条件,如果满足,则根据PC部件33中的常量寄存器36的内容求出分支目的地的地址,并将其存入PC(程序计数器)中。
读出标记存储部件28的值仍为“1”。
(2)读出标记存储部件28的值为“0”时
首先,执行第二运算字段60中指定的“op2”。目标操作数为“Rd1”,源操作数为连接P2.0字段53-P2.2字段55中指定的12位常量“const2”和P3.1字段57中指定的4位常量“const2”而成的16位常量。
接着,判断是否满足P1.0字段52中指定的“cc”操作的分支条件,如果满足,则根据PC部件33中的常量寄存器36的内容求出分支目的地的地址,并将其存入PC(程序计数器)中。
最后,读出标记存储部件28的值设为“1”。
关于格式码“B”:
是只执行1种操作的指令,且无论读出标记存储部件28的值如何,都不参照常量寄存器36的内容。操作数为连接P1.0字段52-P2.2字段55中指定的16位常量“const2”和P3.1字段57-P3.2字段58中指定的8位常量“const2”而成的24位常量。
下面,对译码执行具体指令时依据本变形例的处理器的操作进行说明。
图27是一个示出了用于处理24位常量的流程图。
在本图中,示出了这样的处理过程:求出寄存器R0和R1的存储值之差(步骤S100),将24位常数“0x876543”加到该结果上(步骤S101、S102),最后将寄存器R2的存储值传送到寄存器R1中(步骤S103)。
图28是在依据本变形例的处理器中进行图27所示的处理内容的程序示例图。该程序由2个指令171、172构成。下面说明包含了指令171和172且依据本变形例的处理器的操作。
首先,以读出标记存储部件28的值为“1”为初始状态。
(指令171)
指令171被装载到指令寄存器10中时,格式译码器21根据指令寄存器10中P0.0字段11的值(“fmt4”),判断出该指令为格式码为“4”的双操作指令,并控制执行部件30以并列执行以下2种操作。
(1)第一操作
常量寄存器控制部件490通过控制其内部的8个选择器490a-490h,利用图5(c)所示的存储方法,将保存在P1.0字段12-P2.2字段15中的16位常数(0x8765)存入常量寄存器36的低16位中。常量寄存器36的高16位被清零。然后,读出标记存储部件28的值设为“0”。
(2)第二操作
第二运算部件38以通用寄存器R0的内容和通用寄存器R1的内容为输入,在从R0的内容中减去R1的内容后,将结果再次存入通用寄存器R0中。
(指令172)
指令172被装载到指令寄存器10中时,格式译码器21根据指令寄存器10中P0.0字段11的值(“fmt6”),判断出该指令为格式码为“6”的双操作指令,并控制执行部件30以并列执行以下2种操作。
(1)第一操作
P2.0字段13的操作为以常量为操作数的操作,由于读出标记存储部件28的值为“0”,所以在将连接常量寄存器36的低24位(0x008765)、P1.0字段12中指定的4位常数(0x4)和P2.1字段14中指定的4位常数(0x3)得到的值(0x00876543)与通用寄存器R0的内容相加后,该结果被再次存入通用寄存器R0中。
然后,读出标记存储部件28的值被设为“1”。
(2)第二操作
第二运算部件38以通用寄存器R2的值为输入,原样通过后存入通用寄存器R1中。
如上所述,利用常量寄存器36的存储值,通过以连接常量寄存器36和操作中所指定的常量而得到的常量为操作数,能够执行利用2个指令处理24位常量的操作。
图29是在实施例1的处理器中执行与图27所示的流程图内容相同的处理的程序示例图。由比较图29和图28可知,上述实施例1的处理器所用的程序比依据本变形例的处理器所用的程序多1个指令。如图29所示,实施例1的处理器在1个操作中只能进行对常量寄存器的值的设定或常量寄存器的存储值的利用,因此为了完成图27所示的处理,需要执行由在24位常量设定中所必需的2个指令173和174以及利用该常量的指令175合起来的3个指令173-175。其结果是,不能插入无动作操作“nop”(指令175的第二运算字段60)。
如上所述,利用依据本变形例的处理器,可以在生成由常量寄存器累积的常量和在指令操作中指定的常量构成的实质上的操作数的同时,执行利用该常量的操作。由此,与实施例1相比,减少了执行周期数。
以上根据实施例1及其5个变形例,对实现第一目的的处理器进行了说明,但并不意味着本发明仅限于这些实施例及其变形例。即
(1)作为将常量存入常量寄存器36中的位置包括从低位开始进行覆盖的方式(例如图5所示的方式)和从高位开始覆盖的方式(例如图24所示的方式)。
而且在将新的常量存入常量寄存器36中时,包括对已经存入的常量移位的方式(例如图5所示的方式)和存入到不同于不移位的位的位置上的方式(图15所示的方式)。
而且,作为常量的高数位的扩展方式,包括进行零扩展(例如图5所示的方式)和进行符号扩展的方式(例如图20所示的方式)。
而且,作为进行零扩展和符号扩展的时刻,包括在向常量寄存器36存储之前进行的方式(例如图20所示的方式)和从常量寄存器36读出之后进行的方式(例如图23所示的方式)。
而且,作为进行零扩展的具体实现方式,包括在读出常量寄存器36的存储值之后,在常量寄存器36中全部存入0的方式(例如图5所示的方式)和在存储常量和读出常量时插入定值“0”的方式(例如图23所示的方式)。
从而,通过组合这些有关存储位置、有无移位、扩展方式、扩展时刻、以及读出后的自动清零的各种方式,可以很容易地构成多种不同方案。
在上述实施例中,示出了只包括上述各方式中的一方面的示例,但本发明并不仅限于此。例如,包括用于进行常量的零扩展的结构和用于进行符号扩展的结构,且根据指令中设置的操作数来选择其中一种结构进行操作的方式也是可以的。
(2)在上述实施例中示出了处理数值常量的例子,当然也同样适用于字符常量。分开设置在多个指令中的字符常量也可以通过向常量寄存器36进行多次存储,还原成原来的位数较长的字符常量。
(3)在上述实施例中,由图2(b)-图2(d)所示的指令格式可知,能够通过1个指令而被存入常量寄存器36中的常量的位数为4位或16位,但本发明对位数的限定并不仅限于此。例如,也可以定义用于将12位和28位常量存入常量寄存器36中的指令格式。为此,最好改变常量寄存器36的外围电路的连接关系。
(4)上述实施例的处理器为包括2个运算部件37、38的VLIW处理器,但本发明也同样适用于只包括1个运算部件且不采用执行用于在1个指令中只指定一种操作的单操作指令的VLIW体系结构的处理器。
特别是,在定长指令的情况下有许多具有未使用区域的指令被定义。例如,MIPS公司的RISC处理器“R2000”执行32位定长指令,但在这个处理器的指令设置中,定义了具有未使用区域的指令(例如ADD指令具有5比特的未使用区域)。而利用本发明则避免了在这样的单操作指令中生成的无用区域的产生。
(5)在上述实施例中,4位操作数“cc”意味着参照常量寄存器36的隐含存储值的间接分支,但本发明并不仅限于此,作为操作数“cc”,也可以包含相对于固定的偏移地址部分而分支的操作和利用通用寄存器35的存储值的间接分支操作。在这种情况下,常量寄存器控制部件32不仅在常量寄存器36的存储值被读出后对常量寄存器36清零,而且在操作数“cc”所表示的分支操作被执行后也对常量寄存器36清零。这些是有关在4位操作数“cc”中配置什么样的操作的设计事项,通过改变分支译码器23和常量寄存器控制部件32可以很容易地实现。
(实施例2)
下面对依据实施例2的处理器进行说明。依据实施例2的处理器是实现上述第二目的的处理器,其特征是具有通过只在必要的情况下保存·还原常量寄存器的值来避免任务的前后转换中的无用操作的功能。而且,以0b开头的数值表示二进制数。
(处理器的硬件结构)
图30是依据实施例2的处理器500的硬件结构方框图。本处理器由指令寄存器510、指令译码电路520、执行部件530及指令读取部件540构成。在本图中,还同时示出了与本处理器500相连接的外围电路,即用于保存任务前后关系等的外部存储器540。
指令读取部件540由用于存储多个指令的指令存储装置和从指令存储装置读出应执行的指令并将其传送到指令寄存器510中的指令读取电路构成。
指令寄存器510是用于保存从指令读取部件540传送来的指令的16位寄存器。
指令译码电路520对保存在指令寄存器510中的指令译码,并根据该译码结果将控制信号输出到执行部件530。上述指令译码电路520基本上在1个时钟周期内对1个指令译码,并向执行部件530提供控制信号。执行部件530是根据指令译码电路520的译码结果执行指令的电路单元,由执行控制电路300、保存还原无效化电路301、通用寄存器310、运算器311、操作数存取电路312、常量寄存器320、有效位数寄存器321、常量还原电路322及多路转接器330、331、332构成。关于这个执行部件530中的保存还原无效化电路301和常量还原电路322,将在其它附图中予以详细说明。
通用寄存器310为16个32位寄存器R0-R15,根据指令译码电路520的译码结果及执行控制电路300生成的控制信号,存储在这16个寄存器中的值被传送到运算器311和操作数存取电路312中,在这里进行运算或被传送到外部存储器540或只是通过这里后被传送到通用寄存器310中。
常量寄存器320为32位寄存器,根据指令译码电路520的译码结果及执行控制电路300生成的控制信号,存储在这个寄存器中的值被传送到常量还原电路322或操作数存取电路312中。
根据指令译码电路520的译码结果、执行控制电路300生成的控制信号及有效位数寄存器321的值,常量还原电路322利用指令寄存器510中存储的指令中包含的常量和常量寄存器320的存储值,生成新的值,并将其传送到运算器311和操作数存取电路312中,在这里进行运算或被传送到外部存储器540或只是通过这里后被传送到通用寄存器310中。但在象后述的sfst指令一样的只是累积值的情况下,生成新的值,并在只是通过运算器311后将其传送到常量寄存器320中。后面将详细说明新值的生成方法。连接指令寄存器510和执行部件530的13位常量信号线11是用于将指令寄存器中设置的常量传送到执行部件530中的总线。
有效位数寄存器321表示分开的常量被存到常量寄存器320的哪一位为止时,常量寄存器320在被更新为新值的同时,有效位数寄存器321也被更新。在保存存储值指令寄存器510中且使用常量寄存器320中的常量的指令(例如后述的addi指令)时,由执行控制电路300将0b00(全部位无效)存入有效位数寄存器321中。有效位数寄存器321的存储值与常量寄存器320的有效位数的具体对应关系如图31所示。
执行控制电路300是用于根据指令译码电路520的执行结果,控制执行部件530的各个构成部分310-332的控制电路和连接关系的总称,除了常规处理器所包括的构成部分(定时控制电路、操作允许禁止控制电路、状态寄存器及状态管理电路、插入控制电路等)之外,还包括常量寄存器320的控制电路。
保存还原无效化电路301是本处理器所特有的电路,根据来自指令译码电路520和执行控制电路300的指示,在指令寄存器510中所存的指令为常量寄存器320的保存或还原指令且有效位数寄存器321中表示常量寄存器320的值为无效(值为0b00)的情况下,将操作数存取电路312的控制信号303变成后面所述的“无操作”。
运算器311是对2个32位数据进行算术逻辑运算的ALU,并在执行控制电路300的控制下进行操作。
操作数存取电路312是以运算器311的输出为操作数地址,以多路转接器332的输出为操作数,在与外部存储器之间进行操作数传送的电路,其内部具有用于保存该操作数和操作数地址的缓冲器。
在保存还原无效化电路301输出的控制信号表示“装入”时,经过操作数存取电路312和多路转接器331读出置于外部存储器540中的1个字,并将其存入通用寄存器310的R0-R15中的任一个,或在后述的常量寄存器320的还原的情况下存入常量寄存器320中。
在控制信号303表示“存储”时,存在通用寄存器310的R0-R15中的任一个或在后述的常量寄存器320的保存的情况下存在的常量寄存器320中的值经多路转接器332选择,由操作数存取电路312写入外部存储器540中。
在控制信号303表示“无操作”时,操作数存取电路312忽视操作数地址和操作数,并不进行向外部存储器540的传送。
(指令格式)
下面对本处理器的指令进行说明。图32中示出了用于说明本实施例的指令及其格式。如图32所示,每个指令为16位定长指令,高3位为操作1(op1)的字段,sfst指令通过对这个字段译码来判断指令的种类。在sfst指令以外的指令中,后面的3位为操作2(op2)的字段,这些指令通过对op1和op2译码来判断指令的种类。在addi指令中,后面的4位为寄存器字段(Rn),用于放置目标寄存器号。接着的字段中为常量(imm6),用于放置在Rn中进行加法运算的6位常量。
下面说明各指令的功能。
(1)sfst imm13
上述指令是将常量寄存器320的值向左移13位,在低位侧插入13位立即数(imm13)并将其存入常量寄存器320中的指令。在常量寄存器320无效时,只对13位立即数进行符号扩展并将其存入常量寄存器320中。(sfst是shift-set的缩写)
(2)addi imm6,(Rn)
上述指令将常量寄存器320的值向左移6位,将在低位侧插入了13位立即数(imm13)的值与通用寄存器310中Rn(n为0-15)的值相加并将其存入Rn中的指令。在常量寄存器320无效时,只对13位立即数进行符号扩展并用于加法运算。在执行本指令时,常量寄存器320被无效。
(3)save IMR,(Rn)
上述指令为将常量寄存器320保存到外部存储器540中的指令,并且该保存目标地址利用通用寄存器310中Rn的值。
(4)restore(Rn),IMR
上述指令为将常量寄存器320还原到外部存储器540中的指令,并且该保存器标地址利用通用寄存器310中Rn的值。
(常量还原电路322的详细说明)
图33为常量还原电路322的详细结构方框图。
3220是连接从指令寄存器510经总线11传送的13位常量和常量寄存器320的存储值的低19位的电路,常量寄存器320的值位于高位侧,整个值为32位。
同样地,3221是连接从指令寄存器510经总线11传送的6位(13位中的低6位)常量和常量寄存器320的存储值的低26位的电路,常量寄存器320的值位于高位侧,整个值为32位。
3222是将从指令寄存器510经总线11传送的13位常量符号扩展为32位的电路,3223是将从指令寄存器510经总线11传送的6位(13位中的低6位)常量符号扩展为32位的电路。
3224-3226是多路转接器,3227是次有效位数生成电路。
图34是定义多路转接器3224、3225、3226和次有效位数生成电路3227的操作的图,根据执行控制电路300的控制信号305和有效位数寄存器321的值来确定操作。在图34中的sfst和use表示指令寄存器510中保存的指令的种类时,根据执行控制电路300的控制信号来进行表示。sfst是sfst指令被保存在指令寄存器510中时的操作,use是使用addi等指令的常量的指令被保存时的操作。次有效位数是次有效位数生成电路3227的输出值,在下一个时钟周期被存入有效位数寄存器321中。
(保存还原无效化电路301的详细说明)
图35示出了保存还原无效化电路301的具体结构。
逻辑电路3010是在有效位数寄存器321的存储值为0x00时输出1,在为其它值时输出0的电路。门单元3011为AND电路,门单元3012为OR电路,门单元3013、3014为以AND电路3011的输出端的逻辑反转为输入的AND电路。
在信号线302(a)、302(b)、302(c)表示图30中3位宽的控制信号302的每一位,信号线303(a)、303(b)、303(c)表示图30中3位宽的控制信号303的每一位时,根据图30的操作数存取电路312,分别对无操作、装入、存储进行控制。
控制信号304是图30所示的执行控制电路300输出的控制信号,并在指令寄存器510中保存的指令为save指令或restore指令时输出1而在其它情况下输出0。
利用此结构,在有效位数寄存器321的存储值为0b00且控制信号304为1,即指令寄存器510中保存的指令为save指令或restore指令的情况下,使与控制信号302无关的控制信号303(a)为1,303(b)和303(c)为0,操作数存取电路312的操作为“无操作”。
另一方面,在在有效位数寄存器321的存储值不为0b00且控制信号304为0的情况下,控制信号302被原封不动地输出到控制信号303中。
(处理器的操作)
下面对执行具体指令时本处理器的操作进行说明。在本实施例中假定通过不同时的插入来起动任务前后关系的转换。在此省略了关于插入处理程序的具体处理,而只对常量寄存器的保存和还原操作进行说明。
图36(a)是用于说明本处理器操作的流程图,图36(b)示出了其对应的程序(指令571-573)清单。这里,示出了将32位常数0x12345678加到通用寄存器R0中的程序。图36(c)-(f)示出了有效位数寄存器321及常量寄存器320的内容随着上述指令571-573的执行的变化,图36(g)示出了执行指令573时实际上的操作数。
下面说明每条指令571-573的操作。在本程序执行前,如图36(c)所示,表示常量寄存器320无效的值0b00被存入有效位数寄存器321中。
(1)sfst 0x0246(指令571)
在上述指令571被保存在指令寄存器510中时,执行控制电路300执行进行以下控制的指令571。
首先,在常量还原电路322中,如图34所示,由于指令寄存器510中保存的指令为sfst指令且有效位数寄存器321为0b00,多路转接器3225选择A,多路转接器3226选择B,所以向多路转接器330输出对保存在指令寄存器510中的指令571的13位立即数0x0246进行13位符号扩展后的值0x00000246,向有效位数寄存器321输出0b01。
向多路转接器330输出的值0x00000246在只是通过运算器311后,经多路转接器331被传送到常量寄存器320中。有效位数寄存器321被更新为0b01。
通过以上操作,常量寄存器320及有效位数寄存器321的内容变成如图36(d)所示。由于控制信号302和303表示“无操作”,所以操作数存取电路312不进行任何操作。通用寄存器310也没有任何变化。
(2)sfst 0x1159(指令572)
在上述指令572被保存在指令寄存器510中时,执行控制电路300执行进行以下控制的指令572。
首先,在常量还原电路322中,如图34所示,由于指令寄存器510中保存的指令为sfst指令且有效位数寄存器321为0b01,多路转接器3224选择A,多路转接器3226选择A,所以向多路转接器330输出将常量寄存器320的存储值0x00000246向左移13位且将保存在指令寄存器510中的指令的13位立即数0x1159插入到低13位后的值0x0048d159,向有效位数寄存器321输出0b10。
向多路转接器330输出的值0x0048d159在只是通过运算器311后,经多路转接器331被传送到常量寄存器320中。有效位数寄存器321被更新为0b10。
通过以上操作,常量寄存器320及有效位数寄存器321的内容变成如图36(e)所示。由于控制信号302和303表示“无操作”,所以操作数存取电路312不进行任何操作。通用寄存器310也没有任何变化。
(3)addi 0x38,R0(指令573)
在上述指令573被保存在指令寄存器510中时,执行控制电路300执行进行以下控制的指令573。
首先,在常量还原电路322中,如图34所示,由于指令寄存器510中保存的指令为addi指令(适用于use栏)且有效位数寄存器321为0b10,多路转接器3224选择B,多路转接器3226选择A,所以向多路转接器330输出将常量寄存器320的存储值0x0048d159向左移6位且将保存在指令寄存器510中的指令的6位立即数0x38插入到低6位后的值0x12345678(图36(g)所示的值),向有效位数寄存器321输出0b00。
向多路转接器330输出的值0x12345678被输入到运算器311的A端。另外,从通用寄存器310中读出R0的值,将其输入到运算器311的另一端B端。在执行控制电路300的控制下,运算器311将各个输入值相加,经多路转接器331传送到通用寄存器310的R0中。有效位数寄存器321被更新为0b00。
通过以上操作,常量寄存器320及有效位数寄存器321的内容变成如图36(f)所示。由于控制信号302和303表示“无操作”,所以操作数存取电路312不进行任何操作。
这里,关于在上述程序中发生插入且进行前后关系转换时的操作,说明各自插入的位置不同的2种情况。
(情况1)
下面说明在上述程序中的addi指令573之前发生插入并进行任务前后关系转换的情况。
图37(a)是情况1中的指令流的流程图。此种情况下,如图36(e)所示,在0b10(低26位有效)被存入有效位数寄存器321中时,常量寄存器320中的0x0048d159进行插入处理。
在插入处理中保存常量寄存器320的情况下,save IMR,(R15)指令被保存在指令寄存器510中并被执行。执行控制电路300执行进行以下控制的指令。
常量寄存器320的存储值经过多路转接器332,作为操作数被输入到操作数存取电路312中。另一方面,通用寄存器310中R15的值被输入到运算器311的B端,在通过后作为操作数地址被输入到操作数存取电路312中。
执行控制电路300在控制信号304表示保存或还原指令时输出1,通过将“存储”输出到控制信号302中进行保存。
在保存还原无效化电路301中,由于有效位数寄存器321的存储值为0b10,所以控制信号302被原样输出到控制信号303中并且操作数存取电路312进行“存储”操作,即常量寄存器320的保存。有效位数寄存器321的内容作为本处理器的状态寄存器的一部分,在状态寄存器的保存同时而被保存。
在进行常量寄存器320的还原时,首先状态寄存器中所具有的有效位数寄存器321的内容0b10被还原,然后,restore (R15),IMR指令被保存在指令寄存器510中并被执行。执行控制电路300执行进行以下控制的指令。
通用寄存器310中R15的值被输入到运算器311的B端,在通过后作为操作数地址被输入到操作数存取电路312中。
执行控制电路300在控制信号304表示保存或还原指令时输出1,通过将“装入”输出到控制信号302中进行还原。
在保存还原无效化电路301中,由于有效位数寄存器321的存储值为0b10,所以控制信号302被原样输出到控制信号303中并且操作数存取电路312进行“装入”操作,读出的值0x0048d159经过多路转接器331并被传送到常量寄存器320中,即进行常量寄存器320的还原。
(情况2)
下面说明在上述程序中的addi指令之后发生插入并进行任务前后关系转换的情况。
图37(b)是情况2中的指令流的流程图。此种情况下,如图36(f)所示,在0b00(全部位均无效)被存入有效位数寄存器321中时,常量寄存器320中的0x0048d159进行插入处理。
在插入处理中保存常量寄存器320的情况下,save IMR,(R15)指令被保存在指令寄存器510中并被执行。执行控制电路300执行进行以下控制的指令。
常量寄存器320的存储值经过多路转接器332,作为操作数被输入到操作数存取电路312中。另一方面,通用寄存器310中R15的值被输入到运算器311的B端,在通过后作为操作数地址被输入到操作数存取电路312中。
执行控制电路300在控制信号304表示保存或还原指令时输出1,通过将“存储”输出到控制信号302中进行保存。
在保存还原无效化电路301中,由于有效位数寄存器321的存储值为0b00、控制信号304为1,所以控制信号302将“无操作”输出到在保存还原无效化电路301中被无效掉的控制信号303中。从而,操作数存取电路312不进行任何操作。有效位数寄存器321的内容作为本处理器的状态寄存器的一部分,在状态寄存器的保存同时而被保存。
在进行常量寄存器320的还原时,首先状态寄存器中所具有的有效位数寄存器321的内容0b00被还原,然后,restore(R15),IMR指令被保存在指令寄存器510中并被执行。执行控制电路300执行进行以下控制的指令。
通用寄存器310中R15的值被输入到运算器311的B端,在通过后作为操作数地址被输入到操作数存取电路312中。
执行控制电路300在控制信号304表示保存或还原指令时输出1,通过将“装入”输出到控制信号302中进行还原。
在保存还原无效化电路301中,由于有效位数寄存器321的存储值为0b00、控制信号304为1,所以控制信号302将“无操作”输出到在保存还原无效化电路301中被无效掉的控制信号303。从而,操作数存取电路312不进行任何操作。
由此,在情况2中操作数存取被无效并不进行对外部存储器540的实际传送。为此,减少了由常量寄存器的部分保存/还原引起的存储器访问次数,缩短了任务前后关系转换的处理时间。如本实施例所示,在立即数被分开设置且累积于常量寄存器320中的情况下,位数大的常量越少,常量寄存器320有效的机会就越少。从而,与位数大的常量越少的程序相比,本发明的效果就越明显。
图38是简略示出上述情况1及2中的处理器操作,即关于常量寄存器320的值的保存及还原的操作的流程图。这个处理器在执行常量寄存器320的保存或还原时(步骤S200),参照有效位数寄存器321的存储值,并在该存储值为0b00,即有效常量没有被存储在或未曾存储在常量寄存器320中时(步骤S201),不进行上述无用的保存及还原(步骤S202)。
以上根据实施例2说明了达到第二目的的处理器,但本发明并不仅限于此实施例2。即,
(1)在实施例2中,利用了16位定长指令格式并利用13位和6位立即数,但本发明并不仅限于此。而且,利用32位寄存器作为通用寄存器310和常量寄存器320,但同样地,本发明并不仅限于此。
(2)以包括1个常量寄存器320的实施例2的处理器为例进行了说明,但本发明也可以包括多个常量寄存器320。
(3)在实施例2的处理器中示出了任务前后关系转换的保存和还原,但本发明同样适用于在与任务前后关系转换无关的常量寄存器和存储装置之间进行传送的情况。
(4)在实施例2的处理器中,设计了用于表示常量寄存器320中所存储的常量的有效位数的有效位数寄存器321,但其他形式的用于保存有效/无效状态的寄存器也能够得到相同的效果。
(5)在实施例2的处理器中,以addi指令作为使用立即数的指令,但本发明也可以利用其他同样使用立即数的指令。
(6)在实施例2的处理器中,分别定义save IMR,(Rn)指令和restore(Rn),IMR指令作为常量寄存器320的保存·还原指令,但也可以利用其他形式的指令。
例如,由包括在寄存器列表形式的操作数中定义常量寄存器320的保存还原和包含在通常任务前后关系中的通用寄存器310(Rn)中的一个或状态寄存器的保存·还原来定义常量寄存器320的保存·还原也是可以的。后者是在保存·还原例如R15和状态寄存器时将常量寄存器320作为隐含的保存·还原对象的指令。
在save IMR,(Rn)指令和restore(Rn),IMR指令中,存在由于常量寄存器320的保存·还原无效而使得用于这些专用指令的代码长度被增加的问题,但通过上述操作,就具有了不需要明确指定常量寄存器320的保存·还原的指令,从而缩短了代码长度的效果。
(7)在实施例2中,有效位数寄存器321的值作为状态寄存器的一部分在任务前后关系转换时被保存及还原,但本发明并不仅限于此。如图39所示,也可以定义用于保存及还原有效位数寄存器321的值的专用指令。在图39中,IMB表示有效位数寄存器321,Rn表示用于存储应保存或还原的外部存储器540地址的通用寄存器310。
(8)在实施例2的处理器中,执行在一个如sfst指令和addi指令一样的指令中定义一种操作的指令,但也可以执行在如实施例1的1个指令中定义多种操作的所谓的VLIW形式的指令。
图40是相当于在实施例1的VLIW处理器中附加了实施例2的任务前后关系转换功能的VLIW处理器600的功能方框图。这个处理器600的执行部件630包括具有与实施例2功能相同的有效位数寄存器631及保存还原无效化电路632。
图41是本处理器600执行的VLIW670的示例。在格式码54为0x0的指令670的第二运算字段60中,设置了用于将常量寄存器R15的内容保存到通用寄存器R3所表示的外部存储器的存储区域中的操作(save)。由第二运算译码器25对这个操作数译码时,常量寄存器36的内容通过第二运算部件38被发送到操作数存取部件40中。然后,保存还原无效化电路632参照该时刻有效位数寄存器631的值,按照图38所示的流程,允许或禁止操作数存取部件40将上述内容保存到外部存储器中。
由此,通过在实施例1的常量还原型VLIW处理器中附加实施例2的任务前后关系转换功能,实现了能够避免在插入NOP指令过程中无用代码长度的增加和任务转换中无用关系的保存及还原的处理器,即支持缩短代码长度并高速执行任务转换的VLIW处理器。