部分逐位置换的制作方法

文档序号:6356616阅读:152来源:国知局
专利名称:部分逐位置换的制作方法
技术领域
本发明涉及用于在微处理器中执行部分逐位置换的技术。
背景技术
随着工业趋势趋向于更大更复杂的指令集,精简指令集计算机(RISC)体系结构被开发出来。通过简化指令集设计,RISC体系结构使得使用像流水线和高速缓存这样的技术更加容易,从而提高系统性能。
RISC体系结构的指令通常是固定长度的(例如,16-位、32-位或64-位),指令格式很少变化。指令集结构(ISA)中的每条指令都可以具有总是在相同位置的源寄存器。例如,32-位ISA可以总是具有由16-20位和21-25位指定的源寄存器。这允许为每条指令取指定的寄存器而不需要进行任何复杂的指令译码。

发明内容
密码系统(“cryptosystem”)正日益用来保护事务、加密通信、鉴别用户并保护信息。
很多密钥加密系统,例如数字加密标准(DES),对数据块执行异或、循环和置换的序列操作的硬件解决方案来说,在计算上相对简单并且经常可简化。
在一个通用方面,在指令集体系结构中提供了用于执行部分逐位置换的指令。该指令包括标识该指令为部分置换指令的操作码和置换操作规范。置换操作规范包括标识目标寄存器的目标说明符、先前的部分值的源说明符、目标子集说明符和控制说明符。目标子集说明符标识目标寄存器的一个或多个目标位,控制说明符为标识出的目标位中的每一位标识源。该指令通过执行由置换操作规范定义的部分逐位置换加以处理。
实施方案可以包括显式或隐式地标识目标寄存器的目标说明符。目标寄存器可以被指定为微处理器的乘/除单元中的累加器和/或通用寄存器。同样,部分值的源说明符可以隐式或显式地标识先前部分值的源寄存器。先前的部分值的源寄存器可以被指定为累加器和/或通用寄存器。另外,目标寄存器和先前的个部分值的源寄存器也可以被标识为相同的寄存器。
在一些实施方案中,目标子集说明符标识目标寄存器中的一个连续的位块。该连续的位块可以包括目标寄存器的最低有效位。不同的实施方案可以在该连续的位块中包括1-6位或者更多位。
控制子集说明符可以包括一个或多个源位说明符,还可以包括一个掩码和一个缺省位。另外,控制子集说明符可以作为指令内的一个字段加以存储或被存储在通用寄存器中字段。
实施方案可以包括在RISC指令集中提供部分置换指令。
在附图和下面的描述中将阐明一种或多种实施方案的细节。从描述、附图以及权利要求中也可以明显地看到其它特性和优点。


图1是可以用在RISC体系结构中的一种示例性五步流水线的框图。
图2是包括执行单元和乘/除单元的处理器核心的框图。
图3是在一种支持二进制多项式算术的乘/除单元中实现的数据通路图。
图4是在一种实施方案中支持算术和二进制多项式乘法的乘法器阵列的框图。
图5是可以用在图4所示的实施方案中的算术乘法器阵列的框图。
图6是可以用在图4中所示的实施方案中的二进制多项式乘法器的框图。
图7A是描述在一种实施方案中的32-位乘16-位的操作的时序图。
图7B是描述在一种实施方案中的32-位乘32-位的操作的时序图。
图7C是描述在一种实施方案中的除法操作的时序图。
图8是实现用于执行乘法指令的步骤的有限状态机。
图9是实现用于执行除法指令的步骤的有限状态机。
图10A是具有四个操作数的示例性部分置换指令的指令编码。
图10B是一种用于诸如图10A中所示的部分置换指令的操作数的示例性控制字编码格式。
图11A和11B是不使用控制字操作数的示例性部分置换指令的指令编码。
图12A是隐式地使用乘/除单元的寄存器的示例性部分置换指令的指令编码。
图12B是一种用于诸如图12A中所示的部分置换指令的操作数的示例性控制字编码格式。
图13A是隐式地使用乘/单元的寄存器的另一条部分置换指令的指令编码。
图13B是一种用于诸如图13A中所示的部分置换指令的示例性控制字编码格式。
具体实施例方式
一些加密操作,例如数字加密标准(DES)(以及准备用来代替DES的高级加密标准(AES)的几个候选标准),对数据值执行某种程度的逐位置换。这些很难映射到传统微处理器指令集体系结构的操作用硬件可以非常有效地实现。然而,国家标准与技术局还处在创建新的AES标准过程中。因此,不太确定在将来会使用哪些算法。至少对于这个原因来说,希望提供支持逐位置换的微处理器,其可以用于提升像分组密码这样的加密算法的性能。
参考图1,图1描述了一种可以用来实现多项式乘法的示例性微处理器体系结构,它包括一个五步流水线,在该流水线中每条指令都被以固定的时间来执行,例如四个时钟周期。每条指令的执行被分为五步取指令(IF)步1001、寄存器读(RD)步1002、算术/逻辑单元(ALU)步1003、存储器(MEM)步1004和写回(WB)步1005。在IF步1001,从指令高速缓冲存储器中取出指定的指令。该取出的指令的一部分被用来指定在执行该指令中可以被使用的源寄存器。在寄存器读(RD)步1002,系统取出所述指定的源寄存器的内容。这些取出的值可以被用来在ALU步1003中执行算术或逻辑操作。在MEM步1004,执行中的指令可以读/写数据高速缓冲存储器中的存储器。最后,在WB步1005,由指令执行而获得的值可以被写回到一寄存器中。
因为一些操作例如浮点计算和整数乘/除不能在一个时钟周期内加以执行,所以一些指令仅仅开始一指令的执行。在经过了足够的时钟周期后,可以用另一条指令来取回结果。例如,当一条整数乘法指令用了五个时钟周期时,一条指令可以启动乘法计算,另一条指令可以在乘法操作完成以后把乘法操作的结果装入寄存器。如果乘法操作在请求结果时仍然没有完成,则流水线将停下来直到获得该结果为止。
参考图2,通过实例提供了一种示例性的RISC体系结构。处理器核心200(也称作“微处理器核心”)包括以下部件执行单元2010、乘/除单元(MDU)2020、系统控制协处理器(CP0)2030、存储管理单元2040、高速缓冲存储器控制器2050和总线接口单元(BIU)2060。在图2中,MDU2020是组合的乘/除单元;不过,其它实施方案也可以提供相互独立的乘和除单元。
执行单元2010是处理器核心2000中用于执行指令的主要机构。执行单元2010包括寄存器堆2011和算术逻辑单元(ALU)2012。在一种实施方案中,寄存器堆2011包括32个可以用在例如标量整数操作和地址计算中的32-位通用寄存器。寄存器堆2011包括两个读端口和一个写端口,而且可以被完全绕过以使该流水线中的操作等待时间为最小。ALU2012支持逻辑和算术操作,例如加、减和移位。
MDU2020包括三个可以供各种操作使用的寄存器(ACX2021、HI2022和LO 2023)。根据一种实施方案,这三个寄存器可以被一起使用来保存最多72-位的值。在一种实施方案中,LO寄存器2023和HI寄存器2022均是32-位宽并且用作MDU2020的专用输出寄存器。在一种实施方案中,ACX寄存器2021在HI/LO寄存器对已经提供的精度之外还提供8-位额外的整数精度。精确的位数随实现而变,但优选的最小位数是2位。对具有32位数据通路的处理器来说,ACX寄存器的优选的最大位数是32位。与此相反,对具有64位数据通路的处理器来说,ACX寄存器的优选最大位数是64位。因此,在具有32-位宽的HI和LO寄存器的处理器中,ACX/HI/LO的组合能够保存64或以上位的连接的值。MDU2020可以用来执行各种操作,包括下列指令中的一些或全部DIV、DIVU、MADD、MADDU、MFHI、MFLO、MSUB、MSUBU、MTHI、MTLO、MUL、MULT、MULTU、MFLHXU、MTLHX、MADDP、MULTP和PPERM。
指令MUL、MULT和MULTU可以被用来把两个32-位数一起相乘。对MUL指令来说结果被存储在一个指定的寄存器中,对MULT和MULTU指令来说,结果被存储在HI/LO寄存器中。例如,“MUL$7,$6,$5”把寄存器$6和$5的内容相乘并把结果存储在寄存器$7中。指令“MULT$6,$5”把寄存器$6和$5的内容相乘并把结果存储在HI/LO寄存器中。MULTU指令执行和MULT相同的操作,MULTU应用于无符号操作数,而MULT应用于带符号操作数。另外,MULTU指令把ACX寄存器清为全零。
指令DIV和DIVU执行除法操作并把结果存储在ACX/HI/LO寄存器中。例如,“DIV $6,$5”用寄存器$6的内容除以寄存器$5的内容并把产生的余数和商存储在HI/LO寄存器中。DIVU指令对无符号操作数执行相同的操作。
指令MSUB、MSUBU、MADD和MADDU可以用来把两个寄存器的内容相乘然后把所得的乘积与ACX/HI/LO寄存器的内容相加或相减。例如,“MSUB $6,$5”把寄存器$6和$5的内容相乘,从ACX/HI/LO寄存器的内容中减去所述乘法的结果,然后把结果值存储在ACX/HI/LO寄存器中。MADD指令同样把两个寄存器的内容相乘,然后把结果加到ACX/HI/LO寄存器,并把结果存储在ACX/HI/LO寄存器中。MSUBU和MADDU对无符号操作数执行类似的操作。在一些实施方案中,ACX寄存器并不用于一些操作,上述操作之后的ACX寄存器的内容可以不加以定义。
MFHI、MFLO、MTHI、MTLO、MFLHXU和MTLHX被用来在ACX/HI/LO寄存器和通用寄存器之间移动数据。第一条指令MFHI把HI寄存器的内容装入到一个通用寄存器中。例如,“MFHI$5”把HI寄存器的内容装入到寄存器$5中。同样,MFLO把LO寄存器的内容装入到一个通用寄存器中。相反,指令MTHI和MTLO被用来把一个通用寄存器的内容装入到HI或LO寄存器中。例如“MTH I$5”把寄存器$5的内容装入到HI寄存器中。
在一种实施方案中,ACX寄存器的内容是不能够直接访问的。为了间接地访问ACX寄存器,存储在ACX/HI/LO寄存器中的值可以被左移或右移。例如,“MFLHXU$5”把ACX、HI和LO寄存器的内容右移一个寄存器位置,把LO寄存器的内容装入到寄存器$5中。因而,在执行该操作之后,ACX寄存器为0。HI寄存器包含ACX寄存器先前的内容,LO寄存器包含HI寄存器先前的内容,寄存器$5包含LO寄存器先前的内容。因为8-位的ACX寄存器的内容被装入到了32-位寄存器中,因而在装入HI寄存器之前,该8-位值可以被零扩展到32-位。
MTLHX执行相反的操作。例如,“MTLHX $5”用HI寄存器先前的内容装载ACX寄存器,用LO寄存器先前的内容装载HI寄存器,并用寄存器$5的内容装载LO寄存器。
PPERM操作执行在寄存器中所指定的置换操作,结果存储在ACX/HI/LO寄存器中。例如,“PPERM$5,$6”使ACX/HI/LO寄存器左移6位。然后,按照寄存器¥6指定的从寄存器$5选取低6位。特别地,寄存器$6的32-位内容被用来选择寄存器$5的哪些位将被用来填充ACX/HI/LO寄存器的低位。因为寄存器$5中有32位,所以需要5位来指定32位中的一个特定位。例如,“01101”是对应13的二进制。因而,这五个位可以指定位13。同样,“00000”是对应0的二进制数,“11111”是对应31的二进制表示。因而,可以用一个5-位的说明符来指定这32-位中的任意一位,用30位(即,6个5-位的说明符)可以指定6个位。
寄存器$6可以以如下方式指定寄存器$5中用来填充ACX/HI/LO寄存器的低位的那些位0-4位用来指定位0的源,5-9位用来指定位1,位10-14用来指定位2,位15-19用来指定位3,位20-24用来指定位4,以及位25-29被用来指定位5。其余位30-31可以不用。因而,该指令是使用所描述的说明符以便用来自寄存器$5的指定的位来填充LO寄存器的最低6位而被执行的。
最后,MULTP可以用来执行二进制多项式乘,并且MADDP可以用来执行二进制多项式乘并把结果加到ACX/HI/LO寄存器上。这些操作与MULT和MADD类似,只是对二进制多项式操作数进行操作而已。
MULTP和MADDP的多项式操作数被编码在32-位寄存器中,每一位表示多项式的系数。例如,多项式“x4+x+1”可以被编码为“10011”,因为x3和x2的系数为“0”,其余系数为“1”。MULTP指令执行两个操作数的二进制多项式乘法。例如(x4+x+1)(x+1)=x5+x4+x2+2x+1减去多项式模2,得到x5+x4+x2+1。如果按照上述二进制表示对该多项式进行编码,相同的乘法操作可以表示为(10011)(11)=110101。
MADDP指令就像MULTP一样执行乘法操作,并且然后把结果加到ACX/HI/LO寄存器。多项式加法可以用逐位XOR来执行。例如,二进制多项式加法(x4+x+1)+(x+1)得到x4+2x+2。减去系数模2得到x4,可以表示为“100000”。
参考图3,MDU2020接收两个32位操作数,RS和RT。MDU2020使用这些操作数执行所请求的操作并把结果存储在寄存器ACX2021、HI2022和L02023中。图3中描述了可以用来执行这些操作的主要数据通路。RShold寄存器3010和RThold寄存器3012用来保存RS和RT操作数。多路复用器3020、3022和3024用来选择是直接使用RS和RT操作数还是使用存储在RShold寄存器3010和RThold寄存器3012中的值。另外,多路复用器3022可以用来在RT或RThold寄存器3012中所存储的值的低位和高位之间进行选择。
RThold寄存器3012与多路复用器3022相连接。多路复用器3022通过选择RThold 3012的高位、RThold 3012的低位、RT操作数的高位或RT操作数的低位而产生一个16-位的结果。多路复用器3022的输出由布斯(Booth)重编码器3040处理并且被存储在寄存器RTB3042中。布斯重编码是一种允许乘法器阵列对有符号和无符号操作数做同样处理的技术。寄存器RTB3042的输出成为至阵列单元3030的输入SEL3034。
阵列单元3030被用来执行下面参考图4而描述的算术和二进制多项式乘法。阵列单元3030把ACC1 3031、ACC2 3032、M3033、SEL 3034和RThold3012作为输入。输入ACC1 3031和ACC2 3032是累加结果,用于执行乘法并把产生的值加到累加结果或从累加结果减去乘积的操作。输入SEL 3034(由寄存器RTB 3042确定)和M3033(由寄存器RSho1d3010确定)形成用于算术操作的操作数。输入RThold 3012(或者RThold 3012的低位或高位)和M3033(由RShold 3010确定)形成用于多项式操作和置换的操作数。这些输入的组合被用于执行下面所详细描述的各种计算。
阵列单元3030还包括两个输出,结果C 3035和结果S 3036。在执行算术操作中,存储进位加法器(CSA)可以用来构造乘法阵列。存储进位加法器相对独立地计算和以及进位以产生两个输出。这样,结果C 3035和结果S 3036分别代表CSA乘法器阵列的进位以及和输出。在一种实施方案中,ACC1 3031、ACC2 3032、结果C 3035和结果S 3036均长72位,其余的输入至多长32位。输入ACC1 3031和ACC23032可以使用多路复用器3037和3038加以选择。
多路复用器3050和3052被用来选择作为至寄存器CPAA 3054和CPAB 3056的输入的值。例如,多路复用器3050可以用来在结果C3035、CPA 3058的输出或多路复用器3020的输出(即,操作数RS或RShold 3010的输出)之间进行选择。同样,多路复用器3052可以用来在结果S 3036、数值0和多路复用器3024的输出(即,操作数RT或RThold 3012的输出)之间进行选择。寄存器CPAA 3054和CPAB 3056存储至进位传播加法器(CPA)3058的输入。CPA 3058可以用来完成如下所述的乘法操作(乘)和执行迭代除法操作(除)。
寄存器RDM 3060存储CPA 3058的结果。最后,多路复用器3070和3072选择哪些值形成要装入到寄存器ACX、HI和LO中的结果。多路复用器3070可以用来选择ACX/HI/LO寄存器、RDM 3060或CPA 3058的结果。多路复用器3072可以用来相反装入由多路复用器3070选择的结果的各种置换。多路复用器3072可被用来通过允许选择下列值(当被连接时形成72位的值)而执行对ACX/HI/LO寄存器的各种循环和装载(1)ah1,多路复用器3070的72位输出;(2)arl,多路复用器3070的高8位,RShold 3010的内容以及多路复用器3070的低32位;(3)ahr,多路复用器3070的高40位和RShold 3010的内容;(4)hlr,多路复用器3070的低40位以及RShold 3010的内容;以及(5)0ah,多路复用器3070的高40位(前32位为0)。
一些操作导致存储在结果寄存器ACX、HI和LO中的数值被重写。出于这个原因,可以提供一个独立的结果寄存器3080以在没有累加器ACX的情况下存储高位和低位结果。
下面描述的数据通路包括6个主要部分(1)输入寄存和选择;(2)布斯重编码;(3)乘法器阵列和置换逻辑(4)进位传播加法器;(5)结果寄存和选择;和(6)一个用于给出结果的独立的32位输出寄存器。
输入寄存和选择是使用RShold和RThold寄存器来实现的,以保存RS和RT操作数。多路复用器选择是直接使用这些操作数还是使用已经寄存的版本。布斯重编码每次对RT操作数的一半加以执行,以便提供至乘法器阵列和置换逻辑的输入。
布斯记录是一种允许乘法器阵列对有符号数和无符号数给予相同处理的技术。这种技术把操作数“重编码”为从2的下一个最高幂的减法。例如,7可以被布斯重编码为8-1=10002-00012=1001,这里1代表-1。Hennessy和Patterson在附录A“omputer ArchitectureAQuantitative Approach”中描述了布斯重编码,在此将其全部引入为各种目作为参考。
阵列单元3030的一个阵列执行算术乘法,阵列单元3030的一个阵列执行二进制多项式乘法。在一种实施方案中,这两个阵列都是32位乘以16位(32×16),并且这两个阵列根据RT操作数的大小被使用一次或两次(即,在RT是16位长时,合适的阵列就被使用一次,在RT是32位长时,合适的阵列就被使用两次)。CPA可以用来完成乘法并执行迭代除法。其它实施方案可以包括用于更快地执行除法的装置。
算术乘法阵列可以用Hennessy和Patterson在引入的“ComputerArchitectureA Quantitative Approach”中所描述的任意一种技术来实现。例如,Hennessy和Patterson的附录A描述了几种加速算术乘法器的方法。所描述的任意一种技术都可用作下面所描述的多项式乘法扩展的基础。
参考图4,阵列单元3030包括两个并行乘法器(Marray 4100和MParray4200)和置换逻辑4300。第一个阵列Marray 4100按照下面参考图5所描述的执行算术乘法。Marray 4100使用ACC1 3031、ACC23032、M3033和SEL3034作为输入并产生ResultC和ResultS作为输出。第二个阵列MParray 4200按照下面参考图6所描述的执行二进制多项式乘法。MParray 4200用RThold 3012的低位或RThold 3012的高位(由多路复用器4305选择)、RShold 3010和ACC1 3031作为输入并产生结果作为输出。最后,置换逻辑4300被用来根据RThold3012中所存储的值对RShold 3010的低位执行各种置换。
多路复用器4310在Marray 4100的输出ResultS和0之间进行选择以产生结果S 3036。多路复用器4315和4320在由Marray 4100产生的结果C、ACC1的25位和由MParray 4200产生的结果的47位以及由置换逻辑4300产生的结果的组合之间进行选择以产生结果C3035。
参考图5,Marray 4100是32位乘16位的华莱士树乘法器阵列,已经对其进行了修改以支持两个72-位宽的操作数ACC1和ACC2的相加。ACC1和ACC2操作数保存了一个72-位值的存储进位表示。因为已经执行了加法操作来实现乘法操作(即,通过存储进位加法器(CSA)),所以可以包括一个额外的加法器以便允许ACC1和ACC2加到乘法的中间结果。Marray 4100产生以存储进位表示的一个72-位宽的结果。因为每个周期处理32×16位,因而对32×32位的乘法需要两次通过该阵列。
Marray 4100被实现为从CSA阵列构建成的华莱士树。这些阵列的宽度可以变化。可以用自动安置和选路来实现这一设计,而不用数据通路样式。因为来自前一次阵列通过的累加值晚些时被输入该阵列,因而累加值不需要直接来自寄存器。布斯重编码是用重叠三联体的方法来实现的,为的是更有效地处理乘法操作。布斯重编码的输出表明是否加上操作数M乘以对应4的每次幂-2、-1、0、1或2。顶级CSA输入上的多路复用器用来选择多个M。
Marray 4100把来自布斯重编码的8个乘积加上一个特殊的部分乘积累加起来。后者可以用于使用来自多路复用器的“0”和“1×”选择的32位无符号计算。在华莱士树中,操作数可以是有符号的以正确地累加2的补码结果。
参考图6,基于二进制多项式的乘法操作可以和对应的无符号算术操作相类似的方式进行处理。在一种实施方案中,MParray 4200是32×16位的阵列,该阵列还通过对一个操作数(例如,ACC1)执行异或(XOR)操作来实现加法操作,和用Marray 4100一样,每周期处理32×16位,而对32×32位乘使用两次通过该阵列。在第一个周期中,ACC1是0(对MULTP操作而言)或上一个结果(对MADDP操作而言)。在第二个周期中ACC1是来自第一个周期的输出的高位。
MParray 4200用一个阵列把两个操作数(例如,OpA和OpB)相乘,该阵列的每一行取OpA和OpB的一位的与而形成。例如,第一行是OpA和OpB的第0位的逻辑与。第二行是OpA和OpB的第1位的逻辑与。每个相继行的结果都被向左移动一位。通过取每一列的异或形成最终结果。因为逐位异或可以用来执行二进制多项式算术中的加法,因而可以把一个累加器的行加到阵列MParray 4200以便支持像MADDP这样的指令。
再来参考图1,MDU 2020在流水线执行步1003的第一个周期启动计算。如果该计算在指令已经通过流水线中的存储器步1004之前已经完成,那么结果就被保存在那个点上。如果操作在指令已经通过流水线中的存储器步1004时才完成,那么该指令已经被提交并且结果被直接写到ACX/HI/LO寄存器。
MDU 2020被从环境流水线去耦合;它不随环境而停顿。也就是说MDU 2020将在流水线停止顿时继续它的计算。通过这种方式,可以通过系统停顿和/或其它非-MDU指令来部分掩蔽多周期MDU操作。
图7A描述了流水线流过用于32×16位乘法的MDU 2020。RS和RT稍晚到达,因此第一个周期可以用于布斯重编码。第二个周期运行阵列,第三个周期CPA 3058完成计算。因为结果总是可以由MFxx指令加以访问而读取,因此32×16位乘法可以在没有停顿的情况下运行。一个直接返回结果给通用寄存器(GPR)的32×16位MUL可以停顿一个周期。
参考图7B,对32×32位乘法来说,该阵列被使用两次,这样就把一个额外的时钟周期加到32×16位乘法操作上。当第一次阵列通过正在完成操作数RT的第一部分时,布斯重编码对操作数的第二部分加以执行。因而,RT的布斯重编码的部分可以用来在第一次通过完成以后立即开始第二次通过。随后用CPA 3058计算出乘法操作的结果。
参考图7C,一种简单的非-恢复除法算法可以用于正操作数。如果需要的话,第一个周期用来对RS求反。出于定时的原因,即使RS为正也要占用这个周期。随后,执行迭代加/减操作的32、25、18或10周期。实际的数是基于正的RS操作数上的前导0的数量。如果余数为负可能也需要最后的余数调整。出于定时的原因,即使不需要余数调整也要占用这个周期。最后,如果需要的话要对商和/或余数执行符号调整。如果两个操作数都为正,可以跳过这个周期。
在一种实施方案中,目标应用需要快速除法。有很多技术可以用来提高除法的性能,例如,可以使用Sweeney、Robertson和Tocher(SRT)算法或它们的一些变体。
参考图8,用一个有限状态机来执行乘法操作。乘法操作以空闲状态8010开始。乘法器停留在空闲状态直到开始信号有效为止。然后,乘法器根据操作数RT是包含一个32-位值还是16-位值转换到ARR1状态8020或ARR2A状态8030。如果RT中存储的是一个16-位值,则系统就转换到状态ARR2A 8030,在此状态下运行第一个阵列通过。随后乘法器转换到状态ARR2B 8040,在此状态下运行第二个阵列通过。如果RT操作数中存储的是16-位值,则乘法就在状态ARR1 8020下被运行通过阵列单元。
在这一实施方案中,乘法器被以流水线的方式来运行。一个乘法操作可以通过阵列单元,另一个可以通过CPA。因而,如果没有额外的乘法操作要执行的话,则乘法器就从ARR1 8020或ARR2B 8040转换到CPA8050,或者开始第二个乘法操作。如果不需要额外的乘法操作,则乘法器就运行通过CPA 8050并且随后或者返回空闲8010或者如上所述开始一个新的乘法操作。
如果在第一个乘法操作准备运行通过CPA时准备执行第二个乘法操作,那么乘法器或者转换到CPA1 8060(对应32×16位乘)或者转换到CPA2A 8070(对应32×32位乘)。在状态CPA1 8060下,第一个乘法操作运行通过CPA,第二个乘法操作运行通过阵列单元。乘法器随后转换到状态CPA 8050以结束第二个乘法操作。
如果第二个乘法操作是一个32-位乘,那么在状态CPA2A 8070下,第一个乘法操作运行通过CPA,第二个乘法操作运行通过阵列单元。乘法器随后转换到状态ARR2B 8040以完成这个32×32乘法操作。这一流水线的方法可以在每个时钟周期启动32×16位乘法操作,带有两个周期的等待时间。另外,可以每隔一个时钟周期启动32×32乘法操作,带有三个周期的等待时间。
参考图9,可以用一个有限状态机来实现迭代除法操作。在一种实施方案中,MDU在空闲状态9010开始。当接收到信号启动除法操作时,如果操作是有符号的,则MDU就转换到DIV1 9020,如果操作是无符号的MDU,则MDU就转换到DIV1U 9030。状态DIV1 9020和ERLY 9040用来为除法操作准备有符号操作数并在必要时调整符号。状态DIV1U9030和ERLYU 9050用来准备一个无符号除法操作。在状态ERLY 9040和ERLYU 9050中,检测操作数RS中的前导0以调整所需的除法迭代次数。
迭代除法在状态DIV 9060和DIVU 9070中执行。可以通过一系列迭代加/减和移位来实现除法。最后,在状态REM 9080和REMU 9090中最终确定余数。如果任一个操作数为负,就在状态SGN 9100中执行符号调整。
再来参考图4,在一种实施方案中,置换逻辑4300用来支持上述PPERM指令。置换逻辑4300包括6个单一位32∶1选择器,这些选择器可以用来根据RThold 3012的值选择RShold 3010的32位中的任意一位。这个逻辑可以直接实现在数据通路模块中。
例如,置换逻辑4300可以用来执行指令“PPERM$5,$6”。置换逻辑4300使用由RThold 3012确定的6个5-位选择器来标识要包括哪些位作为来自RShold 3010的输出。例如,如果寄存器$5包含低位“010101”,那么选择器“00010”(对应于寄存器$6的低位)会选择包含“1”的位2(即,从右数第3位)。如果RThold 3012包含低位“0001000011”(相应于寄存器$6的低10位),那么就会选中位2(包含“1”)和位3(包含“0”)以产生“10”。采用这种方法,置换逻辑4300可以根据RThold 3020从RShold 3010选择位来生成6个位。生成的6个位被连接到ACC1的低66位以形成结果。这有效地把ACC1的低66位向左移动了6位并把低6位替换成置换逻辑4300的输出。
上述PPERM指令是一种可以用来在硬件中提供逐位置换支持的技术。从严格的数学意义上来说,逐位置换包括对寄存器或存储单元中的有序位组的任意重新排序,就像1对1的映射那样。这里所描述的置换可以是更通用的操作,在其中还可以实现1对多和1对元的映射。如果使用了足够的硬件,就可以在单一的时钟周期中执行任意置换。但是,对除了固定置换以外的任何操作来说,必须在执行置换之前建立起大量的状态。例如,如果把来自32-位值的位置换为扩展的48-位值,这48个目标位中的每个位都需要数据的5位来指示对应的源位。因而,需要240个状态位来完全地指定这个操作。
可以通过减少可被置换的目标位数来减少指定置换所需的状态的数量。这些部分置换操作允许在多个时钟周期上完成大范围的置换操作,同时相对于可以和没有扩大的指令集一起使用的移位-和-掩蔽算法提供了增强的性能。可以提供以下列项作为输入的部分置换指令(1)要置换成的目标位的子集;(2)要置换成的目标位的子集中的每一位的源的描述;(3)先前的部分值;和(4)目标寄存器。
可以随着改变经济等级而用几种方式来指定目标位。例如,可以用自由形式格式来指定目标位,每个目标位用至少一个5-位的值来指定它的位置。还可以把目标位指定为以一个显式受控制的位开始的连续组,要求每条指令至少5位。另外,可以把目标位指定为以一个隐式受控制的位开始的连续组,完整的置换操作作为规范的指令序列加以实现。
PPERM指令在微处理器的乘或乘/除单元中提供了部分逐位置换的硬件实现。在上述PPERM指令之外,还希望有部分逐位置换的几种替代实施方案。
参考图10A,可以指定采用四个操作数的部分置换操作。rd操作数指定存储结果的目标寄存器。rs操作数指定用作执行部分置换的源位的输入字。rt操作数标识存储前一个部分值的寄存器。最后,ru操作数用作指定要执行的部分置换的控制输入。
参考图10B,由操作数ru指定的控制寄存器可以用四个指定源位的5-位的值、一个指定要置换这四个目标位中的哪一位的掩码、一个缺省位和一个目标四位字节来实现。目标四位字节可以用来指定目标寄存器中特定的4-位域以放置结果的置换位。例如,如果目标四位字节是0,则替换目标寄存器的低四位。
四个源位标识符指定输入字(由rs指定)中的哪些位用来替换目标寄存器(由rd指定)中的对应位。这些源位标识符形成了由目标四位字节指定的要替换的4-位的域。例如,如果源位0是“00010”,那么rs的位2是该4-位域的低位。如果rs包含“1010”,那么“0”(位2是从右开始的第3位)形成目标四位字节的低位。
掩码用来指定是否置换对应的源位。例如,掩码“00111”将只执行由源位0、1和2指定的置换操作。如果对应的掩码位是0,就在目标四位字节中使用缺省位。在这个实例中,对应于源位3的掩码位是“0”,因此对目标四位字节的高位使用缺省位的值。掩码和缺省位的使用在期望的结果值是从多个源字汇集得到的位的置换的地方是非常有用的,这里缺省位可以是0、1或者是按照掩码未被选择来置换的目标位的值保持不变的指示。没有被选中用于该操作的目标寄存器的所有半位元组的值都被从由操作数rt指定的前一个部分值复制。
参考图11A,在部分置换的另一种实施方案中,使用更少的寄存器来指定部分置换指令。在这种实施方案中,指定了目标操作数rd和源操作数rs。代替使用控制寄存器,如上所述,在这条指令中包括了两个源位说明符。采用这种指令格式,指令指定要置换更少的位。但其重复速率要更高一些。
因为在这种指令格式中使用了掩码或开始说明符,所以先前的部分置换的源寄存器隐式地是目标寄存器,并且该指令在并入来自源的两个附加位之前隐式地对先前的值执行移动或循环两位。如下位的掩码的缺少,可以通过使用显式移位/循环指令并通过单个位部分置换指令来加以处理,其中所述位的值无法从当前源(rs)寄存器导出,。
参考图11B,单个位部分置换指令包括与参考图11A所述的两位格式相类似的格式。在这种实施方案中,在指令域中指定一个单一位并在用所选择的源位替换低位之前执行隐式的一位位移。
参考图12A,也可以用乘/除单元中的累加器来实现部分置换。例如,图12A中所示的指令格式包括源寄存器操作数rs、控制字操作数rt和目标五位字节(5-位域说明符)。MDU 2030的HI/LO寄存器可以隐式地用作源数据寄存器和先前的部分值的源。
参考图12B,控制字可以包含一个缺省位、一个掩码和上面参考图10B所描述的源位。但是,在这个实施方案中,目标五位字节(与四位字节相反)是在指令中指定的,留下用于控制字中附加源位标识符的空间。这种格式的指令在HI/LO寄存器对上进行操作并且可以用来使扩展置换更有效(例如,32位值扩展为48-位值)。
参考图13A,也可以用乘法器或乘/除单元中的累加器来执行部分置换,并且没有掩码。例如,图13A中所示的指令格式包括源寄存器操作数rs和控制字操作数rt。MDU 2030的HI/L0寄存器可以被隐式地用作前一部分值的源。参考图13B,控制字可以包含上面参考图10B所描述的6个源位的描述。
附加的部分置换实施方案可以通过使用一个以上的控制字操作数来增加指定的位数。例如,一种实施方案使用图10A中所描述那样的指令编码和图10B中所描述那样的控制字编码,除了可以指定两个控制字之外。这种实施方案用操作数rt来指定第二个控制字操作数而不是用来指定先前的部分值的源,先前的部分值来源由另一寄存器例如HI/LO寄存器隐式指定。附加实施方案允许(1)通过修改图13A的指令编码以提供两个诸如在图13B中描述的控制字操作数的12位的置换;(2)使用参考图12B所描述的两个控制字操作数的10位的置换。
除了采用硬件(例如,在微处理器或微控制器中)的乘法器实施方案之外,也可以用配置成用于存储软件(例如,计算机可读程序代码)的计算机可用(例如,可读)介质中的软件实现。程序代码使得能够实现这里所描述的系统和技术的功能或制做,或者同时实现这两者。例如,这可以通过使用通用编程语言(例如,C、C++)、硬件描述语言(包括Verilog HDL、VHDL、AHDL(Altera HDL)等等)或者其它可用的编程和/或电路(即原理的)捕捉工具加以实现。程序代码可以放置在任意已知的计算机可用介质中,包括半导体、磁盘、光盘(例如,CD-ROM、DVD-ROM)和作为在计算机可用(例如,可读)传输介质(例如,载波或包括基于数字、光学或模拟的任意其它介质)中体现的计算机数据信号。这样,就可以通过通信网络(包括因特网和内联网)传输所述代码。
可以理解,由上述系统和技术所实现的功能和/或所提供的设备可以被提供在一个核心(例如,微处理器核心)中,该核心被实现在程序代码中并且可以被转换为硬件作为集成电路产品的一部分。另外,这些系统和技术可以被实现为硬件和软件的组合。因此,其它实施方案也在下面这些权利要求的范围内。
权利要求
1.在指令集体系结构中的一种用于执行部分逐位置换的指令,该指令是指令集体系结构的一部分,该指令包括用于标识该指令为部分置换指令的操作码;和置换操作规范,包括用于标识目标寄存器的目标说明符;部分值的源说明符;用于标识目标寄存器中的一个或多个目标位的目标子集说明符;以及用于为由目标子集说明符标识的所述一个或多个目标位中的每一位标识源的控制说明符;其中,该指令通过执行由置换操作规范定义的部分逐位置换加以处理。
2.如权利要求1所述的指令,其中所述目标说明符隐式地标识所述目标寄存器。
3.如权利要求2所述的指令,其中所述目标寄存器包括一乘法单元累加器。
4.如权利要求1所述的指令,其中所述目标说明符显式地指定一通用寄存器。
5.如权利要求1所述的指令,其中所述部分值的源说明符隐式地标识一部分值的源寄存器。
6.如权利要求5所述的指令,其中所述部分值的源寄存器包括一乘法单元累加器。
7.如权利要求1所述的指令,其中所述部分值的源说明符显式地指定一通用寄存器。
8.如权利要求1所述的指令,其中所述目标说明符和部分值的源说明符均标识相同的寄存器。
9.如权利要求8所述的指令,其中所标识的寄存器包括一通用寄存器。
10.如权利要求8所述的指令,其中所标识的寄存器包括一乘法单元累加器。
11.如权利要求1所述的指令,其中所述目标子集说明符标识所述目标寄存器中一连续的位块。
12.如权利要求11所述的指令,其中所述连续的位块包括所述目标寄存器的最低有效位。
13.如权利要求12所述的指令,其中所述连续的位块包括12位或更少的位。
14.如权利要求1所的指令,其中所述控制子集说明符包括一个或多个源位标识符。
15.如权利要求14所述的指令,其中所述控制子集说明符还包括用于选择位以接收置换数据的掩码;和用于标识要指派给未被所述掩码选择的位的缺省值以接收置换数据的缺省位。
16.如权利要求14所述的指令,其中所述一个或多个源位标识符中的每一个都是该指令中的域。
17.如权利要求14所述的指令,其中所述一个或多个源位标识符中的每一个都被存储在控制寄存器中,该控制寄存器由所述控制说明符标识。
18.如权利要求1所述的指令,其中所述指令集包括一RISC指令集。
19.一种用指令执行部分逐位置换的方法,该指令包括从数据存储区取指令,以执行操作;读一个或多个寄存器;执行由该指令指定的操作,该指令包括用于标识该指令为部分置换指令的操作码;和置换操作规范,包括用于标识目标寄存器的目标说明符;先前的部分值的源说明符;标识所述目标寄存器中的一个或多个目标位的目标子集说明符;以及用于为由所述目标子集说明符标识的所述一个或多个目标位中的每一个标识源的控制说明符;其中该指令是通过执行由所述置换操作规范定义的部分逐位置换而加以处理的。
20.如权利要求19所述的方法,其中所述目标说明符隐式地标识所述目标寄存器。
21.如权利要求20所述的方法,其中所述目标寄存器包括一乘法单元累加器。
22.如权利要求19所述的方法,其中所述目标说明符显式地指定一通用寄存器。
23.如权利要求19所述的方法,其中所述先前的部分值的源说明符隐式地标识部分值的源寄存器。
24.如权利要求23所述的方法,其中所述部分值的源寄存器包括一乘法单元累加器。
25.如权利要求19所述的方法,其中所述先前的部分值的源说明符显式地指定一通用寄存器。
26.如权利要求19所述的方法,其中所述目标说明符和先前的部分值的源说明符均标识相同的寄存器。
27.如权利要26所述的方法,其中所标识的寄存器包括一通用寄存器。
28.如权利要求26所述的方法,其中所标识的寄存器包括一乘法单元累加器。
29.如权利要求19所述的方法,其中所述目标子集说明符标识所述目标寄存器中一连续的位块。
30.如权利要求29所述的方法,其中所述连续的位块包括所述目标寄存器的最低有效位。
31.如权利要求30所述的方法,其中所述连续的位块包括12位或更少的位。
32.如权利要求19所述的方法,其中所述控制子集说明符包括一个或多个源位标识符。
33.如权利要求32所述的方法,其中所述控制子集说明符还包括用于选择位以接收置换数据的掩码;和用于标识要指派给未被所述掩码选择的位的缺省值以接收置换数据的缺省位。
34.如权利要求32所述的方法,其中所述一个或多个源位说明符中的每一个都是该指令中的域。
35.如权利要求32所述的方法,其中所述一个或多个源位说明符中的每一个都被存储在控制寄存器中,该控制寄存器由所述控制说明符标识。
36.如权利要求19所述的方法,其中所述指令是指令集的一部分,并且所述指令集包括一RISC指令集。
37.一种计算机可读介质,包括以软件实现的微处理器核心,该微处理器核心包括用于执行部分逐位置换的指令,该指令包括用于标识该指令为部分置换指令的操作码;和置换操作规范,包括用于标识目标寄存器的目标说明符;先前的部分值的源说明符;用于标识目标寄存器中的一个或多个目标位的目标子集说明符;以及用于为由目标子集说明符标识的所述一个或多个目标位中的每一位标识源的控制说明符;其中,该指令通过执行由置换操作规范定义的部分逐位置换加以处理。
38.如权利要求37所述的计算机可读介质,其中所述目标说明符隐式地标识所述目标寄存器。
39.如权利要求38所述的计算机可读介质,其中所述目标寄存器包括一乘法单元累加器。
40.如权利要求37所述的计算机可读介质,其中所述目标说明符显式地指定一通用寄存器。
41.如权利要求37所述的计算机可读介质,其中所述先前的部分值的源说明符隐式地标识一部分值的源寄存器。
42.如权利要求41所述的计算机可读介质,其中所述部分值的源说明符是一乘法单元累加器。
43.如权利要求37所述的计算机可读介质,其中所述先前的部分值的源说明符显式地指定一通用寄存器。
44.如权利要求37所述的计算机可读介质,其中所述目标说明符和先前的部分值的源说明符均标识相同的寄存器。
45.如权利要求44所述的计算机可读介质,其中所标识的寄存器包括一通用寄存器。
46.如权利要求44所述的计算机可读介质,其中所标识的寄存器包括一乘法单元累加器。
47.如权利要求37所述的计算机可读介质,其中所述目标子集说明符标识所述目标寄存器中一连续的位块。
48.如权利要求47所述的计算机可读介质,其中所述连续的位块包括所述目标寄存器的最低有效位。
49.如权利要求48所述的计算机可读介质,其中所述连续的位块包括12位或更少的位。
50.如权利要求37所述的计算机可读介质,其中所述控制子集说明符包括一个或多个源位标识符。
51.如权利要求50所述的计算机可读介质,其中所述控制子集说明符还包括用于选择位以接收置换数据的掩码;和用于标识要指派给未被所述掩码选择的位的缺省值以接收置换数据的缺省位。
52.如权利要求50所述的计算机可读介质,所述一个或多个源位说明符中的每一个都是该指令中的域。
53.如权利要求50所述的计算机可读介质,其中所述一个或多个源位说明符中的每一个都被存储在控制寄存器中,该控制寄存器由所述控制说明符标识。
54.如权利要求37所述的计算机可读介质,其中该指令是指令集的一部分,并且所述指令集包括一RISC指令集。
55.在一包含第一通用寄存器、第二通用寄存器和扩展精度的累加器的微处理器中,一种用于执行部分置换的方法包括把扩展精度累加器的内容移位以产生预定数量的开位的位置;用第一个通用寄存器中包含的信息选择填充所述开位的位置的位;以及用从第二个通用寄存器中获取的位填充所述开位的位置,其中移位、选择和填充响应单条指令而发生。
56.如权利要求55所述的方法,其中所述单条指令指定第一和第二个通用寄存器。
57.如权利要求55所述的方法,其中开位的位置的预定数量是扩展精度累加器的6个最低有效位。
58.在一微处理器中的一条用于执行部分逐位置换的指令,该指令是指令集体系结构的一部分,该指令包括用于标识该指令为部分置换指令的操作码;和置换操作规范,包括用于标识目标寄存器的目标说明符;先前的部分值的源说明符;用于标识目标寄存器中的一个或多个目标位的目标子集说明符;以及用于为由目标子集说明符标识的所述一个或多个目标位中的每一位标识源的控制说明符;其中,该指令通过执行由置换操作规范定义的部分逐位置换加以处理。
全文摘要
在微处理器或微控制器中提供了部分逐位置换指令。部分逐位指令可以由下列方式中的一项或多项来指定目标说明符、先前的部分值的源、目标子集说明符和控制说明符。微处理器或微控制器中的阵列单元(3030)包括两个并行乘法器(Marray 4100和MParray 4200)和置换逻辑(4300)。第一个阵列Marray 4100执行算术乘法。Marray(4100)使用Acc1(3031)、Acc2(3032)、M(3033)和sel(3034)作为输入,产生结果C和结果S作为输出。第二个阵列MParray 4200执行二进制多项式乘法。置换逻辑(4300)用来根据RThold(3012)中的值对RShold的低位执行各种置换。
文档编号G06F9/30GK1503936SQ02808631
公开日2004年6月9日 申请日期2002年2月15日 优先权日2001年2月21日
发明者K·D·基斯塞尔, H·W·J·埃克纳, M·斯特里贝克, J·S·詹森, J 埃克纳, K D 基斯塞尔, 乩锉纯, 詹森 申请人:美普思科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1