具有寄存器直接分支并使用指令预加载结构的计算机处理器的制作方法

    专利查询2022-07-08  149


    具有寄存器直接分支并使用指令预加载结构的计算机处理器
    1.本技术是申请号为201680023107.5、名称为“具有用于对存储器寻址的不同寄存器的计算机处理器”的中国发明专利申请的分案申请。
    2.相关申请的交叉引用
    3.本技术要求2015年4月24日提交的美国临时专利申请62/152,313的利益,该临时专利申请的公开通过引用被全部并入本文。
    技术领域
    4.本公开的实施方式涉及计算机处理器,且特别是涉及使用不同寄存器文件对存储器寻址以用于读取和写入数据并用于取出指令的计算机处理器的架构和实现。


    背景技术:

    5.通常,现代指令集架构通过使用通用寄存器作为基址来构建用于读取或写入存储器的地址,并接着可能加上或减去其它寄存器的换算值和/或在指令中指定的立即值以得到最终地址。这个地址然后用于访问存储器。因此,在x86上,mov ax,[1 bx*4 di]指令将乘以4的寄存器bx的内容加到寄存器di的内容,加1,并接着将在那个地址处的存储器的内容加载到寄存器ax内。
    [0006]
    一些较老的架构特殊化寄存器的使用,使得不是所有寄存器都可参与所有类型的地址计算。然而,趋势是使指令集成为正交的,使得特定类型的所有寄存器可在地址计算中互换地使用。
    [0007]
    一些架构——最突出的是摩托罗拉68000——具有单独的寄存器文件(即寄存器组),其主要目的是作为用于地址计算的基址。在摩托罗拉68000中,存在两种主要类型的寄存器:数据和地址。8个数据寄存器用于大部分计算。8个地址寄存器用作用于地址计算的基地址。只有几个其它操作(主要是加、减和比较)可直接在地址寄存器上执行;更复杂的操作需要将值复制到数据寄存器以及将结果复制回。
    [0008]
    在现代处理器中,所产生的地址是虚拟地址;该地址不对应于真实的存储单元。替代地,地址首先经历重映射过程,其中虚拟地址转换成真实地址。存在完成此的很多技术。最常用的技术涉及页面和转换旁视缓冲器(tlb)的使用。
    [0009]
    在分页中,真实地址空间被分成页面;一般有2的某个幂,例如4kb,并在页面尺寸上对准。假设4bk页面,地址0x000到0xfff是页面0,0x1000到0x1fff是页面1,依此类推。每个进程的虚拟地址类似地被划分。每个虚拟页面映射到真实页面。如果虚拟页面4映射到真实页面1,地址0x4000到0x4fff将映射到真实存储器地址0x1000到0x1ffff。
    [0010]
    有用于维持在正执行的进程的虚拟页面和处理器的真实页面之间的完全映射的多种技术。这些映射的子集的高速缓存通常被保持在处理器中。这个高速缓存被称为tlb(或转换旁视缓冲器)。tlb通常被实现为n路关联高速缓存(一般,n=1、2或4),其由虚拟地址的页面号码进行索引。
    [0011]
    在确定了加载/存储地址之后,使用tlb来转换那个虚拟地址。如果地址的页面不
    在tlb中,则需要采取特殊行动。这可涉及在处理器中引发异常,使被称为tlb未命中处理程序的特殊软件被调用,这一般将被访问的虚拟页面的映射带到tlb内。可选地,这个tlb未命中可全部或部分地在硬件中被处理。在任一情况下,在将映射加到tlb之后,重新尝试存储器访问。
    [0012]
    在现代处理器中,在正常操作下,加载或存储将试图查找对应于在数据高速缓存中的那个地址的数据。在处理器中可以有多于一个级别的高速缓存;如果是这样,第一级高速缓存将针对那个地址被探查。如果地址在那里(缓存命中),则值被返回(在加载的情况下)或写入(在存储的情况下)。如果否(缓存未命中),则第二级高速缓存被检查,依此类推,直到真实存储器潜在地被达到为止。处理缓存未命中可使地址被添加到较早的缓存级别,或它可以不被添加——其在实现之间变化。
    [0013]
    如果使用真实地址来探查高速缓存,则高速缓存被称为真实寻址高速缓存。可选地,处理器可选择针对一些高速缓存(通常是第一级高速缓存)使用虚拟地址。在那种情况下,高速缓存被称为虚拟寻址高速缓存。虚拟寻址高速缓存具有不需要执行转换的益处。然而,虚拟寻址高速缓存存在缺点。多个虚拟地址(甚至在同一进程内)可能指同一地址。这被称为虚拟混叠。考虑两个不同的虚拟地址映射到同一真实地址的情况。如果进程使用一个地址来执行存储并接着使用另一虚拟地址读取同一真实地址,且这两个虚拟地址都在高速缓存中,则读取将(错误地)看不到写入。存在校正虚拟混叠的技术,但它们增加复杂性且是昂贵的,所以使用真实地址是优选的。
    [0014]
    乍一看,看起来使用真实寻址高速缓存比虚拟寻址高速缓存慢,因为在访问高速缓存之前地址需要被转换。然而,存在允许转换与查找并行地进行的可用技术。这可隐藏与转换相关的大部分延迟,但以额外的功率和面积为代价。
    [0015]
    在标准von-neumann型架构上的指令执行基于程序计数器(也被称为指令指示器和指令计数器)的思想而被构建。程序执行的模型是处理器加载存储在程序计数器(缩写为pc)中的位置处的存储器中的指令并执行它。作为指令执行的部分,pc被修改。该过程然后重复。
    [0016]
    基于pc如何被修改,可以用很多方式对指令分类。这可包括:
    [0017]
    ·
    下一地址如何被指定
    [0018]
    ·
    指令是否可指定一个或多个可能的接下来的地址
    [0019]
    ·
    预期使用,可能有副作用
    [0020]
    最常见的指令是贯穿(fall-through)指令——新pc将指向存储器中的下一指令。对于具有固定长度指令的架构,例如32位(4字节)risc架构,这可被写为pc《-pc 4。对于具有可变长度指令的架构,程序计数器通常寻址字节,但到下一指令的距离是可变的。我们可以写pc《-pc n,其中n是在当前指令中的字节的数量。
    [0021]
    可将pc设置到下一指令地址以外的值的其它指令被称为分支指令。它们可以用不同的方式被分类。一种是下一地址如何被计算。
    [0022]
    用于设置下一pc值的最直接的方式是使新地址作为指令的部分。这些种类的分支被称为绝对分支。如果a是在指令中指定的地址,则这将被写为:
    [0023]
    pc《-a
    [0024]
    很多较早的架构具有绝对寻址。然而,当存储器尺寸变得更大时,分支的这个形式
    将需要更大的指令。例如,对于4字节地址,分支指令将需要4个字节来指定新pc值。实际上,大部分分支地址相当接近当前地址。所以,更现代的架构使用相对分支;指令指定从指令的pc到待执行的下一指令的偏移或位移。如果d是在指令中指定的位移,则新计算被表达为:
    [0025]
    pc《-pc d
    [0026]
    新pc值的地址的可选源是某个其它寄存器的内容。在寄存器间接分支中,指令指定在架构中的寄存器,且pc被设置到那个寄存器的值。如果r是寄存器且(r)是那个寄存器的内容,则这可被写为:
    [0027]
    pc《-(r)
    [0028]
    还存在存储器间接分支;这些分支计算存储器中的地址,并将pc设置到存储在那个地址处的值。有计算存储器地址的多种方式;例如,数据地址可指定寄存器r和位移d,并使用那些来计算存储器地址。在那个情况下,新pc将被计算为:
    [0029]
    pc《-memory[(r) d]
    [0030]
    显然,存在指定下一pc地址的其它手段,例如寄存器相对间接(其中pc被设置到寄存器的内容加上位移)和链式存储器(存储器间接的形式,其中在加载的存储器中的位指示处理器应使用存储器的内容作为地址,并从那个地址加载以得到下一pc)。
    [0031]
    分支可以是无条件的,其中只有一个可能的目标。
    [0032]
    在条件分支中,通常条件被评估,且基于那个条件,几个可能的地址之一被选取用于存储到pc内。通常,在现代架构上,只有两个可能性,且它们之一是fall-through地址(即下一连续指令)。假设固定的4字节指令宽度,条件相对分支将被写为:
    [0033]
    if(cond)
    [0034]
    pc《-pc d
    [0035]
    else
    [0036]
    pc《-pc 4
    [0037]
    条件分支的一个变形被称为跳过;在这种情况下,两个选择是下一个指令和下下个指令。所以,基于条件,执行或跳过下一个指令,因而产生这个类别的条件分支指令的名称。对于固定的4字节指令架构,跳过将被写为:
    [0038]
    if(cond)
    [0039]
    pc《-pc 8
    [0040]
    else
    [0041]
    pc《-pc 4
    [0042]
    存在更复杂的条件指令,例如在vax-11中的case指令,其可指定多个可能的下一地址,或跳过零、一或两个指令的在ibm 704上的cas。
    [0043]
    条件分支可基于条件如何在指令中被指定而分成两个类别。在检验和分支类型的指令中,分支指令检查寄存器的几个位(通常一个或两个位)并基于那个结果来形成分支。通常,位将来自条件代码或标志寄存器,其存储某个前一操作——通常是比较——的状态。因此在x86上,为了比较两个值且如果它们是相等的则形成分支,将被使用的指令序列是:
    [0044]
    cmp ecx,edx;这两个值存储在ecx和edx寄存器中
    [0045]
    je li
    [0046]
    l0:;fall-through,不是相等的情况
    [0047]

    [0048]
    li:;相等的情况
    [0049]

    [0050]
    可选地,在比较和分支指令中,比较被指定为分支指令的部分。在mips架构上的等效代码序列将被写为:
    [0051]
    beq$t0,$tl,ll;这两个值存储在$t0和tl中
    [0052]
    l0:;fall-through,不是相等的情况
    [0053]

    [0054]
    li:;相等的情况
    [0055]

    [0056]
    在分支指令的这两个形式之间的折衷是指定分支所需的位的数量。在第一情况下,指令集使用少量位来指定待检查的位,且在指令中的其余位可用于指定下一地址的位移或其它源。在第二情况下,指令必须指定比较操作的细节,这通常需要较大数量的位。
    [0057]
    在程序中的分支的主要源是子例程调用和返回。通常,指令集包括对这些种类的分支的专门支持。该支持也许是相当精细的。在vax-11上,callg/calls/ret指令完成建立和拆除帧所需的所有动作,包括建立堆栈和帧寄存器以及在callg/calls之后保存和返回到指令。
    [0058]
    最低限度地,在现代架构上,调用指令将在调用和分支到子例程之后保存指令的地址。返回地址可保存在存储器中(在堆栈上)、在专用寄存器(通常被称为链路寄存器)中或在由调用指令指定的更通用的寄存器中。返回指令分支到那个保存的地址。如果地址存储在通用寄存器中且架构具有可通过那些寄存器来形成分支的分支间接指令,则可能在架构中没有专门的返回指令,返回使用正常分支间接指令来执行。
    [0059]
    处理器取出一系列指令。当分支指令被取出时,处理器必须确定要取出的下一地址。如果处理器等待直到分支被评估为止,且关于分支目标的所有细节是已知的,则它可以是几个周期以后。因此,高性能处理器试图猜测分支的下一目标将是什么。这被称为分支预测。
    [0060]
    对于条件分支,分支预测的一部分确定分支是否被采用或fall-through。有很多已知的技术:最新技术——具有历史的2位预测器——可达到非常高的准确率。
    [0061]
    对于所采用的条件分支以及对于无条件分支,处理器必须也预测或计算下一地址。这更复杂。对于具有位移的分支,计算下一地址涉及将位移(一般10到16位数字)加到当前程序计数器,一般是32或64位值。计算此可将明显的延迟加到下一地址的取出。存在不需要在取出指令之前完成完全加法的技术;然而,它们仍然增加循环时间。
    [0062]
    存在结构,例如下一取出地址高速缓存,其基本上是与指令取出并行地被索引并返回待取出的下一地址的预测的缓存结构。不幸的是,对于实现起来可行的尺寸,它们不是非常准确的。
    [0063]
    专用地址分支地址预测器是用于预测返回的地址的调用堆栈。这基于调用和返回通常被匹配的简单观察。每当遇到调用时,在调用指令之后的地址(即那个调用的返回地址)被推到调用堆栈上。当遇到返回时,在调用堆栈的顶部处的地址被预测为返回的目标,且调用堆栈弹出。
    [0064]
    取出指令还涉及高速缓存查找和转换。用于数据和指令存取的tlb可以是相同的;然而,有单独的指令tlb(itlb)和数据tlb(dtlb)很常见。
    [0065]
    在指令取出和数据取出之间的另一差异是指令通常是不可变的。因此,如果有虚拟混叠并没有多大关系,所以它使得对于指令高速缓存而言虚拟地被寻址更为实际。


    技术实现要素:

    [0066]
    通过提供具有地址寄存器文件的计算机处理器,在本领域中解决上面所述问题并实现技术解决方案。计算机处理器可包括存储器。计算机处理器还可包括通用寄存器文件,其包括至少一个通用寄存器。计算机处理器还可包括地址寄存器文件,其包括至少一个地址寄存器。计算机处理器还包括用于存取存储器、通用寄存器文件和地址寄存器文件的处理逻辑。处理逻辑可执行存储器存取指令,所述存储器存取指令存取在一个或多个相应地址处的在所述存储器中的一个或多个存储单元,其中所述地址是通过取回在所述指令中指定的所述地址寄存器文件的所述至少一个寄存器的地址寄存器的值并加上在所述指令中编码的位移值而计算的。
    [0067]
    在计算机处理器中,存储器存取指令可将一个或多个存储器值从所计算的地址拷贝到计算机处理器中的相应的一个或多个寄存器内。一个或多个寄存器可以是一个或多个通用寄存器。一个或多个寄存器可以是一个或多个地址寄存器。
    [0068]
    在计算机处理器中,存储器存取指令可将一个或多个值从计算机处理器中的相应的一个或多个寄存器拷贝到在所计算的地址处的存储器。一个或多个寄存器可以是一个或多个通用寄存器。一个或多个寄存器可以是一个或多个地址寄存器。
    [0069]
    处理逻辑可以将位移值加到地址寄存器文件的至少一个寄存器以产生所计算的地址。处理逻辑可使用所计算的地址来执行到/从存储器的拷贝。处理逻辑可以用所计算的地址更新地址寄存器文件的至少一个寄存器。
    [0070]
    处理逻辑可读取存储在地址寄存器文件的至少一个寄存器中的地址以产生第一地址。处理逻辑可使用第一地址来存取存储器。处理逻辑可将位移加到第一地址以产生所计算的地址。处理逻辑可以用所计算的地址更新地址寄存器文件的至少一个寄存器。位移值可以是0。
    [0071]
    处理逻辑可处理可将地址寄存器文件的地址寄存器的内容移动到通用寄存器文件的通用寄存器或从通用寄存器文件的通用寄存器移动地址寄存器文件的地址寄存器的内容的指令。处理逻辑可处理可将存储在地址寄存器文件的地址寄存器中的地址值和位移值相加以产生结果值并可将结果值存储在地址寄存器中的指令。处理逻辑可处理将存储在地址寄存器文件的地址寄存器中的地址值和存储在通用寄存器文件的通用寄存器中的值相加以产生结果值并可将结果值存储在地址寄存器中的指令。存储在通用寄存器文件的通用寄存器中的值可在相加之前进行移位。
    [0072]
    处理逻辑可处理从存储在地址寄存器文件的第二地址寄存器中的第二值减去存储在地址寄存器文件的第一地址寄存器中的第一值以产生差值并可将结果值存储在通用寄存器文件的通用寄存器中的指令。存储在通用寄存器中的值可在存储之前进行移位。
    [0073]
    计算机处理器还可包括程序计数器。处理逻辑还可处理将位移加到程序计数器以产生结果值并可将结果值存储在地址寄存器文件的地址寄存器中的指令。处理逻辑还可处
    理可将带符号值加到地址寄存器文件的地址寄存器以产生结果值并可将结果值存储在通用寄存器文件的通用寄存器中的指令。处理逻辑还可处理可将由第二值按比例调整的存储在通用寄存器文件的通用寄存器中的第一值加到地址寄存器文件的地址寄存器以产生结果值并可将结果值存储在通用寄存器中的指令。处理逻辑可处理可比较存储在寄存器地址文件的两个地址寄存器中的地址值的指令。比较的结果可以是确定在第一地址寄存器的值和第二地址寄存器的值之间的确切的排序关系的多个位并可存储在条件标志寄存器中。比较可检验在第一地址寄存器的值和第二地址寄存器的值之间的特定关系并可基于该检验是真还是假来将单个位存储到寄存器内。
    [0074]
    处理逻辑可处理比较地址寄存器文件的两个地址寄存器以产生比较的结果并基于比较的结果来形成分支的指令。
    [0075]
    通过提供具有仅间接分支的计算机处理器,在本领域中解决上面所述的问题并实现技术解决方案。计算机处理器可包括一个或多个目标寄存器。计算机处理器还可包括与一个或多个目标寄存器进行信号通信的处理逻辑。处理逻辑基于存储在一个或多个目标寄存器中的目标寄存器中的值来执行分支指令。分支指令可使用一个或多个目标寄存器来指定由分支指令指定的分支的目的地地址。计算机处理器还可包括与一个或多个目标寄存器和处理逻辑进行信号通信的程序计数器。处理逻辑可处理可将位移值加到由程序计数器指向的当前值以产生地址并可将存储在目标寄存器中的值设置到该地址的指令。将存储在目标寄存器中的值设置到该地址可包括将存储在目标寄存器中的值拷贝到通用寄存器或从通用寄存器拷贝存储在目标寄存器中的值。将存储在目标寄存器中的值设置到该地址可包括将存储在目标寄存器中的值拷贝到存储器或从存储器拷贝存储在目标寄存器中的值。
    [0076]
    处理逻辑可处理无条件地分支到一个或多个目标寄存器中的目标寄存器的指令。处理逻辑可处理确定分支将被采用时的条件的指令。响应于处理逻辑确定分支将被采用,处理逻辑可将控制转移到存储在一个或多个目标寄存器中的目标寄存器中的地址。指令还可指定一个或多个通用寄存器。指令还可指定立即字段。指令还可指定一个或多个浮点寄存器。
    [0077]
    处理逻辑可处理执行被指定为指令的部分的在存储在一个或多个寄存器中的相应寄存器中的两个值之间的比较的指令。响应于处理逻辑确定分支将被采用,处理逻辑可将控制转移到存储在一个或多个目标寄存器中的目标寄存器中的地址。由指令指定的寄存器可以是一个或多个通用寄存器。由指令指定的寄存器可以是一个或多个浮点寄存器。
    [0078]
    处理逻辑可处理执行被指定为指令的部分的在存储在一个或多个通用寄存器中的相应寄存器中的值和被指定为指令中的立即字段的值之间的比较的指令。响应于处理逻辑确定分支将被采用,处理逻辑可将控制转移到存储在一个或多个目标寄存器中的目标寄存器中的地址。
    [0079]
    处理逻辑可处理检查从先前指令的执行产生的状态以确定分支是否将被采用的指令。响应于处理逻辑确定分支将被采用,处理逻辑可将控制转移到存储在一个或多个目标寄存器中的目标寄存器中的地址。状态可包括指定通过先前比较指令的在两个值之间的比较操作的结果的位。状态可包括指定在先前指令的结果和0之间的隐式比较的结果的位。
    [0080]
    处理逻辑可处理执行基于存储在一个或多个目标寄存器中的目标寄存器中的值而形成分支的调用指令的指令,并用返回地址更新一个或多个目标寄存器中的第二目标寄
    存器。
    [0081]
    目标寄存器文件可分成第一组目标寄存器和第二组目标寄存器。第一组目标寄存器可包括分支目标寄存器,而第二组目标寄存器可包括调用返回目标寄存器。
    [0082]
    处理逻辑还可执行调用指令,其中该调用指令基于存储在第二组目标寄存器的分支目标寄存器中的值而形成分支,以及其中处理逻辑用返回地址更新第二组的调用返回目标寄存器。
    [0083]
    处理逻辑还可执行返回指令,其中返回指令指定调用返回目标寄存器,以及其中返回指令无条件地分支到在调用返回目标寄存器中的值。返回指令可以是可使用调用返回寄存器作为分支目标寄存器的唯一分支指令。可以有仅仅一个调用返回目标寄存器。
    [0084]
    通过提供实现虚拟地址的预转换的计算机处理器,在本领域中解决上面所述的问题并实现技术解决方案。计算机处理器可包括寄存器文件,其包括一个或多个寄存器。计算机处理器可包括处理逻辑。处理逻辑可接收要存储在一个或多个寄存器中的寄存器中的值。处理逻辑可在寄存器中存储该值。处理逻辑可将所接收的值指定为虚拟地址。虚拟地址可具有相应的虚拟基本页面号码。处理逻辑可将虚拟基本页面号码转换成相应的真实基本页面号码和对应于与所述虚拟基本页面号码相邻的零个或更多个虚拟页面号码的零个或更多个真实页面号码。处理逻辑可进一步在一个或多个寄存器中的寄存器中存储真实基本页面号码和零个或更多个真实页面号码。
    [0085]
    处理逻辑可接收指定一个或多个寄存器中的至少一个寄存器的指令。处理逻辑可读取在至少一个寄存器中指定的一个或多个输入寄存器值并组合一个或多个寄存器值以产生结果值。处理逻辑可读取存储在一个或多个寄存器中的真实转换信息并组合真实转换信息和一个或多个输入寄存器值以计算到结果值的真实地址的真实转换。
    [0086]
    处理逻辑还可将结果值存储在第二寄存器中。处理逻辑可将结果值和所计算的到真实地址的真实转换存储在第二寄存器中。处理逻辑可将结果值指定为虚拟地址以存取存储器。处理器可使用所计算的到真实地址的真实转换来存取存储器。
    [0087]
    结果值可以是一个或多个输入寄存器值的拷贝,且真实转换信息可以是与输入寄存器相关的转换信息的拷贝。结果值可以是将第二值加到输入寄存器或从输入寄存器减去第二值的结果,且真实转换信息可从与输入寄存器相关的一个或多个真实转换和第二值得到。
    [0088]
    操作可包括寄存器与被指定为一个或多个立即值或为一个或多个寄存器值的一个或多个值的加法或减法。当处理逻辑计算加法或减法时以及当计算位于所转换的真实页面的范围内时,处理逻辑可从所转换的真实页面选择一个页面,并可连接和的页面偏移位与所选择的真实页面。
    [0089]
    当加数/减数是具有小于页面尺寸的绝对值的立即值时,处理逻辑还可在寄存器中存储对应于与存储在一个或多个输入寄存器的值对应的页面的真实地址的三个真实页面。这三个真实页面可对应于与下一较高虚拟页面对应的页面的真实地址、与下一较低虚拟页面对应的页面的真实地址和与基本页面对应的真实地址。处理逻辑可在和被计算之后基于转换是否导致下溢、上溢或指向基本页面来选择三个真实页面之一,且页面偏移可与所选择的页面连接。
    [0090]
    当加数/减数是具有小于页面尺寸的一半的绝对值的立即值时,处理逻辑还可在
    寄存器中存储对应于与存储在一个或多个输入寄存器的值对应的页面的真实地址的两个真实页面。这两个真实页面可对应于与下一较高虚拟页面或下一较低虚拟页面之一对应的页面的真实地址,且真实地址可对应于基本页面,其基于在寄存器中的值是在它的当前页面的上半部分还是它的当前页面的下半部分中来确定。处理逻辑可在和被计算之后基于转换是否导致下溢、上溢或指向基本页面来选择两个真实页面之一,且页面偏移可与所选择的页面连接。
    [0091]
    一个或多个寄存器可以是一个或多个通用寄存器。
    [0092]
    计算机处理器可以不存储所有寄存器的真实转换信息。
    [0093]
    可为所有寄存器的预定子集计算真实转换信息。
    [0094]
    计算机处理器可动态地确定哪些指令或寄存器或指令和寄存器使它们的结果产生真实转换。计算机处理器可使用基于历史的预测来动态地确定哪些指令或寄存器或指令和寄存器用于将虚拟基本页面号码转换成相应的真实基本页面号码和对应于与所述虚拟基本页面号码相邻的零个或更多个虚拟页面号码的零个或更多个真实页面号码。
    [0095]
    一个或多个寄存器可以是一个或多个地址寄存器。
    [0096]
    到具有有效真实转换的一个或多个寄存器中的寄存器的写可发起将数据预取到存储器分级结构的级别内。
    [0097]
    处理逻辑可进一步在一个或多个寄存器中只存储对应于虚拟地址的真实基本页面号码。到一个或多个寄存器中的寄存器的写可触发将数据预取到与寄存器文件相关的寄存器内。
    [0098]
    当处理逻辑不能将虚拟地址映射到寄存器文件中的一个或多个真实地址时,处理逻辑可等待,直到加载或存储指令被执行为止,加载或存储指令使用虚拟地址来引起异常。
    [0099]
    通过提供使用目标寄存器实现虚拟地址的预转换的计算机处理器,在本领域中解决上面所述的问题并实现技术解决方案。计算机处理器可包括寄存器文件,其包括一个或多个寄存器。计算机处理器可包括处理逻辑。处理逻辑可接收要存储在一个或多个寄存器中的寄存器中的值。处理逻辑可在寄存器中存储该值。处理逻辑可将所接收的值指定为虚拟指令地址。虚拟指令地址可具有相应的虚拟基本页面号码。处理逻辑可将虚拟基本页面号码转换成相应的真实基本页面号码和对应于与所述虚拟基本页面号码相邻的零个或更多个虚拟页面号码的零个或更多个真实页面号码。处理逻辑可进一步在一个或多个寄存器中的寄存器中存储真实基本页面号码和零个或更多个真实页面号码。
    [0100]
    处理逻辑可接收指定一个或多个寄存器中的至少一个寄存器的指令。处理逻辑可读取在至少一个寄存器中指定的一个或多个输入寄存器值并组合一个或多个寄存器值以产生结果值。处理逻辑可读取存储在一个或多个寄存器中的真实转换信息并组合真实转换信息和一个或多个输入寄存器值以计算到结果值的真实地址的真实转换。处理逻辑还可将结果值存储在第二寄存器中。处理逻辑可将结果值和所计算的到真实地址的真实转换存储在第二寄存器中。处理逻辑可将结果值指定为虚拟地址以存取存储器。计算机处理器可使用所计算的到真实地址的真实转换来从存储器读取指令。结果值可以是一个或多个输入寄存器值的拷贝,且真实转换信息可以是与输入寄存器相关的转换信息的拷贝。
    [0101]
    结果值可以是将第二值加到输入寄存器或从输入寄存器减去第二值的结果。真实转换信息可从与输入寄存器相关的一个或多个真实转换和第二值得到。
    [0102]
    操作可包括寄存器与被指定为一个或多个立即值或为一个或多个寄存器值的一个或多个值的加法或减法。当处理逻辑计算加法或减法时以及当计算位于所转换的真实页面的范围内时,处理逻辑可从所转换的真实页面选择一个页面,且处理逻辑还可连接和的页面偏移位与所选择的真实页面。
    [0103]
    当加数/减数是具有小于页面尺寸的绝对值的立即值时,处理逻辑还可将在寄存器中存储对应于与存储在一个或多个输入寄存器的值对应的页面的真实地址的三个真实页面。这三个真实页面可对应于与下一较高虚拟页面对应的页面的真实地址、与下一较低虚拟页面对应的页面的真实地址和与基本页面对应的真实地址。处理逻辑可在和被计算之后基于转换是否导致下溢、上溢或指向基本页面来选择三个真实页面之一,且页面偏移可与所选择的页面连接。
    [0104]
    当加数/减数是具有小于页面尺寸的一半的绝对值的立即值时,处理逻辑还可在寄存器中存储对应于与存储在一个或多个输入寄存器的值对应的页面的真实地址的两个真实页面。这两个真实页面可对应于与下一较高虚拟页面或下一较低虚拟页面之一对应的页面的真实地址以及对应于基本页面的真实地址,其基于在寄存器中的值是在它的当前页面的上半部分还是它的当前页面的下半部分中来确定。处理逻辑可在和被计算之后基于转换是否导致下溢、上溢或指向基本页面来选择两个真实页面之一,且页面偏移可与所选择的页面连接。
    [0105]
    一个或多个寄存器可以是一个或多个通用寄存器。
    [0106]
    计算机处理器可以不存储所有寄存器的真实转换信息。可为所有寄存器的预定子集计算真实转换信息。计算机处理器可动态地确定哪些指令或寄存器或指令和寄存器使它们的结果产生真实转换。计算机处理器可使用基于历史的预测来动态地确定哪些指令或寄存器或指令和寄存器用于将虚拟基本页面号码转换成相应的真实基本页面号码和对应于与所述虚拟基本页面号码相邻的零个或更多个虚拟页面号码的零个或更多个真实页面号码。
    [0107]
    一个或多个寄存器可以是一个或多个分支目标寄存器。
    [0108]
    到具有有效真实转换的一个或多个寄存器中的寄存器的写可发起将指令预取到存储器分级结构的级别内。
    [0109]
    处理逻辑可在一个或多个寄存器中只存储对应于虚拟地址的真实基本页面号码。
    [0110]
    到一个或多个寄存器中的寄存器的写可触发将指令预取到与寄存器文件相关的寄存器内。当处理逻辑不能将虚拟地址映射到寄存器文件中的一个或多个真实地址时,处理逻辑可等待,直到分支指令被执行为止,分支指令使用虚拟地址来引起异常。
    [0111]
    通过提供具有寄存器直接分支并使用指令预加载结构的计算机处理器,在本领域中解决上面所述的问题并实现技术解决方案。计算机处理器可包括存储器的分级结构。存储器的分级结构可包括但不限于指令高速缓存、数据高速缓存和第二级高速缓存。存储器的分级结构可包括以具有用于与一个或多个指令对应的一个或多个地址的一个或多个条目的结构组织的第一存储器。一个或多个地址的一个或多个条目可具有起始地址。结构可具有用于存储一个或多个指令的一个或多个单元。计算机处理器还可包括一个或多个相应的指令地址可写到的一个或多个寄存器。计算机处理器还可包括处理逻辑。处理逻辑可包括用于执行比较和/或确定分支是否将被采用的整数计算逻辑。处理逻辑可包括用于比较
    浮点寄存器并比较地址寄存器的分支计算逻辑。处理逻辑可包括分支预测器逻辑以保持一个或多个分支预测条目是最新的。处理逻辑可包括用于通过选择尚未被预取的地址之一来识别待读取的下一组指令的指令预取逻辑。
    [0112]
    响应于处理逻辑将一个或多个指令地址写到一个或多个寄存器,处理逻辑可从存储器的分级结构的第一存储器级别将指令的线性序列的一个或多个指令预取到在起始地址处开始的存储器的分级结构的第二存储器级别内。一个或多个地址中的至少一个地址可以是一个或多个寄存器中的寄存器的内容。
    [0113]
    一个或多个地址中的至少一个地址可以是当前正被处理的指令序列的下一地址。一个或多个地址中的至少一个地址可以是预取的指令的线性序列的最后一个的下一地址。
    [0114]
    一个或多个条目还可包括由分支预测器逻辑为一个或多个指令提供的一个或多个分支预测条目。在线性序列中的一个或多个指令可对应于高速缓存行。一个或多个条目还可包括在存储器的分级结构的第一存储器级别中的所存储的一个或多个指令之后的下一指令的地址。
    [0115]
    分支指令的目标可以是存储在一个或多个相应寄存器中的一个或多个地址。存储在一个或多个相应寄存器中的一个或多个地址可包括正被处理的指令序列的fall-through地址。存储在一个或多个相应寄存器中的一个或多个地址可包括分支指令目标的fall-through地址。一个或多个地址可包括来自调用堆栈的一个或多个地址。调用堆栈被实现为一个或多个条目的指针的堆栈。
    附图说明
    [0116]
    从结合下面的附图考虑的下面呈现的示例性实施方式的详细描述中可更容易理解本发明:
    [0117]
    图1示出使用双向集合相关转换后援总线(tlb)的具有仅基址寻址的架构的转换高速缓存的实现的一个例子。
    [0118]
    图2示出架构的地址转换高速缓存的组织的一个例子,其中位移和页面尺寸是相同的,假设直接映射tlb包含每个虚拟页面的前一、基本和下一页面的映射。
    [0119]
    图3是示出具有内联预加载数据的地址寄存器文件的图。
    [0120]
    图4是示出具有缓冲的预加载数据的地址寄存器文件的图。
    [0121]
    图5是示出目标寄存器预加载结构的图。
    [0122]
    图6是示出具有预加载和寄存器重命名的调用堆栈的图。
    [0123]
    图7是示出分支预测预加载结构的图。
    [0124]
    图8是具有地址寄存器文件的计算机处理器的架构的方框图。
    [0125]
    图9是具有仅间接分支的计算机处理器的架构的方框图。
    [0126]
    图10是具有寄存器直接分支并使用指令预加载结构的计算机处理器的架构的方框图。
    具体实施方式
    [0127]
    地址寄存器
    [0128]
    提出包含地址寄存器的计算机处理器的架构,且所有数据存取都基于地址寄存器
    的内容,可能加上在数据存取(即加载/存储/高速缓存控制)指令中编码的位移。
    [0129]
    转换高速缓存
    [0130]
    这个架构将被写到地址寄存器的任何值视为虚拟数据地址,并将虚拟数据地址转换成真实地址,将虚拟地址值和真实地址值都保持在寄存器中。当数据存取指令例如加载或存储被发送用于执行时,处理器读取与由加载/存储指令使用的地址寄存器对应的真实地址,并随后可使用真实地址来存取存储器,而没有转换延迟。
    [0131]
    例如,假设有8个地址寄存器$a0...$a7。假设指令将0x40c8写到寄存器$a3。在写入过程期间,实现可将地址转换到比如0xl0c8。值0x40c8和0xl0c8都存储在寄存器中。现在假设有使用$a3作为基址的加载,比如ldw$rll,$a3(即,将字从在$a3中的存储器地址加载到寄存器$rl1内)。在那种情况下,真实地址0xl0c8用于存取数据高速缓存,而不需要做任何转换。
    [0132]
    图1示出使用双向集合相关转换后援总线(lbt)100的具有仅基址寻址的架构的转换高速缓存的实现的一个例子。命中字段102是表示页面是否成功地被转换的单个位字段。许可字段104对应于读取/写入和与页面相关的其它许可。
    [0133]
    注意,虚拟地址106和真实地址108的较低位是相同的;确切的数量可取决于页面尺寸。一个实现可选择共享它们。然而,由于两个地址的不同使用,虚拟地址可用于地址算术,而真实地址可用于加载存储,这两个地址保持分离。这将允许实现将虚拟地址106和转换高速缓存位(命中、许可、真实地址)物理地放置在不同的地方中。
    [0134]
    在上面所示的tlb 100中,只有虚拟页面地址用作tlb 100的标签。这仅仅为了简化例子;在实际实践中,将有其它数据作为标签的部分,例如进程id。
    [0135]
    基址 位移
    [0136]
    存储器存取只使用地址寄存器的情况被称为基址寻址。支持基址 位移存储器存取有时也是合乎需要的。在这种情况下,存储在指令中的立即值被加到地址寄存器以产生用于存储器存取的地址。
    [0137]
    如果需要支持在指令中的基址 位移寻址,为了利用早期虚拟到真实映射,当地址被写入时,可基于位移的大小而被存取的所有页面的映射存储在地址寄存器。当使用基址 位移形式来计算存储器存取地址时,然后选择适当的页面转换。这不如上面所述的仅基址寻址的情况一样直接或有效,但仍然比完成完全转换的可选方案更有效。
    [0138]
    作为例子,假设所有页面是4kb,以及最大位移是12位带符号数字,使得在 2047到-2048的范围内的值可被加到基地址。在这种情况下,当地址被写入时,只有3个页面需要同时被转换:地址的页面、前一页面和下一页面。假设页面0x4如上映射到0x1以及0x3映射到0x23,以及0x5映射到0x8。在那种情况下,从上面继续例子,当0x40c8被写到$a3时,页面0x3、0x4和0x5到0x23、0x1、0x8的转换也与地址寄存器保存在一起。现在假设处理器执行基址 位移指令ldw$rll,$a3,-0x800。这将使基本页面下溢,且所以可从所保存的转换使用前一页面映射(即对于0x3),得到0x238c8作为真实地址。类似地,如果处理器计算指令ldw$rll,$a3,0xff0的地址,则处理器计算虚拟地址0x50b8,且通过使用保存在$a3中的页面0x5的转换,可高效地计算出真实地址0x80b8。
    [0139]
    优选地,最大位移和最小页面尺寸被选取使得位移小于页面。否则,为了利用上面所述的技术,可能需要更多的页面。在上面的例子中,假设页面是仅仅2kb。在那种情况下,
    需要同时转换5个页面——基本页面、2个前面的页面和2个随后的页面,并保存它们。
    [0140]
    如果位移小于页面尺寸,则取决于基址的值,基址 位移将从不上溢或从不下溢。假设在上面的例子中最大可能的位移是11位,而不是12。在那种情况下,可被加到0x40c8的最大值是 511(或0x3ff),给出仍然在第4页面中的地址0x44c7。因此,使用那个寄存器的最大基址 位移值将从不上溢。然而,可被加上的最小值是-512(或-0x400),给出不在同一页面中的0x38c8。所以在转换过程期间,处理器可基于地址来检测上溢或下溢是否是可能的,并且只将两个映射保存在地址寄存器中。对于在页面尺寸和位移之间的足够大的差异,也许可能有被写到地址寄存器的既不上溢也不下溢的地址。然而,仍然必须提供上溢/下溢页面映射以与地址寄存器存储在一起,因为写入可能下溢/上溢的值总是可能的;考虑写入页面中的第一个/最后一个地址的值;任何负/正位移将分别引起下溢/上溢。
    [0141]
    用于基址 位移的dtlb组织
    [0142]
    没有对支持仅基址情况所需的dtlb的修改。在基址 位移的情况下,dtlb必须被修改以同时返回对3(位移=页面尺寸)、2(位移《页面尺寸)或大于3(位移》页面尺寸)个页面的转换。完成此的一种方式是将额外的读取端口添加到tlb 100,并同时查找多个页面。
    [0143]
    可选地,每个tlb条目可存储多个转换。在这个方法中,每个tlb条目将存储前面的页面、基本页面和随后的页面的真实地址。这增加了每个条目的位的数量,因为tlb条目现在将需要保存多个页面,但减少了读取端口的数量。
    [0144]
    在位移小于页面尺寸的情况,在多转换tlb中的每个条目仍然将需要3个页面。基于地址是否可以以最小/最大位移下溢或上溢,前一和基本页面或基本和下一页面被选择。这可通过检查单个位来完成,以确定被写入的地址是在页面的下半部分还是上半部分中。如果页面尺寸是4kb,则这将意味着查看地址的位11。
    [0145]
    图2示出架构的地址转换高速缓存的组织的一个例子,其中位移和页面尺寸是相同的,假设直接映射tlb 200包含每个虚拟页面208的前一虚拟页面202、基本虚拟页面204和下一虚拟页面206的映射。在条目中的每行包含虚拟页面208、与前一虚拟页面202、基本虚拟页面204和下一虚拟页面206对应的真实页面210以及对那些页面的许可212。它还包含指示是否有对那个页面的虚拟到真实映射的有效位214。如果没有,则当页面被使用时,处理器将采用异常。
    [0146]
    地址寄存器220包含指示tlb条目数据是有效的命中位216、3个真实页面的拷贝和在地址的页面内的偏移218。再次,这个偏移218可从虚拟地址寄存器页面偏移218被读取,如果实现选择对虚拟地址222和真实地址共享该偏移。
    [0147]
    tlb未命中/许可处理
    [0148]
    当地址寄存器220被写入时,可能没有足够的信息来将正被写的虚拟地址222映射到真实地址;即,tlb未命中出现。处理器可选择引起tlb未命中异常,或启动硬件状态机以开始在此时取出tlb数据。然而,优选的实现是等待,直到使用地址寄存器220的加载或存储指令被执行为止,并在那时引起tlb异常/重新加载tlb 200。在这个实现中,在tlb未命中被处理之后,地址寄存器220可被重新加载相同的虚拟地址222,然而此时因为映射存在,正确的真实地址将与地址寄存器220存储在一起。
    [0149]
    tlb 220还包含读取/写入和页面的其它许可212。作为转换高速缓存过程的部分,所转换的页面的许可位212可与地址寄存器220存储在一起。当执行加载或存储指令时,检
    查存储在地址寄存器中的许可位212,且如果必要,引起许可异常。可能有存储在tlb 220中的其它页面特性,其将需要被拷贝,例如缓存控制指示(例如写回与直写、可缓存的/不可缓存的等)。
    [0150]
    如果虚拟到真实地址转换由于某个原因被无效或更新,则与地址寄存器220存储在一起的转换可能需要被变更以反映事情的新状态。完成此的最简单的方式是用它们的当前内容重写地址寄存器220,使处理器重新执行转换,并从而更新与地址寄存器220存储在一起的转换。
    [0151]
    其它指令
    [0152]
    在编程语言(例如c)中,通常使用指针来表示存储器地址。除了作为加载/存储地址以外,指针的最频繁的使用是:
    [0153]
    ·
    通过加上/减去常数或所计算的值来产生另一指针
    [0154]
    ·
    比较指针与0或与另一指针
    [0155]
    ·
    取两个指针的差异
    [0156]
    通常,当偏移被加到指针时或当两个指针被减去时,必须按照指针所指向的对象的尺寸按比例调整这两个指针。最常见的尺寸是1、2、4和8b。
    [0157]
    在一个优选实现中,提出下面的指令:
    [0158]
    ·
    addai$at,$aa,#imm:将带符号常数#imm加到地址寄存器$aa并将结果存储在目标地址寄存器$at中
    [0159]
    $at《-$aa #imm
    [0160]
    ·
    addar$at,$aa,$rb,#scl:将按照立即值#scl按比例调整的通用寄存器$rb加到地址寄存器$aa,并将结果存储在目标地址寄存器$at中
    [0161]
    $at《-$aa ($rb《《#scl)
    [0162]
    ·
    asub$rt,$aa,$ab,#scl:从$aa减去地址寄存器$ab,按照立即值#scl按比例调整差异,并将结果存储在通用寄存器$rt中
    [0163]
    $rt《-($aa-$ab)》》#scl
    [0164]
    预定用于处理指针比较的指令将取决于指令集是否使用检验和分支或比较和分支。在第一种情况中,另外的地址寄存器指令将比较两个地址寄存器并设置条件代码或标记。在第二种情况中,另外的指令将比较两个地址寄存器并基于该比较的性质来形成分支。
    [0165]
    注意,可使用简单的alu来执行所有这些指令以执行相加/相减/比较。
    [0166]
    计算相对于当前pc的数据地址是有用的。这允许可浮动数据(例如程序常数)被快速存取。在优选实现中,提出下面的指令:
    [0167]
    ·
    addpci$at,#imm:将带符号常数#imm加到程序计数器,并将结果存储在目标地址寄存器$tt中。
    [0168]
    此外,架构需要具有将地址移动到通用寄存器/从通用寄存器移动地址的手段,以处理需要处理地址计算(其需要地址的复杂处理)的情况。此外,架构需要具有将地址寄存器的内容保存到存储器并从存储器恢复地址寄存器的内容的手段。这些可通过有下列的指令来实现:
    [0169]
    ·
    从地址寄存器加载/存储到存储器
    [0170]
    ·
    将地址寄存器拷贝到通用寄存器/从通用寄存器拷贝地址寄存器
    [0171]
    如果指令的两个类别中的仅仅一个类别是可用的,则可使用一系列指令来合成指令的另一类别的行为。例如,为了将地址寄存器移动到存储器,每个地址寄存器可首先被拷贝到通用寄存器,且然后通用寄存器可被存储。
    [0172]
    优化转换
    [0173]
    可能使用上面建议的指令来优化虚拟到真实页面的转换。如果地址寄存器与来自寄存器/立即加的值的和的结果不越过页面边界,即如果源地址和结果地址在同一页面中,则处理器可以对结果寄存器重用与源寄存器高速缓存在一起的转换。在这种情况下,可绕过tlb查找,节省能量并可能增强性能。
    [0174]
    寄存器文件端口
    [0175]
    在可对地址操作的指令是如上所述的集合的情况下,地址寄存器文件将具有至多2个读取端口和一个写入端口以支持在地址寄存器上的算术运算,其将读取存储在地址寄存器中的值(即虚拟地址)。与地址寄存器存储在一起的真实地址/页面将需要单独的端口以为存储器存取操作提供地址。如果试图实现优化,其中高速缓存的地址映射可被重用,则端口需要为源地址寄存器提供真实映射。因此,可能使用仅2个读取端口的寄存器文件来并行地执行加载/存储指令和地址算术操作。
    [0176]
    在仅基址中的预取
    [0177]
    地址寄存器架构的仅基址变形是一种变形,其中经由存储在地址寄存器中的地址来执行所有存储器存取而没有位移。在这个架构中,当值被写到地址寄存器时,很可能是意图使用那个值作为读取或写入位置。实现可通过使用到地址寄存器的写入作为预取暗示来利用此,即开始将一行带到最顶级高速缓存。
    [0178]
    注意,没有被写到地址寄存器的值将被使用的保证;程序可加载地址寄存器,预期它将使用那个值作为地址,并接着选择不这么做。可选地,在架构的无序实现中,寄存器写入可推测地被执行,且结果可能是在序列中的某个分支预测是不正确的。
    [0179]
    因此,实现可选择使用关于如何积极地执行预取的启发法。作为例子,考虑具有两个级别的片上高速缓存和外部存储器的无序实现。所使用的启发法可以是,如果地址写入是推测的,则从第二级高速缓存向第一级取出行,但不是从存储器取出,而如果地址写入是非推测的,则如果必要就从外部存储器取出那个地址的内容。
    [0180]
    在仅基址中的预加载
    [0181]
    预取的思想可扩展到实际上将与地址寄存器中的地址相关的数据加载到结构中,该结构是由地址标记的散列表或由地址寄存器号码索引的表或这两者。被加载的数据的尺寸可以是:
    [0182]
    ·
    可被读取/写入的最大尺寸的值。因此,如果架构支持64位加载,则8b的数据将被加载。
    [0183]
    ·
    高速缓存行,具体地,包含在地址寄存器中的地址的高速缓存行
    [0184]
    ·
    两个高速缓存行—包含地址的缓存行和下一缓存行。这在架构支持未对准的存储器存取时特别适用,使得加载/存储可以跨越缓存行被分离。
    [0185]
    ·
    其它中间尺寸
    [0186]
    如果结构是由地址标记的散列表,则结构类似于位于存储器分级结构的顶部处的完全相关的高速缓存。当被选取的数据的宽度是缓存行尺寸的倍数时,特别如此。
    [0187]
    当数据被预加载时,触发预加载的地址寄存器是已知的。被预加载的数据可与地址寄存器相关联。在图3所示的一个实现300中,可为在地址寄存器302本身中的数据分配空间。这可被称为内联预加载。使用特定的地址寄存器作为基址的加载将从预加载的数据提取必要的字节。使用地址寄存器302作为它的基址的存储将重写预加载的数据中的相关字节,以及写到存储器分级结构。
    [0188]
    内联预加载遭受多个地址寄存器可能指向相同或重叠的地址的问题。所以为了正确性,存储必须重写不仅与它的地址寄存器302而且与包含来自地址的数据的任何其它地址寄存器内联地存储的数据。
    [0189]
    可选的实现400是有缓冲器404的池,其中缓冲器的数量至少是地址寄存器402的数量。每个地址寄存器402将指向缓冲器404。如果两个地址寄存器402保存相同或重叠的值,则它们将使用同一缓冲器404,如图4所示。这避免对存在于多个地址寄存器中的地址的存储的问题。
    [0190]
    这个实现假设所有加载和存储都被对准。如果它们可以是未对准的,则一个可能的实现是在缓冲器404的池中具有多达两倍的缓冲器并具有与每个地址相关的两个缓冲器404。到地址寄存器402的未对准的加载将从这两个缓冲器404读取,而未对准的存储将潜在地重写在这两个缓冲器404中的字节。
    [0191]
    当指向缓冲器的所有寄存器都用使它们指向其它缓冲器的新值被重写时,在缓冲器404的池中的缓冲器将被释放。可选地,在具有寄存器重命名的实现的情况下,已经被释放的寄存器被视为不指向缓冲器404。
    [0192]
    在图3和图4中,虚拟地址和真实地址都被示出,指示有转换高速缓存以及预加载。可能实现预加载而没有转换高速缓存。
    [0193]
    因为预加载是一种形式的高速缓存,当数据缓存行例如通过高速缓存控制指令或通过相干业务被修改时,则预加载的高速缓存行也必须更改以反映改变的存储器分级结构。
    [0194]
    未命中处理
    [0195]
    到目前为止,在预加载的处理中,假设每当值被写到地址寄存器时,在那个地址处的内容就从存储器分级结构取出。由于与在关于预取的章节中所述的相同的原因,它可以被选择为并不总是完成预加载。
    [0196]
    为了实现那个行为,提出具有4个状态的状态机:
    [0197]
    ·
    未发送:地址已经被写到地址寄存器(或缓冲器),但没有请求被发送到存储器子系统;
    [0198]
    ·
    已发送:对加载与地址寄存器(或缓冲器)相关的数据的请求已经被发送,但没有被返回;
    [0199]
    ·
    未命中:请求被不令人满意地返回,因为它不存在于我们启发式地查看的高速缓存分级结构的部分中;以及
    [0200]
    ·
    有效:数据是可得到的。
    [0201]
    当将地址写到地址寄存器时或当在写中将缓冲器首先分配给地址寄存器时,将状态机设置为未发送的。在某个时刻,将请求发送到存储器分级结构且将状态机设置为已发送的。基于各种启发法(例如推测的程度)来研究存储器分级结构的子集。如果找到那个地
    址的数据,则将数据保存在地址寄存器/缓冲器中,且将状态机设置为有效的。如果未找到那个地址的数据,则将状态机设置为未命中的。稍后,当很显然需要数据时,例如当使用那个寄存器/缓冲器作为基址来完成非推测性加载/存储时,重新发出对数据的请求。这次,请求被发出,使得加载必须完成,即使它需要从主存储器取回。
    [0202]
    具有位移的加载/存储
    [0203]
    仅基址加载/存储指令必须只对目的地/源寄存器、地址寄存器和操作码编码。这将使得在指令中的大量位未被使用。相应地,添加具有使用这些额外的指令位来提供立即值的更新指令的加载/存储,立即值可作为用于使存储器操作后递增的位移来被使用。因此,ldw$rt,$aa,#imm将从在$aa中的存储单元加载$rt,然后将$aa设置到$aa #imm的值。
    [0204]
    目标寄存器
    [0205]
    可提出计算机处理器的架构,其中所有分支是间接的,经由可被称为目标寄存器的专用的一组寄存器。
    [0206]
    所有分支经由专用的一组寄存器的架构非常类似于所有加载和存储是基址直接的地址寄存器的情况。随后,上面所述的各种性能优化(即转换高速缓存、预取和预加载)都可应用于这样的架构。然而,有一些差异。
    [0207]
    明显的差异是,对目标寄存器的实现优化必须使用指令资源而不是数据资源。这包括使用指令tlb并预取到指令高速缓存中。
    [0208]
    指令不遭受混叠问题;即使两个虚拟地址指向同一真实地址,改变在那个地址处的指令也很罕见。当包含指令的行例如由jit引擎改变时,软件可采取矫正行动以确保可指向指令的所有虚拟地址是无效的并被刷新,或否则被同步。这些行动可能是昂贵的,但考虑到指令重写的稀有性,摊销成本是可忽略的。因此,可能有虚拟地被寻址的顶级指令高速缓存,其减小转换高速缓存的益处。
    [0209]
    指令更新的这个相同的稀有性使为指令使用内联预加载变得可行。
    [0210]
    fall-through
    [0211]
    在执行分支之后,取出并执行指令,直到遇到下一采用的分支为止。这可以是任意长的序列,可能跨越多个高速缓存行,或短至一个指令,如果分支目标本身是采用的分支。
    [0212]
    使用预加载,对于每个目标寄存器,某个数量的指令被预加载。如果分支到那个目标寄存器且在执行预加载的数据时没有遇到所采用的分支,则下一连续的地址被称为预加载fall-through地址。假设架构具有4b指令且实现具有32b行尺寸,以及实现一次预加载一个缓存行。假设值0x1014被写到目标寄存器$tl。处理器然后预加载包含0x1014的行,其是字节0x1000到0xl02f。如果程序分支到$tl,则实现将使用在0x1014开始的预加载数据。如果没有被采用的分支,则在0x1014、0x1018和oxlolc处的指令将被执行,且处理器将接着试图执行在预加载fall-through地址0x1020处的指令。
    [0213]
    每个目标寄存器具有fall-through地址。活动的fall-through是正被执行的预加载值的fall-through值。因此在上面的例子中,到$tl的分支一被执行,0x1020就变成活动的fall-through。
    [0214]
    预加载的可能实现将活动的fall-through地址处理为好像它也是目标寄存器一样,且将试图预加载在那个地址处的指令。
    [0215]
    图5示出目标寄存器文件和预加载结构500。对每个目标寄存器502有一个条目,对
    活动的fall-through 504有一个条目。下面的值与每个条目存储在一起:
    [0216]
    ·
    地址506;在fall-through寄存器的情况下,这是活动的fall-through地址
    [0217]
    ·
    fall-through地址508:这是如果这行被使用则将被使用的fall-through地址
    [0218]
    ·
    sm 510:未命中处理状态机
    [0219]
    ·
    数据512:预加载的数据
    [0220]
    预加载的数据512可以是指令高速缓存行,其被对准以使得在预加载数据中的第一指令是由地址506指向的指令。
    [0221]
    设置目标寄存器
    [0222]
    设置目标寄存器的最常见的方式是将位移加到当前pc,并将那个值写到目标寄存器。这个指令可被称为i taddpci$tt,#disp;它将目标寄存器$tt设置到pc 位移。
    [0223]
    目标寄存器需要被保存并存储。这可通过拷贝到通用寄存器/从通用寄存器拷贝或直接保存到存储器或这两者来实现。
    [0224]
    使用目标寄存器
    [0225]
    所有无条件分支将简单地分支到目标寄存器。
    [0226]
    根据架构是否具有用于处理条件分支的检验和分支或比较和分支指令理念,条件分支指令看起来像beq$t0或bgt$r0,$rl,$t0,其中第一形式检验条件代码寄存器以查看前一比较是否设置了相等的标记,以及第二形式比较两个寄存器以查看是否大于。如果在检查条件/比较值之后,确定分支应被采用,控制转移到在目标寄存器$t0中的地址。
    [0227]
    因为所有分支目的地在几个位中被指定为目标寄存器,与使用大量位来指定位移相反,因此在指令中将会有大量位留下来指定通用寄存器和可能立即字段。这产生优选的选择比较和分支型指令。
    [0228]
    当分支预测被使用时,使用比较和分支可能甚至不引起额外的循环延迟;只有比较的结果可用于确认分支预测是否是正确的。如果它是,则没有额外的工作。如分支预测是不正确的,则需要采用矫正行动,包括重新启动流水线。
    [0229]
    调用/返回
    [0230]
    提出有具有显式调用和返回指令的架构。调用指令经由目标寄存器来形成分支,并用返回地址(即在调用指令之后的指令的地址)更新另一目的寄存器。原则上,返回地址可被写到任何目标寄存器;然而实际上,由于调用约定和应用二进制接口(abi)被定义的方式,将总是使用一个寄存器。
    [0231]
    经由目标寄存器的返回与经由那个寄存器的无条件跳跃是区分不开的。这产生返回和无条件跳跃将可互换地被使用的风险。所以,进一步提出具有可由调用指令但不可由taddpci指令写入并可经由返回指令但不是由其它条件或无条件分支指令被分支到的目标寄存器。这可被称为链路目标寄存器。
    [0232]
    调用返回堆栈
    [0233]
    具有显式调用/返回指令使使用调用返回堆栈来实现分支预测变得简单;每当执行调用时,返回地址被推到调用返回堆栈上,以及每当执行返回时,弹出堆栈,且弹出的地址用作用于返回的预测地址。如果调用堆栈上溢,则最底部的条目被重写。如果调用堆栈下溢,则没有预测可被执行,且平常的分支处理逻辑开启。
    [0234]
    如果使用预加载,则当执行调用时,链路寄存器被写入。这触发到链路寄存器的条
    目内的预加载。如果有随后的调用,则链路寄存器将被重写,触发又一预加载,导致以前预加载的值被重写。处理器可选择也将预加载值保存在调用返回堆栈中;所以每当预加载链路寄存器时,也将相同的数据写到在调用返回堆栈的顶部处的条目。
    [0235]
    如果实现使用目标寄存器的寄存器重命名,则每当链路寄存器被写入时,不同的物理寄存器将被写入。这将意味着链路寄存器的物理寄存器仍然在附近,包括预加载的数据。在这种情况下,调用堆栈的优选实现将作为物理寄存器604的一组指针602,其对应于链路寄存器的重命名。这在图6(600)中示出。
    [0236]
    为了从通过指向重命名的寄存器实现调用堆栈得到大部分,改变在寄存器重命名逻辑中的寄存器分配算法是需要的,以首先分配未由调用堆栈指向的那些自由目标寄存器,并接着更偏爱那些更接近底部的自由目标寄存器。在某个时刻,虽然如果目标寄存器的足够重命名发生,调用堆栈的一些元素将需要被重用,且将不再保存地址或预加载数据用于调用返回。此时,应使调用堆栈指针无效。这是对在例子中的调用堆栈中的底部条目的情况。
    [0237]
    当无效地址从调用堆栈弹出时,使用平常的分支处理逻辑而不是预测。
    [0238]
    分支预测
    [0239]
    连同指令一起,可被预加载的另一事物是对应于那些地址的分支预测信息。
    [0240]
    在使用由用于分支预测的地址索引的饱和2位预测器的实现中,当将指令地址写到目标寄存器时,从分支预测器表格拷贝分支预测位。
    [0241]
    在预加载指令和预加载分支预测位之间的一个差异是,分支预测位可在它们被预加载的时间和它们被使用的时间之间改变。因此,实现可添加逻辑以保持它们是最新的。一种方式是从分支预测表格定期地重新加载它们。另一方式是镜像分支预测表格更新,将影响预加载的分支预测位的任何更新应用于在目标寄存器中的拷贝。
    [0242]
    这在图7(700)中示出。假设多达4个指令被预加载。当地址首先被写到目标寄存器结构时,分支预测位702从分支预测表格704拷贝到目标寄存器结构706。当更新出现时且应用于表格704时,更新索引与每个目标寄存器结构条目的地址708并行地比较。在地址匹配的情况下,更新预加载的分支预测位710。
    [0243]
    这假设分支预测只由地址708索引。已经发现将条件分支的采用/未采用的历史混合在索引内将提高分支预测器的准确度。常见的技术是采用表示所采用/未采用的历史的某个数量的位、来自地址的某个数量的位,移动位的那些集合中的任一个并接着对它们共同的位置做异或操作。
    [0244]
    如果实现使用分支预测预加载,则被预加载的分支预测条目不能取决于历史,因为历史将在位被预加载和使用的时间之间改变。此外,如果目标寄存器多次用作条件分支目标,则历史可以在使用之间不同。所以如果历史将被使用,则它必须只影响索引的较低位。
    [0245]
    考虑基于目标寄存器的地址从分支预测表格预加载24(16)个条目的情况。历史的多达4个位可混合以在这些条目当中选择。如果目标保持多达22(4)个指令,则历史的这4个位和地址的2个位可组合以选择正确的分支预测。
    [0246]
    适应于通用寄存器
    [0247]
    上面所述的技术(即转换高速缓存和预加载)当与具有专用地址和目标寄存器文
    件、具有基址 位移或仅基址寻址的架构一起使用是工作得最好。这些技术可适合于其它架构。在极端情况下,到寄存器的每次写入可被假设是潜在地址,且转换高速缓存和预加载可应用于寄存器。
    [0248]
    更特别地,在数据侧,大部分架构提供基址 位移、基址 索引和甚至基址 索引 位移寻址。每当值被写到寄存器时,那个值可贯穿dtlb,且某个数量的页面(例如前一/基本/下一页面)可被转换,并与寄存器高速缓存在一起。如果寄存器然后用作地址计算的部分,则可检查最后产生的地址以查看它是否落入高速缓存的页面内。如果是,则可使用高速缓存的转换而不引起对存取dtlb的延迟。
    [0249]
    转换高速缓存的应用可被限制到所有寄存器。例如,一些架构按照惯例将某些寄存器保留为地址的基址(例如堆栈-指针)。实现可静态地决定处理某些通用寄存器,好像它们是地址寄存器一样,并将转换高速缓存/预加载应用于它们。如果这个实现细节暴露于用户,则编译和其它代码写入器可开始对适合于转换高速缓存或预加载的地址优先使用这些寄存器。
    [0250]
    可选地,实现可动态地确定哪些指令和/或寄存器为了转换高速缓存/预加载而被最佳地处理。动态技术可涉及动态程序分析,例如检查未来的指令流以预测哪个指令写入潜在地用作存储器或分支地址。可被使用的另一动态技术是基于历史的预测,跟踪在这个pc处的指令最后一次写入寄存器时是否:
    [0251]
    ·
    值用作存储器/分支地址
    [0252]
    ·
    它是否用作基址或基址 位移
    [0253]
    ·
    转换高速缓存/预加载有用的
    [0254]
    基于那个信息,实现可选择要应用所述优化中的哪个,如果有的话。
    [0255]
    图8是具有地址寄存器文件806的计算机处理器800的架构的方框图。计算机处理器800可包括存储器802、816。计算机处理器800还可包括通用寄存器文件808,其包括至少一个通用寄存器。计算机处理器800还可包括地址寄存器文件806,其包括至少一个地址寄存器。计算机处理器还可包括用于存取存储器802、816、通用寄存器文件808和地址寄存器文件806的处理逻辑818(例如整数计算逻辑810、第一算术逻辑单元(alu)812和第二alu 812)。整数计算逻辑810对通用寄存器文件808的通用寄存器的内容执行各种算术操作。
    [0256]
    处理逻辑818可执行存储器存取指令,其存取在一个或多个相应的地址处的在存储器802、816中的一个或多个存储单元,其中,通过取回在指令中指定的地址寄存器文件806的至少一个寄存器的地址寄存器的值并加上在指令中编码的位移值来计算所述一个或多个相应的地址。
    [0257]
    在计算机处理器800中,存储器存取指令可将一个或多个存储器值从所计算的地址拷贝到计算处理器800中的相应的一个或多个寄存器806、808内。一个或多个寄存器可以是通用寄存器文件808的一个或多个通用寄存器。一个或多个寄存器可以是地址寄存器文件806的一个或多个地址寄存器。
    [0258]
    在计算机处理器808中,存储器存取指令可将一个或多个值从在计算机处理器800中的相应的一个或多个寄存器拷贝到在所计算的地址处的存储器802、816。一个或多个寄存器可以是通用寄存器文件808的一个或多个通用寄存器。一个或多个寄存器可以是地址寄存器文件806的一个或多个地址寄存器。
    [0259]
    处理逻辑818可将位移值加到地址寄存器文件806的至少一个寄存器以产生所计算的地址。处理逻辑818可使用所计算的地址来执行到/从存储器802、818的拷贝。处理逻辑818可以用所计算的地址来更新地址寄存器文件806的至少一个寄存器。
    [0260]
    处理逻辑818可读取存储在地址寄存器文件806的至少一个寄存器中的地址以产生第一地址。处理逻辑818可使用第一地址来存取存储器802、816。处理逻辑818可将位移加到第一地址以产生所计算的地址。处理逻辑818可以用所计算的地址更新地址寄存器文件806的至少一个寄存器。位移值可以是0。
    [0261]
    处理逻辑818可处理可将地址寄存器文件806的地址寄存器的内容移动到通用寄存器文件808的通用寄存器或从通用寄存器文件808的通用寄存器移动地址寄存器文件806的地址寄存器的内容的指令。处理逻辑818可处理可使存储在地址寄存器文件806的地址寄存器中的地址值和位移值相加以产生结果值并将结果值存储在地址寄存器中的指令。处理逻辑818可处理使存储在地址寄存器文件806的地址寄存器中的地址值和存储在通用寄存器文件808的通用寄存器中的值相加以产生结果值并将结果值存储在地址寄存器中的指令。存储在通用寄存器文件808的通用寄存器中的值可以在相加之前进行移位。
    [0262]
    处理逻辑818可处理从存储在地址寄存器文件806的第二地址寄存器中的第二值减去存储在地址寄存器文件806的第一地址寄存器中的第一值以产生差值并可将结果值存储在通用寄存器文件808的通用寄存器中的指令。存储在通用寄存器中的值可在存储之前进行移位。
    [0263]
    计算机处理器800还可包括程序计数器804。处理逻辑818还可处理将位移加到程序计数器804以产生结果值并可将结果值存储在地址寄存器文件806的地址寄存器中的指令。处理逻辑818还可处理将带符号值加到地址寄存器文件806的地址寄存器以产生结果值并可将结果值存储在通用寄存器文件808的通用寄存器中的指令。处理逻辑818还可处理将由第二值按比例调整的存储在通用寄存器文件808的通用寄存器中的第一值加到地址寄存器文件806的地址寄存器以产生结果值并可将结果值存储在通用寄存器中的指令。处理逻辑818可处理可比较存储在寄存器地址文件806的两个地址寄存器中的地址值的指令。比较的结果可以是确定在第一地址寄存器的值和第二地址寄存器的值之间的确切的排序关系的多个位,并可存储在条件标记寄存器(未示出)中。比较可检验在第一地址寄存器的值和第二地址寄存器的值之间的特定关系,并可基于检验是真的还是假的来将单个位存储到寄存器内。
    [0264]
    处理逻辑818可处理比较地址寄存器文件806的两个地址寄存器以产生比较的结果并可可基于比较的结果来形成分支的指令。
    [0265]
    图9是具有仅间接分支的计算机处理器900的架构的方框图。计算机处理器900可包括目标寄存器文件906的一个或多个目标寄存器。计算机处理器还可包括与目标寄存器文件906的一个或多个目标寄存器进行信号通信的处理逻辑918。
    [0266]
    处理逻辑918可包括整数计算逻辑910、存储器存取逻辑912和分支计算逻辑914。处理逻辑918可存取存储器902、916、通用寄存器文件908和目标寄存器文件906。整数计算逻辑910对通用寄存器文件908的通用寄存器的内容执行各种算术操作。如果分支将被采用,分支计算逻辑914可执行比较和/或确定。存储器存取逻辑可产生在寄存器文件和存储器分级结构之间的移动。
    [0267]
    处理逻辑918可基于存储在目标寄存器文件906的一个或多个目标寄存器中的目标寄存器中的值来执行不中断分支指令。不中断分支指令可使用目标寄存器文件906的一个或多个目标寄存器来指定由不中断分支指令指定的分支的目的地地址。计算机处理器900还可包括与目标寄存器文件906的一个或多个目标寄存器和处理逻辑918进行信号通信的程序计数器904。处理逻辑918可处理可将位移值加到由程序计数器904指向的当前值以产生地址并可将存储在目标寄存器中的值设置到该地址的指令。将存储在目标寄存器中的值设置到该地址可包括将存储在目标寄存器中的值拷贝到通用寄存器文件908的通用寄存器或从通用寄存器文件908的通用寄存器拷贝存储在目标寄存器中的值。将存储在目标寄存器中的值设置到该地址可包括处理逻辑918将存储在目标寄存器中的值拷贝到存储器902、916或从存储器902、916拷贝存储在目标寄存器中的值。
    [0268]
    处理逻辑918可处理无条件地分支到目标寄存器文件906的一个或多个目标寄存器中的目标寄存器的指令。处理逻辑918可处理确定分支将被采用时的条件的指令。响应于处理逻辑918确定分支将被采用(使用分支计算逻辑914),处理逻辑918可将控制转移到存储在目标寄存器文件906的一个或多个目标寄存器中的目标寄存器中的地址。指令还可指定通用寄存器文件908的一个或多个通用寄存器。指令还可指定与指令相关的立即字段。指令还可指定一个或多个浮点寄存器(未示出)。
    [0269]
    处理逻辑918可处理执行被指定为指令的部分的在存储在一个或多个寄存器(未示出)中的相应寄存器中的两个值之间的比较的指令。响应于处理逻辑918确定分支将被采用(使用分支计算逻辑914),处理逻辑918可将控制转移到存储在目标寄存器文件906的一个或多个目标寄存器中的目标寄存器中的地址。由指令指定的寄存器可以是通用寄存器文件908的一个或多个通用寄存器。由指令指定的寄存器可以是一个或多个浮点寄存器(未示出)。
    [0270]
    处理逻辑918可处理执行被指定为指令的部分的在存储在通用寄存器文件908的一个或多个通用寄存器中的相应寄存器中的值和被指定为指令中的立即字段的值之间的比较的指令。响应于处理逻辑918确定分支将被采用(使用分支计算逻辑914),处理逻辑918可将控制转移到存储在目标寄存器文件906的一个或多个目标寄存器中的目标寄存器中的地址。
    [0271]
    处理器逻辑918可处理检查从先前指令的执行产生的状态以确定分支是否将被采用的指令。响应于处理逻辑918确定分支将被采用(使用分支计算逻辑914),处理逻辑918可将控制转移到存储在目标寄存器文件906的一个或多个目标寄存器中的目标寄存器中的地址。状态可包括指定通过先前比较指令的在两个值之间的比较操作的结果的位。状态可包括指定在先前指令的结果和0之间的隐式比较的结果的位。
    [0272]
    处理逻辑918可处理执行基于存储在目标寄存器文件906的一个或多个目标寄存器中的目标寄存器中的值而形成分支的调用指令,并用返回地址更新目标寄存器文件906的一个或多个目标寄存器中的第二目标寄存器的指令。
    [0273]
    目标寄存器文件906可分成第一组目标寄存器和第二组目标寄存器。第一组目标寄存器可包括分支目标寄存器,而第二组目标寄存器可包括调用返回目标寄存器。
    [0274]
    处理逻辑918可进一步执行调用指令,其中调用指令基于存储在第二组目标寄存器的分支目标寄存器中的值来形成分支,以及其中处理逻辑918可以用返回地址更新第二
    组的调用返回目标寄存器。
    [0275]
    处理逻辑918可进一步执行返回指令,其中返回指令指定调用返回目标寄存器,以及其中返回指令无条件地分支到在调用返回目标寄存器中的值。返回指令可以是可使用调用返回寄存器作为分支目标寄存器的唯一分支指令。可以只有一个调用返回目标寄存器。
    [0276]
    再次参考图2和图8,计算机处理器800可实现虚拟地址的预转换。计算机处理器800可包括寄存器文件806、808,其包括一个或多个寄存器。计算机处理器800可包括处理逻辑818。处理逻辑818可接收值以存储在一个或多个寄存器806、808的寄存器中。处理逻辑818可在寄存器中存储该值。处理逻辑818可将所接收的值指定为虚拟地址222。虚拟地址222可具有相应的虚拟基本页面号码。处理逻辑818可将虚拟基本页面号码转换成相应的真实基本页面号码和对应于与所述虚拟基本页面号码相邻的零个或更多个虚拟页面号码的零个或更多个真实页面号码。处理逻辑818可进一步在一个或多个寄存器806、808的寄存器中存储真实基本页面号码和零个或更多个真实页面号码。
    [0277]
    处理逻辑818可接收指定一个或多个寄存器806、808中的至少一个寄存器的指令。处理逻辑818可读取在至少一个寄存器中指定的一个或多个输入寄存器值并组合该一个或多个寄存器值以产生结果值。处理逻辑818可读取存储在一个或多个寄存器806、808中的真实转换信息并组合真实转换信息和一个或多个输入寄存器值以计算到结果值的真实地址的真实转换。
    [0278]
    处理逻辑818还可在第二寄存器中存储结果值。处理逻辑818可在第二寄存器中存储结果值和所计算的到真实地址的真实转换。处理逻辑818可将结果值指定为虚拟地址以存取存储器802、816。处理器800可使用所计算的到真实地址的真实转换来存取存储器802、816。
    [0279]
    结果值可以是一个或多个输入寄存器值的拷贝,且真实转换信息可以是与输入寄存器相关的转换信息的拷贝。结果值可以是将第二值加到输入寄存器或从输入寄存器减去第二值的结果,且真实转换信息可从与输入寄存器相关的一个或多个真实转换和第二值得到。
    [0280]
    操作可包括寄存器与被指定为一个或多个立即值或为一个或多个寄存器值的一个或多个值的加法或减法。当处理逻辑818计算加法或减法时,以及当计算位于所转换的真实页面的范围内时,处理逻辑818可从所转换的真实页面中选择一个页面并可连接和的页面偏移位218与所选择的真实页面。
    [0281]
    当加数/减数是具有小于页面尺寸的绝对值的立即值时,处理逻辑818还可在寄存器中存储对应于与存储在一个或多个输入寄存器的值对应的页面的真实地址的三个真实页面。这三个真实页面可对应于与下一较高虚拟页面206对应的页面的真实地址、与下一较低虚拟页面202对应的页面的真实地址以及与基本页面204对应的真实地址。处理逻辑818可在和被计算之后基于转换是否导致下溢、上溢或指向基本页面来选择这三个真实页面之一,且页面偏移218可与所选择的页面连接。
    [0282]
    当加数/减数是具有小于页面尺寸的一半的绝对值的立即值时,处理逻辑818还可在寄存器中存储对应于与存储在一个或多个输入寄存器的值对应的页面的真实地址的两个真实页面。这两个真实页面可对应于与下一较高虚拟页面206或下一较低虚拟页面202之一对应的页面的真实地址,且真实地址可对应于基本页面204,其基于寄存器中的值是在它
    的当前页面的上半部分还是它的当前页面的下半部分中来确定。处理逻辑818可在和被计算之后基于转换是否导致下溢、上溢或指向基本页面来选择这两个真实页面之一,且页面偏移218可与所选择的页面连接。
    [0283]
    一个或多个寄存器可以是通用寄存器文件808的一个或多个通用寄存器。
    [0284]
    计算机处理器800可以不存储所有寄存器的真实转换信息。
    [0285]
    可以为所有寄存器的预定子集计算真实转换信息。
    [0286]
    计算机处理器800可动态地确定哪些指令或寄存器或指令和寄存器使它们的结果产生真实转换。计算机处理器800可使用基于历史的预测来动态地确定哪些指令或寄存器或指令和寄存器被用于将虚拟基本页面号码转换成相应的真实基本页面号码和对应于与所述虚拟基本页面号码相邻的零个或更多个虚拟页面号码的零个或更多个真实页面号码。
    [0287]
    一个或多个寄存器可以是地址寄存器文件806的一个或多个地址寄存器。
    [0288]
    到具有有效真实转换的一个或多个寄存器中的寄存器的写可发起将数据预取到存储器分级结构的一个级别内。
    [0289]
    处理逻辑818还可在一个或多个寄存器中只存储对应于虚拟地址222的真实基本页面号码。到一个或多个寄存器中的寄存器的写可触发将数据预取到与寄存器文件相关的寄存器内。
    [0290]
    当处理逻辑818不能将虚拟地址222映射到寄存器文件806、808中的一个或多个真实地址时,处理逻辑818可等待,直到加载或存储指令被执行为止,该加载或存储指令使用虚拟地址来引起异常。
    [0291]
    再次参考图2和图8,计算机处理器800可使用目标寄存器来实现虚拟地址的预转换。计算机处理器800可包括存储器文件806、808,其包括一个或多个寄存器。计算机处理器800可包括处理逻辑818。处理逻辑818可接收值以存储在一个或多个寄存器806、808中的寄存器中。处理逻辑818可在存储器中存储该值。处理逻辑818可将所接收的值指定为虚拟指令地址。虚拟指令地址可具有相应的虚拟基本页面号码。处理逻辑818可将虚拟基本页面号码转换成相应的真实基本页面号码和对应于与所述虚拟基本页面号码相邻的零个或更多个虚拟页面号码的零个或更多个真实页面号码。处理逻辑818还可在一个或多个寄存器806、808中的寄存器中存储真实基本页面号码和零个或更多个真实页面号码。
    [0292]
    处理逻辑818可接收指定一个或多个寄存器806、808中的至少一个寄存器的指令。处理逻辑818可读取在至少一个寄存器中指定的一个或多个输入寄存器值并组合该一个或多个寄存器值以产生结果值。处理逻辑818可读取存储在一个或多个寄存器806、808中的真实转换信息并组合真实转换信息和一个或多个输入寄存器值以计算到结果值的真实地址的真实转换。处理逻辑818可在第二寄存器中存储结果值。处理逻辑818可在第二寄存器中存储结果值和所计算的到真实地址的真实转换。处理逻辑818可将结果值指定为用于存取存储器的虚拟地址222。计算机处理器800可使用所计算的到真实地址的真实转换来从存储器读取指令。结果值可以是一个或多个输入寄存器值的拷贝,且真实转换信息可以是与输入寄存器相关的转换信息的拷贝。
    [0293]
    结果值可以是将第二值加到输入寄存器或从输入寄存器减去第二值的结果。真实转换信息可从与输入寄存器相关的一个或多个真实转换和第二值得到。
    [0294]
    操作可包括寄存器与被指定为一个或多个立即值或为一个或多个寄存器值的一
    个或多个值的加法或减法。当处理逻辑818计算加法或减法时以及当计算位于所转换的真实页面的范围内时,处理逻辑818可从所转换的真实页面中选择一个页面,且处理逻辑818还可连接和的页面偏移位与所选择的真实页面。
    [0295]
    当加数/减数是具有小于页面尺寸的绝对值的立即值时,处理逻辑818还可在寄存器中存储对应于与存储在一个或多个输入寄存器的值对应的页面的真实地址的三个真实页面。这三个真实页面可对应于与下一较高虚拟页面206对应的页面的真实地址、与下一较低虚拟页面202对应的页面的真实地址和与基本页面204对应的真实地址。处理逻辑可在和被计算之后基于转换是否导致下溢、上溢或指向基本页面来选择三个真实页面之一,且页面偏移可与所选择的页面连接。
    [0296]
    当加数/减数是具有小于页面尺寸的一半的绝对值的立即值时,处理逻辑818还可在寄存器中存储对应于与存储在一个或多个输入寄存器的值对应的页面的真实地址的两个真实页面。这两个真实页面可对应于与下一较高虚拟页面206或下一较低虚拟页面202之一对应的页面的真实地址以及与基本页面对应的真实地址,其基于在寄存器中的值是在它的当前页面的上半部分还是它的当前页面的下半部分中来确定。处理逻辑818可在和被计算之后基于转换是否导致下溢、上溢或指向基本页面来选择两个真实页面之一,且页面偏移可与所选择的页面连接。
    [0297]
    一个或多个寄存器可以是一个或多个通用寄存器808。
    [0298]
    计算机处理器800可以不存储所有寄存器的真实转换信息。可为所有寄存器的预定子集计算真实转换信息。计算机处理器800可动态地确定哪些指令或寄存器或指令和寄存器使它们的结果产生真实转换。计算机处理器800可使用基于历史的预测来动态地确定哪些指令或寄存器或指令和寄存器用于将虚拟基本页面号码转换成相应的真实基本页面号码和对应于与所述虚拟基本页面号码相邻的零个或更多个虚拟页面号码的零个或更多个真实页面号码。
    [0299]
    一个或多个寄存器可以是一个或多个分支目标寄存器(未示出)。
    [0300]
    到具有有效真实转换的一个或多个寄存器中的寄存器的写可发起将指令预取到存储器分级结构的级别内。
    [0301]
    处理逻辑可在一个或多个寄存器中只存储对应于虚拟地址222的真实基本页面号码。
    [0302]
    到一个或多个寄存器中的寄存器的写可触发将指令预取到与寄存器文件806、808相关的寄存器内。当处理逻辑不能将虚拟地址222映射到寄存器文件8086、808中的一个或多个真实地址时,处理逻辑818可等待,直到加载或存储指令被执行为止,加载或存储指令使用虚拟地址来引起异常。
    [0303]
    图10是具有寄存器直接分支并使用指令预加载结构的计算机处理器100的架构的方框图。计算机处理器1000可包括存储器1022的分级结构。存储器1022的分级结构可包括但不限于指令高速缓存1002、数据高速缓存1018和第二级高速缓存1016。存储器1022的分级结构可包括以具有用于与一个或多个指令对应的一个或多个地址的一个或多个条目的结构组织的第一存储器1002、1018、1016。一个或多个地址的一个或多个条目可具有起始地址。该结构可具有用于存储一个或多个指令的一个或多个单元。计算机处理器1000还可包括一个或多个相应的指令地址可写到的一个或多个寄存器1006、1008。计算机处理器1000
    还可包括处理逻辑1024。处理逻辑1024可包括用于执行比较和/或确定分支是否将被采用的整数计算逻辑1010。处理逻辑1024可包括分支计算逻辑1014,其用于操纵目标寄存器并用于执行无条件分支。处理逻辑1024可包括分支预测器逻辑1020以保持一个或多个分支预测条目是最新的。处理逻辑1024可包括用于通过选择尚未被预取的地址之一来识别待读取的下一组指令的指令预取逻辑1022。
    [0304]
    响应于处理逻辑1024将一个或多个指令地址写到一个或多个寄存器1006、1008,处理逻辑1024可从存储器的分级结构的第一存储器级别1002、1008将指令的线性序列的一个或多个指令预取到在起始地址处开始的存储器1022的分级结构的第二存储器级别1016内。一个或多个地址中的至少一个地址可以是一个或多个寄存器1006、1008中的寄存器的内容。
    [0305]
    一个或多个地址中的至少一个地址可以是当前正被处理的指令序列的下一地址。一个或多个地址中的至少一个地址可以是预取的指令的线性序列的最后一个的下一地址。
    [0306]
    一个或多个条目还可包括由分支预测器逻辑1020为一个或多个指令提供的一个或多个分支预测条目。在线性序列中的一个或多个指令可对应于高速缓存行。一个或多个条目还可包括在存储器1022的分级结构的第一存储器级别1002、1018中的所存储的一个或多个指令之后的下一指令的地址。
    [0307]
    分支指令的目标可以是存储在一个或多个相应寄存器中的一个或多个地址。存储在一个或多个相应寄存器中的一个或多个地址可包括正被处理的指令序列的fall-through地址。存储在一个或多个相应寄存器中的一个或多个地址可包括分支指令目标的fall-through地址。一个或多个地址可包括来自调用堆栈的一个或多个地址。调用堆栈被实现为一个或多个条目的指针的堆栈。
    [0308]
    应理解,上面的描述意为示例性的而不是限制性的。当阅读并理解上面的描述时,很多其它例子对本领域中的技术人员将是明显的。本公开的范围因此应可参考所附权利要求连同这样的权利要求被给予的等效形式的完全范围一起来确定。
    转载请注明原文地址:https://tc.8miu.com/read-2528.html

    最新回复(0)