标识第一和第二架构寄存器编号的编码指令的制作方法

文档序号:15285790发布日期:2018-08-29 00:04阅读:169来源:国知局

本技术涉及数据处理领域。



背景技术:

数据处理装置可以具有被配置为执行根据给定指令集架构(isa)编码的指令的处理电路。可以使用给定数量的位来表示指令,这些给定数量的位被解码以标识在处理操作期间什么样的处理操作应当被执行以及哪些寄存器会被使用到。isa设计可能具有挑战性,因为尽管理论上可能期望支持多种处理操作,但为了适应附加的操作而增加每条指令中的位数往往会增加电路面积和处理设备执行根据isa的指令的功耗,因为对于每条指令均需沿处理管线承载附加位,所以可能需要更复杂的解码电路,并且所需用于在存储器中存储程序的存储器空间将随着指令的大小而增加。另一方面,为了节省电路面积和能量,指令编码中的位数可以被限制到一定数量,但是这可能需要就isa支持哪些操作方面做出妥协。



技术实现要素:

至少一些示例提供了一种装置,包括:

多个寄存器,用于存储数据值;以及

处理电路,用于响应于指令来执行处理操作;

其中,响应于标识第一和第二架构寄存器编号的第一类指令中的一个,该处理电路被配置为使用对应于该第一和第二架构寄存器编号的第一和第二寄存器执行相应的处理操作;以及

所述第一类指令中的指令具有约束所述第一架构寄存器编号为大于所述第二架构寄存器编号的指令编码。

至少一些示例提供了一种数据处理方法,包括:

控制处理电路用于响应于指令来执行处理操作;

其中,响应于标识第一和第二架构寄存器编号的第一类指令中的一个,所述处理电路被控制为使用对应于第一和第二架构寄存器编号的第一和第二寄存器来执行相应的处理操作;以及

所述第一类指令中的指令具有约束所述第一架构寄存器编号大于所述第二架构寄存器编号的指令编码。

至少一些示例提供了一种装置,包括:

多个寄存器,用于存储数据值;以及

处理电路,用于响应于指令来执行处理操作;其中:

响应于具有标识第一和第二架构寄存器编号的指令编码的指令,处理电路被配置为根据第一和第二架构寄存器编号的比较来选择使用对应于第一和第二架构寄存器编号的寄存器来执行第一类型的处理操作还是第二类型的处理操作。

至少一些示例提供了一种数据处理方法,包括:

响应于具有标识第一和第二架构寄存器编号的指令编码的指令,比较第一和第二架构寄存器编号;以及

根据第一和第二架构寄存器编号的比较来选择是使用对应于第一和第二架构寄存器编号的寄存器来执行第一类型的处理操作还是第二类型的处理操作。

计算机可读存储介质可以被提供,其存储用于控制计算机以提供对应于上述任一装置的虚拟机执行环境的计算机程序。存储介质可以是非暂态存储介质。

根据下面对将结合附图来阅读的实施例进行的描述,本技术的其他方面、特征和优点将变得显然。

附图说明

现在将参照附图,仅以示例的方式来描述本发明的实施例,其中:

图1示意性地示出了具有用于处理指令的处理管线的数据处理装置的示例;

图2示出了标识可采用任何值的第一和第二架构寄存器编号的指令编码的示例;

图3示出了提供其中第一架构寄存器编号被约束为大于第二架构寄存器编号的第一类指令的指令编码和编码单个源架构指令编号的第二类指令编码的示例;

图4a和图4b示出了图3所示的第一类指令的第一和第二寄存器字段的两种可能的编码;

图5示出了用于解码如图3所示被编码的指令的解码阶段的示例;

图6a示出了用于根据图4a的编码方案解码第一和第二寄存器字段的电路的第一示例;

图6b示出了解码电路的第二示例;

图7示出了处理指令的方法;

图8示出了包括用于比较第一和第二架构寄存器编号的寄存器比较器的指令解码电路的第二示例;

图9示出了比较指令的编码示例;

图10示出了处理指令的方法;以及

图11示出了可使用的虚拟机实现方式。

具体实施方式

以下示出了一些具体的示例。应该理解,本发明不限于这些示例。

处理电路可以支持标识第一和第二架构寄存器编号的一些指令。响应于这样的指令,处理电路可以使用对应于第一和第二架构寄存器编号的第一和第二寄存器来执行相应的处理操作。典型的isa指定给定数量的架构寄存器,并对指令进行编码,使得这些架构寄存器中的任何寄存器可以被指定为任何组合的第一和第二架构寄存器编号。

然而,发明人认识到,在这种方法中存在一些冗余,因为将分别被指代第一和第二架构寄存器编号的那些寄存器对换可能不会给出不一样的结果。例如,用于相加存储在寄存器r1和r2中的值的加法指令会给出与用于相加寄存器r2和r1中的值的加法指令相同的结果。因此,对于给定的处理操作,典型的isa在分别对给定的寄存器对的两种顺序进行编码时会用尽大量的指令编码空间。本技术提供了可以利用这种冗余来提供对指令的更有效编码的技术。

在第一示例中,可以提供具有约束第一架构寄存器编号为大于第二架构寄存器编号的指令编码的第一类指令。通过消除第一架构寄存器编号小于或等于第二架构寄存器编号的选项,减少了架构寄存器的有效组合的数量,并且这可释放一些指令编码以用于用信号标示其他处理操作。与架构寄存器的任何组合可被指定的情况相比,通过将第一架构寄存器编号限制为大于第二架构寄存器编号,有效寄存器对编码的数量可以减少一半以上,从而可使用较少的位来标识它们。这可以使得能够使用总计更少的位来对指令进行编码,从而节约在执行这些指令的处理设备中的能量和功率,或允许给定数量的位表示更宽范围的不同处理操作以支持额外的功能,因为附加位可用于对要执行的处理操作进行编码。

为了简明起见,第一架构寄存器编号在下面被称为rx并且第二架构寄存器编号被称为ry,并且rx>ry。

该装置可具有以硬件提供的物理寄存器,其可由处理电路响应于指令而被访问。在一些实施例中,架构寄存器编号rx、ry也可以标识要使用的物理寄存器。在这种情况下,rx>ry的约束条件也可以约束哪些物理寄存器可以存储要处理的数据。然而,其他实施例可以支持寄存器重命名,其中,由指令指定的架构寄存器编号可以映射到在硬件中提供的不同物理寄存器。在这种情况下,虽然指令编码可能需要rx>ry,但这不需要通过任何方式来限制对物理寄存器的选择,因为寄存器重命名电路可仍具有将指定架构寄存器编号映射到任何可用的物理寄存器的自由。请注意,尽管指令编码约束了架构寄存器编号,使得rx>ry,但是对存储在相应寄存器中的数据没有限制,存储在rx和ry中的数据可以采用任何值。

处理电路可以具有解码电路,以根据其中rx被限制为大于ry的指令编码来对第一类指令进行解码。

对于第一类指令中的至少一些,第一和第二架构寄存器编号rx、ry可以是源架构寄存器编号,其标识存储要响应于相应指令而被处理的操作数值的寄存器(例如,算术或逻辑指令可以通过架构寄存器(其中,rx>ry)来标识其源操作数)。该指令还可以指定要写入操作结果的目标寄存器。目标寄存器的选择可以是不受约束的,所以任何架构寄存器都可以被指定为目标架构寄存器,而与对源架构寄存器rx、ry的选择无关。

另一方面,对于第一类指令的其他指令,第一和第二架构寄存器编号rx、ry中的一者或两者可以标识结果要被写入的目标寄存器。例如,加载多指令可以指定使用rx>ry的编码从存储器向其加载值的两个目标寄存器rx、ry。

在一个示例中,第一类指令可以包括相应的处理操作是可交换操作的至少一个可交换指令。可交换操作可以是这样一种操作:当被应用于给定的一组操作数时,无论操作数被输入的顺序如何都会给出相同的结果(例如,函数f(m,n),其中f(a,b)=f(b,a),即使a≠b)。例如,加法是可交换操作,因为2+3=3+2。其他可交换操作的示例包括乘法、绝对差、和一些按位逻辑操作,如and、or、和xor。对于可交换操作,除了rx>ry的编码之外允许rx<ry的编码是完全多余的,因为不管输入操作数的顺序如何,都会生成相同的结果。因此,对于这种操作,rx<ry的编码缺失不会影响isa提供的功能。编译器可以例如简单地选择编码addr3、r2而不是addr2、r3的指令。

对于一些可交换操作,将操作应用于两个相同的操作数可能仍具意义,因此排除了rx=ry的编码可能会在某种程度上对功能性进行限制。然而,对于一些类型的操作,可能已存在将给出对两个相同输入应用操作相同的结果的由isa支持的另一操作(例如,rx+rx可以等于rx*2或左移一位的位置,所以允许两个源寄存器为相同的加法指令可以不是必需的)。

而且,即使应用于两个相同输入的某个可交换操作在指令集架构中的其他地方没有等价操作,也可以将相同的操作数值写入两个不同的架构寄存器rx、ry,使得相应的可交换指令仍可通过rx>ry来执行。

另外,如果对于给定的可交换操作,将操作应用于两个相同的操作数倾向于经常被使用,从而期望在isa中明确地支持该操作,或期望避免与使用两个不同寄存器来存储相同的值相关联的增加的寄存器压力,然后可以在指令集编码空间中的其他地方实现第二指令类型(例如具有不同的操作码),以利用相同的输入来执行该特定的可交换操作。例如,除了具有rx>ry的编码的乘法指令mulrx、ry之外,还可以为平方指令分配附加的编码,该平方指令执行mulrx、rx以将寄存器rx中的值进行平方。通常,有意向在rx=ry时执行操作的可交换操作的数量少于要支持的可交换操作的总数,因此即使只有少数操作具有分别为rx>ry以及rx=ry定义的单独编码,总体上也可以减少所需的指令编码的总数。

第一类指令还可以包括至少一个非可交换指令,其中,相应的处理操作是非可交换操作。非可交换操作可以是这样一种操作:当操作数不是全部相等时改变操作数的顺序产生不同的结果(例如,函数f(m,n),其中,当a≠b时,f(a,b)≠f(b,a))。例如,减法是一种非可交换操作,因为4-1不等于1-4。非可交换操作的其他示例包括分割和移位操作(例如,通过由操作数b指定的若干位位置的移位操作数a通常不会给出与由操作数a指定的若干位位置的移位操作数b相同的结果)。

对于非可交换指令来说,由于它允许rx<ry仍然具意义(因为这会产生不同的结果),所以有人可能会认为约束rx>ry的指令编码不是理想的。然而,即使对于给定的非可交换操作指令集架构仅允许rx>ry,输入值也可以以与先前指令不同的顺序写入架构寄存器,使得非可交换操作仍可以以正确的顺序应用于正确的值,尽管在架构寄存器编号rx、ry中存在限制。例如,可以选择生成将要应用非可交换操作的操作数的较早指令的目标寄存器,使得用于非可交换操作的第一操作数位于具有比用于第二操作数的寄存器高的架构寄存器编号中。可选地,寄存器移动指令可以在非可交换指令之前执行以将数据值从一个寄存器移动到另一寄存器的,以确保操作数在符合约束rx>ry的适当寄存器中,并且非可交换操作指令可以与正确的顺序的操作数一起被执行。

然而,执行额外的移动指令或限制可存储用于非可交换操作的操作数的寄存器可能会影响性能。为了避免这种情况并简化编译器设计,第一类指令可以包括对应于相同类型的非可交换操作的至少一对互补的非可交换指令。对于每一对,该对中的一个指令控制处理电路以用相对该对中的另一指令而言不同的顺序的第一和第二操作数来执行非可交换操作。例如,可以提供减法指令的互补对,例如,具有对应于rx-ry的subrx、ry和对应于ry-rx的subrrx、ry。通过包括非可交换操作的非取反和取反版本作为单独指令,编译器完全自由地将非可交换操作的操作数放置在任何架构寄存器中。

起初人们可能会认为这有损于将约束架构寄存器编号编码rx、ry的主要目的。然而,通过这种方式对架构寄存器进行编码仍然是有利的,因为通过将冗余移位到指令的其他部分而不是寄存器指定字段,这可以将编码空间的冗余部分合并到连续部分,该连续部分对那些操作进行解码的和/或回收这样的冗余部分以用于其他更简单的操作。

非可交换指令的互补对可以用不同的方式进行区分。在某些情况下,该指令对可以有不同的操作码。在一些情况下,非可交换指令的互补对的操作码可以是相同的,除了一位是不同,这种方法可以简化解码电路,因为不同的位可以用于激活取反寄存器的顺序的逻辑。可选地,该指令对可以具有相同的操作码,但可以具有附加的位字段,其指定操作数将使用非可交换操作被处理的顺序。

可选地,除了第一类指令(其中,rx>ry)之外,还可能存在另一类指令,其中rx被约束小于ry,并且第一类和其他类中的每一个中的一条指令被分配给相同的指令非可交换操作(例如,操作码的一位可以选择rx和ry的解码值是否被取反,有效地取反rx和ry中更大的一个),但是可交换操作可仅具有被分配于第一类或其他类中的单个指令。

第一类指令可以包括至少一个寄存器范围指定指令,用于控制处理电路使用对应于第一架构寄存器编号rx和第二架构寄存器编号ry之间的连续范围中的架构寄存器编号的多个寄存器来执行处理操作。例如,寄存器范围指定指令可以是用于在寄存器和存储器中的相应地址之间传送数据的加载或存储多指令,或用于在寄存器和堆栈之间传送数据的推送或弹出指令。对于寄存器范围指定指令,能够对范围无论以升序还是降序进行编码可能并没有明显的好处,因此通过约束寄存器编码使得rx>ry,可以使某些指令编码可用于编码其他操作,使得isa的整体编码更有效。注意,在支持寄存器重命名的系统中,尽管架构寄存器编号可由寄存器范围指定指令标识为连续范围,但是相应的物理寄存器编号不一定要处于连续范围内,因为每个架构寄存器编号可以映射到离散物理寄存器文件内的物理寄存器。

在第一类指令的指令编码中,第一和第二架构寄存器编号rx、ry可能并没有明确地标识出。因此,该装置可以包括寄存器解码电路,其解码第一类指令的指令编码以标识第一和第二架构寄存器号rx、ry。在一些情况下,寄存器解码电路可以是对指令本身进行解码的指令解码器的一部分,使得指令解码器对用于标识要执行什么样处理操作的指令的操作码和用来标识实际架构编号rx、ry的指令的寄存器标识位进行解码。在其他情况下,寄存器解码电路可独立于指令解码器而提供。例如,指令解码器可以在初始时解码操作码,但是随后在诸如寄存器重命名阶段或分布阶段之类的后续阶段,架构寄存器编号rx、ry可以被解码。然而,通常可以越早地标识第一和第二架构寄存器编号rx、ry,则可以越早标识指定相同架构寄存器的指令之间的危险(hazard),因此尽可能早地提供寄存器解码电路是有益的,例如在指令解码阶段。

在一些情况下,架构寄存器编号rx、ry的编码可与指令的至少一个其他参数(诸如,立即值、控制标志或其他参数)的编码组合。在这种情况下,指令的公共位字段(或多位字段)可以被解码以标识rx、ry和其他参数,其中只有rx>ry的寄存器对被分配了(一个或多个)位字段的有效编码。相比提供用于寄存器和其他参数的单独字段,通过这种方式将寄存器编号rx、ry的编码与其他参数的编码相组合可以允许对指令进行更高效的编码。

在其他示例中,第一类指令的指令编码的某些位可以专门被分配用于标识第一和第二架构寄存器编号rx、ry,并且指令的任何其他参数可以在该指令的不同字段中单独标识。在这种情况下,对于提供2n个架构寄存器的isa,在第一类指令中,第一和第二架构寄存器rx、ry可以使用指令编码的2n-1位来表示。例如,如果架构提供了16或32个寄存器,则rx和ry可分别用7或9位表示。相反,如果指令编码允许自由选择架构寄存器编号rx、ry,则需要2n位。因此,通过在寄存器指定字段中保留1位,这可以允许指令宽度缩短或释放指令其他部分中的编码空间以供编码其他操作使用。

当存在2n个架构寄存器并且使用2n-1个寄存器标识位来表示rx和ry时,其中,rx>ry的rx和ry的组合的数量为2n2n-1/2,剩余寄存器标识位的2n-1个备用值可用于其他用途。这些备用编码中的一些可用于表示第二类指令,其中指令操作码或指令编码的其他部分可以被解释为不同于第一类指令,使得其他操作码可用于编码其他操作。

例如,第二类指令可以包括仅需要一个输入操作数并因此仅需要指定一个源架构寄存器编号的指令。例如,这样的单输入指令可以包括用于取反在指定寄存器中的位的顺序的指令,或用于对存储在给定寄存器中的数据值中的前导零的数量进行计数的指令。而且,可能存在如上所讨论的一些可交换操作,其中有兴趣将操作应用于两个相同的输入(例如,上述平方指令)。这些指令可以使用寄存器标识位的某些备用位模式进行编码,以避免用尽用于这些单输入操作的其他操作码。

备用位模式的数量可能不足以将所有可能的架构寄存器标识为单输入操作的单个源寄存器,并且因此,对于第二类指令,第一类指令的操作码字段的位可以与寄存器标识位的至少一个子集一起标识单个源寄存器。因此,第二类指令的操作码可以有效缩短一位,使得第二类指令中的指令比第一类指令少。

对于第一类指令,可能存在可用于将rx和ry编码为给定的位模式的各种编码方案。通常,寄存器标识位的每个可能的位模式可以被任意地映射到rx>ry的给定寄存器对rx、ry,留下一些位模式备用,其可以用于如上所讨论的第二类指令。然而,一些编码方案可能需要比其他编码方案更复杂的解码电路。

一种特别有效的编码是当ry的最高有效位是0时根据rx提供第一寄存器字段a,并且当ry的最高有效位为1时根据rx的所有位的取反结果提供第一寄存器字段a;以及第二寄存器字段b,其具有取决于除ry的最高有效位之外的ry的剩余位的值。这可以通过根据a和b的比较而选择性地翻转a字段的内容来解码,使得rx和ry可以用相对较少的电路来解码。

在一个示例中,第二寄存器字段b可以具有取决于ry的剩余位与rx的对应位的按位异或(xor)的结果的值。这种编码有几个优点。首先,用于第二类指令的备用位模式被合并为其中第二寄存器字段b的所有位为零并且第一寄存器字段a的最高有效位也为零的编码,这使得对第二类指令的编码更简单。而且,与用于解码其他编码的逻辑相比,解码逻辑相对简单且快速。

在另一示例中,当ry的最高有效位为0时,第二寄存器字段b可具有取决于ry的剩余位的值,并且当ry的最高有效位为1时具有取决于对ry的剩余位取反的结果的值。采用这种方法,备用编码可以使a的最低有效位等于b的相应位。

利用架构寄存器编号编码冗余的另一种技术是允许自由选择哪些架构寄存器被指定为rx和ry,但是从rx和ry的比较中获得一些附加信息。例如,处理电路可以基于rx和ry的比较来选择是使用对应于rx、ry的寄存器来执行第一类型的处理操作还是第二类型的处理操作。通常,第一和第二类型的处理操作可以是针对输入值的至少一些组合生成不同结果的任何处理操作。因此,除了像上面讨论的那样对寄存器编码进行限制之外,寄存器编码可以从任何可用的架构寄存器编号中选择,但是通过比较架构寄存器编号,可以导出至少一条附加信息,其随后可以影响指令如何被解码,使得即使指令编码的其余部分在其他方面相同,处理电路也可以执行不同类型的处理操作。同样,这可以消除为了标识该附加信息而提供另一位编码的必要,从而允许更短的指令,或这可以释放额外的编码以用于其他目的以允许通过使用给定数量的指令位而支持更多的功能。

对于一些指令,当rx>ry时,处理电路可以执行第一类型的处理操作,并且当rx<ry时,处理电路可以执行第二类型的处理操作。因此,操作数被编码的顺序可以有效地提供用于选择处理操作类型的操作码的附加位。

当第一和第二类型的处理操作是不同的可交换操作时,这种方法会特别有用。如上所讨论的,对于可交换操作,当将可交换操作应用于给定的一对寄存器时,无论那些寄存器中的哪一个被指定为第一操作数或第二操作数,结果将是相同的。因此,针对给定的指令操作码指定寄存器的顺序可以用于用信号标示一些其他信息。在一些情况下,可交换操作可能完全不同。例如,第一类型的处理操作可以是加法,而第二类型的处理操作可以是异或。在其他情况下,第一和第二类型的处理操作可以对应于基本上同一种类的算术或逻辑操作,但是第二类型的处理操作是第一类型的修改版本(例如,第二类型的操作可以返回第一类操作结果的绝对量)。

当存在rx和ry的自由选择,并且rx>ry和ry<rx分别对应于第一和第二处理操作时,也会存在一些编码,其中rx等于ry。这些可以用几种不同的方式来处理:

·对于某些指令,当rx=ry时,处理电路可以选择第一类型的处理操作或第二类型的处理操作。例如,当rx≥ry时第一类型的处理操作可以被选择,当rx<ry时第二类型的操作可以被选择。有一些类型的处理操作,当rx=ry时,对这两种操作类型的编码可能都没有意义。例如,如果第一类型操作是减法,而第二类操作产生减法结果的绝对量,则当rx=ry时,两个操作都会产生0的结果,因此当rx=ry时提供两种操作的单独编码是没有价值的,相反当rx=ry时,这可能导致第一类型的操作被选择。

·可选地,对于某些指令,当rx=ry时,可以执行第三种类型的处理操作。因此,rx=ry的编码可以用信号标示与当rx>ry或rx<ry时的操作完全不同的操作。

·另一种方法可以是针对某些指令的,其中rx=ry的编码仅仅是一种无效的编码,它不对应于任何类型的处理操作。当遇到这样的编码时,指令解码器可以信号告知该未定义的指令,或者可以将该指令视为nop。

并非所有isa指令都需要使用相同的方法来处理rx=ry时的情况。给定的isa可具有使用这些方法中的一个的一些指令和使用另一方法的其他指令。

对于其他指令,当rx与ry不同时可以执行第一类型的处理操作,并且当rx等于ry时可以执行第二类型的处理操作。当第一类型的处理操作是非可交换操作时,这是特别有用的。对于非可交换操作,感兴趣的是,应该对给定寄存器对的两种可能的顺序进行编码,因为当操作数的顺序取反时,非可交换操作会给出不同的结果。但是,对于两个操作数相同时的一些非可交换操作,结果可能不感兴趣或可使用替代操作生成。例如,对于bic操作(rxand(notry)(rx与(非ry))),当rx=ry时,结果总是为0,所以不同的是,其中rx=ry的bic操作的编码可以以信号标示不同的第二类型的处理操作,例如用于对寄存器rx中数据值的所有位取反的位取反操作。其中对rx=ry时的结果不感兴趣的非可交换操作的其他示例为整数减法(rx-rx总为0)、除法(rx/rx总为1)或orn(aornb相当于aor(notb)(a或(非b)),所以rxornrx总是全1位模式,即,oxffff...,或-1)。

该装置可以具有用于比较第一和第二架构寄存器编号rx、ry的寄存器编号比较电路,以及用于基于指令的操作码和由寄存器编号比较电路执行的比较结果来标识要执行的处理操作的类型的解码电路。例如,操作码可以由从寄存器比较导出的附加操作码位补充,该附加操作码位可以与所述操作码一起被解码以标识将使用寄存器执行的所需处理操作。这避免了需要在显式指令编码中表示该附加操作码位。

可用于当rx>ry和rx<ry时分别执行不同操作的指令的示例是比较指令,其中,第一类型的处理操作可以包括确定第一和第二操作数是否相等并且第二类型的处理操作可以包括确定第一和第二操作数是否不相等。由于相等和不相等比较是可交换的,所以不需要能够表示rx>ry和rx<ry两者,并且因此这些可以使用通用编码来表示,该通用编码具有用信号标示要使用相等条件还是不相等条件的寄存器编号的相对顺序。其中rx=ry的编码可不用再区分相等和不相等条件,但通常给定值与其自身进行相等还是不相等的比较可以用其他操作来评估。

更具体地,比较指令可以具有比较条件字段。当比较条件字段具有第一值时,处理电路可以在rx>ry时确定第一操作数和第二操作数是否相等,并且在rx<ry时确定第一操作数和第二操作数是否不相等。当比较条件字段具有第二值时,处理电路可以确定以下各项之一:(i)第一操作数是否大于第二操作数,以及(ii)第一操作数是否小于或等于第二操作数,无论rx>ry或rx<ry。当比较条件字段具有第三值时,处理电路被配置为确定以下各项之一:(i)第一操作数是否大于或等于第二操作数,以及(ii)第一操作数是否小于第二操作数,无论rx>ry或rx<ry。根据这种方法,两位字段而不是所期望的三位字段足以表示六种不同的比较条件(小于(<)、大于(>)、小于或等于(≤)、大于或等于(≥)、等于(==)以及不等于(!=))。这是可能的,因为尽管不是所有的比较条件都具有比较条件字段的专用编码,但可以使用具有以相反顺序指定的操作数的其他比较条件之一来应用等效结果(例如,rx>ry等效于ry≤rx)。如果需要,比较条件字段的编码还留出备用以供用信号标示的另一操作的使用。

对于上面讨论的所有示例,该技术还可以用于虚拟机执行环境。虚拟机可以被提供为存储在可以是非暂态存储介质的计算机可读存储介质中的计算机程序。当由本身不具有用于处理如上面所讨论的被编码的指令的指令解码或处理电路的计算机执行时,虚拟机程序根据该编码解译指令并控制处理电路执行相应的操作。例如,虚拟机程序可以将指令映射到由主机的处理电路支持的本地指令。这允许为支持上面所讨论的编码技术的另一平台编写的代码在不支持这些技术的计算机上执行。

图1示意性地示出了包括用于响应于指令而执行数据处理的处理管线4的数据处理装置2的示例。管线4包括多个管线阶段,包括用于从指令高速缓存8获取待处理的指令的提取阶段6,用于对所提取的指令进行解码的解码阶段10,用于执行寄存器重命名以将由经解码的指令指定的架构寄存器指定符映射到标识硬件中提供的物理寄存器14的物理寄存器指定符的寄存器重命名阶段12,用于当指令的操作数变得可用时将等待执行的指令进行排队并且当操作数可用时发布用于执行的指令的发布阶段16,以及用于执行所发布的指令的执行阶段18。发布阶段16可以是有序的管线,其中指令以与由提取阶段6从指令高速缓存8提取指令的程序顺序相同的顺序执行,或可以是可以允许指令的无序发布用于以不同于程序顺序的顺序的执行。

执行阶段18可以包括用于处理不同种类的指令的多个执行单元,诸如用于执行算术或逻辑指令的算术/逻辑单元(alu),用于执行浮点指令的浮点(fp)单元以及用于执行加载指令以从存储器系统加载数据或存储指令以将数据存储到存储器系统的加载/存储单元。如图1所示,存储器系统可以包括指令高速缓存8、1阶(l1)数据高速缓存26、2阶(l2)高速缓存28和主存储器30。在这个示例中,l2高速缓存28被用作共享的指令/数据高速缓存,但是也可以提供单独的l2指令和数据高速缓存。此外,可以理解的是,可以有两阶以上的缓存。

图1仅是示意性的,并且为了简明起见,其并未示出处理装置2的所有可能的组件,因此装置2还可以包括其他元件。图1中所示的管线4中的特定管线阶段的布置仅是一个示例,并且可以提供其他类型的管线阶段。尽管图1示出了执行阶段18从寄存器14读取数据值并将数据值回写到寄存器14的示例,但是在其他示例中,可以当指令在发布阶段16未决(pending)时从指令的源寄存器读取数据。此外,可以在执行阶段之后提供单独的回写阶段,用于将指令的结果回写到寄存器14。而且,一些管线4可以在重命名阶段12和发布阶段16之间具有单独的分派阶段,用于提供缓冲器,使得即使发布阶段16已满,指令也可以离开重命名阶段12。尽管图1示出了包括寄存器重命名阶段12的管线的示例,但这是可选的,并且其他管线可以省略重命名阶段12。例如,以其原始程序顺序处理指令的有序管线可能不需要重命名阶段12。如果没有提供重命名阶段12,则由经解码的指令指定的架构寄存器也标识响应于这些指令而被访问的物理寄存器14。

解码阶段10根据特定指令集架构(isa)对指令进行解码。每条指令都有一定数量的位,并且isa定义了将如何解译这些位。通常,处理管线4可以支持多种不同的处理操作。为了便于理解,下面的示例的重点放在操作的有限子集上,例如加法、减法(sub)、and(与)、or(或)、乘法(mul)、除法(div)、位取反(bitrev,用对给定值的所有位取反,例如,对0001的位取反,得到1000)并且计数前导零(clz,例如,值0011的前导零计数为2)。可以理解,在实践中,大多数isa会定义其他类型的操作,诸如移位、推送或弹出操作用于推送或弹出来自堆栈或类似数据结构的数据、加载或存储指令、将指令进行分支等。为简洁起见,下面的示例被简化了。此外,下面的示例假定该架构定义了可响应于指令被访问的16个架构寄存器。可以理解,其他架构可以定义其他数量的寄存器,例如,32个。注意,这不限制硬件中提供的物理寄存器14的数量。当寄存器重命名被支持,则物理寄存器文件可具有比架构中定义的架构寄存器更多数量的物理寄存器。

如图2的示例所示,上面所讨论的操作的子集可以使用15位表示,其中4位表示指令的结果将被写入到的目标架构寄存器rd,3位表示标识要执行的操作的类型的指令操作码opc,4位表示第一源架构寄存器rx,还有4位表示第二源架构寄存器ry。add、sub、and、mul和div指令都是需要源寄存器rx和ry的双源指令,并且控制处理管线4以对存储在寄存器rx、ry中的操作数执行相应的处理操作,结果被写入架构寄存器rd。bitrev和clz指令只需要一个源寄存器rx,在这种情况下,忽略与ry对应的位字段。应该理解,图2中示出的15个指令位可以仅表示整个编码空间的一部分。例如,指令可以多于15位,在这种情况下,指令的其他位中的一些可以指定图2中示出的15位应该被解译为如图2的编码中所示或针对其他指令(例如,移位或加载/存储指令)以一些其他方式进行解译。

由于有16个架构寄存器,源寄存器和目标寄存器rx、ry、rd分别由4位表示,因此可以自由选择使用哪个架构寄存器作为每个源寄存器和目标寄存器。然而,该方案包括一些冗余,因为例如当将add指令应用于给定的架构寄存器对(例如,r1和r2)时会给出相同的结果,而不管r1和r2中的哪一个被指定为第一源操作数rx以及哪一个被指定为第二源操作数ry。类似地,and、or和mul指令是可交换指令,其中,将源操作数rx和ry的顺序取反不会改变结果。

与之相比,图3示出了用于表示上面所讨论的操作的子集的替代编码,其中,对于图3的左侧部分中所示的第一类指令,第一和第二源架构寄存器rx、ry使用限制rx大于ry的编码来表示。目标架构寄存器rd和操作码opc仍分别使用4位和3位字段表示。

在图3的第一类指令中,两个源架构寄存器rx、ry使用两个字段a、b来表示,这些字段一起包括7位而不是图2的8位。以下参考图4a和图4b讨论基于rx和ry对字段a和b进行编码的两个示例,但是通常通过使用如下所述的rx>ry的编码方案对rx、ry进行重新编码,我们虽然节省了1位但也牺牲了一些功能。寄存器不能自身进行加法或乘法,并且我们不能在单个操作码中编码针对div或sub的所有独特情况。add的丢失的功能仍然可以通过移位来执行(左移1位位置的操作数等效于将操作数与其本身相加)。

在这个示例中,rx/ry编码方案对于a、b字段有八个未使用的码点。如图3右侧第二类指令所示,它们用于为单输入操作标示单独的操作码空间。需要额外的一位来完全指定单个醒目的源寄存器,并且该位s取自操作码编码,剩余2位操作码空间用于单输入操作,以及单独的3位操作码空间用于双输入操作。bitrev和clz以及对其单输入进行平方的mul的变体被放置在这个单输入操作码空间中。这会在双输入操作码空间中打开两个槽,该槽由sub和div的取反变体使用,使得可以对这些操作的rx>ry和rx<ry操作数情况进行编码。

在更现实的实施方式中,操作码列表可能会更长,并且在事物如何被移动方面提供了更大的灵活性。操作码列表可能包括移位;在这种情况下,将需要取反的版本,这表明了指令通过寄存器不断移位的形式的可能性。如果支持寄存器操作数位移由立即数(immediateconstant)指定的位数的移位指令被支持,则指令的取反形式可以将立即数移位由寄存器操作数指定的位数量的位置,这可能对于例如掩码生成是有用的。

图3示出了存在16个架构寄存器的示例,但是更一般地,如果存在2n个寄存器,则约束rx>ry意味着存在rx和ry的2n2n-1/2个有效组合,其可以在2n-1位中编码,剩余2n-1未被使用的值。利用这里提出的编码方案,这些未使用的值可以用于用信号标示单独的单输入操作数空间,但是可选地可使用采用a和b字段的备用编码的第二类指令来表示其他类型的操作。如果附加的取反操作数操作码的数量足够少,则不需要使得操作码字段更大,并且整体编码方案会变得比一般方案少1位。但是,通常可能会发现,在添加了取反操作码以用于非可交换操作之后,操作码字段会增长1位,并且未保存任何内容,但在这种情况下,益处是可以合并未使用的操作码空间,简化解码并且防止未来扩展变得复杂。

图4a和图4b示出了图3中所示的指令编码的a和b字段的两个示例编码。在图4a中,两个n位架构寄存器指示符rx、ry被如下编码,其中,x总是大于y:

针对需要两个源寄存器rx、ry的双输入操作:

a=xeorreplicate(y<n-1>);(a=x异或复制(y<n-1>))

b=x<n-2:0>eory<n-2:0>;(b=x<n-2:0>异或y<n-2:0>)

instruction=binary_opcode:b:a:d;(指令=二元_操作码:b:a:d)

针对单输入操作来对单个源寄存器rx进行编码:

a=xeorreplicate(x<n-1>);(a=x异或复制(x<n-1>))

b=0;

s=x<n-1>;instruction=unary_opcode:s:b:a:d;(指令=一元_操作码:s:b:a:d)

在该表示中:

·v<b>表示值v的位b,例如,y<n-1>指代来自值y的位n-1。

·v<b:a>表示值v的位a至位b的范围(其中b通常大于a),例如,x<n-2:0>表示值x的位0至位n-2。

·eor表示异或(xor)

·replicate()表示通过重复括号()内的参数位而形成的全宽值。因此,replicate(y<n-1>)包括全部等于y的位n-1(这是y的最高有效位)的n位。实际上,如果y的最高有效位是1,则a=x,并且如果y的最高有效位是0,则a=取反(x)。

·冒号(:)表示拼接,其中最高有效位在前。因此,如果binary_opcode是101,b是00,a是10,d是1001,则binary_opcode:b:a:d的结果是值10100101001。

图4a示出了当使用这种编码时,每对rx和ry的a和b的可能值。请注意,表中以阴影条目示出的rx和ry的组合是无效的,因为它们具有ry>rx,并且以叉示出的条目是无效的,因为它们具有rx=ry。从表的对称性我们可以看出,通过限制rx大于ry,我们将可能的组合数减少到总数的一半以下,这就是为什么可以节省1位。此外,如图4a底部所示,还有一些备用编码可用于单输入操作。在该示例中,备用编码具有b=000和a=0???(其中?是0或1,这些位与附加操作码位s一起标识了用于单输入操作之一(例如,bitrev、crz或平方mul指令)的单个源寄存器rx。

注意,对给定的架构寄存器指定符的对进行编码以产生a和b值并不是由图1的装置2本身执行的,而是当根据生成将基于源代码或编译代码执行的指令时,由编译器或汇编器执行。

在管线2处的某点提供解码电路用于解码a和b字段以标识架构寄存器指定符rx、ry。尽管寄存器解码可以放置在任何阶段处(例如,在寄存器重命名处),但是标识结构寄存器编号越早,可以越早执行危险检测。因此,可以期望寄存器解码在解码阶段10处发生。

图5示出了用于解码指令的解码阶段10的部分的示例。如图5所示,解码阶段可以包括操作码解码器40和寄存器解码器42。由于目标寄存器指定符rd在指令编码中被明确标识,所以其不变地经过解码阶段10。寄存器解码器42接收指令的a和b字段以及附加操作码位s,并对它们进行解码以标识第一和第二源架构寄存器rx和ry。寄存器解码器42还从a和b字段标识当前指令是单输入指令(第二类指令)中之一,并且向操作码解码器40提供关于是否为这种情况的指示。操作码解码器40根据指令是第一类指令还是第二类指令之一来解码指令的操作码,并且输出标识经解码指令的给定数量的位。经解码指令可以包括控制管线的后续阶段以适当地处理该指令所需的任何数量的位,例如,用于选择执行阶段80内的若干功能单元中的哪一个应该处理指令的标示信号。

当使用图4a中所示的编码时,寄存器解码器42可以使用以下操作来解码a和b字段以及附加操作码位s:

booleanbinary=(b:a<n-1>!=replicate('0'));

bits(n-1)tmp_y=beora<n-2:0>;

booleanflip=('0':tmp_y:s>a:'0');

bits(n)mask=flip?replicate('1',n):replicate('0',n);

bits(n)x=aeormask;

bits(n)y='0':tmp_yeormask;

“二元”标志可用于向操作码解码器40信号告知操作码是否应被解译为二元操作码(第一类操作)或一元操作码(第二类操作)。

这似乎是一系列相对复杂的操作,但在电路中用于确定这些的逻辑实际上比上述表达式所表达的更简单。为了确定影响是否对a和tmp_y的值进行取反的值“flip”,可以使用b的第一非零扫描来选择来自a的哪一位用于确定a是否大于axorb。图6a示出了用于解码a和b以标识rx、ry的电路的示例。该电路包括一系列or(或)门50,它们将b的相应位与a的对应位进行异或(即,这些门50有效地确定上述表达式中的“tmp_y”的值)。该电路还包括一系列nor(或非)门52,其输出由or门54结合。or门54的输出表示上面所示的参数“flip”。nor门52-0接收附加操作码位s的取反版本、b字段的3位和a字段的最高位作为输入,仅当s=1、b=000且a的最高位是0的情况下其输出为1。nor门52-1接收b的最高两位、a的最高位、b的最低位和a的最低位的取反版本作为输入,并且如果b=001且a=0??0(同样,所有用“?”表示的位可以是0或1),则其输出将为1。nor门52-2接收b的高位、a的高位、b的第二位的取反版本和a的第二最低位作为输入,并且如果b=01?且a=0?0?,则其输出为1。最后,nor门52-3接收a的最高两位和b的高位的取反版本作为输入,并且如果b=1??且a=00??,则其输出为1。如果任意nor门52输出1,则“flip”=1,如由or门54生成的。当“flip”等于1时,使用xor门56将a字段反转以产生第一源寄存器指定符rx。此外,当“flip”等于1时,则ry的最高有效位为1,并且ry的其他3位由xor位58形成,其将由xor门50生成的tmp_y的相应位的输出进行取反。可选地,当“flip”等于0时,rx=a,ry的高位=0,ry的其余位等于b的相应位。

图6b示出了编码逻辑的第二示例。在该示例中,在or门54与xor门56、58之间的路径上提供额外的xor门55。xor门55接收操作码的选定位(例如,最低位)作为其第二输入。利用这种解码逻辑,操作码具有以下特性:按操作码编号的每个第二个操作码,将rx>ry条件有效取反为rx<ry(因为xor门55有效地将最终rx、ry结果的所有位取反);这使得可以将单个非可交换操作分配给两个不同的操作码槽,从而使所有操作数序列成为可能。当针对取反的非可交换指令之一(该取反由门55施加)对给定值rx、ry进行编码时,应该在应用以上所示的编码处理之前执行对rx、ry的相应取反,以确保rx和ry的正确值被返回。因此,对应于相同非可交换操作但具有不同操作数顺序的一对互补指令有效地用仅一位不同的操作码来表示,从而允许仅使用一个附加的门55进行相对简单的解码。另一方面,对于可交换操作只分配一个操作码槽,其中仅相差一位的相邻操作码对对应于完全不同的可交换操作。注意,虽然在图6b中为了简明而省略了图6a的nor门52-0(例如,这可以是不重复使用a、b中的备用编码空间用于单输入操作的示例),但是在其他示例中,也可以提供nor门52-0。

图4b示出了可以使用的a和b字段的第二示例编码。再次,rx被约束为大于ry。在这种情况下,对于在0到2n-1的范围内的并且约束为rx>ry的给定值rx、ry,将a和b编码如下:

if(y>=2n-1)then

a=xeor(2n-1)//(2n-1是具有n-1位全部=1的值))

b=yeor(2n-1)

else

a=x

b=y

endif

可以观察到,由于这个ry的约束值,b将总是小于2n-1,所以我们可以删除一位。

图4b是示出可用该编码方案得到的不同编码的表格。再次地,有一些备用编码,但是这次是针对a的最高位为零并且a的剩余位等于b的相应位的值。因此,虽然备用编码不同于图4a的编码,但仍允许使用对要被定义的操作码的不同解译的单独的第二类指令,其由寄存器字段a、b的特定值与第一类区分开。对于这些备用编码,图3中所示的单个源寄存器rx是使用b的3位(与a的较低的3位相同)和附加操作码位s来标识,并且将要使用该单个寄存器rx执行的操作由操作码字段的其余两位来标识。

为了针对以图4b中所示的方式编码的第一类指令而解码a和b,可以使用以下逻辑:

if(b>=a)then

x=aeor(2n-1)

y=beor(2n-1)

else

x=a

y=b

endif

这种方法可能需要稍微更深的解码逻辑,因为以确定是否b>=a而进行的b和a的数字比较可能需要若干xnor门。对于第二类指令,比较器可以确定a的较低的3位是否等于b的相应位,并且如果是,rx可以直接从s和b确定而不需要任何解码。

可以选择rx和ry的特定组合的其他更多任意映射,其中,rx>ry被映射到a和b字段的潜在值上。通常,无所谓由a和b字段的每个不同编码表示哪一对寄存器,但是图4a和4b中所示的示例在减少所需的解码逻辑量方面是尤其有利的,并且因为图4a需要相对较浅的逻辑所以尤其有效,如图6所示,它将备用编码合并到针对b为000且a的最高位也为0的编码空间的公共部分。

图7示出了处理指令的方法。在步骤100处,解码器确定当前指令是否是第一类指令中的一个(例如,是否a、b不具有备用编码中的一个)。如果该指令是第一类,则在步骤102处,寄存器字段a和b被解码以确定要用于该指令的架构寄存器编号rx、ry,其中rx>ry。在步骤104处,解码阶段10对指令的操作码进行解码。在步骤106处,管线的后续阶段使用对应于所标识的架构寄存器rx和ry的寄存器来处理指令。注意,这些寄存器可以是由重命名阶段12重映射的具有不同物理寄存器编号的物理寄存器。当rx>ry时,不存在对物理寄存器的使用的约束。

另一方面,如果指令不是第一类指令中的一个,则在步骤110处确定该指令是否是第二类指令。如果不是,则以某一其他方式处理该指令。为确定指令是否属于第二类,其可以根据a和b字段是否具有上述的备用编码中的一个来标识。如果该指令是第二类,则在步骤112处,附加操作码位s和a和b字段的位的子集(例如,a字段的较低的3位)被解码以确定单个源寄存器的架构寄存器编号rx。在步骤114处,根据一元操作码解码方案来对指令的操作码进行解码。在步骤116处,随后的管线阶段使用对应于架构寄存器编号rx的单个寄存器来处理指令以执行由操作码表示的操作类型。

在上面的示例中,所表示的寄存器rx、ry是包含用于相应处理操作的源操作的源寄存器。但是,使用这种编码方案来编码目标寄存器或其他类型的寄存器也是可能的。例如,一些指令标识从开始寄存器开始的并在结束寄存器处结束的架构寄存器的列表,并且控制处理电路使用具有在开始和结束寄存器之间的架构编号的连续的架构寄存器块来执行给定操作。例如,加载多重指令可以将数据值从多个地址加载到对应于架构寄存器编号的连续寄存器块中,或者存储多个指令可以将来自指定寄存器的数据存储到存储器中的相应地址。此外,某些堆栈指令(推送或弹出指令)可以将数据从寄存器范围保存到堆栈,或者将数据从堆栈中恢复到寄存器。在这种情况下,定义寄存器列表的开始和结束寄存器也可以使用与上面所示类似的方案进行编码。第一类指令和第二类指令的定义(其中使用第一类中的寄存器字段的一些备用编码来表示第二类指令)对于这种基于列表的指令也是有用的,因为第一类给出多寄存器列表,并且第二个类仅给出单个寄存器,相比第二类,更多的操作码用于第一类操作是有用的,以便描述列表的元素之间的不同潜在交互。

图8示出了利用寄存器编码rx、ry中的冗余的另一示例。在这个示例中,指令可以用指令中明确标识的rx和ry进行编码,并允许rx和ry的任意组合。例如,这可以使用图2中所示的编码。然而,如图8所示,解码阶段10可以包括寄存器比较器150,用于比较rx和ry并生成比较结果信号152,该比较结果信号被提供给操作码解码器154以指示rx和ry中的哪一个更大。操作码解码器154可根据由信号152指示的比较结果以不同的方式解码指令的操作码,从而根据rx和ry中的哪一个更大从相同的操作码生成不同的经解码指令156。基本上,rx和ry的相对顺序提供了至少1位的附加信息,这些附加信息可以补充操作码,使得可以使操作码字段本身缩小1位或者使用给定数量的操作码位来支持更大数量的不同的操作。注意,在一些情况下,来自比较信号152的附加信息应被视为单独的标志而不是操作码的扩展。

这可以以不同的方式使用。在一些情况下,由指令的rx>ry和rx<ry形式表示的操作本质上应对应于相同类型的操作,但是可基于比较结果以某种方式来修改操作。其示例就是针对算术(例如,相乘)指令导出会影响结果的“绝对”修饰符。在这种情况下,rx<ry可能意味着“不对结果取正绝对值”,而rx>ry的情况意味着“取绝对值”。rx==ry的情况只属于“不做什么”的情况,因为任何数字乘以自己都是正数,并且不需要绝对标志。如果rx<=ry,则可以将“绝对”标志定义为被清除,如果rx>ry,则将其定义为被设置。因此,通过使用rx和ry的相对顺序,无需在指令中编码绝对标志。

可选地,rx>ry和rx<ry时执行的操作可以完全不同。一般来说,如果从操作字段中取出一位,则该位可以用rx和ry寄存器的顺序来补充,使得基本上有三种不同的技术用于解译操作码字段,针对rx>ry的操作码设置0,针对rx<ry的操作码设置1,针对rx=ry的操作码设置2(设置2是上面所讨论类型的单输入操作码)。尽管这种方法可能需要更深的测试逻辑(因为由比较器150提供的比较可能需要比图6所示的用于约束rx大于ry的编码的电路更多的电路),但它具有在寄存器操作数可见之前无需解码的优势,并因此这可以有助于更快地激活管线的操作数转发逻辑,并且可以允许更快地检测不同指令之间的危险。指令集设计者可以任意选择哪些特定的操作被组合成单个操作码编码。

例如,and、or和mov操作可以合并至单个操作码点中。如果rx小于ry,则将操作码视为and操作并返回rxandry。如果rx大于ry,则将操作码视为or操作并返回rxorry。如果rx和ry相等,则做什么并不重要,因为无论哪种情况,结果都等同于mov操作,所以称之为mov。然后,可以采用所有的可交换操作,其中至少有一半不需要处理rx==ry的情况,将它们配对至共享的操作码编号中。例如,不能将add和sub配对,因为sub需要以任意顺序接受参数,但可以将add和eor配对,因为rx+rx给出rx*2,并且rxeorrx给出零,并且还存在无需使用eor便能够获得零结果的其他方式(例如,rx-rx),所以不需要它来处理这种情况(rx*2也可能是多余的,因为它相当于左移1位)。

图9示出了可以使用图8所示的方法的指令的另一示例。图9示出了比较指令,其中条件字段(cond)标识要将什么比较条件应用于架构寄存器rx和ry中的两个源操作数。这不是可交换的,但可以对操作数重新排序并更改操作以获得等效操作。

如果有假设的cmp指令,则有六种基本方法可以比较两个输入rx和ry:小于(<)、大于(>)、小于或等于(<=)、大于或等于(>=)、等于(==)和不等于(!=)。这六个操作需要3位加上两个寄存器索引rx和ry的位进行编码,总位数为(nx+ny+3),其中nx和ny是分别用于指定rx、ry的位的数量。通过使用交换性和等价性,可以更有效地对它们进行编码。

假设可以自由选择用(nx+ny)位编码的rx和ry。实际上只需要三种操作选择,而不是六种:

cmp(rx<ry)等同于cmp(rx>=ry),所以仅需要对这两条指令中的一条进行编码。

cmp(rx<=ry)等同于cmp(rx>ry),所以同样可以仅编码一个选项。

cmp(rx==ry)和cmp(rx!=ry)是可交换的,因此可以用一个操作值对它们进行编码,并根据rx<ry或rx>ry来选择正确的操作。

然而,在最后一种情况下,如果rx==ry,那么无法区分等于操作和不等于。但是因为这些都是无关紧要的情况,所以可以再次将它们转换成能够给出相同答案的其他操作。所以:

cmp(rx==rx)始终为真,cmp(rx<=rx)同样为真,所以对后者进行编码。

cmp(rx!=rx)始终为假,cmp(rx<rx)同样为真,所以对后者进行编码。

这些组合允许仅使用2位来编码比较操作,总计(nx+ny+2)位。

请注意,对于这样的比较指令,会执行两个单独的比较,一个用于比较寄存器指定符rx、ry以标识正在使用哪种类型的比较条件,以及稍后在管线中执行的另一比较用以根据所选择的比较条件来比较存储于寄存器中的实际数据值。

图10示出了处理使用第二示例编码的指令的方法。在步骤200处,接收指令并且由寄存器比较器150比较寄存器字段rx和ry。如果rx大于ry,则在步骤202处,操作码解码器154生成经解码的指令156以控制后续管线阶段使用对应于架构寄存器rx和ry的寄存器来执行第一类型的处理操作。另一方面,如果rx小于ry,则在步骤204处,操作码解码器154对操作码进行解码以生成经解码的指令156,其控制管线的其余部分以使用对应于rx和ry的寄存器执行第二类型的处理操作。该第二类型的处理操作可以与第一类型的处理操作相同,但是以某种方式进行修改(例如获取结果的绝对量),或者可以是完全不同的操作。当rx=ry时,解码器可以进行到步骤202或204中的一个,以便控制处理管线执行第一或第二类型的处理操作,或者在步骤206处,可以生成对应于使用与rx相对应的单个寄存器执行的第三类型处理操作的经解码指令。另一种替代方案是使针对rx=ry编码的一些指令无效,使得在这种情况下,在应该用信号通知未定义的指令异常的情况下,不会生成经解码的指令。对于rx=ry所采取的方法可以因操作码的不同而不同。

可选地,对于一些指令,当rx>ry或rx<ry时可以选择第一类型的操作,并且当rx=ry时可以选择第二类型的操作。例如,根据是rx>ry还是rx<ry,减法指令会生成不同的结果,但是当rx=ry时结果始终为0并且可能由其他操作生成,所以可以将其中rx=ry的sub操作码的编码重新使用以供另一操作,例如单输入操作数。对于其中不感兴趣rx=ry时的结果的其他非可交换操作(例如,bic、div、orn等)可采用类似的方法。

图11示出了可以使用的虚拟机实现方式。尽管前面描述的实施例在用于操作支持相关技术的特定处理硬件的装置和方法方面实现了本发明,但是也可以提供所谓的硬件装置的虚拟机实现方式。这些虚拟机实现方式运行于主机处理器330上,该主机处理器通常运行支持虚拟机程序310的主机操作系统320。通常,需要大型强功率处理器来提供以合理的速度执行的虚拟机实现,但是这种方法可能在某些情况下是合乎情理的,例如出于兼容或重新使用的原因期望运行另一处理器本地的代码时。虚拟机程序310能够执行应用程序(或操作系统)300以提供与由真实硬件设备执行该程序所给出的结果相同的结果。因此,程序指令,包括对上述存储器访问的控制,可使用虚拟机程序310从应用程序300内被执行。

在本申请中,用语“被配置为”的使用意指装置的元件具有能够执行所定义操作的配置。在此上下文中,“配置”意指硬件或软件的互连布置或方式。例如,装置可具有提供所定义操作的专用硬件,或者处理器或其他处理装置可被程序化以执行该功能。“被配置为”并不意指装置元件需要以任何方式改变从而提供所定义操作。

尽管本文已参考附图详细地描述本发明的说明性实施例,但应理解,本发明并不限于这些精确实施例,并且在不脱离如所附权利要求所定义的本发明的范围和精神的情况下,本领域技术人员可以在其中实施各种改变、添加及修改。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1