CN118132154A - 指令处理方法、程序编译方法、相关器件及设备 - Google Patents

指令处理方法、程序编译方法、相关器件及设备 Download PDF

Info

Publication number
CN118132154A
CN118132154A CN202410263957.9A CN202410263957A CN118132154A CN 118132154 A CN118132154 A CN 118132154A CN 202410263957 A CN202410263957 A CN 202410263957A CN 118132154 A CN118132154 A CN 118132154A
Authority
CN
China
Prior art keywords
instruction
prefix
extended
byte
target
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202410263957.9A
Other languages
English (en)
Inventor
林志翔
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Haiguang Information Technology Co Ltd
Original Assignee
Haiguang Information Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Haiguang Information Technology Co Ltd filed Critical Haiguang Information Technology Co Ltd
Priority to CN202410263957.9A priority Critical patent/CN118132154A/zh
Publication of CN118132154A publication Critical patent/CN118132154A/zh
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

本申请实施例提供一种指令处理方法、程序编译方法、相关器件及设备,其中指令处理方法包括:译码当前指令;如果当前指令为第二指令且具有指令前缀,根据第二指令的指令前缀,判断第二指令是否扩展第一指令对应的第一操作;程序中依赖第一指令的第二指令扩展第一操作,程序中被第二指令所依赖的第一指令被消除;如果第二指令扩展第一操作,为第二指令携带第一操作对应的标记位;在执行第二指令时,对于携带第一操作对应的标记位的第二指令,利用第一操作得到第二指令的中间计算结果,根据中间结算结果得到第二指令的执行结果。本申请实施例可在精简程序中第一指令的数量的情况下,减少处理器的流水线过程的资源占用、释放资源,提升处理器性能。

Description

指令处理方法、程序编译方法、相关器件及设备
技术领域
本申请实施例涉及处理器技术领域,具体涉及一种指令处理方法、程序编译方法、相关器件及设备。
背景技术
指令作为程序的操作命令,可用于指导处理器执行程序任务,从而处理器可以通过处理指令,以实现运行程序(程序可由一系列指令组成)。处理器处理指令的效率,对于处理器的性能具有重大影响,因此如何改进处理器的指令处理方案,以提升处理器的性能,一直是处理器技术的研究热点。
发明内容
有鉴于此,本申请实施例提供一种指令处理方法、程序编译方法、相关器件及设备,以提升处理器的性能。
为实现上述目的,本申请实施例提供如下技术方案。
第一方面,本申请实施例提供一种指令处理方法,包括:
译码当前指令;
如果当前指令为第二指令,且第二指令具有指令前缀,则根据第二指令的指令前缀,判断第二指令是否扩展第一指令对应的第一操作;其中,程序中依赖第一指令的第二指令扩展第一操作,且程序中被第二指令所依赖的第一指令被消除;
如果第二指令扩展第一操作,为第二指令携带第一操作对应的标记位;
在执行第二指令时,对于携带第一操作对应的标记位的第二指令,利用第一操作得到第二指令的中间计算结果,根据中间结算结果得到第二指令的执行结果。
第二方面,本申请实施例提供一种程序编译方法,包括:
在程序编译的过程中,确定程序中的第一指令以及依赖第一指令的第二指令;
消除第一指令;
以及,为依赖第一指令的第二指令扩展第一指令对应的第一操作,并在依赖第一指令的第二指令的指令前缀中设置目标值的目标标识,以指示第二指令扩展第一操作;
其中,扩展第一操作的第二指令在被执行时,利用第一操作得到第二指令的中间计算结果,所述中间结算结果用于得到第二指令的执行结果。
第三方面,本申请实施例提供一种处理器,包括:
译码单元,用于译码当前指令;如果当前指令为第二指令,且第二指令具有指令前缀,则根据第二指令的指令前缀,判断第二指令是否扩展第一指令对应的第一操作;如果第二指令扩展第一操作,为第二指令携带第一操作对应的标记位;其中,程序中依赖第一指令的第二指令扩展第一操作,且程序中被第二指令所依赖的第一指令被消除;
执行单元,用于在执行第二指令时,对于携带第一操作对应的标记位的第二指令,利用第一操作得到第二指令的中间计算结果,根据中间结算结果得到第二指令的执行结果。
第四方面,本申请实施例提供一种芯片,包括如上述第三方面所述的处理器。
第五方面,本申请实施例提供一种电子设备,包括如上述第三方面所述的处理器,或者,如上述第四方面所述的芯片。
第六方面,本申请实施例提供一种计算机,用于编译程序,所述计算机包括:至少一个处理器和至少一个存储器,所述存储器存储编译软件,所述处理器调用所述编译软件,以执行如上述第二方面所述的程序编译方法。
第七方面,本申请实施例提供一种存储介质,所述存储介质存储有编译软件,所述编译软件被执行时实现如上述第二方面所述的程序编译方法。
第八方面,本申请实施例提供一种计算机程序产品,包括编译软件,所述编译软件被执行时实现如上述第二方面所述的程序编译方法。
本申请实施例可以为程序中依赖第一指令的第二指令扩展第一操作,并将程序中被依赖的第一指令进行消除,以精简程序中的第一指令的数量,从而在处理器处理指令时,如果译码的当前指令为第二指令,且第二指令具有指令前缀,则可以根据第二指令的指令前缀,判断第二指令是否扩展第一操作;并为扩展第一操作的第二指令携带第一操作对应的标记位,以便第二指令在执行时能够采用具有扩展的第一操作的执行逻辑;进而在执行第二指令时,对于携带第一操作对应的标记位的第二指令,处理器可以利用第一操作得到第二指令的中间计算结果,根据中间结算结果得到第二指令的执行结果,实现第二指令的指令处理。由于程序中被第二指令依赖的第一指令可以被消除,并且第一指令对应的第一操作嵌入在依赖第一指令的第二指令的中间计算过程中,因此程序中的第一指令能够减少,从而处理器的流水线过程(例如取指、译码、发射、执行、写回等流水线过程)能够减少资源占用,例如可以减少处理器译码指令的译码阶段对于译码器的占用,进而处理器原本为第一指令分配的资源可以释放出来,并分配给其他指令使用,从而提升处理器的资源利用效果;因此,本申请实施例可以在程序中第一指令的数量被精简的情况下,减少处理器的流水线过程的资源占用、释放处理器的资源,提升处理器的性能。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为程序的程序编译阶段和程序处理阶段的示例图。
图2为本申请实施例提供的程序编译方法的流程图。
图3为本申请实施例提供的指令处理方法的流程图。
图4为本申请实施例提供的指令处理方法的另一流程图。
图5为SIB地址索引方式的地址计算单元的示例图。
图6为兼容扩展和未扩展符号位扩展操作的地址计算单元的示例图。
图7为本申请实施例提供的处理器的示例图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
程序可由程序员使用汇编语言或高级语言编写得到,程序员编写的程序可以通过编译器编译为机器可执行的机器指令(简称为指令),编译的指令可以由处理器(比如CPU)读取并处理。为便于理解,图1示例性的示出了程序的程序编译阶段和程序处理阶段的示例图,如图1所示,在程序编译阶段,编译器可以将程序编译为指令,编译后的指令可以保存在用于处理程序的电子设备的存储中,存储比如内存、缓存等;在程序处理阶段,处理器可以通过取指从存储中读取指令、并通过译码、执行、访存和写回等处理器流水线过程,完成指令处理。
其中,取指是指处理器的取指单元从缓存中读取指令。例如,处理器的取指单元可以从缓存中读取指令,如果缓存中未读取到指令,则内存中的指令可以替换到缓存中,从而取指单元再从缓存中读取指令;取指单元读取的指令可以送入处理器的译码单元。
译码是指处理器的译码单元将指令解释为可由处理器执行的操作信息,例如操作码、操作数和控制字段所形成的微指令。译码单元可以是译码器,例如多个译码器形成的译码器组,处理器可以设置一个或多个译码器组进行指令的译码。
执行是指处理器的执行单元对指令执行运算。译码单元译码后的指令可以发射到执行单元,以便执行单元对指令执行运算,也就是说,译码后的指令可以分发给处理器中可用的执行单元,以执行指令。进一步的,处理器可以通过寄存器重命名单元对进入发射的指令进行寄存器重命名;也就是说,译码后的指令在发射到执行单元之前,可以由寄存器重命名单元对指令进行寄存器重命名。需要说明的是,执行单元在执行指令时允许乱序执行,但是执行单元执行完成的指令需要按照程序编写时的指令顺序进行提交,以保持程序的语义正确性,这一过程可称为乱序执行但按顺序提交。
访存是指处理器的访存单元执行访存操作,实现数据在内存的写入或读取。
写回是指处理器的写回单元将指令的执行结果写回到寄存器或内存。
指令作为程序的操作命令,不同类型的指令对应的操作可能不同。例如,不同类型的指令可以包括但不限于:取反指令、零位扩展指令、符号位扩展指令、地址计算指令等。需要说明的是,指令的类型众多,此处仅是进行指令类型的示例性说明。
取反指令对应的操作为将源操作数取反。零位扩展指令对应的操作为在源操作数的高位用零进行填充,得到位数扩展后的目的操作数;比如在8位或16位的源操作数的高位填充零,扩展得到32位或64位的目的操作数。符号位扩展指令对应的操作为在源操作数的高位复制符号位,得到位数扩展后的目的操作数;比如在32位的源操作数的高位复制符号位,扩展得到64位的目的操作数。需要说明的是,在符号位扩展中,源操作数是带有符号的,因此源操作数的高位是使用符号位进行填充;而在零位扩展中,源操作数的高位则是使用零进行填充。地址计算指令对应的操作是计算地址,例如计算内存地址。需要进一步说明的是,源操作数是指令需操作的操作数,目的操作数是指令执行之后的执行结果对应的操作数。
可见,程序可以由一系列的指令组成,然而,如果组成程序的指令数量众多,则将对处理器处理程序的处理时间造成影响,增大处理器的指令处理负担,影响处理器的性能。也就是说,如果程序中的指令数量较多,将增大处理器的指令处理负担。
以符号位扩展指令为例,符号位扩展指令在程序中存在大量的使用。具体的,本申请的发明人通过对SPEC(Standard Performance Evaluation Corporation,标准性能评估组织)CPU(Central Processing Unit,中央处理器)测试程序进行调研之后,发现符号位扩展指令在SPEC CPU测试程序中占据较大的比例,如下表1所示。
SPEC CPU测试程序 movsxd占比
416.gamess_gradient 11.27%
416.gamess_triazolium 8.68%
416.gamess_cytosine 6.95%
410.bwaves 7.62%
表1
其中,movsxd表示符号位扩展指令,在SPEC CPU测试程序中,符号位扩展指令用于通过符号位扩展操作,将32位的寄存器扩展到64位的寄存器,即通过符号位扩展操作,将寄存器中的值从32位的值扩展到64位的值。
在表1示例中,416.gamess_gradient属于GAMESS(Gaussian ElectronicStructure Programs,高斯电子结构程序)的软件包测试程序,涉及GAMESS软件包中的梯度计算部分;416.gamess_triazolium属于GAMESS的软件包测试程序,用于量子化学计算,比如涉及三唑啉分子的计算;416.gamess_cytosine属于GAMESS的软件包测试程序,用于量子化学计算,比如涉及胞嘧啶分子的计算;410.bwaves属于GAMESS的软件包测试程序,应用于流体动力学。
通过表1所示可以看出,符号位扩展指令在程序中占据较大的比例,处理器如果需要处理这些较大比例的符号位扩展指令,无疑将增大处理器的指令处理负担,影响处理器的性能。
优化处理器的性能的一种思路是考虑精简程序的指令数量。例如,在编译器层面将程序中不必要的指令进行移除,不必要的指令比如程序中的无效指令、对于程序结果无影响的指令等。通过移除程序中不必要的指令,可以精简程序的指令数量,从而减小处理器的指令处理负担。
示例的,以符号位扩展指令为例,基于程序中占据较大比例的符号位扩展指令,编译器可以在编译程序时(例如将程序的高级语言代码编译为指令时),检测程序中的符号位扩展指令是否必要,从而将程序中不必要的符号位扩展指令进行移除。通过移除程序中不必要的符号位扩展指令,可以降低符号位扩展指令在程序中的占比,精简程序中的符号位扩展指令的数量,从而减小处理器的指令处理负担。
在一个示例中,程序中的符号位扩展指令在以下情况可以视为不必要,能够进行移除:
符号位扩展指令的源操作数的符号位为0,则认为符号位扩展指令不必要,可以进行移除;也就是说,符号位扩展指令的源操作数的符号位需带有符号(比如1),使用源操作数的符号位在高位进行填充,能够保持带有符号的符号位的符号性,而如果源操作数的符号位为0,则实质是进行零位扩展,因此认为符号位扩展指令的源操作数的符号位为0时,符号位扩展指令不必要,可以进行移除;
符号位扩展指令的后续指令如果没有使用到符号位扩展指令的执行结果(即符号位扩展指令的目的操作数),则认为符号位扩展指令不必要,可以进行移除;也就是说,在后续指令没有使用到符号位扩展指令的执行结果时,后续指令并不依赖符号位扩展指令,符号位扩展指令是否执行都不影响后续指令的操作,因此可以移除符号位扩展指令;
符号位扩展指令的执行结果(即符号位扩展指令的目的操作数)的位宽,小于符号位扩展指令的源操作数,则认为符号位扩展指令是无效指令,可以移除符号位扩展指令;也就是说,符号位扩展指令是对操作数的位宽进行扩展,而如果符号位扩展指令的执行结果的位宽,反而小于符号位扩展指令的源操作数,则说明符号位扩展指令的操作是无效操作,可以移除符号位扩展指令。
编译器虽然可以将程序中不必要的指令进行移除,但是如果某一指令的执行结果需要在后续指令中使用(即某一指令被后续指令所依赖,换言之,后续指令依赖该某一指令),则并无法将该某一指令消除,这导致程序的指令数量的精简程度受限。也就是说,编译器优化移除程序中不必要指令的方式,限于检测判断程序中的具体指令是否必要,从而将不必要的具体指令进行移除,而执行结果在后续指令需使用的指令视为是必要的指令,无法消除,导致程序的指令数量的精简程度受限。
示例的,以符号位扩展指令为例,编译器虽然可以将程序中不必要的符号位扩展指令进行移除,但是如果后续指令需要依赖某一符号位扩展指令(即某一符号位扩展指令的执行结果需要在后续指令使用)时,并无法移除该符号位扩展指令。比如,程序中的某一符号位扩展指令通过符号位扩展操作,将一个32位的负数扩展到64位的负数,并且后续指令需要对该64位的负数进行计算,则由于该符号位扩展指令的执行结果在后续指令中需要使用(即该符号位扩展指令被后续指令所依赖),因此编译器并无法在程序中消除被后续指令依赖的符号位扩展指令。也就是说,编译器并无法将程序中被后续指令所依赖的符号位扩展指令进行移除,从而程序中仍然会存在一定比例的符号位扩展指令,导致程序的指令数量的精简程度受限。
基于此,本申请实施例考虑精简程序的指令数量的新思路:当程序中某一指令被后续指令所依赖时(即某一指令的执行结果是作为后续指令的源操作数使用时),本申请实施例考虑消除程序中的该某一指令,并在依赖该某一指令的后续指令中扩展该某一指令的操作,从而后续指令可通过扩展的操作来得到中间计算结果,进而后续指令可利用得到的中间计算结果实现后续指令的指令计算,达到进一步精简程序中的指令数量的效果,以提升处理器的性能。
例如,当程序中指令A被后续的指令B所依赖时(即指令A的执行结果是作为指令B的源操作数使用时),本申请实施例考虑消除程序中的指令A,并在依赖指令A的指令B中扩展指令A的操作,从而指令B可以通过扩展的指令A的操作得到中间计算结果(即将指令A的操作嵌入在指令B的中间计算中,得到中间计算结果),进而指令B可利用得到的中间计算结果实现指令B的指令计算,达到精简程序中的指令A的数量的效果,以提升处理器的性能。
示例的,当程序中的符号位扩展指令被地址计算指令所依赖时(即符号位扩展指令的执行结果是作为地址计算指令的源操作数使用时),本申请实施例考虑消除程序中的符号位扩展指令,并在依赖符号位扩展指令的地址计算指令中扩展符号位扩展操作(符号位扩展操作即符号位扩展指令的操作),从而地址计算指令可通过符号位扩展操作来得到64位的中间计算结果(即将符号位扩展操作嵌入在地址计算指令的中间计算中,以得到64位的中间计算结果),进而地址计算指令可利用得到的64位的中间计算结果实现地址计算。基于此,可以将程序中被地址计算指令所依赖的符号位扩展指令进行消除,从而精简程序中的符号位扩展指令的数量,提升处理器的性能。
为便于说明,针对程序中被后续指令依赖的指令,本申请实施例可称为第一指令,即执行结果被后续指令作为源操作数使用的指令可称为第一指令;在可选实现中,第一指令的一种示例可以是符号位扩展指令。针对程序中依赖第一指令的指令,本申请实施例将依赖第一指令的指令所属的指令称为第二指令,也就是说,程序中可能存在部分第二指令依赖第一指令,另一部分第二指令不依赖第一指令,因此第二指令是依赖第一指令的指令所属的指令;在可选实现中,第二指令的一种示例可以是地址计算指令,程序中可能存在部分地址计算指令依赖符号位扩展指令,另一部分地址计算指令不依赖符号位扩展指令。
基于此,本申请实施例可以在程序的第一指令被第二指令所依赖时,将第一指令在程序中进行消除,并在依赖第一指令的第二指令中扩展第一指令的第一操作(第一指令的操作可称为第一操作,第一操作比如符号位扩展操作),以使得依赖第一指令的第二指令能够使用第一操作得到中间计算结果,从而使用中间计算结果进行第二指令的指令计算(第二指令的指令计算比如地址计算指令的地址计算)。
例如,程序中的符号位扩展指令被地址计算指令所依赖,则可以将程序中的符号位扩展指令消除,并在依赖符号位扩展指令的地址计算指令中扩展符号位扩展操作,来得到用于地址计算的中间计算结果,从而利用中间计算结果进行地址计算。
为便于进一步理解,以符号位扩展指令和地址计算指令为例,符号位扩展指令在64位的程序中具有广泛的应用,用于通过符号位扩展操作,将非64位的操作数扩展到64位。比如,根据指令集的定义,64位的地址模式可以使用SIB(Scale,Index,Base)地址索引,其中,Scale、Index和Base是计算访存虚拟地址的输入,Scale表示比例、Index表示索引、Base表示基址;作为保存Index的Index寄存器和保存Base的Base寄存器需要使用64位的寄存器;如果Index寄存器或者Base寄存器对应的架构寄存器被作为非64位的寄存器来写入值(即写入的值是非64位的数据),则在进行SIB地址索引之前,需使用符号位扩展指令对Index寄存器或Base寄存器中写入的值进行符号位扩展操作,得到64位的值;从而才可以将Index寄存器或Base寄存器中64位的值作为地址计算的输入(即源操作数),以参与后续的SIB地址计算。
也就是说,符号位扩展指令的执行结果主要是用于后续的地址计算,即除地址计算指令之外,其他指令基本不会使用到符号位扩展指令的执行结果。同时,本申请的发明人通过对SPEC CPU测试程序等程序进行反汇编,也发现符号位扩展指令的执行结果主要是用于后续的地址计算。
基于此,在符号位扩展指令的执行结果是作为地址计算指令的源操作数来使用时(即符号位扩展指令被地址计算指令所依赖时),本申请实施例考虑将程序中的符号位扩展指令进行消除,而在依赖符号位扩展指令的地址计算指令中扩展符号位扩展操作,从而使得程序中占据较大比例的符号位扩展指令能够消除,优化处理器的性能。
需要说明的是,上述仅是以符号位扩展指令作为第一指令的示例进行说明,地址计算指令作为第二指令的示例进行说明,如果程序中某一指令的执行结果是作为另一指令的源操作数来使用(即某一指令被另一指令所依赖),则本申请实施例可以将该某一指令视为是可以在程序中消除的第一指令。例如,如果程序中的取反指令、零位扩展指令等指令的执行结果是作为后续其他指令的源操作数来使用,则也可以将取反指令、零位扩展指令等指令视为是本申请实施例支持消除的第一指令,并将依赖取反指令、零位扩展指令等指令的后续其他指令所属的指令视为是本申请实施例的第二指令。
作为可选实现,对于程序中可被消除的第一指令、以及依赖第一指令的第二指令而言,第一指令和第二指令可以存在使用上的强相关性,比如第一指令的执行结果唯一的被第二指令作为源操作数使用。也就是说,程序中的第一指令如果唯一的被第二指令所依赖,则可以将程序中被第二指令所依赖的第一指令消除,并在依赖第一指令的第二指令中扩展第一指令对应的操作,从而精简程序中的第一指令的数量。
基于上述思路,作为可选实现,基于程序可能存在部分第二指令依赖第一指令,另一部分第二指令不依赖第一指令,而在本申请实施例中,依赖第一指令的第二指令需扩展第一操作,不依赖第一指令的第二指令不需扩展第一操作,因此本申请实施例可以在扩展第一操作的第二指令的指令前缀中设置目标值的目标标识,以指示第二指令扩展了第一操作。
需要说明的是,某一第二指令未扩展第一操作可能是该第二指令的执行并不依赖第一指令,即该第二指令的源操作数不来自于第一指令的执行结果(比如地址计算指令的输入已是64位,则不需要通过符号位扩展指令进行扩展),此时可在该第二指令的指令前缀中不设置目标值的目标标识,以指示第二指令未扩展第一操作。对于依赖第一指令的第二指令,本申请实施例在消除第二指令所依赖的第一指令的情况,需要为第二指令扩展第一操作,此时可在第二指令的指令前缀中设置目标值的目标标识,以指示第二指令扩展了第一操作。
作为可选实现,本申请实施例可以在程序的编译阶段,消除程序中被第二指令所依赖的第一指令,以及为依赖第一指令的第二指令扩展第一操作,并通过在第二指令的指令前缀中设置目标值的目标标识进行指示。在可选实现中,图2示例性的示出了本申请实施例提供的程序编译方法的可选流程图,该方法流程可由编译器执行实现。需要说明的是,编译器工作在程序开发的程序编译阶段,可将程序的高级语言代码编译成指令;程序编译阶段发生在程序员编写程序代码之后,但在程序由处理器处理之前。
参照图2,该方法流程可以包括如下步骤。
在步骤S210中,在程序编译的过程中,确定程序中的第一指令以及依赖第一指令的第二指令。
在程序编译的过程中,如果编译器发现程序中的第一指令,则可确定后续指令中依赖第一指令的第二指令。例如,从第一指令的后续指令中,确定将第一指令的执行结果作为源操作数的第二指令。
示例的,在程序编译的过程中,如果编译器发现程序中的符号位扩展指令,则可确定后续指令中依赖符号位扩展指令的地址计算指令。例如,从符号位扩展指令的后续指令中,确定将符号位扩展指令的执行结果作为源操作数的地址计算指令。
在步骤S211中,消除第一指令。
在步骤S212中,为依赖第一指令的第二指令扩展第一操作,并在依赖第一指令的第二指令的指令前缀中设置目标值的目标标识,以指示第二指令扩展第一操作。
在程序编译的过程中,编译器发现第一指令以及依赖第一指令的第二指令,则可将程序中的第一指令进行消除,使得程序的指令数量的精简程度得以提升,也就是说,程序中减少了第一指令,程序的指令数量能够进一步精简,程序占用的代码空间能够减小,从而程序的指令在内存和缓存中占用的存储空间能够减小,优化指令在内存和缓存的存储。同时,程序中第一指令的数量被精简(即程序中被第二指令所依赖的第一指令可以消除,比如第一指令唯一的被第二指令所依赖,则第一指令可被消除),处理器可以减少处理第一指令,降低处理器的指令处理负担,提升处理器的性能。
在消除第一指令的情况下,为使得依赖第一指令的第二指令能够正常进行指令计算,本申请实施例可以在依赖第一指令的第二指令中扩展第一操作,其中,第二指令中扩展的第一操作用于得到第二指令的中间计算结果,中间计算结果用于进行第二指令的指令计算。
需要说明的是,程序中不同类型的指令对应的操作不同,第二指令的原本操作并不涉及第一指令的操作,由于本申请实施例是将第一指令在程序中进行消除,而依赖第一指令的第二指令又需要使用第一指令的执行结果作为源操作数,因此本申请实施例是在依赖第一指令的第二指令中扩展第一操作,来得到与第一指令的执行结果相对应的中间计算结果,从而依赖第一指令的第二指令可利用中间计算结果来完成第二指令所需的指令计算。
示例的,以第一指令为符号位扩展指令、第二指令为地址计算指令为例,在程序编译的过程中,编译器发现程序中的符号位扩展指令,以及依赖符号位扩展指令的地址计算指令,则可将程序中的符号位扩展指令进行消除,使得程序的指令数量的精简程度得以提升,优化处理器的性能。同时,为使得依赖符号位扩展指令的地址计算指令能够正常进行地址计算,本申请实施例可以在依赖符号位扩展指令的地址计算指令中扩展符号位扩展操作,地址计算指令中扩展的符号位扩展操作用于得到地址计算指令的中间计算结果(符号位扩展后的中间计算结果),以便地址计算指令可使用中间计算结果进行地址计算。
在符号位扩展指令和地址计算指令的示例下,需要进一步说明的是,地址计算指令的原本操作是计算地址,例如,基于Scale、Index和Base计算地址,地址计算指令的原本操作(计算地址)并不涉及到进行符号位扩展。而本申请实施例在消除程序中的符号位扩展指令的情况下,由于依赖符号位扩展指令的地址计算指令需要使用符号位扩展指令的执行结果来计算地址,因此本申请实施例将符号位扩展操作扩展到了依赖符号位扩展指令的地址计算指令中,从而依赖符号位扩展指令的地址计算指令可以通过符号位扩展操作,来得到用于计算地址的中间计算结果(比如64位的中间计算结果),进而利用中间计算结果进行地址计算。
作为可选实现,对于依赖符号位扩展指令的地址计算指令,本申请实施例可以设置地址计算指令通过符号位扩展操作,对Scale和Index的计算结果进行符号位扩展,以得到中间计算结果;以及,设置地址计算指令根据中间计算结果与Base,得到所计算的地址。
在一个示例中,扩展了符号位扩展操作的地址计算指令可以表示为:Sign-extend(Scale×Index)+Base,其中,Sign-extend表示符号位扩展操作。
在上述示例中,扩展了符号位扩展操作的地址计算指令可以通过符号位扩展操作,将Scale和Index的乘积扩展到64位,作为中间计算结果;从而中间计算结果再与Base相加,得到计算的地址。
可见,扩展了符号位扩展操作的地址计算指令的地址计算方式是区别于SIB地址索引方式的,即扩展了符号位扩展操作的地址计算指令是使用SSIB(Sign-extend,Scale,Index,Base)模式来进行地址计算,即Sign-extend(符号位扩展)、Scale、Index和Base的模式进行地址计算。
在为依赖第一指令的第二指令扩展第一操作的基础上,为区分扩展了第一操作的第二指令以及未扩展第一操作的第二指令,针对扩展了第一操作的第二指令,本申请实施例可以在第二指令的指令前缀中设置目标值的目标标识,并通过目标值的目标标识指示第二指令扩展第一操作。从而,在程序处理阶段,对于处理器处理的第二指令,本申请实施例可以通过判断第二指令的指令前缀中是否具有目标值的目标标识,以实现判断第二指令是否扩展第一操作。
也就是说,如果第二指令的指令前缀中具有目标值的目标标识,则第二指令扩展了第一操作;如果第二指令的指令前缀中不具有目标值的目标标识,则第二指令未扩展第一操作。
需要说明的是,指令可以通过多个byte(字节)进行指令编码,其中,一个byte为8个bit(比特,也称为位),该多个byte可以包括:代表指令前缀的byte、代表操作码的byte、以及代表源操作寄存器的编号和目的操作寄存器的编号的byte,其中,源操作寄存器为源操作数对应的寄存器,目的操作寄存器为目的操作数对应的寄存器。
为便于理解,以如下指令的指令编码进行示例:
0x:4c 63c0 movsxd r8,eax;
其中,上述指令表示将32bit的eax寄存器进行符号位扩展,扩展后的值写到r8寄存器;该指令的指令编码采用了3个byte,一个byte代表指令前缀(0x4c),一个byte代表操作码(0x63),一个byte代表源操作寄存器的编号和目的操作寄存器的编号(0xc0)。
需要进一步说明的是,指令前缀是指令用于修改指令行为的标识符或附加信息。也就是说,在指令集中,指令前缀作为一种辅助信息,可以在指令原本的编码功能的基础上扩展指令行为,从而可以通过为指令添加指令前缀,来实现在指令层面为指令添加新特性;比如通过添加的指令前缀为指令扩展操作码、或者对寄存器的索引进行扩展等。在可选实现中,指令前缀作为指令可选的一部分(也就是说,指令可设置指令前缀,也可以不设置指令前缀),可以在指令的开头添加指令前缀。
在可选实现中,本申请实施例使用的第二指令的指令前缀可以是第二指令的原指令前缀(即第二指令原本使用的指令前缀),也可以是为第二指令定义的新指令前缀。
作为可选实现,第二指令的原指令前缀可以包括前缀标识以及前缀内容,前缀标识用于表示指令前缀,前缀内容用于扩展指令。
为便于理解,以第二指令的原指令前缀为REX(Register Extension,寄存器扩展)指令前缀为例,下表2示例了REX指令前缀的一种示例。需要说明的是,REX指令前缀作为指令集中引入的一种指令前缀,可以用于扩展寄存器操作码和地址计算。
表2
在表2示例中,REX指令前缀中高位的0100作为前缀标识,用于表示此信息为指令前缀。前缀标识之后的多个bit(比特)作为前缀内容,用于扩展指令。例如,在表2示例中,前缀标识之后的W、R、X和B这4个bit作为前缀内容,用于扩展指令,即前缀内容中的W、R、X和B分别占据1个bit,用于扩展指令。
其中,W是一位二进制数,用于扩展操作数大小,具体如表2所示。R是一位二进制数,用于扩展ModR/M字节中的reg字段;ModR/M字节可用于指定指令的操作数和寄存器,reg字段是ModR/M字节中的一部分,用于指定指令中的寄存器操作码。X是一位二进制数,用于扩展SIB字节中的Index(索引)字段。B是一位二进制数,用于扩展ModR/M字节中的r/m字段、SIB基址(Base)字段或opcode(操作码)reg字段;ModR/M字节中的r/m字段表示指令中的第二个操作数或内存寻址信息;SIB基址字段表示基地址寄存器;opcode reg字段是指令的操作码中的一部分,用于在操作码中表示寄存器信息。
在一些实施例中,第二指令的指令前缀中的目标标识可以是:第二指令的原指令前缀的前缀内容中的bit。例如,将第二指令的原指令前缀的前缀内容中的一个bit,作为目标标识。从而,第二指令的原指令前缀中的目标标识的不同值(即不同bit值)可以表示第二指令是否扩展了第一操作;例如,如果目标标识的值为目标值,则表示第二指令扩展了第一操作,如果目标标识的值不为目标值,则表示第二指令未扩展第一操作。使用第二指令的原指令前缀的前缀内容中的一个bit作为目标标识,以bit的不同取值来表示第二指令是否扩展第一操作,能够节省指令前缀的使用空间。
在目标标识对应第二指令的原指令前缀的前缀内容中的一个bit时,作为一个示例,目标标识的目标值可以为第一值(例如1)。从而如果第二指令的原指令前缀的目标标识为第一值(例如1),则表示第二指令扩展了第一操作;如果第二指令的原指令前缀的目标标识为第零值(例如0),则表示第二指令未扩展第一操作。当然,本申请实施例也可支持目标值为第零值(例如0);也就是说,在目标标识为前缀内容中的bit,采用bit的不同值表示第二指令是否扩展第一操作的情况下,只要保障表示第二指令扩展第一操作和未扩展第一操作的bit值是不同的即可,本申请实施例并不设限目标值的具体数值取值。
基于目标标识为前缀内容中的bit,在可选实现中,编译器可确定程序中依赖第一指令的第二指令,为依赖第一指令的第二指令扩展第一操作,并在第二指令的原指令前缀的前缀内容中设置目标标识,将目标标识的赋值设置为目标值(比如第一值),以指示第二指令扩展第一操作;进一步的,编译器可以确定程序中不依赖第一指令的第二指令,并在不依赖第一指令的第二指令的原指令前缀的前缀内容中设置目标标识,将目标标识的赋值设置为非目标值(非目标值比如第零值),以指示第二指令未扩展第一操作。当然,对于不依赖第一指令的第二指令,本申请实施例也可以不为第二指令设置原指令前缀,以指示第二指令未进行功能扩展。
在可选实现中,本申请实施例可以将第二指令的原指令前缀的前缀内容中的空闲bit,作为目标标识;也就是说,目标标识可以是前缀内容中的空闲bit。比如,将第二指令的原指令前缀的前缀内容中的空闲bit,作为目标标识,该空闲bit的赋值为第一值(例如1),则表示第二指令扩展了第一操作;该空闲bit的赋值为第零值(例如0),则表示第二指令未扩展第一操作。
作为可选实现,如果第二指令的原指令前缀(例如REX指令前缀)的编码空间未饱和,即第二指令的原指令前缀(例如REX指令前缀)的前缀内容中存在空闲bit,则本申请实施例可以将第二指令的原指令前缀(例如REX指令前缀)的前缀内容中的任一空闲bit,作为目标标识,从而实现在第二指令的原指令前缀(例如REX指令前缀)中设置目标标识。
进而,针对扩展第一操作的第二指令,本申请实施例将第二指令的原指令前缀(例如REX指令前缀)的前缀内容中的目标标识的赋值设置为目标值,比如第一值;针对未扩展第一操作的第二指令,将第二指令的原指令前缀(例如REX指令前缀)的前缀内容中的目标标识的赋值设置为非目标值,比如第零值。进一步的,针对未扩展第一操作的第二指令,本申请实施例也可以不为第二指令设置原指令前缀,第二指令未设置原指令前缀则说明第二指令未进行功能扩展,从而在后续处理上等效于第二指令设置原指令前缀但目标标识为第零值的情况。
在一个示例中,以符号位扩展指令和地址计算指令为例,地址计算指令可以添加REX指令前缀,以扩展寄存器操作码和地址计算。如果REX指令前缀的前缀内容中存在空闲bit,则可将REX指令前缀的任一空闲bit作为目标标识,从而实现在地址计算指令的REX指令前缀中设置目标标识;进而,针对扩展了符号位扩展操作的地址计算指令,将REX指令前缀的前缀内容中的目标标识的赋值设置为第一值;针对未扩展符号位扩展操作的地址计算指令,将REX指令前缀的前缀内容中的目标标识的赋值设置为第零值,或者,针对未扩展符号位扩展操作的地址计算指令,也可以不为地址计算指令设置REX指令前缀。
作为可选实现,如果第二指令的原指令前缀(例如REX指令前缀)的编码空间饱和,即第二指令的原指令前缀(例如REX指令前缀)的前缀内容中不存在空闲bit,则本申请实施例可以定义新指令前缀,比如为第二指令扩展新指令前缀对应的byte,实现设置第二指令的扩展byte(即第二指令的扩展byte可以作为第二指令扩展的新指令前缀对应的byte),从而在扩展byte中设置目标标识。基于第二指令的新指令前缀包括扩展byte,对于依赖第一指令的第二指令,本申请实施例可以在第二指令的扩展byte中设置目标值的目标标识;而对于不依赖第一指令的第二指令,本申请实施例可以不在第二指令的扩展byte中设置目标值的目标标识,或者,不为第二指令设置扩展byte;其中,不依赖第一指令的第二指令未扩展第一操作。
可选的,扩展byte可以包括扩展前缀标识以及扩展前缀内容。可选的,目标标识可以设置于扩展byte的扩展前缀内容中,例如,目标标识为扩展前缀内容中的bit。从而,对于依赖第一指令的第二指令,本申请实施例可以在第二指令的扩展byte的扩展前缀内容中,为目标标识设置目标值(比如第一值);而对于不依赖第一指令的第二指令,本申请实施例可以在第二指令的扩展byte的扩展前缀内容中,为目标标识设置非目标值(比如第零值)。当然,对于不依赖第一指令的第二指令,本申请实施例也可支持不为第二指令设置扩展byte,其等效于为第二指令设置扩展byte但目标标识为第零值的情况。
在可选实现中,扩展byte可以为一个byte,也可以为多个byte(比如两个byte),并且扩展byte的取值可以从指令集未使用的代码值中选择。
作为可选实现,在扩展byte为一个byte的情况下,按照扩展byte的位数高低顺序,扩展byte中高位的多个bit(比如高位的4个bit)可以作为扩展前缀标识;扩展byte中低位的多个bit(比如低位的4个bit)作为扩展前缀内容,从而可以在扩展前缀内容中选择bit作为目标标识,以利用目标标识的不同赋值(目标值和非目标值),来表示第二指令是否扩展第一操作。
需要说明的是,扩展前缀内容由于是扩展得到,因此扩展前缀内容中的多个bit均未使用(即扩展前缀内容中的多个bit均为空闲bit),本申请实施例可以选择扩展前缀内容的一个bit作为目标标识,而其他bit可以留作后续扩展,根据需求使用。
可以看出,在第二指令的原指令前缀没有空闲bit作为目标标识的情况下,本申请实施例可以在第二指令的基础上扩展一个byte,从而定义新指令前缀,使用扩展byte中的扩展前缀内容的bit作为目标标识。由于是在第二指令的基础上扩展一个byte来实现目标标识的设置,因此本申请实施例能够合理的控制指令长度,同时扩展byte的扩展前缀内容在设置目标标识后,就算留有空闲bit,仍可以保留后续继续扩展指令集架构的可能性。
需要说明的是,从移除第一指令的角度来看,本申请实施例可以在整体上节省程序的指令长度。例如,第一指令需要3个byte进行指令编码(3个byte进行指令编码的示例可以参照前文相应部分的描述),如果本申请实施例能够在第二指令的指令前缀中使用空闲bit来作为目标标识,则可以每移除一个第一指令,使得程序节省3个byte。在第二指令的指令前缀没有空闲bit可以使用的情况下,本申请实施例就算为依赖第一指令的第二指令扩展一个byte,来实现设置目标标识(即扩展byte占据一个byte),也可在第一指令被移除的情况下,每移除一个第一指令,使得程序节省2个byte。另外,就算本申请实施例为依赖第一指令的第二指令扩展两个byte,来实现设置目标标识(即扩展byte占据两个byte),本申请实施例也可在第一指令被移除的情况下,每移除一个第一指令,使得程序节省1个byte。
在可选实现中,扩展byte可以占据两个byte(即扩展byte为两个byte),其中,扩展byte中的一个byte为扩展前缀标识,另一个byte为扩展前缀内容。可选的,本申请实施例可以从指令集未使用的代码值中选择一个代码值,从而扩展一个与所选择的代码值对应的byte,作为扩展前缀标识,并再扩展一个byte作为扩展前缀内容,以实现扩展两个byte来得到扩展byte(一个byte为扩展前缀标识,另一个byte为扩展前缀内容)。在扩展byte为两个byte的情况下,可以在扩展前缀内容对应的byte中选择一个bit作为目标标识,而其他bit可以留作后续扩展并根据需求使用。
作为可选实现,本申请实施例可以从指令集未使用的代码值中选择代码值,作为扩展byte(比如扩展byte的扩展前缀标识)。为便于理解,在一个示例中,下表3示例了指令集未使用的代码值的示例图。
表3
结合表3示例所示,以04的代码值未使用为例,则第二指令可以通过扩展一个与04对应的byte,作为扩展前缀标识,并再扩展一个byte作为扩展前缀内容;进而从扩展前缀内容中选择一个bit作为目标标识,前缀内容中的其他bit可以留作后续扩展。
在另一些实施例中,目标标识可以为第二指令的扩展前缀标识;从而本申请实施例可以通过判断第二指令的扩展前缀标识是否为目标值,以判断第二指令是否扩展了第一操作。也就是说,如果第二指令的扩展前缀标识为目标值,则视为第二指令的指令前缀具有目标值的目标标识,第二指令扩展了第一操作;如果第二指令不具有扩展前缀标识,或者,扩展前缀标识不为目标值,则视为第二指令的指令前缀不具有目标值的目标标识,第二指令未扩展第一操作。
作为可选实现,本申请实施例可以从指令集未使用的代码值中选择一个代码值,从而扩展一个与所选择代码值对应的byte,作为扩展前缀标识,从而具有所选择代码值的扩展前缀标识可以视为是目标值的目标标识,以实现在第二指令的指令前缀设置目标值的目标标识。此时,本申请实施例可以不再扩展另一个byte作为扩展前缀内容,而是以扩展前缀标识这一个扩展的byte,来指示第二指令是否扩展第一操作。
也就是说,扩展byte占据一个byte,且扩展byte作为第二指令的扩展前缀标识使用,从而目标标识为扩展前缀标识,且目标标识的目标值为扩展前缀标识的取值,扩展前缀标识的取值从指令集未使用的代码值中选择。进而,对于依赖第一指令的第二指令,可以为第二指令设置目标值的扩展前缀标识;而对于不依赖第一指令的第二指令,可以不为第二指令设置扩展前缀标识,或者,为第二指令的扩展前缀标识设置非目标值。
在一个示例中,结合表3示例所示,以04的代码值未使用为例,则可以为第二指令扩展与04对应的一个byte,作为扩展前缀标识,并且作为目标值的目标标识。从而,对于依赖第一指令的第二指令(对应扩展第一操作的第二指令),可以为第二指令设置04的扩展前缀标识,以指示第二指令扩展了第一操作;对于不依赖第一指令的第二指令(对应未扩展第一操作的第二指令),则可以不为第二指令设置04的扩展前缀标识。
通过上文描述,作为可选实现,第二指令的新指令前缀包括扩展byte,通过扩展byte来设置目标标识可以存在以下情况:
扩展byte为一个byte,扩展byte中的扩展前缀标识为扩展byte的高位bit(比如高4位bit),扩展byte中的扩展前缀内容为扩展byte的低位bit(比如低4位bit),则可以在扩展前缀内容中选择bit(比如一个bit)作为目标标识;目标标识为目标值(比如第一值),则指示第二指令扩展第一操作,目标标识为非目标值(比如第零值),则指示第二指令未扩展第一操作;
扩展byte为两个byte,其中一个byte为扩展前缀标识,扩展前缀标识的数值从指令集未使用的代码值中选择,另一个byte为扩展前缀内容,则可以在扩展前缀内容中选择bit(比如一个bit)作为目标标识;目标标识为目标值(比如第一值),则指示第二指令扩展第一操作,目标标识为非目标值(比如第零值),则指示第二指令未扩展第一操作;
扩展byte为一个byte,且扩展byte为目标值的扩展前缀标识,并作为目标值的目标标识,其中,扩展前缀标识的目标值从指令集未使用的代码值中选择;从而目标值的扩展前缀标识如果在指令前缀中存在,则指示第二指令扩展第一操作,目标值的扩展前缀标识如果未在指令前缀中存在,则指示第二指令未扩展第一操作。
在第二指令具有扩展byte可以视为是形成了新指令前缀,即对指令集进行了扩展,从而计算机硬件(比如CPU)可以标明是否支持具有新指令前缀的指令集;如果支持,则说明计算机硬件(比如CPU)支持第二指令通过扩展的第一操作进行指令计算,从而编译器可以为第二指令添加新指令前缀,例如可以为第二指令设置扩展byte,以指示第二指令是否扩展第一操作。
例如,对于地址计算指令而言,在地址计算指令扩展了符号位扩展操作的情况下,地址计算指令是使用SSIB模式来进行地址计算,因此计算机硬件(比如CPU)需要兼容SIB模式的地址计算指令(对应未扩展符号位扩展操作的情况)、以及SSIB模式的地址计算指令(对应扩展符号位扩展操作的情况),从而如果要为地址计算指令添加新指令前缀,则计算机硬件(比如CPU)可以标明是否支持具有新指令前缀的指令集,如果支持,则说明计算机硬件(比如CPU)可以支持SSIB模式的地址计算指令;进而,编译器可以为地址计算指令添加新指令前缀,即可以在地址计算指令的指令前缀的基础上扩展byte,以指示地址计算指令是否扩展符号位扩展操作。
前文对本申请实施例提供的程序编译方案的可能实现进行了介绍,作为可选实现,基于本申请实施例提供的程序编译方案,编译器的编写者可以通过阅读软件优化手册,得知处理器所具有的新特性,以使得编译器确认指令集架构上的调整,从而编译器可以根据需求,在程序的高级语言代码生成机器指令的过程中,执行本申请实施例提供的程序编译方案,以决定是否为第二指令的指令前缀设置目标值的目标标识,即决定是否为第二指令添加具有目标值的目标标识的指令前缀,例如,决定是否要为地址计算指令添加具有指示符号位扩展操作的指令前缀。
需要说明的是,在指令集架构提供新的第二指令的指令计算模式、以及相应的指令前缀时(即指令集架构提供了扩展第一操作的第二指令以及相应的指令前缀,例如,指令集架构提供了扩展了符号位扩展操作的地址计算指令以及相应的指令前缀),编译器出于性能的考虑,可以通过实际应用场景中的具体需求,来选择编译生成的指令。也就是说,编译器出于性能的考虑,在编译程序过程中,针对依赖第一指令的第二指令,可以根据本申请实施例提供的程序编译方案,选择编译生成扩展了第一操作的第二指令并设置相应的指令前缀,而不是同时编译生成第一指令和第二指令,从而能够实现精简程序的指令数量,使得整体程序占用的代码空间能够更小。
在程序编译完成之后,编译的指令可以由处理器读取并通过处理器流水线过程进行处理。作为可选实现,图3示例性的示出了本申请实施例提供的指令处理方法的可选流程图,该方法流程可由处理器(比如CPU)执行,参照图3,该方法流程可以包括如下步骤。
在步骤S310中,译码当前指令。
处理器可以读取指令并进行译码。在可选实现中,处理器中的译码单元可以对指令进行译码。其中,处理器当前进行译码的指令可以视为是当前指令。
在步骤S311中,如果当前指令为第二指令,且第二指令具有指令前缀,则根据第二指令的指令前缀,判断第二指令是否扩展第一指令对应的第一操作,若是,执行步骤S312,若否,执行步骤S313。
处理器在译码当前指令时,可以确定当前指令的指令类型,如果当前指令的指令类型为第二指令,则基于程序编译阶段,编译器对于依赖第一指令的第二指令扩展了第一操作,对于未依赖第一指令的第二指令未扩展第一操作,并且编译器将程序中被依赖的第一指令进行了移除,因此处理器可以在译码的当前指令为第二指令时,判断第二指令是否扩展了第一操作。也就是说,程序中依赖第一指令的第二指令扩展了第一操作,且程序中被第二指令所依赖的第一指令被消除,从而扩展第一操作的第二指令和未扩展第一操作的第二指令在执行时,具有不同的执行逻辑,本申请实施例可以在译码第二指令时,如果发现第二指令具有指令前缀,则可以根据第二指令的指令前缀,判断第二指令是否扩展第一操作,以为后续第二指令执行时区分不同的执行逻辑提供基础。
作为可选实现,基于第二指令的指令前缀中目标值的目标标识可以指示第二指令扩展了第一操作,处理器在确定译码的当前指令为第二指令时,如果第二指令具有指令前缀,则可以判断第二指令的指令前缀是否具有目标值的目标标识,以实现根据第二指令的指令前缀,判断第二指令是否扩展第一指令对应的第一操作。可选的,如果第二指令的指令前缀具有目标值的目标标识,则第二指令扩展了第一操作,可以执行步骤S312;如果第二指令的指令前缀不具有目标值的目标标识,则第二指令未扩展第一操作,可以执行步骤S313。进一步的,如果译码的当前指令为第二指令,且发现第二指令不具有指令前缀,则可确认第二指令未扩展第一操作,此时也可进入步骤S313进行后续执行。
在一些实施例中,指令前缀可以为第二指令的原指令前缀,原指令前缀可以包括前缀标识和前缀内容,其中,前缀标识用于表示指令前缀,前缀内容用于扩展指令。对于扩展第一操作的第二指令,目标值的目标标识可以设置于原指令前缀的前缀内容,比如在第二指令的原指令前缀的前缀内容具有空闲bit时,可以将前缀内容中的空闲bit作为目标标识,并且通过目标标识的不同赋值,表示第二指令是否扩展第一操作。也就是说,前缀内容可以包括多个bit,目标标识可以为前缀内容中的空闲bit。从而,在可选实现中,处理器在确定译码的当前指令为第二指令时,可以判断第二指令的原指令前缀的前缀内容中的目标标识是否为目标值(目标值比如第一值),如果为目标值,则确定第二指令扩展了第一操作,如果不为目标值(即目标标识为非目标值,比如目标标识为第零值),则确定第二指令未扩展第一操作。
在另一些实施例中,指令前缀可以为第二指令的新指令前缀,新指令前缀可以包括扩展byte,扩展byte可以为第二指令扩展的新指令前缀对应的byte。比如第二指令的指令前缀可以增加至少一个byte,从而增加的byte可以作为扩展byte,进而目标标识可以设置于第二指令的扩展byte中。例如,在第二指令的原指令前缀的前缀内容没有空闲bit时,第二指令可以增加至少一个byte,以得扩展byte,从而对于扩展了第一操作的第二指令,目标值的目标标识可以设置于第二指令的扩展byte中。
作为可选实现,扩展byte可以包括扩展前缀标识和扩展前缀内容,扩展前缀内容中的bit(比如任一bit)可以作为目标标识,从而通过目标标识的不同赋值,表示第二指令是否扩展第一操作。进而,在可选实现中,处理器在确定译码的当前指令为第二指令时,可以判断第二指令的扩展byte的扩展前缀内容中,目标标识是否为目标值(目标值比如第一值);如果为目标值,则确定第二指令扩展了第一操作;如果不为目标值(即目标标识为非目标值,比如目标标识为第零值),则确定第二指令未扩展第一操作。
在一个实现示例中,扩展byte可以占据一个byte,即通过为指令前缀增加一个byte,以得到扩展byte;从而按照扩展byte的位数高低顺序,扩展前缀标识可以为扩展byte高位的多个bit(比如扩展前缀标识为扩展byte高位的4个bit),扩展前缀内容可以为扩展byte低位的多个bit(比如扩展前缀内容为扩展byte低位的4个bit)。处理器在确定译码的当前指令为第二指令时,可以判断第二指令的扩展byte的低位多个bit中,目标标识是否为第一值;如果为第一值(比如1),则确定第二指令扩展了第一操作;如果为第零值(比如0),则确定第二指令未扩展第一操作。进一步的,扩展byte的扩展前缀标识(比如扩展byte的高位多个bit)的取值,可以与第二指令的指令前缀的前缀标识相一致。
在再一个实现示例中,扩展byte可以占据两个byte,即通过为第二指令的指令前缀增加两个byte,以得到扩展byte;从而扩展前缀标识可以为扩展byte中的一个byte,扩展前缀内容可以为扩展byte中的另一个byte。处理器在确定译码的当前指令为第二指令时,可以判断第二指令的扩展byte的扩展前缀内容这一byte中,目标标识是否为第一值;如果为第一值(比如1),则确定第二指令扩展了第一操作;如果为第零值(比如0),则确定第二指令未扩展第一操作。进一步的,扩展byte的扩展前缀标识这一byte的取值,可以从指令集未使用的代码值中选择。
作为另一种可选实现,扩展byte可以为扩展前缀标识,并且扩展前缀标识可以作为目标标识;比如第二指令的指令前缀可以增加一个byte,作为扩展前缀标识(也就是,扩展byte占据一个byte,且扩展byte为增加的扩展前缀标识),此时可以不用设置扩展前缀内容,而是将扩展前缀标识直接作为目标标识,从而将扩展前缀标识的取值作为目标标识的目标值,进而可以通过判断第二指令是否具有目标值的扩展前缀标识,以实现判断第二指令是否扩展第一操作。比如,处理器在确定译码的当前指令为第二指令时,可以判断第二指令是否具有目标值的扩展前缀标识(此时的目标值为扩展前缀标识的取值,而不是第一值);如果是,则第二指令的指令前缀具有目标值的目标标识,确定第二指令扩展了第一操作;如果否,则第二指令的指令前缀不具有目标值的目标标识,确定第二指令未扩展第一操作。进一步的,扩展前缀标识的取值(即此时目标标识的目标值)可以从指令集未使用的代码值中选择。
在步骤S312中,为第二指令携带第一操作对应的标记位。
在译码的当前指令为第二指令,且判断第二指令扩展了第一操作的情况下,为使得第二指令在执行时(例如执行单元在执行第二指令时),能够执行第二指令扩展的第一操作,本申请实施例可以为第二指令携带第一操作对应的标记位,以便通过第一操作对应的标记位,指示第二指令在执行时需执行扩展的第一操作。
也就是说,在处理器的流水线过程中,译码单元如果在译码第二指令时,判断第二指令扩展了第一操作,则为指示后续执行单元在执行第二指令时需执行第一操作,可以为扩展了第一操作的第二指令携带第一操作对应的标记位,从而后续执行单元可以通过第二指令携带的第一操作对应的标记位,通过具有第一操作的执行逻辑,执行扩展了第一操作的第二指令,实现在执行逻辑的层面区分扩展了第一操作的第二指令和未扩展第一操作的第二指令。
作为可选实现,本申请实施例可以为第二指令的数据传输通路设置第一值(比如1),以实现为第二指令携带第一操作对应的标记位。也就是说,第二指令的数据传输通路可以用于在处理器的流水线过程中传输第二指令,第二指令的数据传输通路的不同赋值,可以对应第二指令是否携带第一操作对应标记位;比如,第二指令的数据传输通路的赋值为第一值(比如1),则表示第二指令携带了第一操作对应的标记位,第二指令的数据传输通路的赋值为第零值(比如0),则表示第二指令未携带第一操作对应的标记位(此时第二指令未扩展第一操作)。从而,执行单元在通过第二指令的数据传输通路获得第二指令时,可以通过第二指令的数据传输通路是否为第一值,以确认执行第二指令的执行逻辑;如果第二指令的数据传输通路为第一值(即第二指令设置了第一操作对应的标记位),则执行单元可以采用具有第一操作的执行逻辑,执行第二指令;如果第二指令的数据传输通路为第零值(即第二指令未设置第一操作对应的标记位),则执行单元可以采用不具有第一操作的执行逻辑,执行第二指令,例如,执行单元可以采用第二指令原本的执行逻辑,执行第二指令。
在步骤S313中,在执行第二指令时,判断第二指令是否携带第一操作对应的标记位,若是,执行步骤S314,若否,执行步骤S315。
在译码的当前指令为第二指令,且根据第二指令的指令前缀,判断第二指令扩展了第一指令对应的第一操作时,可以设置第二指令携带第一操作对应的标记位,并且将第二指令发射给执行单元,以便执行单元执行第二指令。而在译码的当前指令为第二指令,且根据第二指令的指令前缀,判断第二指令未扩展第一操作时,第二指令可以发射给执行单元,以便执行单元执行第二指令;进一步的,第二指令不具有指令前缀的情况可以视为是与第二指令未扩展第一操作相对应,其后续处理等效于第二指令具有指令前缀但不具有目标值的目标标识的情况。因此,执行单元执行的第二指令可能为扩展了第一操作的第二指令,也可能为未扩展第一操作的第二指令。
进一步的,第二指令(涉及扩展第一操作的第二指令,以及未扩展第一操作的第二指令)在发射给执行单元之前,可以通过寄存器重命名,对第二指令进行寄存器重命名。寄存器重命名是指为指令的逻辑寄存器(也称为架构寄存器)和物理寄存器建立映射关系。
基于本申请实施例在判断第二指令扩展了第一操作时,设置为第二指令携带第一操作对应的标记位,执行单元在执行第二指令时,可以通过判断第二指令是否携带第一操作对应的标记位(比如,判断第二指令的数据传输通路是否被赋值为第一值),以决定执行第二指令的执行逻辑。
在步骤S314中,利用第一操作得到第二指令的中间计算结果,根据中间结算结果得到第二指令的执行结果。
执行单元在判断第二指令携带第一操作对应的标记位时(例如,执行单元在判断第二指令的数据传输通路的赋值为第一值时),可以利用具有第一操作的执行逻辑,执行第二指令;从而在执行第二指令时,可以利用第一操作得到第二指令的中间计算结果,进而根据中间结算结果,得到第二指令的执行结果。
示例的,以符号位扩展指令和地址计算指令为例,对于扩展了符号位扩展操作的地址计算指令,执行单元在执行地址计算指令时,可以基于地址计算指令携带的符号位扩展操作对应的标记位(比如地址计算指令的数据传输通路为第一值),采用具有符号位扩展操作的地址计算逻辑,执行地址计算指令。例如,执行单元可以通过符号位扩展操作,对Scale和Index的计算结果进行符号位扩展,得到中间计算结果,进而根据中间计算结果与Base,得到地址计算指令所计算的内存地址。在一个实现示例中,以扩展了符号位扩展操作的地址计算指令为Sign-extend(Scale×Index)+Base为例,执行单元可以通过符号位扩展操作,对Scale×Index的计算结果进行符号位扩展(比如将Scale×Index的计算结果从32位扩展到64位),得到中间计算结果,中间计算结果与Base相加,得到地址计算指令所计算的内存地址。
在步骤S315中,按照第二指令的原执行逻辑,执行第二指令的指令计算,得到第二指令的执行结果。
执行单元在判断第二指令未携带第一操作对应的标记位时(例如,执行单元在判断第二指令的数据传输通路的赋值为第零值时),可以利用不具有第一操作的执行逻辑(比如第二指令原本的执行逻辑,称为第二指令的原执行逻辑),执行第二指令,以执行第二指令的指令计算,得到第二指令的执行结果。
示例的,以符号位扩展指令和地址计算指令为例,对于未扩展符号位扩展操作的地址计算指令,执行单元在执行地址计算指令时,可以基于地址计算指令未携带符号位扩展操作对应的标记位(比如地址计算指令的数据传输通路为第零值),采用地址计算指令原本的地址计算逻辑,执行地址计算指令。例如,执行单元可以基于SIB地址索引方式,执行地址计算指令的地址计算,从而得到地址计算指令所计算的内存地址。
本申请实施例提供的指令处理方法在译码当前指令时,如果确定当前指令为第二指令,则可以根据第二指令的指令前缀,判断第二指令是否扩展第一指令对应的第一操作;其中,程序编译阶段,程序中依赖第一指令的第二指令扩展第一操作,且程序中被第二指令所依赖的第一指令被消除;如果第二指令扩展第一操作,则为第二指令携带第一操作对应的标记位;进而在执行第二指令时,对于携带第一操作对应的标记位的第二指令,本申请实施例可以利用第一操作得到第二指令的中间计算结果,根据中间结算结果得到第二指令的执行结果。
可以看出,本申请实施例可以为程序中依赖第一指令的第二指令扩展第一操作,并将程序中被依赖的第一指令进行消除,以精简程序中的第一指令的数量,从而在处理器处理指令时,如果译码的当前指令为第二指令,且第二指令具有指令前缀,则可以根据第二指令的指令前缀,判断第二指令是否扩展第一操作;并为扩展第一操作的第二指令携带第一操作对应的标记位,以便第二指令在执行时能够采用具有扩展的第一操作的执行逻辑;进而在执行第二指令时,对于携带第一操作对应的标记位的第二指令,处理器可以利用第一操作得到第二指令的中间计算结果,根据中间结算结果得到第二指令的执行结果,实现第二指令的指令处理。由于程序中被第二指令依赖的第一指令可以被消除,并且第一指令对应的第一操作嵌入在依赖第一指令的第二指令的中间计算过程中,因此程序中的第一指令能够减少,从而处理器的流水线过程(例如取指、译码、发射、执行、写回等流水线过程)能够减少资源占用,例如可以减少处理器译码指令的译码阶段对于译码器的占用,进而处理器原本为第一指令分配的资源可以释放出来,并分配给其他指令使用,从而提升处理器的资源利用效果;因此,本申请实施例可以在程序中第一指令的数量被精简的情况下,减少处理器的流水线过程的资源占用、释放处理器的资源,提升处理器的性能。
需要说明是,由于程序中第一指令的数量被精简,因此处理器在译码时,第一指令的后续指令可以占据原本属于第一指令的译码位置,从而处理器的译码器可以在不改变带宽的情况下,减少有效指令(非第一指令)占据译码器的时间;并且,大量的第一指令(比如符号位扩展指令)在程序中被移除,且第一指令对应的第一操作(比如符号位扩展操作)是作为第二指令的指令计算(比如地址计算)的一部分存在,因此从处理器的译码到执行的流水线过程,原本需要给第一指令(比如符号位扩展指令)分配的资源可以释放出来,并分配给其他指令使用,从而提升处理器的性能。
作为可选实现,以符号位扩展指令和地址计算指令为例,图4示例性的示出了本申请实施例提供的指令处理方法的另一可选流程图,该方法流程可由处理器(比如CPU)执行,参照图4,该方法流程可以包括如下步骤。
在步骤S410中,译码当前指令。
在步骤S411中,如果当前指令为地址计算指令,判断地址计算指令是否扩展符号位扩展操作,若是,执行步骤S412,若否,执行步骤S413。
在可选实现中,可以根据地址计算指令的指令前缀,判断地址计算指令是否扩展符号位扩展操作,相关的可选实现方式可以参照前文相应部分的描述,此处不再展开。
在步骤S412中,为地址计算指令携带符号位扩展操作对应的标记位。
在一个实现示例中,可以为地址计算指令的数据传输通路赋值为第一值。
在步骤S413中,将地址计算指令分发给执行单元。
在可选实现中,将地址计算指令分发(发射)给执行单元之前,可以为地址计算指令进行寄存器重命名,建立地址计算指令的逻辑寄存器和物理寄存器的映射关系。
在步骤S414中,在执行地址计算指令时,判断地址计算指令是否携带符号位扩展操作对应的标记位,若是,执行步骤S415,若否,执行步骤S416。
在一个实现示例中,执行单元在执行地址计算指令时,可以判断地址计算指令的数据传输通路赋值是否为第一值,若是,则判断地址计算指令携带符号位扩展操作对应的标记位,若否,则判断地址计算指令未携带符号位扩展操作对应的标记位。进一步的,如果译码地址计算指令时,发现地址计算指令不具有指令前缀,则也视为地址计算指令未扩展符号位扩展操作,相应的,地址计算指令的数据传输通路赋值不为第一值。
在步骤S415中,通过符号位扩展操作,对Scale和Index的计算结果进行符号位扩展,得到中间计算结果;根据中间计算结果与Base,得到地址计算指令所计算的地址。
在一个实现示例中,当地址计算指令携带符号位扩展操作对应的标记位时,执行单元需要在地址计算过程中使用符号位扩展操作,从而执行单元可以通过符号位扩展操作,对Scale×Index的计算结果进行符号位扩展(比如将Scale×Index的计算结果从32位扩展到64位),得到中间计算结果,中间计算结果与Base相加,得到地址计算指令所计算的内存地址。
在步骤S416中,确定Scale和Index的计算结果,根据Scale和Index的计算结果和Base计算地址。
在一个实现示例中,当地址计算指令未携带符号位扩展操作对应的标记位时,执行单元可以基于SIB地址索引方式,基于Scale、Index和Base计算地址。例如,确定Scale和Index的计算结果(比如Scale×Index的计算结果),将Scale和Index的计算结果和Base相结合(比如,将Scale×Index的计算结果与Base相加),得到计算的地址。
可以看出,处理器可以在微架构上作出调整,以兼容扩展符号位扩展操作的地址计算指令以及未扩展符号位扩展操作的地址计算指令。也就是说,处理器在译码时,需要判断译码的地址计算指令是否扩展符号位扩展操作;如果地址计算指令扩展符号位扩展操作,则译码器可以给地址计算指令设置携带的标记位;同时,在执行地址计算的执行单元(比如地址计算单元)中加入符号位扩展操作的执行逻辑,地址计算单元可以通过读取地址计算指令是否携带标记位,来对决定是否对符号位扩展操作的执行逻辑进行使能;如果使能,则地址计算单元可以对Scale×Index的计算结果进行符号位扩展,并与Base相结合(例如相加),以得到计算的地址。
在可选实现中,第二指令的执行单元可以具有第一操作的执行逻辑,并在第二指令携带第一操作对应的标记位的情况下,第一操作的执行逻辑可以被使能,以在第二指令的指令计算过程中发挥作用,实现在第二指令的指令计算过程中,利用第一操作得到第二指令的中间计算结果;而在第二指令未携带第一操作对应的标记位的情况下,第一操作的执行逻辑不被使能,从而以第二指令的原执行逻辑,进行指令计算。
作为实现示例,以地址计算指令为例,图5示例性的示出SIB地址索引方式的地址计算单元的示例图,图6示例性的示出了兼容扩展和未扩展符号位扩展操作的地址计算单元的示例图。其中,地址计算单元可以视为是执行单元的一种示例,用于执行地址计算指令,得到所计算的地址。
由图5所示可以看出,地址计算单元以SIB地址索引方式进行地址计算时,可以基于Scale、Index和Base计算地址。在图5所示中,位运算单元510对Scale和Index进行位运算(例如shift运算,shift是一种位运算操作),得到Scale和Index的计算结果(比如Scale×Index的计算结果);进而结合单元520将Scale和Index的计算结果与base相结合(比如相加),得到计算的地址。需要说明的是,Scale为2的次幂时(例如,Scale为1、2、4或8等2的次幂时),Scale×Index的计算可以调整为移位运算,从而得出Scale×Index的计算结果;也就是说,当乘数是2的次幂时,乘法运算可以转变为移位运算来实现,从而提高运算速度。
由图6所示可以看出,地址计算指令以SSIB模式,基于Sign-extend、Scale、Index和Base的模式进行地址计算,并通过使能和不使能符号位扩展单元610,以兼容扩展和未扩展符号位扩展操作的地址计算指令。如图6所示,地址计算单元可以包括位运算单元510、符号位扩展单元610、结合单元520;其中,位运算单元可以例如shift运算单元,符号位扩展单元可以用于符号位扩展操作(比如进行32位到64位的符号位扩展操作),结合单元可以例如加法单元。
在图6所示中,Scale和Index可以通过位运算单元,得到Scale和Index的计算结果(比如Scale×Index的计算结果)。也就是说,位运算单元可用于对Scale和Index执行位运算,得到Scale和Index的计算结果。
基于地址计算指令是否携带符号位扩展操作对应的标记位,可以决定符号位扩展单元是否被使能;如果地址计算指令携带符号位扩展操作对应的标记位,则符号位扩展单元被使能,符号位扩展单元可以对Scale和Index的计算结果进行符号位扩展(比如将Scale×Index的计算结果从32位扩展到64位),得到中间计算结果,进而中间计算结果可提供给结合单元;如果地址计算指令未携带符号位扩展操作对应的标记位,则符号位扩展单元不被使能,从而Scale和Index的计算结果直接提供给结合单元。
结果单元,可以将符号位扩展单元提供的计算结果与Base相结合,得到所计算的地址。例如,在符号位扩展单元被使能时,将符号位扩展单元提供的中间计算结果与Base相结合(比如相加),得到地址计算指令所计算的地址;例如,在符号位扩展单元不被使能时,将符号位扩展单元提供Scale和Index的计算结果与Base相结合(比如相加),得到地址计算指令所计算的地址。
需要说明的是,本申请实施例虽然以符号位扩展指令作为第一指令的示例,地址计算指令作为第二指令的示例进行方案的示例说明,但是本申请实施例提供的方案并不限于符号位扩展指令和地址计算指令;比如,被其他指令所依赖的取反指令、非广播指令(广播指令是将内存中的单份数据进行多份扩展,扩展的结果写回寄存器,从而后续继续使用寄存器进行运算;此处是指不为广播指令的指令,即非广播指令可作为第一指令)、零位扩展指令等指令可以视为是第一指令,从而在程序中精简第一指令的数量,并将第一指令对应的第一操作嵌入到依赖第一指令的第二指令的中间计算中,以提升处理器的性能。
作为可选实现,本申请实施例还提供一种处理器,作为可选实现,图7示例性的示出了本申请实施例提供的处理器的可选示例图,参照图7,该处理器可以包括译码单元710和执行单元720。
其中,译码单元710,用于译码当前指令;如果当前指令为第二指令,且第二指令具有指令前缀,则根据第二指令的指令前缀,判断第二指令是否扩展第一指令对应的第一操作;如果第二指令扩展第一操作,为第二指令携带第一操作对应的标记位;其中,程序中依赖第一指令的第二指令扩展第一操作,且程序中被第二指令所依赖的第一指令被消除;
执行单元720,用于在执行第二指令时,对于携带第一操作对应的标记位的第二指令,利用第一操作得到第二指令的中间计算结果,根据中间结算结果得到第二指令的执行结果。
译码单元和执行单元的可选实现功能和进一步实现功能可以与前文相应部分的描述内容相互对应参照,此处不再展开。
需要说明是,作为可选实现,执行单元可以具有第一操作的执行逻辑。其中,在第二指令携带第一操作对应的标记位时,执行单元中第一操作的执行逻辑被使能,使能的第一操作的执行逻辑用于利用第一操作得到第二指令的中间计算结果。以第二指令为地址计算指令,第一操作为符号位扩展操作为例,具有第一操作的执行逻辑的执行单元的示例可以参照图6所示,此处不再展开。
需要进一步说明的是,处理器还可以具有其他功能单元,比如取指单元、发射单元、寄存器重命名单元等,本申请实施例对此不再作进一步展开说明。
作为可选实现,本申请实施例还提供一种芯片,例如片上系统芯片,包括本申请实施例提供的处理器。
作为可选实现,本申请实施例还提供一种电子设备,例如终端设备或者服务器设备,包括本申请实施例提供的芯片,或者,本申请实施例提供的处理器。
作为可选实现,本申请实施例还提供一种编译器,用于执行本申请实施例提供的程序编译方法。
在可选实现中,编译器作为一种计算机程序产品,可以由运行编译器的计算机通过执行编译软件来实现。可选的,运行编译器的计算机可以包括至少一个处理器和至少一个存储器。
处理器可能是CPU、GPU(Graphics Processing Unit,图形处理器),NPU(嵌入式神经网络处理器)、FPGA(Field Programmable Gate Array,现场可编程逻辑门阵列)、TPU(张量处理单元)、AI芯片、特定集成电路(Application Specific Integrated Circuit,ASIC)、或者是被配置成实施本申请实施例的一个或多个集成电路等。
存储器可能包含高速RAM存储器,也可能还包括非易失性存储器,例如至少一个磁盘存储器。
其中,存储器存储编译软件(编译软件可以用于编译程序,比如编译软件中可以具有用于编译程序的编译指令),处理器调用所述编译软件(比如编译软件中的编译指令),以执行本申请实施例提供的程序编译方法。
作为可选实现,本申请实施例还提供一种存储介质,该存储介质可以存储有编译软件,该编译软件被执行时(比如编译软件中的编译指令被处理器执行时),实现本申请实施例提供的程序编译方法。
作为可选实现,本申请实施例还提供一种计算机程序产品(比如编译器对应的计算机程序产品),包括编译软件(比如编译软件中的编译指令),该编译软件被执行时(比如编译软件中的编译指令被处理器执行时),实现本申请实施例提供的程序编译方法。
上文描述了本申请实施例提供的多个实施例方案,各实施例方案介绍的各可选方式可在不冲突的情况下相互结合、交叉引用,从而延伸出多种可能的实施例方案,这些均可认为是本申请实施例披露、公开的实施例方案。
虽然本申请实施例披露如上,但本申请并非限定于此。任何本领域技术人员,在不脱离本申请的精神和范围内,均可作各种更动与修改,因此本申请的保护范围应当以权利要求所限定的范围为准。

Claims (29)

1.一种指令处理方法,其特征在于,包括:
译码当前指令;
如果当前指令为第二指令,且第二指令具有指令前缀,则根据第二指令的指令前缀,判断第二指令是否扩展第一指令对应的第一操作;其中,程序中依赖第一指令的第二指令扩展第一操作,且程序中被第二指令所依赖的第一指令被消除;
如果第二指令扩展第一操作,为第二指令携带第一操作对应的标记位;
在执行第二指令时,对于携带第一操作对应的标记位的第二指令,利用第一操作得到第二指令的中间计算结果,根据中间结算结果得到第二指令的执行结果。
2.根据权利要求1所述的方法,其特征在于,所述根据第二指令的指令前缀,判断第二指令是否扩展第一指令对应的第一操作包括:
判断第二指令的指令前缀是否具有目标值的目标标识;
其中,第二指令的指令前缀具有目标值的目标标识,则第二指令扩展第一操作;第二指令的指令前缀不具有目标值的目标标识,则第二指令未扩展第一操作。
3.根据权利要求2所述的方法,其特征在于,所述指令前缀为第二指令的原指令前缀,所述原指令前缀包括前缀标识和前缀内容,所述前缀标识用于表示指令前缀,所述前缀内容用于扩展指令;所述前缀内容包括多个bit,所述目标标识为所述前缀内容中的空闲bit;
所述判断第二指令的指令前缀是否具有目标值的目标标识包括:
判断第二指令的原指令前缀的前缀内容中的目标标识是否为目标值。
4.根据权利要求2所述的方法,其特征在于,所述指令前缀为第二指令的新指令前缀,所述新指令前缀包括扩展byte,所述扩展byte为第二指令扩展的新指令前缀对应的byte,所述目标标识设置于所述扩展byte中。
5.根据权利要求4所述的方法,其特征在于,所述扩展byte包括扩展前缀标识和扩展前缀内容;所述目标标识为所述扩展前缀内容中的bit;
所述判断第二指令的指令前缀是否具有目标值的目标标识包括:
判断第二指令的扩展byte的扩展前缀内容中,目标标识是否为目标值。
6.根据权利要求5所述的方法,其特征在于,所述扩展byte占据一个byte,按照扩展byte的位数高低顺序,所述扩展前缀标识为扩展byte中高位的多个bit,所述扩展前缀内容为扩展byte中低位的多个bit;其中,所述扩展byte的取值从指令集未使用的代码值中选择。
7.根据权利要求5所述的方法,其特征在于,所述扩展byte占据两个byte,所述扩展前缀标识为扩展byte中的一个byte,所述扩展前缀内容为扩展byte中的另一个byte,其中,所述扩展byte的取值从指令集未使用的代码值中选择。
8.根据权利要求4所述的方法,其特征在于,所述扩展byte占据一个byte,且所述扩展byte作为所述第二指令的扩展前缀标识使用;所述目标标识为所述扩展前缀标识,且所述目标标识的目标值为所述扩展前缀标识的取值,所述扩展前缀标识的取值从指令集未使用的代码值中选择;
所述判断第二指令的指令前缀是否具有目标值的目标标识包括:
判断第二指令的扩展前缀标识是否为目标值;
其中,第二指令的扩展前缀标识为目标值,则第二指令的指令前缀具有目标值的目标标识;第二指令的扩展前缀标识不为目标值,或者,第二指令不具有扩展前缀标识,则第二指令的指令前缀不具有目标值的目标标识。
9.根据权利要求1所述的方法,其特征在于,所述为第二指令携带第一操作对应的标记位包括:
为第二指令的数据传输通路设置第一值;
其中,第二指令的数据传输通路为第一值,则第二指令携带第一操作对应的标记位;第二指令的数据传输通路为第零值,则第二指令未携带第一操作对应的标记位,第二指令在未扩展第一操作的情况下,未携带第一操作对应的标记位。
10.根据权利要求1所述的方法,其特征在于,还包括:
如果译码的当前指令为第二指令,且第二指令不具有指令前缀,则确认第二指令未扩展第一操作,第二指令未扩展第一操作则第二指令未携带第一操作对应的标记位。
11.根据权利要求10所述的方法,其特征在于,还包括:
在执行第二指令时,判断第二指令是否携带第一操作对应的标记位;
如果第二指令携带第一操作对应的标记位,则执行所述对于携带第一操作对应的标记位的第二指令,利用第一操作得到第二指令的中间计算结果,根据中间结算结果得到第二指令的执行结果的步骤;
如果第二指令未携带第一操作对应的标记位,按照第二指令的原执行逻辑,执行第二指令的指令计算,得到第二指令的执行结果。
12.根据权利要求1所述的方法,其特征在于,所述对于携带第一操作对应的标记位的第二指令,利用第一操作得到第二指令的中间计算结果包括:
对于携带第一操作对应的标记位的第二指令,使能第一操作的执行逻辑,以在第二指令的指令计算过程中,利用第一操作得到第二指令的中间计算结果。
13.根据权利要求1-12任一项所述的方法,其特征在于,所述第一指令为符号位扩展指令,所述第二指令为地址计算指令,所述第一操作为符号位扩展操作;所述利用第一操作得到第二指令的中间计算结果包括:
通过符号位扩展操作,对Scale和Index的计算结果进行符号位扩展,得到中间计算结果;
所述根据中间结算结果得到第二指令的执行结果包括:
根据中间计算结果与Base,得到地址计算指令所计算的地址。
14.一种程序编译方法,其特征在于,包括:
在程序编译的过程中,确定程序中的第一指令以及依赖第一指令的第二指令;
消除第一指令;
以及,为依赖第一指令的第二指令扩展第一指令对应的第一操作,并在依赖第一指令的第二指令的指令前缀中设置目标值的目标标识,以指示第二指令扩展第一操作;
其中,扩展第一操作的第二指令在被执行时,利用第一操作得到第二指令的中间计算结果,所述中间结算结果用于得到第二指令的执行结果。
15.根据权利要求14所述的方法,其特征在于,所述指令前缀为第二指令的原指令前缀,所述原指令前缀包括前缀标识和前缀内容,所述前缀标识用于表示指令前缀,所述前缀内容用于扩展指令;
所述在依赖第一指令的第二指令的指令前缀中设置目标值的目标标识包括:
对于依赖第一指令的第二指令,如果第二指令的原指令前缀的前缀内容中具有空闲bit,将空闲bit作为目标标识;为第二指令的原指令前缀的前缀内容中的目标标识设置目标值;
所述方法还包括:
对于不依赖第一指令的第二指令,为第二指令的原指令前缀的前缀内容中的目标标识设置非目标值,其中,不依赖第一指令的第二指令未扩展第一操作。
16.根据权利要求14所述的方法,其特征在于,所述在依赖第一指令的第二指令的指令前缀中设置目标值的目标标识包括:
如果第二指令的原指令前缀的前缀内容中不具有空闲bit,为第二指令定义新指令前缀,所述新指令前缀包括扩展byte,所述扩展byte为第二指令扩展的新指令前缀对应的byte;
对于依赖第一指令的第二指令,在第二指令的扩展byte中设置目标值的目标标识;
所述方法还包括:
对于不依赖第一指令的第二指令,不在第二指令的扩展byte中设置目标值的目标标识,或者,不为第二指令设置扩展byte;其中,不依赖第一指令的第二指令未扩展第一操作。
17.根据权利要求16所述的方法,其特征在于,所述扩展byte包括扩展前缀标识以及扩展前缀内容,所述目标标识为所述扩展前缀内容中的bit;
所述对于依赖第一指令的第二指令,在第二指令的扩展byte中设置目标值的目标标识包括:
对于依赖第一指令的第二指令,在第二指令的扩展byte的扩展前缀内容中,为目标标识设置目标值;
所述对于不依赖第一指令的第二指令,不在第二指令的扩展byte中设置目标值的目标标识包括:
对于不依赖第一指令的第二指令,在第二指令的扩展byte的扩展前缀内容中,为目标标识设置非目标值。
18.根据权利要求17所述的方法,其特征在于,所述扩展byte占据一个byte,按照扩展byte的位数高低顺序,所述扩展前缀标识为扩展byte中高位的多个bit,所述扩展前缀内容为扩展byte中低位的多个bit;
或者,所述扩展byte占据两个byte,所述扩展前缀标识为扩展byte中的一个byte,所述扩展前缀内容为扩展byte中的另一个byte;
其中,所述扩展byte的取值从指令集未使用的代码值中选择。
19.根据权利要求16所述的方法,其特征在于,所述扩展byte占据一个byte,且所述扩展byte作为所述第二指令的扩展前缀标识使用;所述目标标识为所述扩展前缀标识,且所述目标标识的目标值为所述扩展前缀标识的取值,所述扩展前缀标识的取值从指令集未使用的代码值中选择;
所述对于依赖第一指令的第二指令,在第二指令的扩展byte中设置目标值的目标标识包括:
对于依赖第一指令的第二指令,为第二指令设置目标值的扩展前缀标识;
所述对于不依赖第一指令的第二指令,不在第二指令的扩展byte中设置目标值的目标标识包括:
对于不依赖第一指令的第二指令,为第二指令的扩展前缀标识设置非目标值。
20.根据权利要求1所述的方法,其特征在于,还包括:
对于不依赖第一指令的第二指令,不为第二指令设置指令前缀。
21.根据权利要求14-20任一项所述的方法,其特征在于,所述第一指令为符号位扩展指令,所述第二指令为地址计算指令,所述第一操作为符号位扩展操作;
所述为依赖第一指令的第二指令扩展第一指令对应的第一操作包括:
对于依赖符号位扩展指令的地址计算指令,设置地址计算指令通过符号位扩展操作,对Scale和Index的计算结果进行符号位扩展,以得到中间计算结果;以及,设置地址计算指令根据中间计算结果与Base,得到所计算的地址。
22.一种处理器,其特征在于,包括:
译码单元,用于译码当前指令;如果当前指令为第二指令,且第二指令具有指令前缀,则根据第二指令的指令前缀,判断第二指令是否扩展第一指令对应的第一操作;如果第二指令扩展第一操作,为第二指令携带第一操作对应的标记位;其中,程序中依赖第一指令的第二指令扩展第一操作,且程序中被第二指令所依赖的第一指令被消除;
执行单元,用于在执行第二指令时,对于携带第一操作对应的标记位的第二指令,利用第一操作得到第二指令的中间计算结果,根据中间结算结果得到第二指令的执行结果。
23.根据权利要求22所述的处理器,其特征在于,所述执行单元具有第一操作的执行逻辑;其中,在第二指令携带第一操作对应的标记位时,所述执行单元中第一操作的执行逻辑被使能,使能的第一操作的执行逻辑用于利用第一操作,得到第二指令的中间计算结果。
24.根据权利要求23所述的处理器,其特征在于,所述第一指令为符号位扩展指令,所述第二指令为地址计算指令,所述第一操作为符号位扩展操作;
所述执行单元包括地址计算单元,用于执行地址计算指令;
所述地址计算单元包括:位运算单元、符号位扩展单元、以及结合单元;
其中,所述位运算单元,用于对Scale和Index执行位运算,得到Scale和Index的计算结果;
所述符号位扩展单元,用于在地址计算指令携带符号位扩展操作对应的标记位时被使能,以对Scale和Index的计算结果进行符号位扩展操作,得到中间计算结果,并将中间计算结果提供给所述结合单元;以及,在地址计算指令未携带符号位扩展操作对应的标记位时不被使能,以将Scale和Index的计算结果提供给所述结合单元;
所述结合单元,用于将所述符号位扩展单元提供的计算结果,与Base进行结合,得到地址计算指令所计算的地址。
25.一种芯片,其特征在于,包括如权利要求22-24任一项所述的处理器。
26.一种电子设备,其特征在于,包括如权利要求22-24任一项所述的处理器,或者,如权利要求25所述的芯片。
27.一种计算机,其特征在于,用于编译程序,所述计算机包括:至少一个处理器和至少一个存储器,所述存储器存储编译软件,所述处理器调用所述编译软件,以执行如权利要求14-21任一项所述的程序编译方法。
28.一种存储介质,其特征在于,所述存储介质存储有编译软件,所述编译软件被执行时实现如权利要求14-21任一项所述的程序编译方法。
29.一种计算机程序产品,其特征在于,包括编译软件,所述编译软件被执行时实现如权利要求14-21任一项所述的程序编译方法。
CN202410263957.9A 2024-03-07 2024-03-07 指令处理方法、程序编译方法、相关器件及设备 Pending CN118132154A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202410263957.9A CN118132154A (zh) 2024-03-07 2024-03-07 指令处理方法、程序编译方法、相关器件及设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202410263957.9A CN118132154A (zh) 2024-03-07 2024-03-07 指令处理方法、程序编译方法、相关器件及设备

Publications (1)

Publication Number Publication Date
CN118132154A true CN118132154A (zh) 2024-06-04

Family

ID=91234944

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202410263957.9A Pending CN118132154A (zh) 2024-03-07 2024-03-07 指令处理方法、程序编译方法、相关器件及设备

Country Status (1)

Country Link
CN (1) CN118132154A (zh)

Similar Documents

Publication Publication Date Title
EP2524303B1 (en) Mapping between registers used by multiple instruction sets
US6128614A (en) Method of sorting numbers to obtain maxima/minima values with ordering
EP2142987B1 (en) Improvements in and relating to floating point operations
CN114356417A (zh) 实行16位浮点矩阵点积指令的系统和方法
JP5299979B2 (ja) Riscプロセッサ及びレジスタのフラグビットの処理方法
CN108885551B (zh) 存储器复制指令、处理器、方法和系统
US11307855B2 (en) Register-provided-opcode instruction
JP2018500657A (ja) 融合された単一のサイクルのインクリメント−比較−ジャンプを実施するための命令及びロジック
CN115686633A (zh) 用于实现链式区块操作的系统和方法
CN103109261B (zh) 用于通用逻辑操作的方法和设备
CN108292228B (zh) 用于基于通道的步进收集的系统、设备和方法
CN110659223A (zh) 用于延迟的不规则载荷的预取器
CN111782270B (zh) 一种数据处理方法及装置、存储介质
JP6807073B2 (ja) 高速ベクトルによる動的なメモリ競合検出
CN116860334A (zh) 用于计算两个区块操作数中的半字节的数量积的系统和方法
JP4141112B2 (ja) プロセッサおよびプロセッサシステム
CN107729118A (zh) 面向众核处理器的修改Java虚拟机的方法
US6209080B1 (en) Constant reconstruction processor that supports reductions in code size and processing time
CN118132154A (zh) 指令处理方法、程序编译方法、相关器件及设备
US5774694A (en) Method and apparatus for emulating status flag
US6408380B1 (en) Execution of an instruction to load two independently selected registers in a single cycle
US20240028337A1 (en) Masked-vector-comparison instruction
CN108463801B (zh) 标识第一和第二架构寄存器编号的编码指令
US6934941B2 (en) Compiler for generating risc object code whereby operations on bit variables written in source code are executed by processing based on bit judgement operations to thereby reduce the amount of object code
CN114217856A (zh) 面向AArch64架构的CPU指令微基准测试方法及系统

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination