本申请为分案申请,其母案的申请号为97107269.8,申请日为1997年11月28日。该母案的在先申请号为JP96-320423,在先申请日为1996年11月29日。
具体实施方式
(第一实施例)
下面,参照附图说明本发明第一实施例。图3是表示第一实施例处理器的内部结构图,如同图所示,本处理器由ROM11、指令读出电路12、译码器13、运算执行装置14、地址总线17、及数据总线18构成,通过地址总线17、数据总线18与RAM10连接。
RAM10预先存储由8×8行列状成分组成的压缩数据Fij(i,j=1,2,3,4,5…8)和由8×8行列状成分组成的系数数据Gji(i,j=2,3,4,5…8)。趟若读出端的i行j列地址向地址总线17输出,则在存储着的数据中,把用其地址指示的数据向数据总线18输出。并且,运算执行装置14计算出由8×8行列状成分组成的压缩数据Fij和8×8系数数据Gji的行列积Hij(i,j=1,2,3,4,5…8)的i行j列成分,当写入端的i行j列地址向地址总线17输出时,则把传输到数据总线18的i行j列成分写入用其地址指示的存储区域。通过逆DCT的近视计算使用象这样写入的行列积Hij,在实施规定的处理之后,利用未图示的重放系统硬件。并且,设定成从低位把第八位分配给码位的带码8位整数来表达Fij和Gij。
ROM11存储RAM10存储的压缩数据的扩展处理程序,当从指令读出电路12输出读出端地址时,则在存储的扩展处理程序中把用其地址指示的指令向数据总线18输出。在ROM11中存储的扩展处理程序混在传输指令、运算指令、分支指令等多种指令中。运算指令大体分成算术运算指令、带积和功能的乘法指令、逻辑运算指令。以加法指令、减法指令、乘法指令为首的算术运算指令分别具有第一操作数和第二操作数。第一操作数具有即值指定及寄存器直接指定的两种寻址状态。与此相反,第二操作数的寻址状态只是寄存器直接指定。这是由于第二操作数兼作运算结果的存储端指定的缘故。加法指令“ADD imm、D1”的一个例子是第一操作数成为即值imm,第二操作数成为寄存器名D1。通过指定作为运算结果的存储端,在“ADD D0、D1”的情况下,把寄存器D0和寄存器D1的相加结果存储在寄存器D1中变成第二操作数。
在本实施例中,扩展处理程序包括通过由8×8行列状成分组成的压缩数据Fij和由8×8行列状成分组成的系数数据Gji产生具有8×8成分的行列积Hij的行列积子程序,要特别指出的是,该行列积子程序主要由带积和功能乘法“MACCB Dm,Dn”及正值饱和运算指令“MCSST Dm”组成。
考虑到算出由8×8成分组成的压缩数据Fij(i,j=1,2,3,4,5…8)和8×8系数行列Gji(i,j=1,2,3,4,5…8)的行列积Hij的情况,在该情况下,为了算出相关行列积的1行1列成分H11,必须作以下计算。
数学式1
H11=G11*F11+G12*F21+G13*F31+G14*F41+G15*F51+G16*F61+G17*F71+G18*F81
该数学式1把“Gji*Fij(i,j=1,2,3,4,5…8)”作为单项式,虽然是取这些单项式代数和的多项式,但该单项式的运算及代数和在本行列积子程度中,用使带积和功能乘法指令“MACCB Dm,Dn”重复启动的循环语句(该循环语句称为积和循环)来表达。
图5是表示行列积子程序一例的图。还有,图5各指令的概要记在其右边相邻的注释语句(开头配有#记号的语句)中。F_ENTRY是在RAM10中付加在存储压缩数据的区域开头上的标号,G_ENTRY是在RAM10中附加在存储系数数据的区域开头上的标号,H_ENTRY是在RAM10中附加在存储行列积的区域开头上的标号。指令1:“MOV F_ENTRY,A0”、指令2:“MOV G_ENTRY,A1”、指令3:“MOV H_ENTRY,A2”是分别把地址F_ENTRY、地址G_ENTRY、地址H_ENTRY传输到地址寄存器A0、地址寄存器A1、地址寄存器A2的传输指令。
根据以上传输指令,为了指示具有8×8个成分的压缩数据、系数数据、行列积数据的读出端地址使用地址寄存器A0,A1,A2。
指令4:“MOV INIT,D2”在数据寄存器D2中设定重复次数的初期值INIT,指令5:“MOV(A0),D0”从由地址寄存器A0指示的地址中给数据寄存器D0读出系数数据Fij。指令6:“MOV(A1),D1”从由地址寄存器A1指示的地址中给数据寄存器D1读出系数数据Gji。指令7:“MACCB D0,D1”是利用数据寄存器D0、数据寄存器D1、及用于存储积和结果寄存器6的带积和功能的乘法指令,指令8:“CMP NUMBER,D2”是这样的指令,进行从在数据寄存器D2中存储的重复次数中减去重复总数NUMBER的运算,以此作重复次数的上限检验。
指令9:“BCS LP1_NEXT”是带这样条件的分支指令,若指令8:“CMPNUMBER,D2”的减法结果进位标志成为ON,则向附加标号LP1_NEXT的指令13:“ADD 1,D2”分路。
指令10:“MCSST D1”为只是进位标志在OFF情况下实施正值处理及饱和运算处理(将这些归纳称为正值饱和运算处理)的指令。
指令13:“INC D2”是加法指令,使存储在数据寄存器D2中的重复次数加1。指令14:“INC A0”是加法指令,使存储在地址寄存器A0中的系数数据的读出端地址加1。指令15:“ADD ROW1,A1”是加法指令,使存储在地址寄存器A1中的系数数据的读出端地址加一行数ROW1。指令16:“BRALP1_START”是向标号LP1_START分路的无条件分支指令。
通过由附加标号LP1_START的指令5:“MOV(A0),D0”~指令12:“BRALP1_END”组成的指令串作单项式运算,取运算结果的代数和。
通过由附加标号LP1_NEXT的指令13:“ADD 1,D2”~指令16:“BRALP1_START”组成的指令串,一行成分X一列成分的行列积一旦结束,则把压缩数据的读出端移向下一行,把系数数据的读出端移向下一列。与此同时,加数据寄存器D2中存储的重复数。
图6是表示带积和功能乘法指令“MACCB Dm,Dn”的形式图,如图6所示,带积和功能乘法指令“MACCB Dm,Dn”包括1位长积和值存储端的指定字段(フイ-ルド)、1位长代数和的运算内容指定字段、1位长单项式运算内容指定字段、2位长乘数读出端指定字段、2位长被乘数读出端指定字段。
乘数读出端指定字段及被乘数读出端指定字段通过写入“00”“01”“10”“11”,从数据寄存器D0、数据寄存器D1、数据寄存器D2以及积和结果专用寄存器6中的任一个,指定乘数Fij、被乘数Gji的读出端寄存器。
1位长单项式运算内容指定字段指定乘数Fij、被乘数Gji的单项式的运算内容。即,当在本字段上写入“1”,则指定作为乘数Fij、被乘数Gji的单项式运算内容的乘数Fij、被乘数Gji的乘法“Gji*Fij”。
积和值的存储端的指定字段设定为“1”,借此作为积和值的存储端指定MCR(是后述的积和结果专用寄存器6的部分)。1位长的代数和的运算内容指定字段通过写入“1”,指定作为乘法结果“Gji*Fij”和存储在积和结果专用寄存器6中的积和值的加法运算之代数和。
在作“G11*F11+G12*F21+G13*F31…”的积和时,应注意的是在压缩数据成分Fij的传输时产生误码,形成与象“G11*F11+G12*F21+G13*F31…”积和值在重放系统不能重放的理论值相距很运的数值。由于存在这种担心,所以,行列积子程序在使带积和功能乘法指令“MACCB D0,D1”的启动重复的循环处理结束之后,配置正值饱和运算指令“MCSST Dm”,要作对积和值分正值饱和的运算处理。
图7展示了正值饱和运算处理指令“MCSST Dm”的操作码形式。如图7所示,正值饱和运算处理指令“MCSST Dm”包括正值-饱和幅度(修整幅度)指定字段和正值饱和运算结果的存储端指定字段。
修整幅度字段利用经线写入“01”“10”“11”,把正值饱和运算处理的修整幅度指定为24位正值、16位正值、8位正值的任一个。
存储端指定字段利用写入“00”“01”“10”“11”,从数据寄存器D0、数据寄存器D1、数据寄存器D2、数据寄存器D3中任一个中指定正值饱和运算处理的存储端寄存器。
象该存储在ROM11中的扩展处理用程序由于在行列积子程序中,用带积和功能乘法指令“MACCB Dm,Dn”记述必要的多项式的单项式运算及代数和运算,用正值饱和运算处理指令“MCSST Dm”记述多项式的积和正值饱和运算处理,所以,算法严谨。由于这些指令仅用处理器表达,所以在ROM11中扩展用程序所占用的存储器的尺寸很小。
以上结束有关存储在ROM11中指令串的说明。下面再对图3所示的处理器构成要素进行说明。
图3构成的指令读出电路12备有依次产生读出端地址,向地址总线输出的程序计数器,从ROM11向译码器13读出输出到数据总线18的指令。
译码器13备有存储多个从数据总线18读出的指令的指令缓冲器,和在存储于指令缓冲器的指令中,保存成为译码对象部分的指令寄存器,使存储在指令寄存器中的指令内容译码,对运算执行装置14进行实现其指令的控制。其中在所述控制中尤其必须说明的是下面所示的寄存器输出控制(1)、运算执行控制(2)、常数产生控制(3)。
所谓寄存器输出控制(1)是控制运算执行装置14,以使得输出根据由指令读出电路12读出的算术运算指令、逻辑运算指令、带积和功能乘法指令的第一、第二操作数指示的寄存器的保持值。所谓运算执行控制(2)是控制运算执行装置14,以使得执行由算术运算指令、逻辑运算指令、带积和功能乘法指令指示的运算内容。所谓常数产生控制(3)是控制运算执行装置14,以使得产生用于执行正值饱和运算指令的最大值和零值。寄存器输出控制(1)及运算执行控制(2)是在译码器13对算术运算指令、逻辑运算指令、带积和功能乘法指令译码时进行,寄存器输出控制(1)及常数产生控制(3)是在译码器13对正值饱和运算指令译码时进行。由于是在带积和功能乘法指令译码时产生运算执行控制(2),正值饱和运算指令译码时产生常数产生控制(3),所以,运算执行控制(2)和常数产生控制(3)彼此处于排他性关系。
地址总线17具有32位宽,传输指令读出电路12输出的读出端地址。
数据总线18具有32位宽,若RAM10输出数据,一旦从RAM10输出,则传输压缩数据Fij、系数数据Gij、行列积数据Hij。
运算处理装置14备有寄存器文件、算术逻辑运算电路,根据来自译码器13的控制作运算处理。
其中应注意的是构成为,指令读出电路12实施指令读出步(ステ—ジ)、译码器13实施指令解码步,运算处理装置14实施运算执行步、存储器写入步、寄存器写入步。并且,这5步实现5级流水线。指令读出电路12不等待其前面指令执行结束,下一个指令在进入译码器13所作的解码步的阶段中,开始下个指令的读出。译码器13也一样,不等其前面指令执行结束,下面的指令在进入由运算处理装置14产生的运算执行步的阶段中,开始下个指令的解码。根据这些处理,处理器利用由如图12A所示的称为指令读出步、指令解码步、执行步、存储器存取步、寄存器写入步等5级组成的流水线处理存储在ROM11中的指令串。
以上完成了对处理器构成要素的说明。接着集中说明运算处理装置14的内部构成。图4表示运算执行装置14的内部构成。如图14所示,运算执行装置14由寄存器文件1、算术逻辑运算电路2、正值饱和运算电路3、码扩展电路4、积和结果存储用寄存器6、第一内部总线15、以及第二内部总线16组成。在这些结构要素和译码器13之间虽然布满用于上述控制(1)、(2)、(3)的控制信号线,但为了简单在图中做了省略。
寄存器文件1备有4个32位宽的数据寄存器D0~D3、3个32位宽的地址寄存器A0~A2。在寄存器输出控制(1)中,当由译码器13指示一个或二个寄存器名时,则寄存器文件1通过总线C2、C3向第一内部总线15和第二内部总线16输出所给予的寄存器名的寄存器保持值。并且,寄存器文件1通过总线C1在数据总线18上保持传输的值。
第一内部总线15具有32位宽,寄存器文件1输出的32位长的保持值传输到算术逻辑运算电路2中。
第二内部总线16具有32位宽,寄存器文件1输出的32位长的保持值传输到算术逻辑运算电路2中。
码扩展电路4当通过第一内部总线15从寄存器文件1传输过来的数据保持值为负数的情况下,作码扩展。在本实施例中,由于规定乘数、被乘数为带码8位数值,所以码扩展电路4作8位长的负数码扩展。例如从第一内部总线15传输过来的保持值如果为8位负数“0X0000_0080”,则第8位码扩展成9~32位,作为“0xFFFF_FF080”向算术逻辑运算电路2输出。
码扩展电路5通过第二内部总线16从寄存器文件1传输过来的数据寄存器保持值为负数的情况下,进行码扩展。在本实施例中,由于乘数、被乘数规定为带码32位数值,所以码扩展电路5作8位长的负数扩展。码扩展方式与码扩展电路4的一样。
算术逻辑运算电路2由32位宽的全加法器、乘法器,鼓式移位器(バレルシフタ)等组成,根据由译码器13所作的运算执行控制(2)进行运算。这里,由于算术逻辑运算电路2的输入部分与码扩展电路4、积和结果专用寄存器6的输出部分相连接,所以基于运算执行控制(2)的运算以向码扩展电路4输出的寄存器32位长的保持值,和向积和结果专用寄存器6输出的寄存器32位长的保持值为对象进行。
在带积和功能乘法指令“MACCB Dm,Dn”解码时,算术逻辑运算电路2作由码扩展电路4输出的32位长的值和由码扩展电路5输出的32位长的值的乘法,输出64位长的乘法结果。并且,作传输到总线P1的32位长值与64位乘算结果的低位32位相加,相加之后,把32位长的相加结果向总线P1输出。
并且,在带积和功能乘法指令“MACCB D0,D1”的解码时,由于在第一内部总线15和第二内部总线16中传输用带积和功能乘法指令“MACCB D0,D1”的第一操作数及第二操作数指定的读出端寄存器保持值,所以利用算术逻辑运算电路2使数据寄存器D0的保持值与数据寄存器D1的保存值相乘。而且,在带积和功能乘法指令“MACCB D0,D1”的解码时,由于在总线P1中传输积和结果专用寄存器6的保持值,所以数据寄存器D0~数据寄存器D1的乘法结果成为与总线P1的积和结果专用寄存器6的保持值的相加。象该算出的加法结果向总线P2上输出。
积和结果专用寄存器6保持好至此的积和的积和值,一旦使带积和功能乘法指令解码,则向总线P1上输出其保持值。当用算术逻辑运算电路2作总线P1上保持值和乘法结果的加法时,虽然重新向总线P2上输出相加结果,但积和结果专用寄存器6锁定输出的相加结果,将此作为新的积和值保持。还有用于积和值存储寄存器6把由算术逻辑运算电路2算出的乘数Fij、被乘数Gji的相乘结果作为带码16位数值保持。
在使正值饱和运算“MCSST”解码的情况下,积和结果专用寄存器6向线路P2输出保持值。
正值饱和运算电路3是把用带码16位数值表达的积和结果专用寄存器6的保持值修整为正8位整数的安装电路。图8A及图8B是用于说明根据正值饱和运算电路3形成的修整处理的说明图。在图8A中,上段展示了32位宽的乘数、被乘数的表达。即涂满黑色的第8位分配给码位,以此使用带影线的7位,表达-127~+127的乘数Fij、被乘数Gji。
中段显示32位宽的积和结果的表达。即通过把涂黑的第16位分配给码位,使用带影线的15位表达在-32767~+32767范围的积和值。
下段显示处理器32位宽的行列积成分的表达。即通过在无码位中使用带影线的第1~第8位,在0~+255范围内表达行列积成分Hij。
在图8B中,左端图形表示可取的寄存器保持的乘数、被乘数的范围,每达正负有8位范围。中央图形表示可取的积和结果专用寄存器6保持的积和值的范围,每逢正负有16位的范围。左端图形是行列积Fij可取的范围,即是重放系统硬件可重放的8位正数范围。
把积和值可取的范围每逢正负定为16位是为了避免修整错误的累积。即,当把取有码8位值的乘数Fij、被乘数Gji相乘结果作积和时,虽说行列积Hij的范围是8位,但每逢乘法时如果把相乘结果修整成8位,则修整错误仅位增相乘次数。意味着避免修整误差倍增,积和结果存储用寄存器6设积和结果为16位,在一行×一列相乘结束的阶段进行正值处理。
为了把中央所示的积和结果专用寄存器6的保持值修整成右端所示的8位正值,所以正值饱和运算电路3把用参照符号y1指示的范围(作为正数超过上限0x000000FF的范围)修整成0x000000FF。
并且,正值饱和运算电路3把用参照符号y2指示的范围(负数范围)修整成0x00000000。
正值饱和运算电路3内部构成如图4的虚线y8内所示。如图4的虚线y8所示,正值饱和运算电路3由常数发生电路21、比较电路22、正负判断电路23、多路转换器24、以及零值发生电路25组成。在这些构成要素中,虽然连接来自译码器13的控制线,但因会使图示烦乱,所以做了省略。
常数发生电路21当由指令读出电路12读出的指令若是正值饱和运算指令“MCSST”,在译码器13解码的情况下,根据该指令正值幅度-饱和幅度指定字段的内容,产生8位无码数值、16位无码数值、24位无码数值正的最大值。正值幅度-饱和幅度指定字段的指定内容是8位的情况下,向多路转换器24输出作为8位无码数值的最大值的带32位码整数0x000000FF;正值幅度-饱和幅度指定字段的指定内容是16位的情况下,向多路转换器24输出作为16位无码数值的最大值的带32位码整数0x0000FFFF;在正值幅度-饱和幅度指定字段的指定内容为24位的情况下,向多路转换器24输出作为24位无码数值的最大值的带32位码整数0x00FFFFFF。
比较电路22比较由积和结果专用寄存器6保持的值和由常数发生电路21输出的最大值大小。这比较是通过从保持在积和结果专用寄存器6中的值中减去由常数发生电路21输出的最大值,并检测相减结果、是否产生借位进行的。其中,当正值幅度-饱和幅度指定字段的指定内容为8位的情况下,从积和结果存储用寄存器6的保持值中减去作为8位无码数值的最大值的带32位码整数0x000000FF;还有当正值幅度-饱和幅度指定字段的指定内容为16位的情况下,从积和结果存储用寄存器6的保持值中减去作为16位无码数值的最大值的带32位码整数0x0000FFFF;当正值幅度-饱和幅度指定字段的指定内容为24位的情况下,从积和结果存储用寄存器6的保持值中减去作为24位无码数值的最大值的带32位码整数0x00FFFFFF。
检测象这样相减的借位结果,如若判定为积和值存储用寄存器6保持的值超过最大值,则向多路转换器24输出逻辑值“1”;如若判定为积和值存储用寄存器6保持的值等于最大值或小于此,则向多路转换器24输出逻辑值“0”。
正负判断电路23判定由积和结果专用寄存器6保持的值的码位是否为ON。其中在正值饱和运算指令“MCSST”的正值幅度-饱和幅度指定字段的指定中,具有24位无码数值、16位无码数值、8位无码数值三种,根据字段指定的情况改变码位的位置。于是,正负判断电路23根据正值饱和运算指令“MCSST”的正值幅度-饱和幅度指定字段的指定,变更应判定ON的位。
其中,正负判断电路23的作用是,正值饱和运算指令“MCSST”的正值幅度-饱和幅度指定字段的指定若为24位无码数值,则从下位判定第24位是否为ON;正值饱和运算指令“MCSST”的正值幅度-饱和幅度指定字段的指定若为16位无码数值,则从下位判定第16位是否为ON;正值饱和运算指令“MCSST”的正值幅度-饱和幅度指定字段的指定若为8位无码数据,则从下位判定第8位是否为ON。这种判断意味着是,在用根据正值饱和运算指令“MCSST”的正值幅度-饱和幅度指定字段的指定的值表达存储在积和结果专用寄存器6中的积和值的情况下,是否作为负数表达的判断。当为负数情况下,向多路转换器24输出逻辑值“1”。当保持的值为零或正数的情况下,向多路转换器24输出逻辑值“0”。
若解码结果为正值饱和运算处理指令“MCSST”,则零值发生电路25产生整数“0x0000_0000”。
多路转换器24根据由比较电路22及正负判断电路23输出的逻辑值的组合,选择性输出常数发生电路21产生的最大值、零值发生电路25产生的零值“0x0000_0000”、由积和结果专用寄存器6保持的寄存器文件1的保持值中的任一个。
这里,设从比较电路22输出的逻辑值为逻辑值x,设从正负判断电路23输出的逻辑值为逻辑值y,这些逻辑值的组合和多路转换器24输出值的对应关系象图9的真值表那样表达(在图9的真值表中,设常数发生电路21产生的最大值为“0x0000_00FF”)。
根据图9的真值表,在比较电路22的输出为“0”,正负判断电路23的输出为“0”的情况下、多路转换器24输出积和结果专用寄存器6的保持值。
在比较电路22的输出为“1”,正负判断电路23的输出为“0”的情况下,多路转换器24输出常数判断电路21产生的最大值“0x0000_00FF”)。
在比较电路22的输出为“0”,正负判断电路23的输出为“1”的情况下,多路转换器24输出零值发生电路25产生的零值“0x0000_0000”。在比较电路22的输出为“1”,正负判断电路23的输出为“1”的情况下,多路转换器24输出零值发生电路25产生的零值“0x0000_0000”。
图10及图11是表示运算装置14的数据流程的说明图。在图10中,规定对在乘数、被乘数的读出端上指定数据寄存器D0及数据寄存器D1的带积和功能乘法指令“MACCB D0,D1”由译码器13解码。这时,存储在寄存器文件1中的数据寄存器D0的保持值“0x0000007F”及数据寄存器D1的保持值“0x00000070”沿第一内部总线15及第二内部总线16传输,提供给码扩展电路4和码扩展电路5。在算术逻辑运算电路2(这里,由于算术逻辑运算电路2的动作是乘法,所以在图中把算术逻辑运算电路2记述成“乘法器。”)中作从码扩展电路4和码扩展电路5输出的32位数值之间的乘法,向积和结果存储用寄存器6输出作为其相乘结果的64位数值“0x0000_0000_0000_3790”的下位32位“0x0000_3790”。根据正值饱和运算指令“MCSST D1”,积和结果存储用寄存器6一旦向正值饱和运算电路3输出其保持值,则正值饱和运算电路3判断其32位“0x0000_3790”比无码8位数值的最大值“0x000000FF”要大,通过数据总线18把无码8位数值的最大值“0x000000FF”保存在寄存器文件1内的数据寄存器D1中。
在图11中,规定对在乘数、被乘数的读出端上指定数据寄存器D0及数据寄存器D1的带积和功能乘法指令“MACCB D0,D1”由译码器13解码。这时,存储在寄存器文件1中的数据寄存器D0的保持值“0x0000007F”及数据寄存器D1的保持值“0x00000080”沿第一内部总线15及第二内部总线16传输,提供给码扩展电路4和码扩展电路5。数据寄存器D1的保持值“0x00000080”由于是8位数值的负数,所以码扩展电路5把数据寄存器D1的保持值“0x00000080”的第8位的码位扩展为9~32位,形成“0xFFFF_FF80”,向算术逻辑运算电路2输出。
码扩展电路4输出的数据寄存器D0的32位长的保持值“0x0000007F”和由码扩展电路5扩展的32位数值“0xFFFF_FF80”的算术逻辑电路2中相乘,把作为其乘算结果的64位数值“0xFFFF_FFFF_FFFF_C080”的下位32位“FFFF_C080”向积和结果存储用寄存器6输出。利用正值饱和运算指令“MCSSTD1”的解码,如若积和结果存储用寄存器6将其保持值向正值饱和运算电路3输出,则正值饱和运算电路3判定其32位“FFFF_C080”是带码16位数值的负数,通过数据总线18把8位数值的零值“0x00000000”保持在寄存器文件1内的数据寄存器D1中。
下面,对如上构成的处理器,根据行列积子程序的动作状态进行说明。利用指令读出电路12把包括在行列积子程序中的传输指令向译码器13内的指令缓冲器内读出,译码器13使读出的指令5:“MOV(A0),D0”解码。该指令5:“MOV(A0),D0”利用地址寄存器A0,使用指定读出端的寄存器间接参照,作为指出通过RAM 10的数据读出的指令,据此在数据寄存器D0上读出由存储在RAM 10中的8×8行列状成份组成的压缩数据Fij的一行一列成份(F11)。根据配置在指令5:“MOV(A0),D0”之后的指令6:“MOV(A1),D1”的执行,通过数据总线18在寄存器文件1内的数据寄存器D1上读出8×8系数数据Gji的一行一列成分(G11)。
在行列积子程序中,与指令5:“MOV(A0),D0”及指令6:“MOV(A1),D1”相接续作为指令7排列好带积和功能乘法指令“MACCB D0,D1”,通过指令读出电路12将此向译码器13内的指令缓冲器内读出,译码器13使读出的带积和功能乘法指令“MACCB D0,D1”解码。根据解码结果,把保持在数据寄存器D0及数据寄存器D1中的F11,G11向第1内部总线15及第2内部总线16上传输。
在带积和功能乘法指令“MACCB D0,D1”的解码中,向第1内部总线15及第2内部总线16传输用带积和功能乘法指令“MACCB D0,D1”的第一操作数及第二操作数指定了的读出端寄存器的保持值F11,G11。将这些通过码扩展电路4及码扩展电路5输出,利用算术逻辑运算电路2使数据寄存器D0的保持值和数据寄存器D1的保持值相乘。乘算结果“G11*G11”被传输到积和结果专用寄存器6,用积和结果专用寄存器6保存。
一旦在积和结果专用寄存器6中存储乘法结果“F11*G11”,则利用指令8:“CMP NOM BER,D2”及指令9:“BCS LP1_NEXT”的执行,向标号LP1_NEXT分路,使指令13:“ADD1,D2”解码。该指令13:“ADD 1,D2”增加重复次数。在指令13:“ADD1,D2”执行之后,执行指令14:“ADD1,A0”及指令15:“ADD ROW1,A1”。指令14:“ADD1,A0”及指令15:“ADD ROW1,A1”的配置目的是使ROM11的读出端地址转移至下列及下行。利用这些指令的增加,压缩数据Fij的读出端地址成为2行1列,系数数据Gji的读出端地址成为1行2列。
在读出端地址增量之后,使指令14:“ADD1,A0”及指令15:“ADD ROW1,A1”之后配置的指令16:“BRA LP1_START”解码。
该指令16:“BRA LP1_START”的分支端地址是付加标号LP1_START的指令5:“MOV(A0),D0”,利用指令16:“BRA LP1_START”产生的分支再次读出指令5:“MOV(A0),D0”、指令6:“MOV(A1),D1”。
利用读出的传输指令在数据寄存器D0上读出由在RAM10中存储的8×8行列状成分组成的压缩数据的2行1列成分(F21),通过数据总线18在寄存器文件1内的数据寄存器D1上读出8×8系数数据的1行2列成分(G12)。
在行列积子程序上接着传输指令并列好带积和功能乘法指令“MACCB D0,D1”,对此利用指令读出电路12向译码器13内的指令缓冲内读出,利用译码器13使读出的带积和功能乘法指令“MACCB D0,D1”解码。根据解码结果向第1内部总线15及第2内部总线16上传输数据寄存器D0及数据寄存器D1的保持值。
在带积和功能乘法指令“MACCB D0,D1”解码时,向第1内部总线15及第2内部总线16传输由带积和功能乘法指令“MACCB D0,D1”的第一操作数及第二操作数指定的读出端寄存器的保持值。这些是行列成分G12,F21,用算术逻辑运算电路2作数据寄存器D0保持值G12和数据寄存器D1的保持值F21的乘算。另一方面在积和结果专用寄存器6上存储至此积和的单项式运算结果“G11*F11”。积和值存储用寄存器6通过带积和功能乘法指令“MACCB D0,D1”的解码,将其保持值向总线P1上输出。
由于在总线P1上传输积和结果专用寄存器6的保持值,所以数据寄存器D0至数据寄存器D1的乘法结果“G12*F21”成为与总线P1上的积和结果专用寄存器6的保持值的加算。加法结果向总线P2上输出。
当利用算术逻辑运算电路2作总线P1上保持值“G11*F11”和乘法结果“G12*F21”相加,则虽然在总线P2上所输出加算结果“G11*F11+G12*F21”,但积和结果专用寄存器6输出的输出加算结果,作为积和值“G11*F11+G12*F21”保持。
就有关由8×8行列状态成分组成的压缩数据Fij第一列全部成分、8×8系数据数据Gji第一行全部成分使以上处理重复。通过这种重复,结束“G11*F11+G12*F21+G13*F31+G14*F41+G15*F51+G16*F61+G17*F71+G18*F81”的积和运算,在积和结果专用寄存器6中得到积和值。其中要注意的是,在RAM10中存储着的F31,由于实际上在传输时引起错位,所以保持在积和结果专用寄存器6中保持的积和值用重放系统硬件大大超过重放可能的范围的数值(“0x000078FF”)表达。
然而,ROM11内的行列积子程序不能忽视象这样的错位,在作带积和功能乘法指令“MACCB D0,D1”的重复的循环语句之后配以正值饱和运算指令“MCSSTD1”。
在ROM 11中,循环语句后配的正值饱和运算指令“MCSST D1”一旦给译码器13内指令缓冲器读出,则利用译码器13使正值饱和运算指令“MCSST D1”解码。
在正值饱和运算指令“MCSST D1”被解码的情况下,积和结果专用寄存器6向总线P1上输出保持值(0x000078FF)。
一旦向总线P1输出,则由译码器13使比较电路22启动。比较电路22比较积和结果专用寄存器6的保持值和带32位码整数0x000000FF的大小。这时,由于积和结果专用寄存器6的保持值超过最大值0x000000FF,所以将逻辑值“1”向多路转换器24输出。
正负判断电路23从由积和结果专用寄存器6保持着的值的低位判定第16位是否ON。该判断意味着在积和结果专用寄存器6中存储着的积和值是否负数。保持值(0x000078FF)的2进数表达是(0000_0000 0000_0000 0111_10001111_1111),从下位由于第16位是“0”,所以向多路转换器24输出上述值“0”。
这时,虽然由常数发生电路21及零值发生电路25产生上限值“0x0000_0FF”及零值“0x0000_0000”,但多路转换器24通过从比较电路22及正负判断电路23输出的逻辑值组合,有选择性地输出上限值,零值、积和结果专用寄存器6的保持值的任一个。该情况下比较电路22的输出为“1”,正负判断电路23的输出为“0”,所以多路转换器24向数据总线18上输出常数发生电路21产生的最大值“0x0000_00FF”。
利用译码器13的控制,在数据总线18上输出的保持值被向由正值饱和运算指令“MCSST D1”的操作数据定的数据寄存器D1传输,由数据寄存器D1保持。保持的保持值作为行列积Hij的第一行一列的成分(H11)被写入RAM 10内。
压缩数据Fij的第一列全部成分与Gji的第一行全部成分之积和运算结束。接着进行有关压缩数据Fij的第2列全部成分和Gji的第一行全部成分的积和运算,“G11*F12+G12*F22+G13*F32+G14*F42+G15*F52+G16*F62+G17*F72+G18*F82”的积和运算结束,在积和结果专用寄存器6中得到积和值。
要注意的是,PAM 10中存储的F32实际上在传输时产生错位,在积和结果专用寄存器6中存储的积和值用重放系统硬件不可能重放的负数(“0x000086FF”)表达。
ROM 11若从ROM 11在译码器13内的指令缓冲器中读出配置在循环词句后的正值饱和运算指令“MCSST D1”,则由译码器13使正值饱和运算指令“MCSSTD1”的操作数解码。
当使正值饱和运算指令“MCSST D1”解码的情况下,积和结果专用寄存器6向总线P1上输出保持值(0x000086FF)。
一旦向总线P1输出,则由译码器13使比较电路22启动。比较电路22比较积和结果专用寄存器6的保持值和带32位码整数0x000000FF的大小。这时,由于积和结果专用寄存器6的保持值超出最大值0x000000FF,则向多路转换器24输出逻辑值“1”。
正负判断电路23判定由积和结果专用寄存器6保持的值的第16位是否ON。这判定意思是在积和结果专用寄存器6中存储的积和值是否为负数。保持值(0x000086FF)2进制表达是(0000_0000 0000_0000 1000_01101111_1111),因第16位为“1”,所以向多路转换器24输出逻辑值“1”。
这时,虽然由常数发生电路21及零值发生电路25产生上限值“0x0000_00FF”及零值“0x0000_0000”,但多路转换器24利用从比较电路22、正负判断电路23输出的逻辑值的组合有选择性地输出这些或积和结果专用寄存器6的保持值。在该情况下比较电路22的输出为“1”,正负判断电路23的输出为“1”,所以多路转换器24向数据总线18上输出常数发生电路21发生的最大值“0x0000_0000”。
利用译码器13的控制向数据总线18上输出的保持值被输送至由正值饱和运算指令“MCSST D1”的操作数指定的数据寄存器D1,由数据寄存器D1保持。被保持的值作为行列积Hij的第1行2列成分(H12)写入ROM 11内。
重复同样的行列积成分的写入,在RAM 10内得到列积结果,把该行列积结果作为反DCT近似计算结果利用,成为压缩数据的扩展处理。
图12B表示这样的状态,利用由把机器语言指令表示为指令读出步、指令解码步、执行步、存储器存取步、寄存器写入部的五级组成的流水线,处理器执行行列积例行程序。由译码器13产生的指令10“MCSST D1”的指令读出步骤与其前面的机器指令9:“BCS LP1_NEXT的指令解码步骤同时进行。在指令8:“CMP NUMBER,D2”中,作从在数据寄存器D2中存储的重复次数减总次数NUMBER的运算,所以相减的结果进位标志若为ON,则为了向指令13:“ADD1,D2”分路,中断向指令10:“MCSST D1”的执行步骤转移。
与此相反,若进位标志为OFF,则在与指令9:“BCS LP1_NEXT”执行步骤同时,作指令10:“MCSST D1”的解码。接着在与指令9:“BCS LP1_NEXT”的存储器写入步骤同时,进行指令10:“MCSST D1”的执行步骤。有关一行成分X一列成分的行列积结果的正值饱和运算处理由于在位于其前的指令的存储器写入步骤中执行,所以不打乱流水线进行,这一点是清楚的。
象这样内装正值饱和运算电路3的处理器对一行成分X一列成分的行列积结果即便必须使成分高频率进行,在机器语言程序中由于正值饱和运算修正处理作为一指令表达,所以也不打乱流水线。从而可使处理器整体处理可高速化。
如上所述,根据本实施例,利用用于积和值正值饱和运算处理的专用指令,对在积和结果专用寄存器6内得到的积和值施加正值饱和运算处理,所以在图象数据、声音数据的扩展处理中必要的行列积近似计算的应用程序可更容易地进行编码,其码量也变得非常少。由于减少该码量,在把程序装在ROM中的情况下,可减少其安装量。
还有,积和值的正值饱和运算处理由于对存储在积和结果专用寄存器6中的积和值的正值处理和饱和运算处理同时进行,所以速度高。正值饱和运算处理在行列积运算的1行成分×1列成分的计算时是必须的,在8×8行列之间的行列积中,虽然64次的正值饱和运算处理执行是必要的,但如上所述,由于正值处理及饱和运算处理非常平稳地进行,所以每次正值饱和运算处理以短时结束。象这样,由于正值饱和运算处理以短时结束,所以扩大的数的行列积重复必要的图象数据、声音数据的扩展处理可更高速地进行。
还有由于通过安装正值饱和运算电路3,不用分支指令可记述正值处理-饱和运算处理,所以在处理器内部执行根据流水线的高速化情况下,不打乱流水线,可求得指令串的高速。可谋求根据高性能流水线执行产生的指令串执行的高速化。
加之,由于不安装实现行列积运算的专用电路,进行正值饱和运算处理,所以保留处理器特有的通用性。因此可按要求用独立的扩展处理器控制处理器。
第1实施例的应用
本应用例的内容是在由正值饱和运算指令“MCSST”产生的正值饱和运算处理的读出端上指定数据寄存器D0~D2,在运算结果存储端上指定积和结果存储用寄存器6。图13表示本应用例的正值饱和运算指令“MCSST”的指令形式。图13的正值饱和运算指令MCSST具有读出端指定字段,写入“11”、“00”、“10”、“01”的值,借此可把积和值读出端变更为积和结果存储用寄存器6、数据寄存器D0、D1、D2的任一个。
存储端指定字段通过写入“11”、“00”、“01”、“10”,在存储端上指定积和结果存储用寄存器6、数据寄存器D0、D1、D2中的任一个。
由于改变正值饱和运算指令“MCSST”的指令形式,所以图4所示运算处理装置14内部作如图14所示变更。在图14中,加在运算处理装置14上的变更点是追加总线C6、C7、C8及选择器30的点。
总线C6用于把在第2内部总线15传输的数据寄存器D0、D1、D2的保持值向正值饱和运算电路3传输。
总线C7与总线C6一样用于把在第1内部总线15上传输的数据寄存器D0、D1、D2的保持值向正值饱和运算电路3传输。
选择器30根据正值饱和运算指令“MCSST”的存储端字段的指定选择性地向正值饱和运算电路3内的比较器22,输出在总线C6及C7传输的数据寄存器D0、D1、D2保持值、积和结果存储用寄存器6的保持值的任一个。
总线C8的用途是把通过总线C4从正值饱和运算电路3向数据总线18输出的正值饱和运算电路3的处理结果,传输到积和结果存储用寄存器6。
利用以上简易追补,在本应用例中可实现正值饱和运算指令“MCSST”的功能扩展。
第2实施例是这样的例子,在算术逻辑运算电路2作乘法运算时,进行对乘法结果的正值饱和运算处理。为了作乘法运算结果正值饱和运算处理,在第2实施例中,如图15的内部构成图所示,为了使算术逻辑运算电路2对输出的乘法结果作正值饱和运算,通过总线P3使正值饱和运算电路3与算术逻辑运算电路2的输出部分连接。为了使这样连接的正值饱和运算电路3启动,在本实施例中,存储于ROM 11中的压缩数据扩展程序包括以下的“MULBSST Dm,Dn”。
所谓“MULBSST Dm,Dn”是把对乘法结果的正值饱和运算处理作为扩展功能指定的乘法指令。即使用寄存器Dm和Dn的下位8位作乘算,对于作为乘法结果的带码16位数值,在正值饱和运算电路3中也称作8位正值饱和运算处理。
图16是表示带正值饱和运算乘法指令“MULBSST Dm、Dn”的形式的图,如图16所示,“MULBSST Dm,Dn”包括2位长单项式运算内容指定字段、2位长乘数读出端指定字段、2位长被乘数读出端指定字段和正值饱和运算结果的存储端指定字段。
正值饱和运算处理字段利用写入“01”、“10”、“11”,把正值饱和运算处理修整幅度指定为24位正值、16位正值和8位正值中的任一个。
乘数读出端指定字段及被乘数读出端指定字段通过写入“00”、“01”、“10”、“11”,从数据寄存器D0、D1、D2及积和结果专用寄存器6的任一个中,指定乘数Fij、被乘数Gji的读出端寄存器。
一旦执行带正值饱和运算乘法指令“MULBSST Dm,Dn”,则寄存器文件1输出用第一操作数及第二操作数指示的寄存器名的保持值。接着运算电路2使寄存器Dm和Dn之值相乘,输出其相乘结果,利用第1实施例同样正值饱和运算电路3作对其乘法结果的正值饱和运算处理,把正值饱和运算处理结果传输到由正值饱和乘法指令第二操作数指定的寄存器。
说明如上构成的处理器根据行列积子程序工作的状态。利用读出电路12向译码器13内的指令缓冲器内读出包括在行列积子程序中的传输指令,译码器13使读出的传输指令解码。据此,由在RAM 10中存储的8×8行列状成分组成的压缩数据Fij的1行1行成分(F11)在数据寄存器D0上被读出,8×8系数数据Gji的1行1列成分(G11)通过数据总线18在寄存器文件1内数据寄存器D1上被读出。
在行列积子程序中,接着传输指令并列带正值饱和运算乘法指令“MULBSSTD0,D1”,由指令读出电路12将此向译码器13内指令缓冲器内读出,译码器13使带读出的正值饱和运算乘法指令“MULBSST D0,D1”解码。根据解码结果,数据寄存器D0及D1中保持的F11,G11被传输到第1内部总线15及第2内部总线16上。
由于在带正值饱和运算乘法指令“MULBSST D0,D1”的解码时,向第1同部总线15及第2内部总线16上传输用带正值饱和运算乘法指令“MULBSST D0,D1”的第一及第二操作数指定的读出端寄存器保持值F11,G11,所以用算术逻辑运算电路2作数据寄存器D0保持值和数据寄存器D1值持值的乘法,将其结果向总线P1上输出(还有,上述F11产生错位,G11*F11的乘法结果称为“0x000078FF”,成为不能用1个字节表达的数值。)
另一方面,译码器13一旦使带正值饱和运算乘法指令“MULBSST D0,D1”解码,则译码器13使正值饱和运算电路3启动。通过该启动,与第1实施例一样由比较电路22比较积和结果专用寄存器6的保持值和带32位码整数0x000000FF的大小。这种情况下,由于积和结果专用寄存器6的保持值超过最大值0x000000FF,所以比较器22向多路转换器24输出逻辑值“1”。
正负判断电路23判断由积和结果专用寄存器6保持的值的第16位是否为ON。该判断意思是,存储在积和结果专用寄存器6中的积和值是否为负数。保持值(0x000078FF)的二进制表达为(0000_0000 0000_0000 0111_10001111_1111),第16位由于是“0”,所以向多路转换器24输出逻辑值“0”。
这时,利用常数发生电路21及零值发生电路25,虽然产生上限值“0x0000_00FF”及零值“0x0000_0000”,但多路转换器24利用由比较电路22、正负判断电路23输出的逻辑值的组合有选择性地输出上限值、零值、积和结果专用寄存器6的保持值中的任一个。该情况下的比较电路22的输出为“1”,正负判断电路23的输出为“0”,所以多路转换器24向数据总线18上输出常数发生电路21产生的最大值“0x0000-00FF”。
通过译码器13的控制,向数据总线18上输出的保持值被向由正值饱和运算指令“MULBSST D0”的操作数指定的数据寄存器D0传输,由数据寄存器D0保持。
根据上述第2实施例,利用准备同时作对带码运算结果的饱和运算处理和正值处理的运算指令,在1个步骤中可作3个运算处理、正值处理、饱和运算处理,以此,正值饱和运算处理与运算处理在同一步骤进行。因此,正值饱和运算处理执行步骤数实质为0。
此外,在本发明的第2实施例中,虽然以无码8位幅度作修整,但上限值也可设定为任意正整数值。