指令获取设备和处理器的制作方法

文档序号:6356796阅读:155来源:国知局
专利名称:指令获取设备和处理器的制作方法
技术领域
本发明涉及指令获取设备。更具体地,本发明涉及用于预取包括分支指令的指令序列的指令获取设备和处理器,以及涉及供所述设备和处理器使用的处理方法,并且还涉及用于使得计算机执行所述处理方法的程序。
背景技术
为了最大化管线型CPU (中央处理单元;或处理器)的处理能力,管线内的指令应当理想地被保持为在无障碍的情况下流动。保持这样的理想状态要求要被处理的下一指令从其被保存到的存储器位置被预取到CPU或指令缓存器。然而,如果程序包括分支指令, 则在分支指令被执行之前,紧接该分支指令后所要被执行的指令的地址不能确定地被识别出。因此,指令获取被暂停;管线迟延发生;并且指令执行的吞吐量下降。因此,许多CPU具有通过不论源自分支的不确定性如何都要执行预取以抑制管线迟延的配置。可通过简单硬件实施的一般预取方案被称为下一行预取(参见日本专利 No. 4327237(图1))。这是一种按照指令被编程的顺序来预取指令的技术。处理器从存储器获取指令的基本模式涉及按照地址顺次上升的顺序访问存储器。因此,此通过硬件的预取构成了将给定地址的指令存储在缓存器中,然后假设还将使用下一缓存行并且还自动地存储下一缓存行的尝试。

发明内容
虽然上述下一行预取可以使用简单硬件结构来实施,但是此预取通过假设没有分支发生而被执行的事实频繁地导致不必要的预取(被称为预取失效)。预取失效发生导致如下不利丢弃预取的指令,再次获取正确分支目的地的指令,同时使得CPU在其等待状态中运行较长时间。另外,读写额外数据的需要使得增加了存储器访问并且增大了功耗。此外,频繁无用的预取引起了恶化数据路径中的流量拥塞的问题。用于减小预取无效的另一尝试是使用被称为分支预测的技术。下一行预取涉及通过预测下一行将永不会分支来预取此下一行,而分支预测特征在于基于过去的历史预测分支方向,并且从预测的地址预取指令。分支预测是复杂的并且要求使用包含包括历史表在内的大电路面积的硬件。然而,通过分支预测得到的性能益处依赖于预测算法的效率,许多预测算法需要使用相对较大容量的存储设备和复杂的硬件来实施。当预测失败时,分支预测还造成与由下一行预取所引入的不利类似的不利。大多数实际程序它们的分支中的环路与例外处理的比率不成比例地高,从而分支预测的优点通常胜于其缺点。尽管如此,一些应用还是按照不管可以利用怎样的预测算法都难以提高其预测性能的方式来构建的。特别是,编解码应用倾向于使得它们的预测失效,除了回路的预测以外。随着预测采样数的比率自然希望被增大,用于实施此目的的方案在电路上变得越来越大并且越来越复杂,并且可能不会引起与实际电路的规模相称的性能改善。与上述概括的用于仅在单方向中执行预取的技术相对,已经提出了另一种技术,
4其涉及在没有预测的情况中在分支的两个方向中预取指令以消除预取失效。与分支预测的技术相比,此技术能够通过增加有限量的硬件来免除管线迟延。然而,不仅仅要被存储用于预取的数据量简单被翻倍,而且不必要的数据总是必须被读取。导致的数据路径上的拥塞不利地影响了性能;增加的冗余电路使得电路结构复杂化;并且增加的功耗也是不能忽视的。如上概括,现有的预取技术具有它们自己的优点(预期能提升吞吐量)和缺点 (增大了实现CPU的成本;分支预测处理的开销)。对于这些技术中的每种技术,存在成本和性能的折中。本发明是鉴于上述情况而做出的,并且提供了一种用于最小化在用于预取指令的下一行预取中所涉及的不利的创新性配置。在实现本发明中,根据本发明的一个实施例,提供了一种指令获取设备,其包括 检测状态设定部件,被配置为设定其指令预取定时要被检测的程序的执行状态;程序执行状态生成部件,被配置为生成所述程序的当前执行状态;指令预取定时检测部件,被配置为对所述程序的当前执行状态与其设定执行状态进行比较并且在两者一致(match)的情况下检测所述指令预取定时;和指令预取部件,被配置为当所述指令预取定时被检测到时预取下一指令。该指令获取设备提供了在预定执行状态被达到时预取下一指令的效果。优选地,检测状态设定部件可以包括地址设定寄存器,地址设定寄存器被配置为设定其指令预取定时要被检测的指令的地址的至少一部分;程序执行状态生成部件可以包括程序计数器,程序计数器被配置为保存当前正在执行的指令的地址作为所述程序的当前执行状态;并且指令预取定时检测部件可以包括地址比较部件,地址比较部件被配置为对所述程序计数器上的值的至少一部分和地址设定寄存器中的值进行比较并且在两者一致的情况下检测指令预取定时。此结构提供了根据程序计数器的状态来预取下一指令的效
: O 优选地,本发明的此指令预取设备还可以包括指令分组保存部件,指令分组保存部件被配置为保存由使得程序指令序列分割成预定大小的指令有效载荷以及包括用于指定下一指令有效载荷的预取定时的预取定时信息的指令头构成的指令分组。在此指令预取设备中,检测状态设定部件可以基于预取定时信息来设定地址设定寄存器。此结构提供了根据基于在指令头中包括的预取定时信息而设定的指令地址来预取下一指令的效果。优选地,检测状态设定部件可以包括设定步长地址寄存器,设定步长地址寄存器被配置为保存指示其指令预取定时要被检测的指令的地址的设定粒度的步长值;和乘算部件,乘算部件被配置为通过将在预取定时信息中包括的步长计数与所述步长值相乘来设定地址设定寄存器。此结构提供了根据基于步长值和步长计数而设定的指令地址来预取下一指令的效果。优选地,本发明的此指令预取设备还可以包括指令分组保存部件,指令分组保存部件被配置为保存由使得程序指令序列分割成预定大小的指令有效载荷和包括分支预测信息的指令头构成的指令分组,分支预测信息指示在指令有效载荷中包括的分支指令分支到既不是包括在指令有效载荷也不是包括在下一指令有效载荷中的指令的可能性程度。在此指令预取设备中,检测状态设定部件可以基于分支预测信息来设定地址设定寄存器。此结构提供了根据基于在指令头中包括的分支预测信息而设定的指令地址来预取下一指令
5
优选地,检测状态设定部件可以包括执行次数设定寄存器,执行次数设定寄存器被配置为将预定指令类型的执行次数设定作为其指令预取定时要被检测的所述程序的执行状态;并且程序执行状态生成部件可以生成所述预定指令类型的当前执行次数作为所述程序的当前执行状态。本此结构提供了在预定类型的指令被执行了预定次数时预取下一指令的效果。在此结构中,程序执行状态生成部件可以优选地包括指令类型设定寄存器,被配置为设定所述预定指令类型;指令类型比较部件,被配置为通过在当前正执行的指令的指令类型与所述预定指令类型之间进行比较而检测它们之间的匹配;和执行次数计数器, 被配置为使得每当指令类型比较部件检测到当前正执行的指令的指令类型与所述预定指令类型之间的匹配时,执行次数计数器获取所涉及的指令类型的执行次数。根据本发明的另一实施例,提供了一种处理器,其包括检测状态设定部件,被配置为设定其指令预取定时要被检测的程序的执行状态;程序执行状态生成部件,被配置为生成所述程序的当前执行状态;指令预取定时检测部件,被配置为对所述程序的当前执行状态和其设定执行状态进行比较并且在两者一致的情况下检测所述指令预取定时;指令预取部件,被配置为当所述指令预取定时被检测到时预取下一指令;和指令执行部件,被配置为执行通过指令预取而获得的指令。此处理器提供了在预定执行状态达到时预取下一指令的效果。根据如上所概括而例示的本发明,能够最小化用于预取指令的下一行预取中所涉及的不利。


在阅读了下面的描述和附图之后,本发明的另外的目的和优点将变得很明显。图1是示出本发明的第一实施例的处理器构成部分的一般管线结构的示意图;图2是示出第一实施例的处理器构成部分的一般块结构的示意图;图3是示出对于第一实施例的一般指令分组结构的示意图;图4是示出对于第一实施例的指令头的一般字段结构的示意图;图5是示出对于第一实施例的分支预测标志的一般设置的示意图;图6是示出基于对指令辞典表的参考的压缩一般被如何应用于第一实施例的示意图;图7是示出对于第一实施例的一般如何改变用于基于对指令辞典表的参考的压缩的分支预测标志的示意图;图8是示出第一实施例生成指令分组所用的一般功能结构的示意图;图9是示出第一实施例生成指令分组所用的一般过程的流程图;图10是示出第一实施例执行指令所用的一般功能结构的示意图;图11是示出第一实施例执行指令所用的一般过程的流程图;图12是示出对于第一实施例的指令头的字段结构的变形例的示意图;图13是示出与本发明的第二实施例有关的在分支指令的布置与指令预取的开始位置之间的一般关系的示意图;图14A和14B是示出对于第二实施例的涉及预取开始地址设定寄存器的使用的配
6置示例的示意图;图15是示出对于第二实施例的涉及指令头中的指令预取定时字段的使用的配置示例的示意图;图16是示出对于第二实施例的涉及预定指令执行次数用作预取定时的配置示例的示意图;图17是示出对于第二实施例的如何在指令头中一般地设定指令类型和执行次数的示意图;图18是示出第二实施例执行指令所用的一般功能结构的示意图;图19是示出第二实施例执行指令所用的一般过程的流程图;图20是示出与本发明第三实施例有关的用于加算控制处理的程序计数器的一般功能结构的示意图;图21是示出对于第三实施例的加算控制寄存器的一般结构的示意图;图22是示出第三实施例如何通过两路分支来处理指令的示意图;图23是示出第三实施例如何通过多向分支来处理指令的示意图;图24A、24B、24C和24D是示出对于第三实施例的用于设定对于加算控制寄存器的值的一般指令集的示意图;图25是示出对于第三实施例的条件分支指令如何向加算控制寄存器设定值的示意图;图沈是示出对于第三实施例的控制寄存器改变指令如何为加算控制寄存器设定值的示意图;图27是示出第三实施例执行指令所用的一般过程的流程图;图观是示出本发明的第四实施例的处理器构成部分的一般管线结构的示意图;图四是示出第四实施例的处理器构成部分的一般块结构的示意图;图30是示出对于第四实施例的分支指令和缓存行之间的一般关系的示意图;图31A和31B是示出第四实施例一般如何改变指令的布置的示意图;图32是示出第四实施例布置指令所用的一般功能结构的示意图;图33是示出第四实施例布置指令所用的一般过程的流程图;图34A和34B是示出第四实施例如何一般地设定预取地址寄存器的示意图;图35是示出第四实施例执行指令所用的一般功能结构的示意图;和图36是示出第四实施例执行指令所用的一般过程的流程图。
具体实施例方式下面将描述本发明的优选实施例。描述将按照以下标题给出。1.第一实施例(用于使用分支预测信息来控制对指令预取的阻止)2.第二实施例(用于控制指令预取的定时)3.第三实施例(用于通过以混合方式布置指令来均化指令预取的不利)4.第四实施例(用于通过固定分支目的地缓存行的布置来避免缓存行冲突)5.实施例的组合<1.第一实施例>
[处理器的结构]图1是示出本发明的第一实施例的处理器构成部分的一般管线结构的示意图。此示例预先假定五个管线阶段指令获取阶段(IF)ll、指令解码阶段(ID)21、寄存器获取阶段(RF)31、执行阶段(EX)41和存储器访问阶段(MEM)51。这些管线以锁存器19、29、39和 49而被划界开。管线处理是与时钟同步而被执行的。指令获取阶段(IF) 11涉及执行指令获取处理。在指令获取阶段11处,程序计数器(PC) 18被加算部件12逐次增大。由程序计数器18指向的指令向下游被发送到指令解码阶段21。此外,指令获取阶段11包括指令缓存器(稍后讨论),指令被预取到该指令缓存器。下一行预取部件13被用于预取下一行,S卩,包含当前作为执行目标的指令的缓存行接下来的缓存行。指令解码阶段(ID) 21涉及对从指令获取阶段11提供来的指令进行解码。在指令解码阶段21处完成的解码的结果被转发到寄存器获取阶段(RF) 31。在分支指令的情况中, 指令的分支目的地地址被馈送到程序计数器(PC) 18。寄存器获取阶段(RF) 31涉及获取指令执行所必要的运算元。对于若干管线处理器,运算元访问的目标被限定为寄存器文件。在寄存器获取阶段31处所获得的运算元数据被提供到执行阶段(EX) 41。执行阶段(EX)41涉及使用运算元数据执行指令。例如,算数和逻辑运算以及分支确定运算被执行。在执行阶段(EX)41处所获得的执行结果数据被存储到寄存器文件中。在存储指令的情况中,在存储器访问阶段(MEM)51处对存储器执行写操作。存储器访问阶段(MEM)51涉及获得对存储器的访问。在加载指令的情况中,对存储器执行读访问操作;在存储指令的情况中,对存储器执行写访问操作。图2是示出第一实施例的处理器构成部分的一般块结构的示意图。此处理器包括处理器核心110、指令缓存器120、数据缓存器130、下一行预取部件150和分组解复用器 160。此处理器还包含预取队列170、指令队列180、指令辞典索引191和指令辞典表192。 此外,此处理器被连接到系统存储器140。处理器核心110包含处理器的除了指令获取装置以外的主要装置,并且包括程序计数器111、指令寄存器112、指令解码器113、执行部件114和寄存器文件115。程序计数器111逐次对作为执行目标的指令的地址进行计数。指令寄存器112保存作为程序计数器 111执行目标的指令。指令解码器113对由指令寄存器112所保存的指令进行解码。执行部件114执行被指令解码器113解码了的指令。寄存器文件115提供保存执行部件114执行指令所必要的运算元和其他数据。指令缓存器120是保存存储在系统存储器140中的指令拷贝的缓存器存储器。当处理器核心110访问指令时,指令缓存器120比系统存储器140能够允许处理器核心110更快速地访问所涉及的指令。因此,优选地尽可能预先将指令保存在指令缓存器120中。如果在对必要指令访问时发现其被保存在指令缓存器120中,则访问被称为命中(hit);如果发现必要指令未被缓存,则访问被称为无效命中(miss hit)。数据缓存器130是保存存储在系统存储器140中的数据的拷贝的存储器缓存器。 当处理器核心Iio访问数据时,数据缓存器130比系统存储器140能够允许处理器核心110 更快地访问数据。因此,优选地尽可能预先将数据保存在指令缓存器120中。正如对于指令缓存器120那样,如果在对必要数据访问时发现其被保存在数据缓存器130中,则访问被称为命中;如果发现必要数据未被缓存,则访问被称为无效命中。与指令缓存器120不同, 数据缓存器130还用于写访问操作。下一行预取部件150被用于从系统存储器140中预取下一行给指令缓存器120, 下一行即作为被预测为需要的指令的下一缓存行。下一行预取部件150对应于管线结构的下一行预取部件13,并且属于指令获取阶段(IF) 11。下一行预取部件150监控程序计数器 111的状态,并按照适当的时控方式向系统存储器140发出用于从指令缓存器120预取指令缓存器120的缓存行的预取请求。分组解复用器160将从系统存储器140取回的指令分组分割成指令头和指令有效载荷。指令分组的结构稍后将被描述。给定指令的缓存行被包含在其指令有效载荷中。预取队列170是保存指令的包含在它们的有效载荷中的缓存行的队列。在预取队列170中所保存的缓存行从第一缓存行开始起被顺次输入指令缓存器120。指令队列180是保存根据程序计数器111从指令缓存器120取回的指令的缓存行的队列。指令辞典索引191和指令辞典表192被用于基于对指令辞典表的参考来执行压缩指令。当由被设计为以高频率出现的一串指令构成的宏第一次出现时,使用指令辞典寄存指令将该指令宏登记。当该宏下次出现时,其被有关指令辞典参考指令的单个指令替代。指令辞典表192保存每个由一串指令构成的宏。指令辞典索引191用作用来访问指令辞典表 192的索引。如何基于对指令辞典表的参考来使用压缩指令将稍后讨论。系统存储器140存储作为执行目标的指令以及用于执行所涉及的指令必要的数据。处理器核心Iio请求对系统存储器140的读或写访问操作。然而,只要在指令缓存器 120中或在数据缓存器130中存在命中,此请求就不会发生。顺便提及,系统存储器140是在所附权利要求中描述的指令分组保存部件的示例。在上述块结构示例中,程序计数器111、指令缓存器120、下一行预取部件150、分组解复用器160、预取队列170和指令队列180属于图1中所示的指令获取阶段(IF) 11。 此外,指令寄存器112、指令辞典索引191和指令辞典表192可以被认为是指令获取阶段 (IF)Il的构成部分。类似地,指令解码器113属于指令解码阶段(ID)21。而寄存器文件 115属于寄存器获取阶段(RF)31。执行部件114属于执行阶段(EX)41。数据缓存器130和系统存储器140属于存储器访问阶段(MEM)51。[指令分组的结构]图3是示出对于第一实施例的指令分组300的一般结构的示意图。指令分组300 包括指令头310和指令有效载荷320。指令有效载荷320是容纳至少一个指令缓存行的区域。在此示例中,假定“η” (η是至少为1的整数)个那么多的每个1 字节的指令缓存行被保存在指令有效载荷320中。指令头310被附接到每个指令有效载荷320并且保存有关指令有效载荷320的信息。图4是示出对于第一实施例的指令头310的一般字段结构的示意图。指令头310 的第一结构示例包括分支预测标志字段311、指令预取定时字段312、指令有效载荷压缩标志字段313、指令有效载荷长度字段314和预取设定字段315。对于此示例,指令头310被假定为32比特长。从最低有效位(LSB)开始,分支预测标志字段311被分配比特0,之后是
9指令预取定时字段312被分配比特1和2,以及指令有效载荷压缩标志字段313被分配比特 3。此外,指令有效载荷长度字段314被分配比特4-7,并且预取设定字段315被分配比特 8-11。由其余的比特12-31形成的20比特未使用字段316可以用于其它目的,这将在稍后讨论。分支预测标志字段311是指示在指令有效载荷320中存在分支指令以及该指令很可能既不在指令有效载荷320内分支也不分支到下一指令有效载荷的字段。也就是说,如果在预取时很有可能发现不希望下一行,则分支预测标志311 —般可指示“1”;否则分支预测标志311可指示“0”。顺便提及,分支预测标志311是在所附权利要求中描述的分支预测信息的示例。指令预取定时字段312是指示用于执行指令预取的定时的字段。指令预取定时字段312将结合稍后描述的第二实施例来被讨论。顺便提及,指令预取定时312是在所附权利要求中描述的预取定时信息的示例。指令有效载荷压缩标志313是指示指令有效载荷320是否经历了无损压缩的字段。无损压缩是指使得没有数据损失的一种可逆压缩。经历了无损压缩,指令有效载荷320 使其全部比特序列被压缩。落入无损压缩的种类有公知的哈夫曼(Huffman)编码、算数编码以及LZ编码等等。如果指令有效载荷320被发现经历了无损压缩,则其需要被扩展;否则指令有效载荷32的指令不能被执行。因此,如果指令有效载荷压缩标志313指示“ 1 ”,则指令在被解码之前要被扩展。使得一个指令缓存行经历无损压缩的益处可以忽视,因为要被预取的数据量没有被减少。编码效率只有在所涉及的比特序列较长时才增大。如果分支指令被包括,则指令分组需要被分割成基本块。指令有效载荷长度字段314是指示指令有效载荷320的大小的字段。例如,指令有效载荷320的大小可以在指令缓存行计数的增大中被指示出。前面的示例预先假定“η” 个那么多的1 字节指令缓存行被存储在指令有效载荷320中。在此情况中,值“η”被设定为指令有效载荷长度314。预取设定字段315是指示用于预设作为预取目标的地址的字段。预取设定字段 315将结合稍后描述的第四实施例来被讨论。[分支预测标志]图5是示出对于第一实施例的分支预测标志311的一般设置的示意图。此示例预先假定分支指令$1被包括在指令分组#1的有效载荷中并且在指令分组#2和#3中不包括分支指令。分支指令$1的分支目的地是在指令分组#3的指令有效载荷内的指令地址。并且分支到该地址的可能性被预测为很高。因此,在此情况中,在指令分组#1的指令头中的分支预测标志311被设定为“1”。另一方面,在指令分组#2和#3的指令头中的分支预测标志311被设定为“0”,因为在指令分组#2和#3不包括分支指令。如稍后所讨论的,分支预测标志311被假定是在编译时段一般基于简档(profile)而静态地被设定的。当从指令分组#1来看时,下一行被发现处于指令分组#2中,并且分支目的地行被发现处于指令分组 #3中。被如上所说明地设定的分支预测标志311在指令预取时被参考。当设定为“1”时, 分支预测标志311停止预取下一缓存行。这避免了被预测是不希望的指令预取。同时,如果连续发生分支预测标志311被设定为“1”的情况,则对指令预取的抑制会使得指令预取装置不能够被有效地利用。为了避免这样连续的分支预测标志311被设定为“1”的情况,考虑通过基于对指令辞典表的参考的压缩处理来压缩分支指令间的指令可能是有利的。这种基于对指令辞典表的参考的压缩与和指令有效载荷压缩标志313有关的无损压缩是不同的。[基于对指令辞典表的参考的压缩]图6是示出基于对指令辞典表的参考的压缩一般被如何应用于第一实施例的示意图。在图6中左边的未压缩码示出如所示那样放置的未压缩指令序列331到335。这里假定指令序列331、332和335是相同的码。还假定指令序列333和334是相同的码。在图6的中间的压缩码中,指令辞典登记指令% 1被置于指令序列331的紧后。此布置使得指令序列331的内容被登记在指令辞典表192的区域% 1 (351)中。随后,当指令辞典参考指令<% 1(342)被执行时,指令辞典表192的区域% 1(351)被参考,并且与指令序列332相对应的内容在被馈送到指令队列180之前被扩展。此外,在此压缩码中,指令辞典登记指令% 2被置于指令序列333的紧后。此布置使得指令序列333的内容被登记在指令辞典表192的区域% 2(35 中。随后,当指令辞典参考指令% 2(344)被执行时,指令辞典表192的区域% 2(352)被参考,并且与指令序列 334相对应的内容在被馈送到指令队列180之前被扩展。此外,当指令辞典参考指令% 1 (345)被执行时,指令辞典表192的区域% 1 (351) 被参考,并且与指令序列335相对应的内容在被馈送到指令队列180之前被扩展。如上所述,借助指令辞典表192执行了对指令序列的压缩处理。此特征可用于如下所述改变分支预测标志311的设置。图7是示出对于第一实施例的一般如何改变用于基于对指令辞典表的参考的压缩的分支预测标志311的示意图。在如在图7中左边所示指令分组#1和#2中分支预测标志311被设定为“1”的情形中,指令预取将不被连续执行。在此情况中,尝试通过使用上述指令辞典表192的指令压缩来防止分支预测标志311被连续设定为“1”。也就是说,如在图7中右边所示,分支指令$1和$2之间的指令使用指令辞典表 192被压缩,从而在指令分组#2中包括的分支指令$2被移动到指令分组#1’。通过分支指令$2被如此从指令分组#2移除,指令分组#2,的分支预测标志311可以被设定为“0”。一般而言,基于对指令辞典表的参考的压缩指令可能比普通指令需要更大数目的解码周期。因此,将此类型的压缩指令应用到所有指令可能与期望相反地会大大地恶化处理能力。尽管如此,此配置在存在以高的出现频率为特征的指令宏的情况中仍有效地提供高压缩效率。[指令分组生成处理]图8是示出第一实施例生成指令分组所用的一般功能结构的示意图。此示例包括程序保存部件411、分支简档保存部件412、指令分组生成部件420、分支预测标志设定部件 430、指令压缩部件440和指令分组保存部件413。优选地在编译时段或者链接时段生成指令分组。如果动态链接是在可重定位OS的情况下执行的,则还可在执行时段生成指令分组。程序保存部件411保存要生成其指令分组的程序。分支简档保存部件412保存由程序保存部件411保存的程序中所包括的分支指令的分支简档。分支简档是通过预先分析
11或执行程序而得到的。在无条件的分支指令的情况中,是否执行分支在许多情况中可以通过分析程序来确定。甚至对于无条件的分支指令,可以通过执行程序来确定分支的统计概率。指令分组生成部件420通过将在程序保存部件411中保存的程序分割成固定大小以生成指令有效载荷320并且向所生成的指令有效载荷320附接指令头310来生成指令分组300。如上所述,假定“η”个那么多的1 字节的指令缓存行被存储在指令有效载荷320中。分支预测标志设定部件430在由指令分组生成部件420所生成的指令头310中设定分支预测标志311。通过参考在分支简档保存部件412中保存的分支简档,分支预测标志设定部件430预测在指令有效载荷320中包括的分支指令的分支目的地以及分支指令的分支概率来设定分支预测标志311。如果在指令有效载荷320中发现分支指令并且如果该指令很可能既不在指令有效载荷320中分支也不分支到下一指令有效载荷,则“1”被设定给分支预测标志311 ;否则“0”被设定给分支预测标志311。顺便提及,分支预测标志设定部件430是在所附权利要求中描述的分支预测信息设定部件的示例。指令压缩部件440对指令有效载荷320中包括的指令进行压缩。为了使用指令辞典表192来压缩指令,指令压缩部件440检测以高频率出现的指令宏。当这样的指令宏第一次被检测到出现时,使用指令辞典寄存指令将此指令宏登记。当由一串指令构成的该宏下一次出现时,其被有关指令辞典参考指令的单个指令替代。结果,如果分支指令的布置被改变,则分支预测标志311被再次设定。如果整个指令有效载荷320被发现经历了无损压缩,则指令头310中的指令有效载荷压缩标志313被设定为“1”。指令分组保存部件413将从指令压缩部件440输出的指令分组300保存。图9是示出第一实施例生成指令分组所用的一般过程的流程图。首先,指令分组生成部件420通过将在程序保存部件411中保存的程序分割成固定大小以生成指令有效载荷320并且向所生成的指令有效载荷320附接指令头310来生成指令分组300(在步骤S911中)。然后,分支预测标志设定部件430判断在指令有效载荷 320中是否发现了分支指令,以及该指令是否很可能既不在指令有效载荷320中分支又不分支到下一指令有效载荷(在步骤S912中)。如果判定这样的分支发生的概率很高,则“1” 被设定给分支预测标志311(在步骤S913中)。否则,“0”被设定给分支预测标志311。如果判定在连续的指令分组300的分支预测标志311中设定了“1” (在步骤S914 中),则指令压缩部件440使用指令辞典表192压缩指令有效载荷320内的指令(在步骤 S915中)。也可以使得整个指令有效载荷320经历无损压缩。在此情况中,指令头310的指令有效载荷压缩标志313被设定为“1”。[指令执行处理]图10是示出第一实施例执行指令所用的一般功能结构的示意图。此示例包括指令分组保存部件413、指令分组分离部件450、分支预测标志判断部件460、指令预取部件 470、指令扩展部件480和指令执行部件490。指令分组分离部件450将在指令分组保存部件413中保存的指令分组300分离成指令头310和指令有效载荷320。分支预测标志判断部件460参考指令头310中的分支预测标志311来判断是否通过指令缓存器120预取下一缓存行。如果判定预取应被执行,则分支预测标志判断部件460 请求指令预取部件470执行指令预取。顺便提及,分支预测标志判断部件460是在所附权利要求中描述的分支预测信息确定部件的示例。当分支预测标志判断部件460请求执行指令预取时,指令预取部件470向系统存储器140发出针对下一缓存行的请求。所预取的指令被保存在指令缓存器120中,并且如果指令流没有发生改变的话,则其然后被提供给指令执行部件490。如果指令头310中指令有效载荷压缩标志313被发现设定为“ 1 ”,则指令扩展部件 480将经历了无损压缩的指令有效载荷320扩展成可解码的指令序列。如果指令头310中的指令有效载荷压缩标志313被发现没有设定为“ 1 ”,则指令扩展部件480无改变地输出指令有效载荷320中的指令。指令执行部件490执行从指令扩展部件480输出的指令序列。如果是基于对指令辞典表的参考而经历了压缩的指令序列,则指令执行部件490通过执行指令辞典寄存指令和指令辞典参考指令来扩展此指令。同时,在无损压缩的情况中,此指令序列不能按原样被解码;其需要由指令扩展部件480扩展。图11是示出第一实施例执行指令所用的一般过程的流程图。首先,指令分组分离部件450将指令分组保存部件413中保存的指令分组300分离成指令头310和指令有效载荷320 (在步骤S921中)。然后。分支预测标志判断部件460 判断指令头310中的分支预测标志311 (在步骤S922中)。如果判定“ 1”被设定给分支预测标志311,则指令预取被阻止(在步骤S923中)。如果判定“0”被设定,则指令预取部件 470执行指令预取(在步骤S9M中)。如果判定指令头310中的指令有效载荷压缩标志313被设定为“1” (在步骤S925 中),则指令扩展部件480对经历了无损压缩的指令有效载荷320进行扩展(在步骤中)。如此获得的指令被指令执行部件490执行(在步骤S927中)。在基于对指令辞典表的参考而经历了压缩的指令序列的情况中,指令执行部件490通过执行指令辞典寄存指令和指令辞典参考指令对每个指令进行扩展。顺便提及,步骤S921是在所附权利要求中描述的分离指令分组的步骤的示例。步骤S922是在所附权利要求中描述的确定分支预测信息的步骤的示例。步骤S923和S9M 是在所附权利要求中描述的预取指令的步骤的示例。如上所述,根据本发明的第一实施例,能够通过预先适当地设定分支预测标志311 来阻止不必要的指令预取。[变形例]图12是示出对于第一实施例的指令头310的字段结构的变形例的示意图。在图4 中的字段结构的示例中,比特12-31的20比特区域被示为未使用区域316,而图12的变形例涉及在20比特区域317中保存指令有效载荷的开头指令。虽然第一实施例预先假定了 32比特长的指令集,然而可以通过诸如从指令字段中去除不使用的部分以及减少运算元之类的配置来将此开头指令紧凑为20比特。此20比特指令然后被嵌入在区域317中。因为此开头指令被嵌入在区域317中,所以指令有效载荷320的大小被减少了一个指令,S卩,减少了 32比特。
13
在上述示例中,开头指令被示为紧凑为20比特。然而,此紧凑的指令的比特宽度不限于20比特。此比特宽度可以与其它字段相关地被适当地确定。<2.第二实施例〉上述第一实施例预先假定使用指令分组来管理程序。然而,此类管理对于本发明的第二实施例不是强制性的。下面首先说明无需借助指令分组的指令预取控制,之后说明使用指令分组的指令预取。第二实施例的管线结构和块结构与第一实施例的那些相同,并且因此将不对它们进行讨论。[分支指令布置和指令预取开始位置]图13是示出与本发明的第二实施例有关的在分支指令布置与指令预取开始位置之间的一般关系的示意图。在缓存行#1中发现的分支指令$1的分支目的地被包括在缓存行#3中。因此,如果分支指令$1被执行并且从而相应地分支被实现,则缓存行#1接下来的缓存行#2即便被预取也将被浪费。现在假定缓存器#2的预取从预取开始位置A开始。在此点处,执行分支指令$1 的结果是未知的,所以缓存器#2的预取可被证明是不必要的。另一方面,如果缓存器#2的预取从预取开始位置B开始,则执行分支指令$1的结果已经知道,所以可以阻止对缓存器 #2的不必要的预取。如上所述,预取开始位置可影响是否要有效阻止对下一行预取的判断。根据上面给出的示例,预取开始位置越靠后,越容易知道执行分支指令的结果,这对于阻止不必要的预取越有利。另一方面,如果预取开始位置太靠后,则预取不能即时执行,这可导致指令管线中的指令等待状态。鉴于这些考虑,第二实施例被配置为按照预先建立的适当的时控方式执行指令预取的装置。[向预取开始地址设定寄存器设定定时]图14A和图14B是示出对于第二实施例的涉及预取开始地址设定寄存器的使用的配置示例的示意图。如图14A所示,此配置示例包括构成下一行预取部件150的部分的预取开始地址设定寄存器153和地址比较部件154。预取开始地址设定寄存器153被用于设定每个缓存行中从其开始下一行预取的地址。在预取开始地址设定寄存器153中要设定的地址可以是在缓存行内的相对地址。假定此地址是在编译时段例如基于程序的分支指令频率而确定的。顺便提及,预取开始地址设定寄存器153是在所附权利要求中描述的地址设定寄存器的示例。地址比较部件巧4对在预取开始地址设定寄存器153中设定的地址与程序计数器 111的内容进行比较。当通过有关缓存行中的相对地址的比较而检测到匹配时,地址比较部件IM发出下一行预取请求。根据上述配置示例,缓存行中的理想位置可以被选作为预取开始地址设定寄存器 153设定的预期开始地址。然后,可由地址比较部件巧4检测匹配。图14B是示出如所描述而设定的地址的示例。假定在缓存行中设立了约四个预期开始位置。当缓存行被假定为1 字节长时,缓存行可以以32字节的间隔被分割来设立四个位置开头(字节0),字节32、字节64(中间)和字节96。如果指令集被假定包含每个4 字节(34)比特长的指令,则每个指令地址的二进制符号中的低2比特可以忽略。因此,在此情况中,只需要比较从比特3到比特7的低5比特。
14
[指令头的使用]图15是示出对于第二实施例的涉及指令头310中的指令预取定时字段312的使用的配置示例的示意图。此配置示例使用了指令头310中的指令预取定时字段312,并且假定上面结合第一实施例说明的指令分组被使用。此外,下一行预取部件150被构建为除了包括图14A中所示的预取开始地址设定寄存器153和地址比较部件154以外,还包括设定步长地址寄存器151和乘算部件152。设定步长地址寄存器151被用于保存用于设定预取开始地址的粒度,作为步长值。例如,如果正如其中预取开始位置被设立在缓存行的开头(字节0)、字节32、字节64 和字节96处的前述示例那样,步长值被设定为32字节,则值“32”被保存在设定步长地址寄存器151中。乘算部件152被用于将指令预取定时字段312中的值与在设定步长地址寄存器 151中保存的步长值相乘。因为如上所述指令预取定时字段312为2比特宽,所以该字段用其中保存的步长计数乘以由设定步长地址寄存器151指示的步长值补充。因此,在指令头 310的指令预取定时字段312中,“00”被设定以表示缓存行的开头(字节0),“01”表示字节32、“10”表示字节64并且“11”表示字节96。乘算部件152的乘算的结果被保存在预取开始地址设定寄存器153中。此配置的其余配置与图14A中的那些相同。地址比较部件巧4将预取开始地址设定寄存器153中保存的地址与程序计数器111的内容进行比较。当检测到有关缓存行中的相对地址的匹配时,地址比较部件巧4发出下一行预取请求。为了辅助乘算部件152的乘算或地址比较部件154的地址比较,步长值应优选为 2的η次幂,“η”是整数。根据上述配置示例,通过使用指令头310中的指令预取定时字段312,预取开始地址可以被设定给预取开始地址设定寄存器153。[预定指令计数被用于预取定时的情况]图16是示出对于第二实施例的涉及预定指令执行次数用作预取定时的配置示例的示意图。在上述图14Α、14Β和15的配置示例中,缓存行中的固定位置被设立用作预取定时。在此配置示例中,相对照地,预取定时在特定类型的指令已经被执行了预定次数时被识别出。此配置包括构成下一行预取部件150的部分的指令类型设定寄存器155、执行次数设定寄存器156、指令类型比较部件157、执行次数计数器158和执行次数比较部件159。指令类型设定寄存器155被用于设定要计算其执行次数的指令的类型。可应用的指令类型可以包括诸如除算指令和加载指令之类的具有相对长潜伏期的指令,以及分支指令。这里可以设定长潜伏期型指令,是因为即使随后的指令或多或少被延迟,整个指令执行也基本上不受影响。还可以设定分支型指令,是因为存在如上面参考图13所说明的分支指令可以优选被等待以便确定随后的指令的情况。执行次数设定寄存器156被用于设定与在指令类型设定寄存器155中设定的指令类型相对应的指令的执行次数。当相应指令被执行了在执行次数设定寄存器156中设定的次数时,执行次数设定寄存器156发出下一行预取请求。指令类型和执行次数可以在编译时段静态地确定,或者在执行时段根据在简档数据中包括的指令出现频率而被动态地确定。
指令类型比较部件157将在指令寄存器112中保存的指令的类型与在指令类型设定寄存器155中设定的指令类型进行比较以确定匹配。每当检测到匹配时,指令类型比较部件157向执行次数计数器158输出计数触发。执行次数计数器158计算与在指令类型设定寄存器155中设定的指令类型相应的指令的执行次数。执行次数计数器158包括加算部件1581和计数值寄存器1582。加算部件1581向计数值寄存器1582中的计数值加“1”。计数值寄存器1582是用于保存执行次数计数器158的计数值的寄存器。每当指令类型比较部件157输出计数触发时,计数值寄存器1582就将加算部件1581的输出保存。执行次数是按照这样的方式计算出的。执行次数比较部件159将计数值寄存器1582中的值与执行次数设定寄存器156 中的值进行比较以确定匹配。当检测到匹配时,执行次数比较部件159发出下一行预取请求。可以提供多对指令类型设定寄存器155和执行次数设定寄存器156。在此情况中, 有必要单独地提供执行次数计数器158。当与这些对中的任意一对的匹配被检测到时,下一行预取请求被发出。[指令头的使用]图17是示出对于第二实施例的如何在指令头310中一般地设定指令类型和执行次数的示意图。在图16的配置示例中,指令类型和执行次数被示出为分别设定在指令类型设定寄存器1 和执行次数设定寄存器156中。替代地,这些值可以改为被设定在指令头 310 中。在图17的示例中,指令类型被设定在指令头310中从比特12到比特25的14比特区域318中,并且执行次数被设定在从比特沈到比特31的6比特区域319中。因此,如果区域318被发送到指令类型比较部件157的一个输入并且区域319的值被提供到执行次数比较部件159的一个输入,则能够将预定指令执行次数用作预取定时。[指令执行处理]图18是示出第二实施例执行指令所用的一般功能结构的示意图。此示例包括程序执行状态生成部件510、检测状态设定部件520、指令预取定时检测部件530、指令预取部件570和指令执行部件590。程序执行状态生成部件510生成当前程序的执行状态。例如,程序执行状态生成部件510可以生成保存当前正执行的指令的地址的程序计数器111的值作为当前程序的执行状态。作为另一示例,程序执行状态生成部件510可以生成在执行次数计数器158中保存的预定执行类型的当前执行次数。检测状态设定部件520设定要检测其指令预取定时的程序的执行状态。例如,作为此程序执行状态,检测状态设定部件520可以设定预取开始地址设定寄存器153中的要检测其指令预取定时的指令的地址的至少一部分。作为另一示例,检测状态设定部件520 可以设定执行次数设定寄存器156中的预定指令类型的执行次数。指令预取定时检测部件530将当前程序的执行状态与检测状态设定部件520中设定的程序执行状态进行比较以确定匹配。在通过比较而确定两个状态之间匹配的情况中, 指令预取定时检测部件530检测到指令预取定时。地址比较部件IM或执行次数比较部件 159可以被用作指令预取定时检测部件530。
指令预取部件570在指令预取定时检测部件530检测到指令预取定时时执行下一行的指令预取。指令执行部件590执行由指令预取部件570获得的指令。指令执行部件590的执行结果影响由程序执行状态生成部件510生成的当前程序的执行状态。也就是说,程序计数器111中的值和执行次数计数器158中的值可以被更新。图19是示出第二实施例执行指令所用的一般过程的流程图。首先,在检测状态设定部件520中设定要检测其指令预取定时的程序的执行状态 (在步骤S931中)。例如,在检测状态设定部件520中设定要检测其指令预取定时的指令的地址或者预定指令类型的执行次数。指令执行部件590然后执行指令(在步骤S932中)。指令预取定时检测部件530 检测指令预取定时(在步骤S933中)。例如,如果一组指令地址与程序计数器111上的值匹配或者如果预定指令类型的执行次数与执行次数计数器158上的值一致,则指令预取定时检测部件530检测到指令预取定时。当通过指令预取定时检测部件530检测到指令预取定时时,指令预取部件570执行指令预取(在步骤S934中)。如上所述,根据本发明的第二实施例,能够预设用于指令预取的定时以便控制指令预取定时。<3.第三实施例〉上面描述的第一和第二实施例被示出用于处理对是否阻止下一行预取的控制。下面要描述的本发明的第三实施例以及稍后描述的第四实施例将在假设下一行和分支目的地行都被预取的情况下进行操作。第三实施例的管线结构和块结构与第一实施例的那些相同,因此将不对它们进一步说明。[程序计数器的加算控制处理]图20是示出结合本发明第三实施例的用于加算控制处理的程序计数器的一般功能结构的示意图。此功能结构示例包括指令获取部件610、指令解码部件620、指令执行部件630、加算控制寄存器640、加算控制部件650和程序计数器660。指令获取部件610根据程序计数器660上的值获取作为执行目标的指令。指令获取部件610对应于指令获取阶段11。由指令获取部件610获取的指令被提供到指令解码部件 620。指令解码部件620对由指令获取部件610获取的指令进行解码。指令解码部件 620对应于指令解码阶段21。指令执行部件630执行已被指令解码部件620解码的指令。指令执行部件630对应于指令执行阶段41。有关所涉及的运算元访问的细节将不在下面讨论。加算控制寄存器640保存供在程序计数器660的加算控制中使用的数据。加算控制寄存器640 —般是如何构建的将稍后说明。加算控制部件650基于在加算控制寄存器640中保存的数据对程序计数器660执行加算控制。程序计数器660对作为执行目标的指令的地址进行计数。所以,程序计数器660 对应于程序计数器(PC) 18。程序计数器660包括程序计数器值保存部件661和加算部件 662。程序计数器值保存部件661是保存程序计数器的值的寄存器。加算部件662将程序计数器值保存部件661中的值递增。图21是示出对于第三实施例的加算控制寄存器640的一般结构的示意图。加算控制寄存器640保存增量字数(inCr)641和增量次数(Conti)642。增量字数641被用于保存当程序计数器值保存部件661的值被增大时使用的增量字数。第三实施例预先假定每个为32比特G字节)的指令的指令集,从而使得一个字为4 字节长。如果程序计数器660被假定通过省略地址的低2比特来以字为单位保存地址,则每次加算时一般加上增量值“1”。相对地,对于第三实施例,增量字数641的值作为增量被加算。如果“1”被设定给增量字数641,则以普通方式执行运算。如果整数“2”或更大值被设定,则可以在间拔(thin out)出一些指令的同时执行运算。此操作的具体示例将在稍后讨论。顺便提及,增量字数641是在所附权利要求中描述的增量值寄存器的示例。增量次数642被用于保存加算部件662根据增量字数641执行的加算的次数。在普通设置中,一般加上增量值“ 1 ”。如果整数“ 1,,或更大值被设定给增量次数642,则根据增量字数641来执行加算。替代地,计算部件(未示出)可以在每次指令被执行时从增量次数642中减去“1”,直到增量次数642变为“0”为止。作为另一替代,可以提供单独的计数器,此计数器在每次指令被执行时被递减1,直到此计数器的值变为“0”。在任何情况中, 在根据增量字数641执行的加算执行了由增量次数642指定的次数之后,利用增量值“1” 的通常加算被复原。顺便提及,增量次数642对应于在所附权利要求中描述的改变指定寄存器的示例。[如何执行指令]图22是示出第三实施例如何通过两路分支来处理指令的示意图。如果参考字符A 被假定用于表示用于两路分支的分支指令的地址,则不经历分支的指令序列可以被配置为具有以1+4”、1+12”、1+20”、1+28”、1+36”、1+44”、1+52”、1+60”等的顺序排序的指令。另一方面,经历分支的指令序列可以被配置为具有以“A+8”、“A+16”、“A+M”、“A+32”、 “A+40”、“A+48”、“A+56”、“A+64”等的顺序排序的指令。也就是说,不经历分支的指令序列和经历分支的指令序列被彼此交替地配置。在上面的两路分支的情况中,当两个指令序列的每个的开头指令被执行时,“2”被设定给增量字数641,并且每个指令序列中的指令数被设定给增量次数642。此配置使得能够仅执行彼此交替的两个指令序列中的一个指令序列。图23是示出第三实施例如何通过多路分支来处理指令的示意图。虽然在图23中所示的技术是针对三路分支的示例,但是相同的技术也可以应用到四路或更多路分支的情况。如果参考字符A被假定用于表示用于三路分支的分支指令的地址,则第一指令序列可被配置为具有以 “A+4”、“A+16 ”、"A+28 ”、"A+40 ”、"A+52 ”、"A+64”、"A+76 ” 等的顺序排序的指令。第二指令序列可被配置为具有以“A+8”、“A+20”、“A+32”、“A+44”、“A+56”、“A+68”、 “A+80”等的顺序排序的指令。第三指令序列可被配置为具有以“A+12”、“A+M”、“A+36”、 “A+48”、“A+60”、“A+72”、“A+84”等的顺序排序的指令。也就是说第一到第三指令序列构成三个错排的指令的序列,这些错排的指令的一个指令与另一个指令被错开。在以上三路分支的情况中,当每个指令序列的开头指令被执行时,“3”被设定给增量字数641并且每个指令序列中的指令数被设定给增量次数642。该配置使得可以执行错排的指令的指令序列中的仅一个指令序列,这些错排的指令的一个指令与另一个指令被错
18开。[加算控制寄存器中的设定]图24A、24B、24C和24D是示出对于第三实施例的用于设定对于加算控制寄存器 640的值的一般指令集的示意图。图24A示出第三实施例使用的一般指令格式。此指令格式包括6比特操作码(OPCODE)、5比特第一源运算元(rs)、5比特第二源运算元(rt)、5比特目的地运算元(rd)和11比特即值字段(imm)。图24B示出第三实施例使用的一般操作码的表。此操作码的高3比特被示为在垂直方向并且其低3比特在表的水平方向被指示。在下面的说明中,将着重强调在操作码的右下部分示出的条件分支指令和具有操作码“100111”的控制寄存器改变指令。图24C示出条件分支指令的一般指令格式。此种类型的一般条件分支指令有表中示出的 BEQfp、BNEfp、BLEfp、BGTZfp、BLTZfp、BGEZfp、BTLZALfp 和 BGEZALfp。参考字符 B 表示“分支”;B后跟随EQ表示“相等”,两个源运算元的值是否相等的分支条件(rs = rt) ;B 后跟随NE表示“不相等”,两个源运算元的值是否不相等的分支条件(rs兴rt) ;B后跟随LE 表示“小于或等于”,第一源运算元是否小于或等于第二源运算元的分支条件(rsSrt) ;B 后跟随GTZ表示“大于零”,第一源运算元是否大于零的分支条件(rs > 0) ;B后跟随LTZ表示“小于零”,第一源运算元是否小于零的分支条件(rs < 0) ;B后跟随GEZ表示“大于或等于零”,第一源运算元是否大于或等于零的分支条件(rs彡0) ;BLTZ和BGEZ后跟随AL表示 “分支并链接”,保留分支时的返回地址的操作;以及这些缩写中的每个后跟随“fp”表示“浮点数”,指示两个源运算元的值都为浮点数。被给出作为目的地运算元的增量字数“incr” 是用于增大程序计数器660的值的增量字数。被给出作为即值字段的增量次数“conti”表示程序计数器660根据增量字数“incr”执行加算的次数。当条件分支指令被执行时,增量字数“ incr"被设定给加算控制寄存器640中的增量字数641,并且增量次数“conti ”被设定给增量次数642。图24D示出控制寄存器改变指令PCINCM0DE的一般指令格式。控制寄存器改变指令PCINCM0DE是将程序计数器660的增量模式设定给加算控制寄存器640的指令。执行控制寄存器改变指令PCINCM0DE将增量字数“incr”设定给加算控制寄存器640中的增量字数641,并且将增量次数“conti”设定给增量次数642。控制寄存器改变指令PCINCM0DE是与条件分支指令不同的指令。实践中,控制寄存器改变指令PCINCM0DE结合条件分支指令来被使用。图25是示出对于第三实施例的条件分支指令如何向加算控制寄存器640设定值的示意图。在此示例中,条件分支指令BEQfp具有这里指定的分支条件“rs = rt”、增量字数“2”以及增量次数“L/2”。假定条件分支指令BEQfp的指令字地址由“m”表示。基于此假定,如果分支条件“rs = rt”满足,则基于增量字数“2”,指令“m+2”、“m+4”、“m+6”...直到“M+L”以此顺序被执行。另一方面,如果分支条件“rs = rt”不满足,则基于增量字数 “2,,,指令“111+1”、“111+3”、“111+5” · · ·直到"M+(L-I),,以此顺序被执行。图沈是示出对于第三实施例的控制寄存器改变指令PCINCM0DE如何为加算控制寄存器640设定值的示意图。在此示例中,控制寄存器改变指令PCINCM0DE紧跟在不对加算控制寄存器640进行设定的普通条件分支指令后。控制寄存器改变指令PCINCM0DE被示出为具有这里指定的增量字数“2”和增量次数“L/2”。这里同样假定控制寄存器改变指令PCINCM0DE的指令字地址由“m”表示。基于此假定,如果条件分支指令的分支条件满足,则基于增量字数巧”,指令“!!^”、“!!^”、“!!^”...直到“M+L”以此顺序被执行。另一方面,如果条件分支指令的分支条件不满足,则基于增量字数“2”,指令“m+l”、“m+3”、“m+5”...直到“M+(L-I) ”以此顺序被执行。[指令执行处理]图27是示出第三实施例执行指令所用的一般过程的流程图。这里假定已经预先使用上述条件分支指令和控制寄存器改变指令等完成了对加算控制寄存器640的增量字数和增量次数的设置。如果加算控制寄存器640中的增量次数642大于零(在步骤S941中),则由程序计数器660将增量字数641乘以“4”获得的值被加算部件662加到程序计数器值保存部件 661 (在步骤S942中)。在此情况中,加算控制寄存器640中的增量次数642被减小“ 1 ”(在步骤S943中)。如果加算控制寄存器640中的增量次数642不大于零(在步骤S941中), 则程序计数器660上的值如常那样被加算部件662加到程序计数器值保存部件661 (在步骤S944中)。上述步骤被重复。顺便提及,步骤S942是在所附权利要求中描述的改变增量加算步骤的示例并且步骤S944是普通增量加算步骤。根据本发明的第三实施例,如上所述,通过以指令为单位以混合方式布置分支后的多个指令序列并且通过根据分支条件控制对程序计数器的加算来执行适当的指令序列的指令。这使得能够以适当混合的方式布置下一行和分支目的地行,从而均化在指令预取操作中涉及的不利。<4.第四实施例〉[处理器的结构]图观是示出本发明的第四实施例的处理器构成部分的一般管线结构的示意图。 第四实施例的基本管线结构被假定包括与上面说明的第一实施例相同的五个管线阶段。然而,上述第一实施例被示为由下一行预取部件13执行下一行预取,而第四实施例使得下一行分支目的地行预取部件14来预取下一行和分支目的地行。也就是说,所要预取的不仅仅有下一行,即包含作为当前执行目标的指令的缓存行接下来的缓存行,而且还有分支目的地行,即包括分支目的地指令的缓存行。由下一行分支目的地行预取部件14预取出的分支目的地行被保存在预取队列17中。在预取队列17中保存的分支目的地行被提供到指令解码阶段(ID)21。因为下一行是直接从指令缓存器馈送的,所以预取队列17不必对下一行处理。图四是示出第四实施例的处理器构成部分的一般块结构的示意图。第四实施例的基本块结构与上面说明的第一实施例的相同。然而,上述第一实施例被示为由下一行预取部件150预取下一行,而第四实施例使得下一行分支目的地行预取部件250预取下一行和分支目的地行。此外,预取队列171 与指令缓存器120并置,从而分支目的地行可以直接从预取队列171被馈送到指令寄存器 112。也就是说,如果发生分支,来自预取队列171的指令被提供而旁路了即将从指令缓存器120馈送的指令。此配置使得指令被连续发出而不会迟延管线。顺便提及,下一行分支目的地行预取部件250是在所附权利要求中所述的预取部件的示例,并且预取队列171是预取队列的示例。
因为对于第四实施例无需强制将指令分割成指令分组,因此这样的装置被从本块结构中排除。此外,基于对指令辞典表的参考的压缩对于第四实施例也是不是强制性的,所以这样的装置也从本块结构中排除。这些装置可以按需结合实施。[分支指令和缓存行之间的关系]图30是示出对于第四实施例的分支指令和缓存行之间的一般关系的示意图。包含作为当前执行目标的指令的缓存行被称为当前行,并且紧跟在当前行后的缓存行被称为下一行。包含被包括在当前行中的分支指令的分支目的地指令的缓存行被称为分支目的地行。在本示例中,分支指令被置于当前行的末端。此布置意在使得下一行和分支目的地行在当前行的开头指令被执行时被预取,从而使得这两行都在分支指令被执行前被预取。因此,可以不必要将分支指令布置在当前行的末端。如果位于至少当前行的后一半中,在一些情况中,对于要完成的预取可及时达到分支指令。如果分支指令被布置在当前行的末端并且如果不满足分支指令的分支条件并因此而不发生分支,则需要下一行。如果满足分支条件并因此而发生分支,则需要分支目的地行。因此,为了无论分支条件是否满足都成功地执行预取,优选预取下一行和分支目的地行二者。第四实施例使得下一行分支目的地行预取部件250预取这二两行,从而独立于分支条件是否满足来连续地执行指令。在本情况中,为了预取这两行,吞吐量最好优选是通常设置的二倍,但是这并不是强制性的。对于指令缓存器120中的缓存行的冲突,优选对分支目的地行的设置施加约束。 例如在指令缓存器120按直接映射原理操作时,如果试图同时缓存具有相同行地址的缓存行,则它们会彼此冲突。在本情况中,如果预取的下一行后紧跟随预取的具有相同行地址的分支目的地行,则下一行被从指令缓存器120驱出。在实行两路设置关联原理的情况中,这样的冲突的可能被降低。尽管如此,依赖于缓存状态,所预取的分支目的地行可能影响其他缓存行。因此,对于第四实施例,指令缓存器被假定按照作为最严厉的条件的直接映射原理而操作。分支目的地行的布置然后通过编译器或通过链接器按照下一行和分支目的地行将不具有相同行地址的方式而被调整。在指令地址的布置将通过编译器或链接器被改变的情况中,下面说明的技术可以用作示例。这里假定下面所示的指令序列,其中,“Ox”后的数是十六进制数。0x0000:指令 A0x0004:指令 B0x0008:指令 C如果上述指令序列的指令布置被希望向后偏移4字节,则可以如下向序列插入 NOP (不操作)指令0x0000 :Ν0Ρ 指令0x0004:指令 A0x0008:指令 BOxOOOC:指令 C如果指令A是使得多个操作在执行时被执行的指令,则指令A可以被分割成如下所示的指令AA和指令AB。此配置也可以将上述指令序列的指令配置向后偏移4字节。0x0000:指令 AA
0x0004:指令 AB0x0008:指令 BOxOOOC 指令 C图31A和31B是示出第四实施例如何一般地改变指令的布置的示意图。如图31A 中所示,考虑这样的程序,其中,指令序列A和B之后是分支指令C,分支指令C分支到指令序列D或指令序列E以进行处理,之后是指令序列F的处理。在本情况中,如果指令序列B 的结果不影响分支指令C的分支条件,则分支指令C可以移动到指令序列A的紧后,指令序列B被布置在分支目的地处,如在图31B中所示。按照这种方式,可以在不影响执行结果的情况下改变指令的布置。[指令布置处理]图32是示出第四实施例布置指令所用的一般功能结构的示意图。本功能结构示例预先假定目标码(object code)是从在程序保存部件701中保存的程序生成的,并且所生成的目标码被保存在目标码保存部件702中。本结构示例包括分支指令提取部件710、分支指令布置部件720、分支目的地指令布置部件730和目标码生成部件740。分支指令提取部件710从在程序保存部件701中保存的程序中提取分支指令。分支指令提取部件710获取程序中的提取的分支指令的地址并且将此地址提供给分支指令布置部件720。此外,分支指令提取部件710获取提取的分支指令的分支目的地地址并且将此分支目的地地址馈送给分支目的地指令布置部件730。分支指令布置部件720将由分支指令提取部件710提取的分支指令布置到缓存行 (当前行)的后半部分。分支指令被布置到缓存行的后半部分,以使得在达到分支指令之前完成预取,如上所述。从此观点来看,最好将分支指令布置在缓存行的末端。分支目的地指令布置部件730将由分支指令提取部件710提取的分支指令的分支目的地指令布置到具有与下一缓存行(下一行)不同行地址的另一缓存行(分支目的地行)。下一行和分支目的地行被布置到具有不同行地址的不同缓存行使得避免了指令缓存器120中的冲突,如上所述。目标码生成部件740从包含由分支指令布置部件720和分支目的地指令布置部件 730布置于其中的分支指令和分支目的地指令的指令序列生成目标码。由目标码生成部件 740生成的目标码被保存在目标码保存部件702中。顺便提及,目标码生成部件740是在所附权利要求中所述的指令序列输出部件。图33是示出第四实施例布置指令所用的一般过程的流程图。首先,分支指令提取部件710从在程序保存部件701中保存的程序提取分支指令 (在步骤S951中)。由分支指令提取部件710提取的分支指令被分支指令布置部件720布置到缓存行(当前行)的后半部分(在步骤S952中)。由分支指令提取部件710提取的分支指令的分支目的地指令被分支目的地指令布置部件730布置到具有与下一缓存行(下一行)不同的行地址的另一缓存行(分支目的地行)(在步骤S953中)。目标码生成部件 740然后从包含由分支指令布置部件720和分支目的地指令布置部件730布置于其中的分支指令和分支目的地指令的指令序列生成目标码(在步骤S%4中)。顺便提及,步骤S951是分支指令提取步骤的示例;步骤S952是分支指令布置步骤的示例;步骤S953是分支目的地指令布置步骤的示例;以及步骤S%4是指令序列输出步
22骤的示例,所有步骤都在所述权利要求中描述。[预取地址的设定]图34A和34B是示出第四实施例如何一般地设定预取地址寄存器的示意图。如上所讨论的,分支目的地行被布置到与下一行不同的行地址。然而,分支目的地行可以按照永久固定的方式使用相对于当前行的位置被预取,替代地,分支目的地地址可以按照自动的方式在每当发生分支时被设定,如下所述。图34A示出了预取地址寄存器(PRADDR) 790的一般结构。预取地址寄存器790被用于设定预取分支目的地行从其被预取给指令缓存器120的那个预取地址。预取地址被保存在预取地址寄存器790的低12比特中。图34B示出了用于设定预取地址寄存器(PRADDR) 790的设定值的MTSI_ PRADDR(移动到特殊寄存器即值-PRADDR)指令的指令格式。MTSI_PRADDR指令是一种特殊的指令并且被用于设定对于特殊寄存器(在本情况中为预取地址寄存器790)的值。本指令的比特17-21表示预取地址寄存器PRADDR。本指令的比特11_8被设定为预取地址寄存器 790的比特11-8。这些设置建立起要被预取的分支目的地行的地址。假定指令缓存器120 是以两路设定关联原理操作并且提供总共16个行(每路8个行)用于构建256字节的条目大小的4K字节缓存器。作为另一示例,可以借助上面结合第一实施例说明的分割成指令分组300并且利用指令头310的预取设定字段315。在本情况中,图4的指令头310中从比特11到比特8 的预取设定字段315被设定为预取地址寄存器中的比特11到比特8。这使得能够在无需借助特殊指令的情况下设定作为预取目标的分支目的地行的地址。[指令执行处理]图35是示出第四实施例执行指令所用的一般功能结构的示意图。本结构预先假定行基于程序计数器111的检测状态被预取到指令缓存器120和预取队列171。本结构示例包括指令预取定时检测部件750、下一行预取部件760、分支目的地行预取部件770。这些组件对应于块结构中的下一行分支目的地行预取部件250。指令预取定时检测部件750通过参考程序计数器111的状态来检测指令预取定时。对于第四实施例,优选在较早阶段开始预取以便按照两路预取下一行和分支目的地行。 因此,指令预取定时可以在缓存行的开头指令开始要被执行时被检测。下一行预取部件760预取下一行。从系统存储器140预取的下一行被存储到指令缓存器120。分支目的地行预取部件770预取分支目的地行。处于相对于当前行的固定位置处的缓存行可以用作分支目的地行。替代地,可以使用在上述预取地址寄存器790中设定的地址。从系统存储器140预取的分支目的地行被存储到指令缓存器120和预取队列171。图36是示出第四实施例执行指令所用的一般过程的流程图。首先,指令预取定时检测部件750检测缓存行的开头指令要开始被执行(在步骤 S961中)。然后,下一行预取部件760预取下一行(在步骤S962中)。分支目的地行预取部件770预取分支目的地行(在步骤S963中)。这些步骤被重复,从而下一行和分支目的地行的指令序列在两路中被预取。根据本发明的第四实施例,如上所述,分支目的地行被配置为具有与下一行不同
23的行地址,从而使得下一行和分支目的地行的指令序列在两路中被预取。本结构有助于增
强吞吐量。<5.实施例的组合〉前面的段落单独地讨论了本发明的第一到第四实施例。替代地,这些实施例可以按照各种组合来实施。[将第一实施例与第二实施例组合]第一实施例被示为根据在指令头310中的分支预测标志311来判断是否执行预取。为了避免判断中的失败预测,第一实施例可以有效地与第二实施例组合。也就是说,第二实施例被用于延迟对于预取的判断,从而预先明确地判断分支的存在与否,从而正确的缓存行被预取。[将第一或第二实施例与第三实施例组合]第三实施例在两路中执行预取。这意味着难以将第三实施例应用到某些情况,例如,分支指令具有利用较远地址的分支目的地的情况以及“ if”语句没有“else”子句的情况。例如,如果多向分支的所有情况不具有相同的指令数,则需要插入NOP指令,直到指令的数目变得对于所有情况都相同为止。在相对较长指令序列的情况中,指令执行的吞吐量和使用缓存器的效率趋于降低。作为针对这些困难的对策,第一实施例的分支预测标志311 可用于在发现分支到较远地址的可能性较高的情况下阻止两路预取。本配置消除了第三实施例的缺点。第三实施例的缺点还通过使用第二实施例而被避免,第二实施例将指令预取定时延迟以使得可以预先明确判定分支存在与否,从而不必要的预取被阻止。[将第一或第二实施例与第四实施例组合]第四实施例被示为总是预取下一行和分支目的地行。本结构遭受如果当前行不包含分支指令则不必要预取分支目的地行的缺点。因此,第一实施例的分支预测标志311被用于确定执行下一行的可能性。如果基于分支预测标志311发现执行下一行的可能性很高,则只预取下一行。本配置避免了第四实施例的缺点。第四实施例的缺点还可以使用第二实施例而被避免,第二实施例将指令预取定时延迟以使得可以预先明确判定分支存在与否,从而不必要的预取被阻止。[将第三实施例与第四实施例组合]第四实施例被示为在两路中预取下一行和分支目的地行。在第三实施例也以组合被使用的情况中,能够在三路或更多路中执行多向分支。也就是说,通过在两路中对其中多个指令序列共存的缓存行进行预取,能够执行多向分支。在上述组合中,第三实施例可被应用到具有有限分支范围(例如有限的行大小范围)的情况中,而第四实施例可被用于处理更广泛的分支。第三和第四实施例的选择性实施可以避免二者的缺点。也就是说,第四实施例具有总是在保持执行吞吐量没有减少的情况下以一半效率来使用指令缓存器的缺点。第三实施例具有在被应用到广泛分支的情况时效果不大的缺点。这两个实施例因此可以被组合来消除它们的缺点。[其他组合]还可以实施上述实施例组合以外的实施例组合来增强单个实施例的效果。例如, 第一或第二实施例与第三实施例和第四实施例的组合加强了所涉及的实施例的效果。上述实施例及其变形例仅仅是其中可以实施本发明的示例。从上述可知,在优选实施例的描述中的实施例及其变形例的细节基本与在所附权利要求中要求的创新性事物对应。同样,在所附权利要求中所称的创新性事物基本对应于在优选实施例的描述中的具有相同名称的事物。然而,本发明的这些实施例及其变形利以及其他示例不对其具有限制意义,而是本领域技术人员应当理解,依赖于设计要求和其他因素,可以发生各种修改、组合、子组合和替代,只要他们在所附权利要求或其等同物的范围内即可。此外,以上作为实施例的部分描述的步骤和处理序列可以被认为是用于执行这些步骤和处理的方法,作为用于使得计算机执行这些方法的程序,或者作为存储这些程序的记录介质。记录介质的示例包括CD (致密盘)、MD (迷你盘),DVD (数字通用盘)、存储卡和蓝光盘(注册商标)。本申请包含与2010年3月四日向日本专利局提交的日本优先专利申请JP 2010-075781中公开的主题有关的主题,该申请的全部内容通过引用被结合于此。
权利要求
1.一种指令获取设备,包括检测状态设定部件,被配置为设定其指令预取定时要被检测的程序的执行状态;程序执行状态生成部件,被配置为生成所述程序的当前执行状态;指令预取定时检测部件,被配置为对所述程序的当前执行状态和其设定执行状态进行比较并在两者匹配的情况下检测所述指令预取定时;和指令预取部件,被配置为当所述指令预取定时被检测到时预取下一指令。
2.根据权利要求1所述的指令预取设备,其中,所述检测状态设定部件包括地址设定寄存器,所述地址设定寄存器被配置为设定其指令预取定时要被检测的指令的地址的至少一部分;所述程序执行状态生成部件包括程序计数器,所述程序计数器被配置为保存当前正在执行的指令的地址作为所述程序的所述当前执行状态;并且所述指令预取定时检测部件包括地址比较部件,所述地址比较部件被配置为对所述程序计数器上的值的至少一部分和所述地址设定寄存器中的值之间进行比较并在两者匹配的情况下检测所述指令预取定时。
3.根据权利要求2所述的指令预取设备,还包括指令分组保存部件,所述指令分组保存部件被配置为保存指令分组,所述指令分组由使得程序指令序列分割成预定大小的指令有效载荷以及包括用于指定下一指令有效载荷的预取定时的预取定时信息的指令头构成;其中,所述检测状态设定部件基于所述预取定时信息来设定所述地址设定寄存器。
4.根据权利要求3所述的指令预取设备,其中,所述检测状态设定部件包括设定步长地址寄存器,所述设定步长地址寄存器被配置为保存指示其指令预取定时要被检测的指令的地址的设定粒度的步长值;和乘算部件,所述乘算部件被配置为通过将在所述预取定时信息中包括的步长计数与所述步长值相乘来设定所述地址设定寄存器。
5.根据权利要求2所述的指令预取设备,还包括指令分组保存部件,所述指令分组保存部件被配置为保存由使得程序指令序列分割成预定大小的指令有效载荷和包括分支预测信息的指令头构成的指令分组,所述分支预测信息指示在所述指令有效载荷中包括的分支指令分支到既不是包括在所述指令有效载荷也不是包括在所述下一指令有效载荷中的指令的可能性程度;其中,所述检测状态设定部件基于所述分支预测信息来设定所述地址设定寄存器。
6.根据权利要求1所述的指令预取设备,其中,所述检测状态设定部件包括执行次数设定寄存器,所述执行次数设定寄存器被配置为将预定指令类型的执行次数设定作为其指令预取定时要被检测的所述程序的所述执行状态;并且所述程序执行状态生成部件生成所述预定指令类型的当前执行次数作为所述程序的所述当前执行状态。
7.根据权利要求6所述的指令预取设备,其中,所述程序执行状态生成部件包括指令类型设定寄存器,被配置为设定所述预定指令类型;指令类型比较部件,被配置为通过在当前正执行的指令的指令类型与所述预定指令类型之间进行比较而检测它们之间的匹配;和执行次数计数器,被配置为使得每当所述指令类型比较部件检测到当前正执行的指令的指令类型与所述预定指令类型之间的匹配时,所述执行次数计数器获取所涉及的指令类型的执行次数。
8.一种处理器,包括检测状态设定部件,被配置为设定其指令预取定时要被检测的程序的执行状态; 程序执行状态生成部件,被配置为生成所述程序的当前执行状态; 指令预取定时检测部件,被配置为对所述程序的当前执行状态和其设定执行状态进行比较并在两者匹配的情况下检测所述指令预取定时;指令预取部件,被配置为当所述指令预取定时被检测到时预取下一指令;和指令执行部件,被配置为执行通过指令预取而获得的指令。
9.一种指令获取设备,包括检测状态设定装置,用于设定其指令预取定时要被检测的程序的执行状态; 程序执行状态生成装置,用于生成所述程序的当前执行状态; 指令预取定时检测装置,用于对所述程序的当前执行状态和其设定执行状态进行比较并在两者匹配的情况下检测所述指令预取定时;以及指令预取装置,用于当所述指令预取定时被检测到时预取下一指令。
全文摘要
本发明公开了指令获取设备和处理器。提供了一种指令获取设备,其包括检测状态设定部件,被配置为设定其指令预取定时要被检测的程序的执行状态;程序执行状态生成部件,被配置为生成程序的当前执行状态;指令预取定时检测部件,被配置为对程序的当前执行状态和其设定执行状态进行比较并在两者匹配的情况下检测指令预取定时;和指令预取部件,被配置为当指令预取定时被检测到时预取下一指令。
文档编号G06F9/38GK102207853SQ20111007332
公开日2011年10月5日 申请日期2011年3月22日 优先权日2010年3月29日
发明者坂口浩章, 小林浩, 山本晴久, 平尾太一, 森田阳介, 甲斐齐, 目次胜彦, 长谷川浩一 申请人:索尼公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1