CN106557304A - 用于预测子程序返回指令的目标的取指单元 - Google Patents

用于预测子程序返回指令的目标的取指单元 Download PDF

Info

Publication number
CN106557304A
CN106557304A CN201610853165.2A CN201610853165A CN106557304A CN 106557304 A CN106557304 A CN 106557304A CN 201610853165 A CN201610853165 A CN 201610853165A CN 106557304 A CN106557304 A CN 106557304A
Authority
CN
China
Prior art keywords
instruction
group
prediction
logic
return
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.)
Granted
Application number
CN201610853165.2A
Other languages
English (en)
Other versions
CN106557304B (zh
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.)
Hai Luo Software Co ltd
Imagination Technologies Ltd
Original Assignee
Imagination Technologies 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 Imagination Technologies Ltd filed Critical Imagination Technologies Ltd
Priority to CN202210097700.1A priority Critical patent/CN114546485A/zh
Publication of CN106557304A publication Critical patent/CN106557304A/zh
Application granted granted Critical
Publication of CN106557304B publication Critical patent/CN106557304B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3802Instruction prefetching
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3005Arrangements for executing specific machine instructions to perform operations for flow control
    • G06F9/30054Unconditional branch instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30145Instruction analysis, e.g. decoding, instruction word fields
    • G06F9/3016Decoding the operand specifier, e.g. specifier format
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3802Instruction prefetching
    • G06F9/3804Instruction prefetching for branches, e.g. hedging, branch folding
    • G06F9/3806Instruction prefetching for branches, e.g. hedging, branch folding using address prediction, e.g. return stack, branch history buffer
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4482Procedural
    • G06F9/4484Executing subprograms
    • G06F9/4486Formation of subprogram jump address
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0875Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches with dedicated cache, e.g. instruction or stack
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/3012Organisation of register space, e.g. banked or distributed register file
    • G06F9/30134Register stacks; shift registers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30145Instruction analysis, e.g. decoding, instruction word fields
    • G06F9/3016Decoding the operand specifier, e.g. specifier format
    • G06F9/30163Decoding the operand specifier, e.g. specifier format with implied specifier, e.g. top of stack
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3802Instruction prefetching
    • G06F9/3808Instruction prefetching for instruction reuse, e.g. trace cache, branch target cache
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3818Decoding for concurrent execution
    • G06F9/382Pipelined decoding, e.g. using predecoding

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Executing Machine-Instructions (AREA)
  • Advance Control (AREA)

Abstract

本申请公开了用于预测子程序返回指令的目标的取指单元。取指单元被配置为响应于检测到子程序调用和链接指令,计算关于对应的子程序返回指令的预测的目标地址并且将其存储在预测栈中,以及如果满足特定条件,还使预测的目标指令束存储在预测栈中。取指单元还被配置为响应于检测到子程序返回指令,使用预测栈中的预测的目标地址来确定待提取的下一个指令束的地址,以及如果满足特定条件,使预测栈中的任何有效预测的目标指令束成为下一个待解码的束。

Description

用于预测子程序返回指令的目标的取指单元
背景
在处理器上执行的程序包括多种类型的指令,诸如子程序调用和链接指令。
子程序调用和链接指令是跳转到调用目的地址处的子程序(执行特定任务的一段代码)并且在已经执行子程序后返回到调用点的指令。具体地,子程序的最后指令是引导处理器返回到调用点并且开始执行指令的返回指令。因此,子程序只能由存储返回到主程序的链接的指令来调用。
如果处理器的取指单元考虑到调用和链接指令与对应的子程序返回指令之间的关系,那么可以更有效地提取程序中的指令。
下面描述的实施例仅作为例子被提供且不是对解决已知处理器取指单元的任何或所有缺点的实现的限制。
概述
本概述以简化形式提供来介绍一系列概念,其将在以下的详细说明中进一步描述。本概述不旨在标识所要求保护的主题的关键特征或本质特征,也不旨在用来辅助确定所要求保护的主题的范围。
一种用于有效地提取子程序调用和链接指令以及对应的子程序返回指令的取指单元。该取指单元被配置为响应于检测到子程序调用和链接指令来计算关于对应的子程序返回指令的预测的目标地址并且将其存储在预测栈中,以及如果满足特定条件,还使预测的目标指令束存储在预测栈中。该取指单元还被配置为响应于检测到子程序返回指令使用预测栈中的预测的目标地址来确定待提取的下一个指令束的地址,以及如果满足特定条件,使预测栈中的预测的目标指令束成为下一个待解码的指令束。
第一方面提供用于在处理器中使用的多级取指单元,该多级取指单元包括:返回预测栈;以及与返回预测栈通信的部分解码逻辑,该部分解码逻辑按周期被配置为:接收一组一个或多个指令以用于执行;至少部分地对接收的一组一个或多个指令进行解码以确定所接收的一组一个或多个指令是否包括子程序调用和链接指令或者子程序返回指令;响应于确定所接收的一组一个或多个指令包括子程序调用和链接指令,使关于对应的子程序返回指令的预测目标组的一个或多个指令存储在返回预测栈中;以及响应于确定所接收的一组一个或多个指令包括子程序返回指令,使存储在返回预测栈中的预测目标组的一个或多个指令成为下一个周期中所接收的一组一个或多个指令。
第二方面提供在处理器的多级取指单元中提取指令的方法,该方法在每个周期中包括:接收用于执行的一组一个或多个指令;至少部分地对接收的一组一个或多个指令进行解码以确定所接收的一组一个或多个指令是否包括子程序调用和链接指令或者子程序返回指令;响应于确定所接收的一组一个或多个指令包括子程序调用和链接指令,使关于对应的子程序返回指令的预测目标组的一个或多个指令存储在返回预测栈中;以及响应于确定所接收的一组一个或多个指令包括子程序返回指令,使存储在返回预测栈中的预测目标组的一个或多个指令成为下一个周期中所接收的一组一个或多个指令。
第三方面提供计算机可读的存储介质,在其上编码有定义包括第一方面的取指单元的处理器的计算机可读程序代码。
第四方面提供计算机可读存储介质,在其上编码有定义被配置为实施第二方面的方法的处理器的计算机可读程序代码。
优选的特征可被适当组合,如将对技术人员将是明显的,并且可与本发明的任何方面组合。
附图简述
本发明的实施例将通过示例的方式参考以下附图进行描述,在附图中:
图1是示例性乱序处理器的框图;
图2是图示包括子程序调用和链接指令的示例程序的示意图;
图3是用于预测子程序返回指令的目标地址的图1的示例取指单元的框图;
图4是图3的示例返回预测栈的示意图;
图5是图示在执行程序时图3的取指单元在许多的周期内的状态的时序图;
图6是用于预测子程序返回指令的目标地址和目标指令束的示例取指单元的框图;
图7是图6的修改的返回预测栈的框图;
图8是用于预测子程序返回指令的目标地址和目标指令束的示例方法的流程图;
图9是用于将数据压入到图6的修改的返回预测栈上的示例方法的流程图;
图10是在使用图9的方法时图6的修改的取指单元在许多的周期内的状态的时序图;
图11是在使用图9的方法时图6的修改的取指单元在许多的周期内的状态的时序图;
图12是用于从图6的修改的返回预测栈中弹出数据的示例方法的流程图;
图13是在使用图12的方法时图6的修改的取指单元在许多的周期内的状态的时序图;
图14是在使用图12的方法时图6的修改的取指单元在许多的周期内的状态的时序图;
图15是用于确定下一个待提取的指令束的地址的示例方法的流程图;
图16是图6的修改的取指单元在许多的周期内的状态的时序图;以及
图17是图6的具有RPS控制器的取指单元的示例FS级的框图;
共有的参考数字在全部附图中用来表示类似的特征。
详细描述
本发明的实施例在下文仅通过示例的方式进行描述。这些示例代表了将本发明付诸实践的申请人当前已知的最好方法,但是它们不是以其可以实现本发明的唯一方法。描述阐述了示例的功能及用于构建和操作示例的步骤的顺序。然而,相同或等效的功能和顺序可以通过不同的示例来完成。
本文描述的是用于预测和存储子程序返回指令的目标指令的方法和多级取指单元,以便在检测到子程序返回指令之后不浪费提取目标指令的周期。取指单元被配置为监控提取的指令中的子程序调用和链接指令。一旦检测到子程序调用和链接指令,用于对应的子程序返回指令的预测的目标地址被存储在缓冲器中,并且在某些情况下,在下一个周期中,紧随的指令束被存储在关联的缓冲器中作为用于对应的子程序返回指令的预测的目标指令束。当取指单元随后检测关于子程序调用和链接指令的对应的子程序返回指令时,从缓冲器中检索预测的目标地址以及任何预测的目标指令束,以便在下一个周期中可以对预测的目标指令束进行处理并且预测的目标地址可以用于提取用于执行的下一个指令束。
首先参考图1,其示出了示例乱序处理器100的示意图,其中可实现本文所述的方法和取指单元。虽然图1示出乱序处理器,但是本方法还可以在并不对指令进行乱序地处理的处理器中(即,在有序处理器中)实现。在该示例中,处理器100是单线程处理器;然而该方法也适用于多线程处理器。
处理器100包括取指单元102、解码和重命名单元104、重排序缓冲器106、提交单元108以及一个或多个执行单元110。然而,对本领域的技术人员将明显的是,可以对这些单元中的一个或多个进行组合。例如,在其他处理器中,可以组合解码和重命名单元104以及一个或多个执行单元110来形成单个的单元。
取指单元102被配置为从如由程序计数器(PC)指示的程序(按程序顺序)提取指令。一些取指单元102被配置为在周期中提取多于一个指令,而其他取指单元被配置为在周期中只提取单指令。当在周期中提取多个指令时,指令被设置为形成指令束。本文使用的术语“周期”意味着处理器100的处理周期。在一些情况下,每个时钟周期具有一个处理周期。然而,在其他情况下,处理周期可以或多或少比每个时钟周期更频繁发生。
本文讨论的取指单元被描述为在周期中提取指令束(即,多于一个指令),然而,对本领域的技术人员将明显的是本文所描述的方法和原理还可以应用到每周期只提取单指令的取指单元。本文中使用的术语“一个或多个指令的集合”包括单指令和包括两个或更多个指令的指令束。
一旦提取了指令束,就向解码和重命名单元104提供其中包含的指令,解码和重命名单元104被布置成解释该指令并进行寄存器重新命名。具体地,每个指令可包括:寄存器写入操作;一个或多个寄存器读取操作;和/或算术操作或逻辑操作。寄存器写入操作向目标寄存器写入,以及寄存器读取操作从源寄存器读取。在寄存器重新命名期间,指令中所提及的每个结构寄存器(例如,每个源和目标寄存器)用物理寄存器替代(或重命名)。
在指令通过解码和重命名单元104之后,其被插入重排序缓冲器106(ROB)并调度到执行单元110以用于执行。指令被调度到的执行单元110可基于指令的类型。
重排序缓冲器106是使指令能够被乱序地执行、但有序地提交的缓冲器。重排序缓冲器106以程序顺序保持被插入其中的指令,但是ROB 106内的指令可由执行单元110失序地执行。将从重排序缓冲器106输出的指令提供给提交单元108,该提交单元108将指令的结果提交给寄存器/存储器。
每个执行单元110负责执行指令,并且可被配置成执行特定类型的指令。执行单元110可包括存取单元、整数单元、浮点单元(FPU)、数字信号处理(DSP)/单指令多数据(SIMD)单元或乘积累加(MAC)单元中的一个或多个。存取单元将数据读到L1缓存和除此之外的存储器,且写入来自L1缓存和除此之外的存储器的数据。整数单元执行整数指令,FPU执行浮点指令,DSP/SIMD单元具有对多个数据点同时执行相同操作的多个处理元件,以及MAC单元计算两个数字的乘积并将该乘积加到累加器中。
处理器100还可包括除图1所示的那些之外的功能元件(例如,缓存、存储器、寄存器文件等)。例如,处理器100还可包括分支预测器,其被配置成预测在已知导致可能的流变化的指令(诸如分支指令)的情况下程序流将采取哪个方向。分支预测是有用的,这是由于它使指令能够在知道分支指令的结果之前就被处理器100推测地执行。当分支预测器精确地预测程序流时,这将提高处理器100的性能。然而,如果分支预测器没有正确地预测分支方向,那么将出现在程序能继续进行之前需要被纠正的误预测。为了纠正误预测,被发送至ROB 106的推测性指令将被丢弃,且取指单元102开始从正确的程序分支提取指令。
应认识到,其他处理器可能不包括图1中所示的所有的功能元件(即,可省略图1中所示的功能元件中的一个或多个),且在一些示例中,可包括图1中未示出的额外的功能元件。
在处理器(例如,处理器100)上执行的程序可包括多种类型的指令,诸如,子程序调用和链接指令。
子程序调用和链接指令(其还可以在本文中被称为调用和链接指令;调用指令;分支和链接指令;或过程调用和链接指令)是跳转到在调用目的地址处的子程序(执行特定任务的一段代码)并且在已经执行子程序后返回到调用点的指令。特别地,子程序的最后指令是引导处理器返回到调用点并且开始执行指令的子程序返回指令。因此,子程序只能通过存储返回到调用点的链接的指令来调用。
处理器(例如,处理器100)开始执行子程序返回指令后的指令的地址在本文中被称为对于子程序返回指令的目标地址,但其也可以被称为返回地址。子程序返回指令的目标地址通常是程序中在子程序后要执行的调用和链接指令后的第一指令。对于某些类型的子程序调用和链接指令,关于对应的子程序返回指令的目标地址是程序中紧随着子程序调用和链接指令的指令的地址。这样的子程序调用和链接指令被称为紧凑子程序调用和链接指令。对于其它类型的子程序调用和链接指令,对应的子程序返回指令的目标地址可以是子程序调用和链接指令后的另一个指令的地址。具体地,一些类型的子程序调用和链接指令可以始终在程序中随后是延迟槽指令。延迟槽指令是跟随着分支指令但在该分支指令之前被执行的指令。对于这些类型的调用和链接指令,关于对应的子程序返回指令的目标地址是紧随着延迟槽指令的指令。
现在参考图2,其示出了主程序202的示意图,主程序202包括调用相同的子程序208的两条子程序调用和链接指令204和206。子程序调用和链接指令204或206的执行使得(i)对于对应的子程序返回指令的目标地址将被存储在返回寄存器中;以及(ii)跳转到子程序208的第一指令210。子程序的最后指令(子程序返回指令212)导致跳回到由返回寄存器指定的目标地址(例如,$31)处的目标指令214或216。
第一子程序调用和链接指令204是紧凑调用和链接指令,并且因此关于对应的子程序返回指令的目标指令214是在主程序202中紧随着第一子程序调用和链接指令204的指令。因此,关于对应的子程序返回指令的目标地址是目标指令214的地址(例如,主程序202的地址4)。相反地,第二子程序调用和链接指令206是非紧凑调用和链接指令,并且因此其后跟随着延迟槽指令218。因此,关于对应的子程序返回指令的目标指令216是在主程序202中紧随着延迟槽指令218的指令。因此,关于对应的子程序返回指令的目标地址是目标指令216的地址(例如,主程序202的地址11)。
子程序调用和链接指令包括但不限于表1中示出的指令。对本领域的技术人员将明显的是这些仅是示例并且本文所描述的方法和技术可用于其它子程序调用和链接指令。
表1
子程序返回指令的示例在表2中示出。对本领域的技术人员将明显的是这些仅是示例并且本文所描述的方法和技术可用于其它子程序返回指令。
表2
如上所述,处理器100的取指单元102从如由程序计数器(PC)指示的程序(以程序顺序)提取指令。通常顺序地执行程序中的指令,除非存在控制转移指令(CTI)(改变程序的方向的指令),诸如分支指令或跳转指令。当顺序地执行指令时,下一条指令的地址很容易被计算为当前指令的地址加上固定偏移(例如,指令的长度)。然而,当执行控制转移指令时,下一条指令的地址经常需要一些时间来计算(例如,可能必须读取一个或多个寄存器等),其可导致在提取用于执行的下一条指令中的延迟。为了缓解这种问题,已经设计了分支预测器,其用于预测分支指令后的下一条指令的地址。
如上所述,当分支预测器精确地预测程序流程时,这将提高处理器100的性能。然而,如果分支预测器没有正确地预测分支方向,那么将出现在程序能继续进行之前需要被纠正的误预测。
由于关于子程序返回指令的目标地址通常可以从对应的子程序调用和链接指令的地址确定,因此可以通过检测子程序调用和链接指令并且将关于对应的子程序调用和链接指令的目标地址存储在返回预测栈(RPS)中来预测关于子程序返回指令的目标地址。具体地,当检测到调用和链接指令时,将对应的子程序返回指令的预测的目标地址压入到RPS上,并且然后在检测到子程序返回指令时,预测的目标地址随后从RPS中弹出。
现在参考图3,其图示了示例取指单元302,取指单元302可用作图1的取指单元102,该取指单元302包括用于存储子程序返回指令的预测的目标地址的返回预测栈304。
取指单元302被实现为具有三级的流水线-提取(FE)级306、缓存(FC)级308和选择(FS)级310。
在FE级306期间,程序计数器选择器逻辑312将程序计数器(PC)设置为待提取的下一个指令束的地址,并且生成且输出将由FC级308使用的基于PC的索引。在某些情况下,索引是PC的位的子集。哪些PC位形成索引的部分可以基于指令缓存的大小。程序正在顺序地执行的情况下,程序计数器选择器逻辑312将PC增量到程序中下一个指令束的地址(例如,程序计数器选择器逻辑312可以将PC增量等于指令束的大小的偏移量)。然而,在已经存在CTI的情况下,程序计数器选择器逻辑312可以从另一个模块(例如,RPS 304)接收另一个地址,其指示应该提取另一个地址处的指令束。程序计数器选择逻辑312可被认为是多路复用器,其基于从一个或多个其它模块或逻辑块(例如,RPS 304)接收的一个或多个输入来选择程序计数器的地址。
在FC级308期间,由FE级306生成的索引用来从指令缓存314中提取下一个要执行的指令束。针对由程序计数器选择逻辑312生成的索引,如果在指令缓存314中找到匹配,那么匹配索引的指令束被输出到FS级310。
在FS级310期间,从FC级308接收的指令束由部分解码逻辑316解码,以便识别子程序调用和链接指令以及子程序返回指令。如果部分解码逻辑316在所接收的指令束中识别到子程序调用和链接指令,那么根据子程序调用和链接指令的地址以及指令类型预测对应的子程序返回指令的目标地址,并且将其压入到RPS 304上。如果部分解码逻辑316识别到子程序返回指令,那么最近添加到RPS 304的预测的目标地址被弹出并且被发送到FE级306。
现在参考图4,其示出了图3的RPS 304的示例结构。
栈通常用来提供暂时存储的区域并且被实现为后进先出(LIFO)存储资源(其可选地涉及先进后出FILO),使得严格按照数据被添加到栈的相反的顺序从栈中移除数据。栈可以被认为从栈起始点增长或减少;然而,在任一情况下,作为栈上最近添加的元素的栈顶可以由顶部指针标识。
出于下面描述的目的,栈并且特别是返回预测栈(RPS)被认为增长,使得在数据被压入到栈时栈指针的值增加,以及在从栈中弹出数据时栈指针的值减小。然而,将了解到,如果栈和/或RPS被认为减少(其中,在数据被压入到栈时栈指针的值减小并且在从栈中弹出数据时栈指针的值增加),本文所描述的方法同样适用。
在图4的示例中,RPS 304的结构是具有顶部指针402的LIFO缓冲器,顶部指针402指向栈上最近创建的条目。每个条目包括有效数据404和目标地址数据406。有效数据404指示目标地址数据是否有效;以及目标地址数据406用来存储关于子程序返回指令的预测的目标地址。
当部分解码逻辑316检测到子程序调用和链接指令时,部分解码逻辑316根据调用和链接指令的地址以及子程序调用和链接指令的类型预测对应的子程序返回指令的目标地址。例如,部分解码逻辑316可以将对应于紧凑子程序调用和链接指令的子程序返回指令的目标地址预测为紧随着子程序调用和链接指令的指令的地址;以及部分解码逻辑316可以将对应于非紧凑子程序调用和链接指令的子程序返回指令的目标地址预测为紧随着延迟槽指令的指令的地址(即,紧随着子程序调用和链接指令的第二指令的地址)。
一旦已经预测对应的子程序返回指令的目标地址,将其压入到RPS 304上。这可能涉及将顶部指针402调整(例如,增量)到RPS 304的下一个空闲的条目或槽,将预测的目标地址存储为由顶部指针指向的条目或槽的目标地址数据406,并且将有效数据404设置为指示对应的目标地址数据406是有效的。
当部分解码逻辑316检测到子程序返回指令时,如果由顶部指针指向的RPS的条目具有有效的目标地址数据406(例如,有效数据404指示目标地址数据406是有效的),那么预测的目标地址从RPS 304中弹出。这可能涉及输出预测的目标地址,清除有效数据404并且调整(例如,减量)顶部指针402以指向RPS 304的下一个有效的条目或槽。
现在参考图5,其示出了如何通过图3的取指单元302提取示例程序的指令的示例。具体地,图5示出在特定的周期中取指单元302的每个级的输出涉及到哪个指令束。例如,在周期A中,FE级306的输出(例如,索引/PC)涉及指令束1。
在图5中示出的示例中,在周期A中,FE级306将PC设置为指令束1的地址。在周期B中,FE级306将PC设置为下一个指令束(例如,指令束2)的地址并且FC级308提取指令束1。在周期C中,FE级306将PC设置为下一个指令束(例如,指令束3)的地址,FC级308提取指令束2,并且FS级310对指令束1进行解码。因此,在周期A、B和C中,按顺序次序对指令进行提取和解码。
然而,在周期D中,FS级310检测到子程序调用和链接指令(例如,JAL),其指示在程序的方向中的变化。具体地,其指示下一个要执行的指令束不是紧随着当前指令束(例如,指令束3)的指令束。因此,FS级310向FE级306通知子程序调用和链接指令的目标地址,其使得FE级306将PC设置为调用和链接指令的目标地址(例如,指令束20的地址)。FS级310还预测关于对应的子程序返回地址的目标地址(在此情况下,其是指令束3的地址)并且将预测的目标地址存储在RPS 304中。
在周期D中,FC级308已经提取指令束3,但指令束3不再是下一个要执行的指令束,所以在下面的周期中(例如,周期E),指令束3被FS级310丢弃并且FS级310并不产生任何有用的输出。这被称为CTI气泡。
取指单元然后继续以程序顺序(例如,周期F)提取指令。
在周期G中,FS级310检测到子程序返回指令(例如,JR$31),其指示在程序的方向中的变化。具体地,其指示下一个要执行的指令束不是紧随着当前指令束(例如,指令束22)的指令束。FS级310然后从RPS弹出最近添加的有效目标地址(例如,在周期D中生成且存储的目标地址)并且向FE级306提供该目标地址(在此情况下为指令束3的地址)。这使得FE级306将PC设置为目标地址(即,指令束3的地址)。
在周期G中,FC级308已经提取指令束22,但指令束22不再是下一个要执行的指令束,所以在下面的周期中(例如,周期H),指令束22被FS级310丢弃并且FS级310并不产生任何有用的输出。这被称为CTI气泡-由控制转移指令造成的延迟。
只有在周期I中,FS级310接收且处理指令束3。
从图5可以看出,紧随着具有子程序调用和链接指令的指令束的指令束(例如,指令束3)在周期D中的FC级308中提取,并且在识别子程序指令后再次在周期H中的FC级308中提取。本发明人已经识别到,在某些情况下,如果紧随着包括子程序调用和链接指令的指令束的指令束被存储,那么周期并不需要被浪费在重新检索已经提取的指令束。具体地,代替周期H对于FS级310是空的周期,存储的指令束可以在已经检测到子程序返回地址之后被馈送给FS级310,其消除了子程序返回指令后的CTI气泡。
图6-16将用来描述改进的取指单元,其中除了存储对于子程序返回指令的预测目标地址外,在某些情况下,还存储对于子程序返回指令的预测的目标指令束。对于子程序返回指令的“目标指令束”是包括对于子程序指令的目标指令的指令束。如上所述,目标指令是由目标地址指向的指令。相应地,对于子程序返回指令的预测的目标指令束包括在预测的目标地址处的指令。
现在参考图6,其图示修改的取指单元602的示例,修改的取指单元602可用作图1的处理器100的取指单元102。修改的取指单元602具有用于存储对于子程序返回指令的预测的目标指令束的修改的RPS 604。如同图3的取指单元302,修改的取指单元602实现具有三级的流水线-提取(FE)级606、缓存(FC)级608和选择(FS)级610。FE级606和FC级608通常以与图3的取指单元302的FE级306和FC级308相同的方式进行操作。
具体地,在FE级606期间,程序计数器选择器逻辑612将程序计数器(PC)设置为下一个待提取的指令束的地址,并且生成且输出基于其的索引以便由FC级606用来提取指令束。当程序正在被顺序地执行时,程序计数器选择器逻辑612将PC增量到程序中下一个指令束的地址。然而,在已经检测到CTI指令(指示方向中的改变)的情况下,则FS级610可以提供用作下一个PC的替换地址。例如,如以下更详细描述的,当FS级610检测到子程序返回指令并且存在存储在修改的RPS 604中的有效目标地址时,则FS级610可以基于目标地址向程序计数器选择器逻辑612提供用作下一个PC的新的地址。如上所述,程序计数器选择器逻辑612可以被认为是多路复用器,其基于从一个或多个其它模块或逻辑块(例如,RPS 604)接收的一个或多个输入来选择用于程序计数器的地址。
在FC级608期间,由FE级606生成的索引用来提取由PC指示的地址处的指令束。具体地,在FC级608期间,索引用来搜索指令缓存614。对于索引,如果在指令高速缓存614中找到匹配,那么与该索引相关联的指令束被输出到FS级610。
在FS级610期间,修改的部分解码逻辑616接收从FC级608输出的指令束并且部分地对其中包含的指令进行解码,以便识别子程序调用和链接指令以及子程序返回指令。在某些情况下,修改的部分解码逻辑616可以被配置为通过分析指令束内包含的指令的操作(OP)码来识别子程序调用和链接指令和/或子程序返回指令。然而,对本领域的技术人员将明显的是任何用于识别特定类型的指令的机制可以由修改的部分解码逻辑616使用以识别子程序调用和链接指令以及子程序返回指令。
如同图3的取指单元302的部分解码逻辑316,如果图6的修改的部分解码逻辑616识别到所接收的指令束中的指令中的一个包括子程序调用和链接指令,那么修改的部分解码逻辑616预测关于对应的子程序返回指令的目标地址(即,返回地址)并且将预测的目标地址压入到修改的RPS 604上。如上所述,对应的子程序返回指令的目标地址可以被预测为从子程序调用和链接指令的地址偏移的地址。
例如,修改的部分解码逻辑616可以被配置为将用于对应于紧凑子程序调用和链接指令的子程序返回指令的目标地址预测为紧随着紧凑子程序调用和链接指令的指令的地址(例如,子程序调用和链接指令的地址加上等于指令的大小的偏移量);以及修改的部分解码逻辑616可以被配置为将用于对应于非紧凑子程序调用和链接指令的子程序返回指令的目标地址预测为紧随着延迟槽指令的指令的地址(例如,子程序调用和链接指令的地址加上等于两指令的大小的偏移量)。
然而,与图3的部分解码逻辑316不同,如果修改的部分解码逻辑616识别到指令束中的指令中的一个是子程序调用和链接指令,那么如果满足特定条件,则修改的部分解码逻辑616还可以导致后面的指令束(即,当前被FC级608提取的指令束)与预测的目标地址一起存储作为预测的目标指令束。具体地,在FS级610正在对指令束X进行解码的周期中,FC级608通常将提取紧随着指令束X的指令束(例如,指令束X+1)。如果对应的子程序返回指令的预测的目标地址指向指令束X+1中的指令(因此,目标指令束是指令束X+1),那么响应于检测到对应的子程序返回指令,可以通过存储指令束X+1而不是通过重新提取该指令来节省时间和资源。
因此,如果修改的部分解码逻辑616识别到指令束包括子程序调用和链接指令,修改的部分解码逻辑616确定(i)关于对应的子程序的预测的目标指令束是否是紧随着当前指令束的指令束(例如,关于对应的子程序返回指令的预测的目标地址指向紧随着当前指令束(该指令束包括检测到的子程序调用和链接指令)的指令束中的指令);以及(ii)FC级608是否是活动的。
在某些情况下,修改的部分解码逻辑616可以被配置为基于预测的目标地址来确定关于对应的子程序返回指令的目标指令束是否是紧随着的指令束。在其它情况下,修改的部分解码逻辑616可以被配置为基于当前指令束的格式来确定目标指令束是否是紧随着的指令束。
如上所述,对于紧凑子程序调用和链接指令,关于对应的返回地址的目标地址可以被预测为紧随着子程序调用和链接指令的指令的地址。因此,如果紧凑子程序调用和链接指令是当前指令束(即,当前正在解码的指令束)中的最后指令,则关于对应的子程序返回指令的预测的目标地址将指向下一个指令束中的指令,否则目标地址将指向相同的指令束中的指令。
相反地,对于非紧凑子程序调用和链接指令(即,随后是延迟槽指令的子程序调用和链接指令),关于对应的返回地址的目标地址可以被预测为紧随着延迟槽指令的指令的地址。因此,如果非紧凑子程序调用和链接指令是当前指令束的最后指令,或者如果延迟槽指令是当前指令束(即,当前正在解码的指令束)的最后指令,那么关于对应的子程序返回指令的预测的目标地址将指向后面指令束中的指令。
当每个指令束包括两条指令时,在第X指令束包括子程序调用和链接指令时是否将第X+1指令束压入到修改的RPS 604上的决定在表3中进行总结。
表3
从表3中可以看出,当每个指令束具有两条指令并且子程序调用和链接指令是非紧凑指令时,关于对应的子程序调用和返回指令的目标地址将始终指向后面指令束中的指令。具体地,如果非紧凑子程序调用和链接指令是两条指令的束(例如,指令束X)中的第一指令,那么关于对应的子程序返回指令的目标地址是紧随的指令束(例如,指令束X+1)中的第一指令。然而,如果非紧凑子程序调用和链接指令是两条指令的束(例如,指令束X)中的第二指令,那么关于对应的子程序返回指令的目标地址是紧随的指令束(例如,指令束X+1)中的第二指令。在任一情况下,于是,目标指令束是紧随的指令束(例如,指令束X+1)。因此,其中指令束具有二的大小的情况下,当修改的部分解码逻辑检测到非紧凑调用和链接指令并且FC级608是活动的时,那么修改的部分解码逻辑616可以通过始终使下一个指令束保存在RPS 604中来进行简化。
因此,修改的部分解码逻辑616可以被配置为如果识别的子程序调用和链接指令是作为指令束中的最后指令的紧凑子程序调用和链接指令,或者如果识别的子程序调用和链接指令是非紧凑子程序调用和链接指令,其中非紧凑子程序调用和链接指令或对应的延迟槽指令是指令束的最后指令,则确定指令束具有预定的形式。
如果修改的部分解码逻辑616确定关于对应的子程序返回指令的目标指令束是紧随着当前指令束的指令束;以及FC级608是活动的(指示其当前正在提取紧随着当前指令束的指令束),那么修改的部分解码逻辑616可以使当前正在被FC级608提取的指令束作为对应的子程序返回指令的目标指令束连同保存的目标地址保存在修改的RPS 604中。
由于当前在FC级608中被提取的指令束并不被输出直到后面的周期,因此修改的部分解码逻辑616可以被配置为设置指示器(诸如,标志618),其指示在随后的周期中,从FC级608接收的指令束应该保存在修改的RPS 604中。因此,在下一个周期中,修改的部分解码逻辑616将首先确定标志618是否被设置,如果是,则将从FC级608接收的指令束保存在修改的RPS 604中的最近保存到修改的RPS 604的目标地址旁边。
在某些情况下,当修改的部分解码逻辑616确定关于对应的返回指令的目标指令束不是紧随着当前指令束的指令束时,修改的部分解码逻辑616被配置为确定关于对应的子程序指令的目标指令是否是当前指令束。如果确定关于对应的子程序返回指令的目标指令束是当前指令束,那么当前指令束被压入到修改的RPS 604上。由于当前指令束可以立即存储在RPS中,所以没有设置标志。
参考图9,将描述用于确定何时将数据压入到修改的RPS 604以及将什么数据压入到修改的RPS 604的示例方法。
修改的部分解码逻辑616还被配置为识别所接收的指令束中的子程序返回指令。如果修改的部分解码逻辑616在所接收的指令束中识别到子程序返回指令并且修改的RPS604的顶部条目具有有效的目标地址,那么将目标地址从修改的RPS 604中弹出并且用来生成下一个待提取的指令束的地址。
如果满足特定条件,那么任何预测的目标指令束也从修改的RPS 604中弹出并且存储在指令存储模块619中。在随后的周期中,修改的部分解码逻辑616将获得存储在指令存储模块619中的指令束并且对其解码。
特定条件可以是修改的RPS 604在修改的RPS 604的顶部条目中具有有效的目标指令束数据,并且包括子程序返回指令的指令束是指定的形式。例如,如以下更详细描述的,在某些情况下,指令束可以被认为是指定的形式,如果子程序返回指令是紧凑子程序返回指令并且子程序返回指令是指令束中的最后指令;或者如果子程序返回指令是非紧凑子程序返回指令(即,其后跟随着延迟槽指令)并且延迟槽指令是指令束中的最后指令。
当每个指令束包括两条指令时,在第X指令束包括子程序返回指令时是否将目标指令束从修改的RPS 604中弹出的决定在表4中进行总结。
表4
如以下更详细描述的,这消除了子程序返回指令之后的CTI气泡,在某些情况下,其可以显著地提高修改的取指单元602和在其中其形成一部分的处理器的性能。
当数据从修改的RPS 604中弹出时,下一个待提取的指令束将取决于是否从修改的RPS 604中弹出关于子程序返回指令的目标指令束。具体地,如果关于子程序返回指令的指令束从修改的RPS 604中弹出,那么弹出的指令束在下一个周期中被提供给FS级610并且下一个待提取的指令束是紧随着所存储的指令束的指令束。由于存储在修改的RPS 604中的目标地址是存储在修改的RPS 604中的指令束的地址,因此下一个待提取的指令束的地址可以通过将偏移量(例如,等于指令束的大小)添加到存储的目标地址来计算。相反地,如果关于子程序返回指令的目标指令束没有从修改的RPS 604中弹出,那么下一个待提取的指令束的地址是从修改的RPS 604中弹出的目标地址。
因此,FS级610可包括下一个束逻辑620,其被配置为基于对应的指令束是否从修改的RPS 604弹出来计算且输出下一个待提取的指令束的地址。参考图15,描述了用于确定下一个待提取的指令束的地址的示例方法,该示例方法可由下一个束逻辑620执行。
现在参考图7,其示出了图6的修改的RPS 604的示例结构。
图7的示例的修改的RPS 604的结构是具有顶部指针702的LIFO缓冲器,顶部指针702指向栈上最近修改的条目。每个条目可包括地址有效数据704、目标地址数据706、束有效数据708和/或目标束数据710。地址有效数据704指示对应的目标地址数据706是否是有效的;目标地址数据706用来存储关于子程序返回指令的预测的目标地址;束有效数据708指示对应的目标束数据710是否是有效的;以及目标束数据710用来存储关于子程序返回指令的预测的目标指令束。
如上所述,当修改的部分解码逻辑616检测到子程序调用和链接指令时,修改的部分解码逻辑616根据子程序调用和链接指令的地址和调用和链接指令的类型来预测关于对应的子程序返回指令的目标地址。例如,在某些情况下,其中调用和链接指令是紧凑调用和链接指令,关于对应的子程序返回的目标地址可以被预测为紧随着调用和链接指令的指令的地址;以及在调用和链接指令是非紧凑调用和链接指令的情况下,关于对应的子程序返回指令的目标地址可以被预测为紧随着延迟槽指令的指令的地址(例如,紧随着延迟槽指令的第二指令的地址)。
一旦已经预测关于对应的子程序返回指令的目标地址,修改的部分解码逻辑616将预测的目标地址压入到修改的RPS 604上。将预测的目标地址压入到修改的RPS 604上可涉及将顶部指针702调整(例如,增量)为指向修改的RPS 604的下一个空闲条目;将预测目标地址存储为由顶部指针702指向的条目的目标地址数据706,并且将对应的地址有效数据704设置为指示目标地址数据是有效的。
如上所述,修改的部分解码逻辑616还可以确定是否满足特定条件,其指示当前由FC级606正在提取的指令束也应该存储在修改的RPS 604中(例如,关于对应的子程序返回指令的目标指令束是紧随着当前指令束的指令束;并且FC级606是活动的)。如果修改的部分解码逻辑616确定满足条件,那么修改的部分解码逻辑616通过例如设置标志618来指示当前正在由FC级606提取的指令束应该被存储在修改的RPS 604中。
在紧随的周期中,修改的部分解码逻辑616看到标志618被设置并且然后将所接收的指令束存储在修改的RPS 604中的最近修改的条目中。这可涉及将所接收的指令束存储为由顶部指针702指向的条目的目标束数据710,并且将对应的束有效数据708设置以指示目标指令束数据是有效的。注意到,此时没有增量顶部指针702。
当修改的部分解码逻辑616检测到子程序调用和链接指令时,如果修改的RPS 604的由顶部指针702指向的条目具有有效地址数据,那么目标地址数据从修改的RPS 604中弹出并且用来确定下一个待提取的指令束的地址。
如上所述,修改的部分解码逻辑616还可以确定是否满足特定条件,其指示任何有效的目标指令束是下一个待解码的指令束。如果修改的部分解码逻辑616确定满足条件,那么如果修改的RPS 604的由顶部指针702指向的条目具有有效的指令束数据,那么指令束数据从修改的RPS 604中弹出并且在下一个周期中由FS级610进行解码。
一旦已经输出目标地址和/或目标指令束,则清除有效的数据指示器(例如,地址有效数据704和束有效数据708)来指示对应的数据不是有效的并且减量顶部指针702。
现在参考图8,其图示用于将数据压入到修改的RPS 604和从修改的RPS 604中弹出数据的示例方法800,其每个周期可以由FS级610执行。方法800在块802处开始,其中响应于识别所接收的指令束中的子程序调用和链接指令,修改的部分解码逻辑616将预测的目标地址和/或预测的目标指令束压入到修改的RPS 604上。例如,如上所述,响应于识别所接收的指令束中的子程序调用和链接指令,修改的部分解码逻辑616将对应的返回指令的预测的目标地址存储在修改的RPS 604中;以及如果满足特定条件,则预测的目标指令束也被存储在修改的RPS 604中。参考图9描述了用于实现块802的示例方法。
在块804处,响应于检测到子程序返回指令,修改的部分解码逻辑616从修改的RPS604中弹出预测的目标地址和/或预测的目标指令束。例如,如上所述,响应于识别到所接收的指令束中的子程序返回指令,修改的部分解码逻辑616从修改的RPS 604中弹出第一有效的预测目标地址;以及如果满足特定条件,那么任何有效存储的目标指令束被输出并且用作下一个周期中对FS级610的输入。参考图12描述了用于实现块804的示例方法。
在块806处,如果在块804中数据从修改的RPS 604中弹出和/或输出,那么下一个束逻辑620基于预测的目标地址生成下一条指令的地址。例如,如上所述,只要目标地址从修改的RPS 604中输出或弹出,那么下一个束逻辑620可以被配置为将下一个待提取的指令束的地址设置为预测的目标地址。然而,如果预测的目标地址和预测的目标指令束从修改的RPS 604中输出或弹出,那么下一个束逻辑620可以被配置为将下一个待提取的指令束的地址设置为紧随着预测的目标指令束的指令束(即,预测的目标地址+1指令束)。参考图15描述了用于实现块806的示例方法。
现在参考图9,其图示了用于将数据压入到修改的RPS 604的示例方法900,其可以每个周期由修改的部分解码逻辑616执行。方法900在块902处开始,其中修改的部分解码逻辑616确定标志618是否被设置。如上(以及下面有关块912到918)所述,如果在特定的周期中,修改的部分解码逻辑616识别子程序调用和链接指令并且满足用于存储当前正在提取的指令束的特定条件,那么设置标志618来通知修改的部分解码逻辑616在下一个周期中所接收的指令束将被压入到修改的RPS 604上。
因此,如果修改的部分解码逻辑616确定已设置标志618,那么修改的部分解码逻辑616知道在上一个周期中检测到子程序调用和链接指令并且已经满足用于存储所接收的指令束的条件,从而方法900进行到块904和906,其中所接收的指令束被压入到修改的RPS604上并且标志618被清除。方法然后在908结束。然而,如果修改的部分解码逻辑616确定没有设置标志618,那么方法900进行到块910。
在块910处,修改的部分解码逻辑616部分地解码所接收的指令束中的指令以便确定所接收的指令束中的任何指令是否是子程序调用和链接指令。如上所述,解码指令可包括使用OP码来识别指令的类型。然而,对本领域的技术人员将明显的是,其它方法和技术可以用于部分解码指令以识别子程序调用和链接指令。一旦已经部分地解码所接收的指令束中的指令,方法900进行到块912。
在块912处,修改的部分解码逻辑616确定所接收的指令束中的任何指令是否是子程序调用和链接指令。如果在所接收的指令束中没有指令是子程序调用和链接指令,那么方法900在908结束。然而,如果在所接收的指令束中的指令中的一个是子程序调用和链接指令,那么方法900进行到块914和916,其中确定是否满足用于存储当前正在由FC级608提取的指令束的条件。
在块914处,修改的解码逻辑616确定FC级608是否是活动的,其指示FC级608当前正在提取指令束。修改的部分解码逻辑616可以通过例如查询FC级608的状态或者通过接收来自FC级608的指示其状态的指示来确定FC级608是否是活动的。如果修改的部分解码逻辑616确定FC级608不是活动的并且从而当前没有提取指令束,则方法进行到块920。然而,如果修改的部分解码逻辑616确定FC级608是活动的并且从而当前正在提取指令束,则方法900进行到块916。
在方法916处,修改的部分解码逻辑616确定关于对应的子程序返回指令的预测目标指令束是否是紧随着当前指令束的指令束。在某些情况下,修改的部分解码逻辑616可以被配置为预测关于对应的子程序返回指令的目标地址,并且基于预测的目标地址来确定关于对应的子程序返回指令的预测的目标指令束是否是紧随着当前指令束的指令束。例如,基于预测的目标地址是否指向紧随着当前指令束的指令束中的指令,修改的部分解码逻辑616可以确定关于对应的子程序返回指令的预测目标指令束是否是紧随着当前指令束的指令束。
在其他情况下,基于当前指令束是否具有特定的形式,修改的部分解码逻辑616可以确定关于对应的子程序返回指令的预测的目标指令束是否是紧随着当前指令束的指令束。如上所述,修改的部分解码逻辑616可以被配置为如果为以下(a)或者(b)则确定当前指令束具有特定形式:(a)识别的子程序调用和链接指令是位于指令束的最后槽中的紧凑调用和链接指令;(b)识别的调用和链接指令是非紧凑调用和链接指令(即,其后跟随延迟槽指令),并且非紧凑调用和链接指令或对应的延迟槽指令在指令束的最后的槽中。如果确定指令束具有特定的形式,那么满足用于存储随后的指令束的条件并且方法900进行到块918。然而,如果束不具有特定的形式,那么不满足用于将随后的指令束存储在修改的RPS604中的条件并且方法900进行到块920。
在某些情况下,如果修改的部分解码逻辑616确定关于对应的返回指令的预测的目标指令束不是紧随着当前指令束的指令束,那么在进行到块920之前,修改的部分解码逻辑616可以被配置为确定关于对应的子程序指令的预测的目标指令束是否是当前指令束。如果确定关于对应的子程序返回指令的预测的目标指令束是当前指令束,那么修改的部分解码逻辑616可以将当前的指令束压入到修改的RPS 604上并且可以设置目标束有效数据。方法900然后继续进行到块920。
在块918处,修改的部分解码逻辑616设置标志618或其它指示器,使得修改的部分解码逻辑616将下一个周期中接收的指令束压入到修改的RPS 604上。一旦已经设置标志618或其它指示器,则方法900进行到块920。
在块920处,修改的部分解码逻辑616预测对应的子程序返回指令的目标地址,并且然后将目标地址压入到修改的RPS 604上。如上所述,对应的子程序返回指令的目标地址可以基于在块912中识别的子程序调用和链接指令的地址以及指令的类型。例如,在某些情况下,对于紧凑子程序调用和链接指令,对应的子程序返回地址的目标地址可以被预测为紧随着子程序调用和链接指令的指令的地址。然而,对于非紧凑子程序调用和链接指令,对应的子程序返回指令的目标地址可以被预测为紧随着延迟槽指令的地址。
一旦已经预测关于对应的子程序返回指令的目标地址,其被压入到修改的RPS604上,这可涉及将顶部指针调整(例如,增量)为指向修改的RPS 604的下一个空闲的条目或槽,将预测的目标地址存储为目标地址数据706,并且将有效地址数据设置为指示目标地址数据是有效的。一旦目标地址已经被压入到修改的RPS 604上,则方法900在908结束。
现在参考图10和图11,其图示了示例时序图,该时序图示出了当图9的方法900用来将数据压入到修改的RPS 604时,图6的修改的取指单元602在几个周期内的状态。具体地,图10示出了修改的取指单元602当满足用于将下一个指令束存储在修改的RPS 604中的条件的调用和链接指令移动通过取指流水线时的状态;以及图11示出了修改的取指单元当并不满足用于将下一个指令束存储在修改的RPS 604的条件的子程序调用和链接指令移动通过取指流水线时的状态。在图10和图11的示例中,每个指令束包括两个指令。
首先参考图10的示例,在第一周期(周期A)中,FE级606将程序计数器(PC)设置为束Z的地址,束Z是包括跟随有延迟槽指令的JAL指令(其是非紧凑子程序调用和链接指令)的束。在第二周期(周期B)中,FE级606将PC增量为指向下一个指令束(束Z+1),并且FC级608提取束Z。
在第三周期(周期C)中,FC级提取束Z+1并且FS级610解码束Z。由于指令束Z包括子程序调用和链接指令(JAL指令),因此FS级610预测关于对应的子程序返回指令的目标地址为紧随着延迟槽指令的指令的地址并且将预测的目标地址压入到修改的RPS 604中。具体地,FS级610使顶部指针增量,将预测的目标地址保存作为目标地址数据并且设置有效地址数据(例如,将有效地址位设置为一)以指示对应的目标地址数据是有效的。
另外,由于束Z是预定的形式(跟随有延迟槽指令的非紧凑子程序调用和链接指令)并且FC级608是活动的,因此满足用于存储当前正在FC级608中被提取的束(束Z+1)的条件,并且因此FS级610设置标志618。
进一步地,由于束Z包括CTI(例如,JAL指令),下一个待提取的束不是束Z+1而是在关于JAL指令的目标地址处的束。如果目标地址是可用的,则将其提供给FE级606,如此PC可以被设置为目标地址。
在第四周期(周期D)中,FE级606将PC设置为下一个指令束(目标指令束+1)并且FC级608提取关于子程序调用和链接指令(例如,JAL指令)的目标指令束。FS级610从FC级608接收指令束Z+1,但是由于标志618已被设置,因此指令束Z+1不被解码或输出,只是将其压入到修改的RPS 604上。FS级610然后清除标志618。
因此,可以在此示例中看出,关于对应的子程序返回指令的预测的目标地址和预测的目标指令束均存储在修改的RPS 604中以由于随后使用。
现在参考图11的第二示例,在第一周期(周期A)中,FE级606将程序计数器(PC)设置为指令束Y的地址,指令束Y是包括其后跟随有指令的JIALC指令(其是紧凑子程序调用和链接指令)的束。在第二周期(周期B)中,FE级606将PC增量以指向下一个指令束(指令束Y+1),并且FC级608提取指令束Y。
在第三周期(周期C)中,FC级608提取指令束Y+1并且FS级610解码指令束Y。由于指令束Y包括紧凑子程序调用和链接指令(JIALC指令),FS级610预测关于对应的子程序返回地址的目标地址为紧随着调用和链接指令的指令的地址并且将预测的目标地址压入到修改的RPS 604上。具体地,FS级610增量顶部指针,将预测的目标地址保存作为目标地址数据706并且设置有效地址数据708以指示目标地址数据706是有效的(例如,将有效地址位设置为一)。
然而,相反于图10的示例,束Y并不满足用于将下一个指令束存储在修改的RPS604中的条件,这是由于预测目标地址是指令束Y中的第二指令,因此标志618没有被设置。然而,由于预测的目标地址指向当前的指令束(指令束Y)中的地址,(从而当前的指令束(指令束Y)是预测的目标指令束)当前的指令束被压入到修改的RPS 604上。
进一步地,由于指令束Y包括CTI(例如,JAL指令),下一个待提取的束不是束Y+2而是在关于JAL指令的目标地址处的束。如果目标地址是可用的,则将其提供给FE级606,如此PC可以被设置为目标地址。
在第四周期(周期D)中,FE级606将PC设置为下一个指令束(目标指令束+1)并且FC级608提取关于子程序调用和链接指令(例如,JIALC指令)的目标指令束。FS级610从FC级608接收束Y+1,但是由于没有设置标志,FS级610只是将其丢弃。
因此,可以在此示例中看出,如同图10的示例,关于对应的子程序返回指令的预测的目标地址和预测的指令束均存储在修改的RPS 604中以用于随后使用。然而,在此示例中,预测的指令束是当前的指令束,因此,其被立即存储在修改的RPS 604中而不是必须等待用于将预测的目标指令束压入到修改的RPS 604的周期。
现在参考图12,其图示了用于从修改的RPS 604中弹出数据的示例方法1200,其可以每个周期由修改的部分解码逻辑616执行。方法1200在块1202处开始,其中修改的部分解码逻辑616部分地解码所接收的指令束以确定其是否包括子程序返回指令。在某些情况下,修改的部分解码逻辑616可以被配置为分析所接收的指令束中的指令的OP码以确定指令束中的任何指令是否是子程序返回指令。一旦指令束已经被部分地解码,则方法1200进行到块1204。
在块1204处,修改的部分解码逻辑616确定指令束中的任何指令是否是子程序返回指令。如果确定指令束中没有指令是子程序返回指令,那么方法1200在1206结束。然而,如果确定指令束中的指令中的一个是子程序返回指令,则方法1200进行到块1208。
在块1208处,修改的部分解码逻辑616确定存储在修改的RPS 604的顶部条目中的目标地址数据706是否是有效的。在某些情况下,修改的部分解码逻辑616可以被配置为分析地址有效数据704以确定对应的目标地址数据706是否是有效的。在地址有效数据704被实现为一位的情况下,修改的部分解码逻辑616可以确定如果地址有效位被设置,则存储在修改的RPS 604的顶部条目中的目标地址是有效的。如果修改的部分解码逻辑616确定存储在修改的RPS 604的顶部条目中的目标地址不是有效的,那么方法1200在1206结束。然而,如果修改的部分解码逻辑616确定目标地址数据706是有效的,那么方法进行到块1210。
在块1210处,修改的部分解码逻辑616确定指令束是否具有特定的形式,该形式指示下一个要执行的指令束是预测的目标指令束。例如,如上所述,如果识别的子程序返回指令是紧凑子程序返回指令;或者如果识别的子程序返回指令是非紧凑子程序返回指令(即,其后跟随有延迟槽指令)并且对应的延迟槽指令是在与子程序返回指令相同的指令束中,则修改的部分解码逻辑616可以确定所接收的指令束具有特定的形式。
如果修改的部分解码逻辑616确定所接收的指令束不具有特定的形式,那么即使预测的目标指令束被保存在修改的RPS 604中,它也不被使用,这样方法1200进行到块1212,其中目标预测的地址从修改的RPS 604中弹出。然而,如果修改的部分解码逻辑616确定所接收的指令束具有特定的形式,那么如果有效预测的目标指令束已经存储在修改的RPS 604中,则预测的目标指令束可以在下一个周期中被馈送给FS级610,这样方法1200进行到块1214。
在块1214处,修改的部分解码逻辑616确定修改的RPS 604的顶部条目是否包括有效目标束数据710。在某些情况下,修改的部分解码逻辑616可以被配置为分析束有效数据708以确定修改的RPS 604的顶部条目是否包括有效目标束数据710。在束有效数据708被实现为一位的情况下,如果束有效位被设置,则修改的部分解码逻辑616可以确定存储在修改的RPS 604的顶部条目中的目标束数据是有效的。如果修改的部分解码逻辑616确定存储在修改的RPS 604的顶部条目中的目标指令束不是有效的,那么方法1200进行到块1212,其中目标地址从修改的RPS 604中弹出。然而,如果修改的部分解码逻辑616确定目标束数据710是有效的,则方法1200进行到块1216。
在块1216处,修改的部分解码逻辑616将顶部目标束数据710从修改的RPS 604中弹出。这可涉及输出顶部目标束数据710(由顶部指针702指向的条目中的目标束数据710),并且将其保存在指令存储模块619中。一旦目标束数据710已经从修改的RPS 604中弹出,则方法1200进行到块1212。
在块1212处,修改的部分解码逻辑616从修改的RPS 604中弹出目标地址数据706。这可涉及将顶部目标地址数据706输出到下一个束逻辑620,其中下一个待提取的束的地址是根据输出目标地址数据706来确定的。修改的部分解码逻辑616还可以清除有效数据字段(即,地址有效数据704和束有效数据708)并且调整(例如,减量)顶部指针702。一旦目标地址数据706已经从修改的RPS 604中弹出,则方法1200在1206结束。
现在参考图13和图14,其图示了示例时序图,该时序图示出了当图12的方法1200用来从修改的RPS 604中弹出数据时,图6的修改的取指单元602在几个周期内的状态。具体地,图13示出了修改的取指单元602当具有特定形式且对于其已经存储目标指令束的子程序返回指令移动通过取指流水线时的状态;以及图14示出了修改的取指单元当具有特定形式的、对于其没有存储目标指令束的子程序返回指令移动通过取指流水线时的状态。在图13和图14的示例中,每个指令束包括两个指令。
首先参考图13的示例,在第一周期(周期A)中,FE级606将程序计数器(PC)设置为指令束J的地址,指令束J包括跟随有延迟槽指令的JR$31指令(其是非紧凑子程序返回指令)。在第二周期(周期B)中,FE级606将PC增量到指向下一个指令束(指令束J+1),并且FC级608提取指令束J。
在第三周期(周期C)中,FC级提取指令束J+1并且FS级610对指令束J进行解码。由于指令束J包括子程序返回指令(JR$31指令)并且指令束是特定的形式(子程序指令是非紧凑子程序返回指令并且对应的延迟槽指令是在相同的指令束中),因此FS级610确定修改的RPS 604是否在顶部条目中包括有效的目标地址和有效的目标束。由于它确实包括(有效位均被设置),因此目标地址用来生成关于下一个待提取的束(其是紧随着目标束的束,在此情况下是束Z+2)的地址,其由FE级606使用以将PC设置到该地址;以及来自修改的RPS 604的目标束(在此示例中,指令束Z)被输出到指令存储模块619,这样其可以在下一个周期中由FS级610使用。
具体地,在第四周期(周期D)中,FS级610对存储在指令存储模块619中目标指令束(在此情况下,指令束Z+1)进行解码。
因此,可以在此示例中看出,响应于检测到子程序返回指令,预测的目标地址和预测的指令束均从修改的RPS 604中弹出。预测的目标地址用来生成下一个待提取的指令束的地址,以及预测的目标指令束在后面的周期中由FS级610使用。可以在此示例中看出,由子程序返回指令引起的CTI气泡已经被消除。
现在参考图14的示例,在第一周期(周期A)中,FE级606将程序计数器(PC)设置为指令束L的地址,指令束L包括其后跟随有JIC$31指令的指令(其是紧凑子程序返回指令)。在第二周期(周期B)中,FE级606将PC增量到指向下一个指令束(指令束L+1),并且FC级608提取指令束L。
在第三周期(周期C)中,FC级提取指令束L+1并且FS级610解码指令束L。由于指令束L包括子程序返回指令(JIC$31指令)并且指令束是特定的形式(子程序指令是紧凑子程序返回指令),因此FS级610确定修改的RPS 604是否在顶部条目中包括有效的目标地址和有效的目标束。由于修改的RPS 604只包括有效的目标地址,因此目标地址用来生成下一个要执行的束(其在此情况下是指令束Z+1)的地址,其由FE级606使用以将PC设置到该地址。
在第四周期(周期D)中,FC级608提取指令束Z+1,并且由于指令束L+1不再是下一个要执行的指令束,FS级610将其丢弃。
因此,可以在此示例中看出,响应于检测到子程序返回指令,只有预测的目标地址从修改的RPS 604中弹出。预测的目标地址用来生成下一个待提取的束的地址,并且FS级610必须等待一个周期以便接收下一个待解码的指令束。
现在参考图15,其图示了用于实现图8的方法800的块806的示例方法1500。具体地,方法1500是用于在预测的目标地址从修改的RPS 604弹出时生成下一个待提取的指令束的地址的示例方法,其每个周期可由下一个束逻辑620执行。
方法1500在块1502处开始,其中下一个束逻辑620确定目标地址是否从修改的RPS604中弹出的。下一个束逻辑620可以被配置为如果其从修改的RPS 604接收目标地址,则确定目标地址是否从修改的RPS 604中弹出的。如果下一个束逻辑620确定目标地址没有从修改的RPS 604中弹出,那么方法1500在1504结束。然而,如果下一个束逻辑620确定目标地址从修改的RPS 604中弹出,则方法1500进行到块1506。
在块1506处,下一个束逻辑620确定目标指令束是否也从修改的RPS 604中弹出。下一个束逻辑620可以被配置为从修改的部分解码逻辑616接收目标指令束已经被弹出的通知,并且从而在接收这样的通知时可以确定目标指令也从修改的RPS 604中弹出。在其它情况下,下一个束逻辑620可以被配置为读取指令存储模块619来看其是否包含有效数据。如果下一个束逻辑620确定目标指令束从修改的RPS 604中弹出,则方法1500进行到块1508。然而,如果下一个束逻辑620确定目标指令束没有从修改的RPS 604中弹出,则方法1500进行到块1510。
在块1508处,下一个束逻辑620将下一个待提取的束的地址设置为目标指令束后的指令束。例如,下一个束逻辑620可以将下一个待提取的束的地址设置为从修改的RPS604中弹出的预测的目标地址加上偏移量。具体地,如果预测的目标束从修改的RPS 604中弹出,那么下一个待解码并且要执行的束已经可用,因此FC级608可以直接提取预测的目标指令束后的下一个指令束。一旦下一个束逻辑620设置地址,则方法1500在1504结束。
在块1510处,下一个束逻辑620将下一个待提取的束的地址设置为目标束的地址。例如,下一个束逻辑620可以将下一个待提取的束的地址设置为从修改的RPS 604中弹出的预测的目标地址。具体地,由于目标束不是立即可用于被解码和执行,该目标束必须在下一个周期中由FC级608提取。一旦下一个束逻辑620设置地址,则方法1500在1504结束。
现在参考图16,其示出了示例时序图,该时序图图示了图6的修改的取指单元602在几个周期内的状态。如同图5的时序图,图16的时序图示出在特定的周期中修改的取指单元602的每个级的输出涉及哪个指令束。例如,在周期A中,FE级606的输出(例如,索引/PC)涉及指令束1。
因此,在周期A中,FE级606将PC设置为指令束1的地址。在周期B中,FE级606将PC设置为下一个指令束(例如,指令束2)的地址并且FC级608提取指令束1。在周期C中,FE级606将PC设置为下一个指令束(例如,指令束3)的地址,FC级608提取指令束2,并且FS级610对指令束1进行解码。因此,在周期A、B和C中,指令被按顺序提取。
然而,在周期D中,FS级610检测到子程序调用和链接指令(例如,JAL指令)。作为响应,FS级610预测对应的子程序返回指令的目标地址并且将其压入到修改的RPS 604上。另外,如果满足用于将下一个指令束存储在修改的RPS 604的条件(例如,下一个指令束被预测为目标指令束,并且FC级608是活动的),那么FS级610通过例如设置标志618向FS级610指示在后面的周期中所接收的指令束应该被压入到修改的RPS 604上。
然后,在周期E中,FS级610看到标志被设置,以及将指令束3存储在修改的RPS 604中作为预测的目标指令束数据并且清除标志618。
然后在周期G中,当FS级610检测到对应的子程序返回指令(例如,JR$31指令)时,FS级610弹出待在下一个周期(周期H)中由FS级610解码的、存储的预测目标指令束(例如,指令束3),并且FS级610弹出用于生成下一个待提取的指令束(在此情况下为指令束4)的地址的存储的预测目标地址。
在某些情况下,指令束可以在其已经保被存或被压入到修改的RPS 604上之后进行更新或无效。因此,在某些情况下,取指单元602还可以包括RPS控制器,该RPS控制器监视对指令缓存中的指令束的变化以及相应地更新修改的RPS 604。例如,在某些情况下,RPS控制器可以被配置为如果RPS控制器检测到对指令缓存中的相应的条目的变化,则自动地使修改的RPS 604中的预测的目标指令束无效(例如,清除束有效数据)。
现在参考图17,其示出了包括RPS控制器1702的取指单元的示例FS级610。为简单起见,不是所有的图6的取指单元602的组件都在图17中示出,但将明显的是,本文描述的RPS控制器1702可以用作图6的取指单元602的FS级610的一部分。
处理器并不通常具有足够的内存来存储整个程序,所以内存管理单元(MMU)用于将指令的虚拟地址(由处理器使用的地址,例如PC)映射到物理内存地址。当在FC级608中在指令缓存614搜索对应于PC的指令束时,指令缓存614可以使用索引(其从PC中生成)和标签(其从物理地址中生成)来搜索。
为了减少访问MMU 1704的次数,FC级608可以保持微型转换旁路缓冲器(TLB)1706,其可以用于将预定数目的虚拟地址缓存到物理地址映射。在这些情况下,微型TLB1706然后被用来生成用于指令高速缓存查找的标签。
为了确保微型TLB 1706中的数据保持更新,MMU 1704跟踪微型TLB 1706中的条目。当MMU 1704接收关于微型TLB 1706中的条目中一个的更新(例如,条目的变化或无效)时,该MMU 1704向微型TLB 1706发送对应的更新。如果适当,微型TLB 1706然后更新指令缓存。
RPS控制器1702可以被配置为监视从MMU 1704发送给微型TLB 1706的更新,以确定它们是否与修改的RPS 604中的指令束条目中的一个相关。由于微型TLB 1706中的条目由虚拟地址(例如,索引)和物理地址(标签)识别,因此在某些情况下,修改的部分解码逻辑616可以被配置为将标签也存储在修改的RPS 604中。在这些情况下,RPS控制器1702可以最终确定如果在更新中指定的索引和标签匹配(从预测的目标地址中确定的)存储的索引和存储的标签,则对微型TLB 1706的更新对应于RPS中的目标指令束条目。在其它情况下,标签没有存储在修改的RPS 604中。在这些情况下,RPS控制器1702可以确定如果更新中的索引匹配存储的索引(其可以从预测的目标地址中确定),则对微型TLB 1706的更新可能对应于RPS中的条目。
如果RPS控制器1702检测从MMU 1704发送给微型TLB 1706的更新与修改的RPS604中的条目有关或可能有关,那么RPS控制器1702可以通过设置束有效数据708为指示目标束数据710是无效的(例如,这可能涉及清除束有效位)来使目标束数据无效。
由于微型TLB 1706具有有限数目的条目,因此如果微型TLB 1706接收关于转换的请求(例如,用于生成标签)而其不具有对应的条目,那么该微型TLB 1706向MMU 1704请求该条目并且MMU 1704发送关于所请求的条目的数据,该条目用于再填充、替换或逐出微型TLB 1706中最近最少使用的条目。在某些情况下,当RPS控制器1702检测到来自MMU 1704的再填充信号或命令时,RPS控制器1702可以被配置为使存储在修改的RPS 604中的所有的目标束数据无效。在其它情况下,修改的部分解码逻辑616可以被配置为存储微型TLB 1706中关于每个条目的对应的条目的槽或条目数,并且只有当该特定槽被再填充或逐出时对应的目标束数据才被无效。
通常,当虚拟地址被重新映射到另一个物理地址时,MMU使微型TLB和指令缓存中的对应的条目无效/更新;并且然后在新地址处的指令束将随后必须被提取。如上所述,当示例RPS控制器1702检测到对微型TLB中对应于RPS中条目的条目的变化,RPS控制器1702使RPS中对应的条目无效并且并不试图用新的指令束数据更新RPS中的条目。这是因为新的地址处的指令束无论如何都要被提取,并且从而通过在将其提取时存储该指令束而没有节省时间。
对本领域的技术人员将明显的是,RPS控制器1702的上面描述仅是示例,并且RPS控制器1702可以以其他方式被配置以监视对指令束的更新并且相应地更新RPS 604。
本文使用的术语“处理器”和“计算机”指的是具有处理能力使得它可以执行指令的任何设备或其部分。术语“处理器”可以例如包括中央处理单元(CPU)、图形处理单元(GPU或VPU)、物理处理单元(PPU)、无线电处理单元(RPU)、数字信号处理器(DSP)、通用处理器(例如,通用GPU)、微处理器、被设计为加速CPU外部的任务的任何处理单元等。本领域的技术人员将认识到这样的处理能力被并入到许多不同的设备中,并且因此,术语“计算机”包括机顶盒、媒体播放器、数字收音机、PC、服务器、移动电话、个人数字助理以及许多其他的设备。
本领域的技术人员将认识到用来存储程序指令的存储设备可以分布在网络上。例如,远程计算机可以将描述的过程实例存储为软件。本地或终端计算机可以访问远程计算机并下载软件的一部分或全部来运行该程序。可选地,本地计算机可以根据需要下载一些软件,或者在本地终端处执行某些软件指令以及在远程计算机(或计算机网络)处执行某些软件指令。本领域的技术人员也将认识到,通过利用本领域的技术人员已知的常规技术,软件指令的全部或一部分可以由例如DSP、可编程逻辑阵列等等的专用电路执行。
本文描述的方法可以通过配置有存储在有形存储介质上的以机器可读形式的软件的计算机来执行,当所述程序在计算机上运行时并且在计算机程序可以体现在计算机可读的存储介质上的情况下,其以包括用于配置计算机以执行描述的方法的组成部分的计算机可读的程序代码的计算机程序的形式,或以包括适于执行本文描述的任何方法的所有步骤的计算机程序代码装置的计算机程序的形式。有形(或非暂时性)的存储介质的例子包括磁盘、拇指驱动器、存储卡等,并且不包括传播的信号。该软件可以适于在并行处理器或串行处理器上执行,使得方法步骤可以以任何合适的顺序或同时实施。
本文描述的硬件组件可以由其上编码了计算机可读程序代码的非暂时性计算机可读存储介质生成。
其旨在涵盖“描述”或定义实现上面描述的模块、功能、部件或逻辑的硬件配置的软件,例如,如用于设计集成电路或用于配置可编程芯片的HDL(硬件描述语言)软件,以执行期望功能。也就是说,可提供计算机可读存储介质,在其上编码有用于生成配置成执行本文描述的任何方法的处理单元或用于生成包括本文描述的任何装置的处理单元的计算机可读程序代码。也就是说,计算机系统可配置成从电路元件的定义和定义用于组合那些电路元件的规则的数据中示出数字电路的表示,其中非暂时性计算机可读存储介质可在其上存储处理器可执行指令,当指令在这样的计算机系统处被执行时使计算机系统生成如本文描述的处理单元。例如,非暂时性计算机可读存储介质可在其上存储计算机可读指令,当在用于生成集成电路的表现的计算机系统处进行处理时,使该计算机系统生成包括如本文的示例中所述的取指单元的处理器的表现,或者生成配置为执行如本文的示例所述的方法的处理器的表现。处理器的表现可以是处理器本身,或者处理器的表示(例如,掩码),其可以用于生成处理器。
存储用于实现公开的方面的机器可执行数据的存储器可以是非暂时性的介质。非暂时性的介质可以是易失性或非易失性的。易失性的非暂时性介质的例子包括基于半导体的存储器,例如SRAM或DRAM。可用于实现非易失性存储器的技术的例子包括光学和磁存储技术、闪存、相变存储器、电阻式RAM。
对“逻辑”的特别引用指的是执行一个功能或多个功能的结构。逻辑的例子包括被布置来执行这些(多个)功能的电路。例如,这样的电路可以包括晶体管和/或在制造过程中可用的其他硬件元件。这样的晶体管和/或其他元件可用来形成实现和/或包含存储器的电路或结构,通过举例的方式,例如寄存器、触发器、或锁存器、逻辑运算器(例如布尔运算、数学运算器(诸如加法器、乘法器、或移位器)和互连件。这样的元件可以被提供为自定义电路或标准单元库、宏、或在其它抽象水平处提供。这样的元件可以以特定的布置互连。逻辑可以包括具有固定功能的电路,且电路可以被编程来执行一个功能或多个功能;这样的编程可以从固件或软件更新或控制机制中提供。确定执行一个功能的逻辑也可包括实现组成性功能或子过程的逻辑。在一个例子中,硬件逻辑具有实现一个固定功能操作或多个操作、状态机或过程的电路。
本文给出的任何范围或设备值可以被扩展或改变而不失去所追求的效果,如对于技术人员将是明显的。
将理解的是,上文描述的好处和优点可能涉及一个实施例或可能涉及若干实施例。实施例不限于解决任何或所有陈述的问题的那些实施例或具有任何或所有陈述的好处和优点的那些实施例。
对“一(an)”项的任何引用指的是那些项中的一项或多项。本文使用的术语“包括”意在包括所识别的方法块或元素,但这样的块或元素不包括独占列表且装置可能包含额外的块或元素以及方法可能包含额外的操作或元素。此外,块、元件和操作是它们本身而不是隐含地封闭。
本文所描述的方法的步骤可以以任何合适的顺序执行或在适当时同时执行。在附图中的方框之间的箭头示出方法步骤的一个示例顺序,但并不意欲排除其它顺序或并行地执行多个步骤。此外,单独的块可以从任何方法中被删除而不背离本文所描述的主题的精神和范围。上面描述的任何例子的方面可以结合所描述的任何其他例子的方面以形成另外的例子而不失去所追求的效果。在图中的元素被示出为通过箭头连接的地方,将理解的是,这些箭头仅示出元素之间的通信(包括数据和控制消息)的一个示例流动。元素之间的流动可以在任一方向上或在两个方向上。
可以理解的是,仅通过示例的方式给出优选实施例的以上描述,并且本领域的技术人员可以做出各种修改。尽管上文已经利用一定程度的特殊性或参考了一个或多个单独的实施例描述了各个实施例,但是本领域的技术人员可以对公开的实施例做出许多改变而不背离本发明的精神或范围。

Claims (18)

1.一种用于在处理器(100)中使用的多级取指单元(602),所述多级取指单元(602)包括:
返回预测栈(604);以及
部分解码逻辑(616),其与所述返回预测栈(604)进行通信,所述部分解码逻辑(616)按周期被配置为:
接收用于执行的一组一个或多个指令;
至少部分地解码接收的一组一个或多个指令,以确定所述接收的一组一个或多个指令是否包括子程序调用和链接指令或子程序返回指令;
响应于确定所述接收的一组一个或多个指令包括子程序调用和链接指令,使关于对应的子程序返回指令的预测目标组的一个或多个指令存储在所述返回预测栈(604)中;以及
响应于确定所述接收的一组一个或多个指令包括子程序返回指令,使存储在所述返回预测栈(604)中的预测目标组的一个或多个指令成为下一个周期中的接收的一组一个或多个指令。
2.根据权利要求1所述的取指单元(602),其中,所述部分解码逻辑(616)还被配置为响应于确定所述接收的一组一个或多个指令包括子程序调用和链接指令,预测关于所述对应的子程序返回指令的目标地址并且将所预测的目标地址存储在所述返回预测栈(604)中。
3.根据权利要求2所述的取指单元(602),其中,所述部分解码逻辑(616)被配置为通过以下方式使关于所述对应的子程序返回指令的所述预测目标组的一个或多个指令存储在所述返回预测栈(604)中:
确定所述预测目标组的一个或多个指令是否是紧随着所述接收的一组一个或多个指令的一组一个或多个指令;以及
响应于确定所述预测目标组的一个或多个指令是紧随着所述接收的一组一个或多个指令的一组一个或多个指令,使下一个周期中的接收的一组一个或多个指令存储在所述返回预测栈(604)中。
4.根据权利要求3所述的取指单元(602),其中,所述部分解码逻辑(616)还被配置为确定所述取指单元(602)的缓存级(608)是否在当前的周期中正在提取一组一个或多个指令;以及如果确定所述取指单元(602)的所述缓存级(608)在所述当前的周期中正在提取一组一个或多个指令,则所述部分解码逻辑(616)将使得下一个周期中的接收的一组一个或多个指令只存储在所述返回预测栈(604)中。
5.根据权利要求3或4所述的取指单元(602),其中,所述部分解码逻辑(616)被配置为基于所述接收的一组一个或多个指令的格式,确定所述预测目标组的一个或多个指令是否是紧随着所述接收的一组一个或多个指令的一组一个或多个指令。
6.根据权利要求3或4所述的取指单元(602),其中,所述部分解码逻辑(616)被配置为基于所述预测的目标地址,确定所述预测目标组的一个或多个指令是否是紧随着所述接收的一组一个或多个指令的一组一个或多个指令。
7.根据权利要求3或4所述的取指单元(602),还包括标志(618);以及其中,所述部分解码逻辑(616)被配置为通过设置所述标志(618)使在下一个周期中的接收的一组一个或多个指令存储在所述返回预测栈(604)中。
8.根据权利要求7所述的取指单元(602),其中,所述部分解码逻辑(616)还被配置为确定所述标志(618)是否被设置,并且响应于确定所述标志(618)被设置,将所述接收的一组一个或多个指令存储在所述返回预测栈(604)中。
9.根据权利要求3或4所述的取指单元(602),其中,所述部分解码逻辑(616)被配置为还通过以下方式使得关于所述对应的子程序返回指令的所述预测目标组的一个或多个指令存储在所述返回预测栈(604)中:
确定所述预测目标组的一个或多个指令是否是所述接收的一组一个或多个指令;以及
响应于确定所述预测目标组的一个或多个指令是所述接收的一组一个或多个指令,将所述接收的一组一个或多个指令存储在所述返回预测栈(604)中。
10.根据权利要求1至4中任一项所述的取指单元(602),还包括指令存储模块(619);以及其中,所述部分解码逻辑(616)被配置为通过将所述预测目标组的一个或多个指令存储在所述指令存储模块(619)中,使得存储在所述返回预测栈(604)中的所述预测目标组的一个或多个指令成为下一个周期中的接收的一组一个或多个指令。
11.根据权利要求10所述的取指单元(602),其中,所述部分解码逻辑(616)还被配置为确定所述指令存储模块(619)是否包括有效的一组一个或多个指令,以及响应于确定所述指令存储模块(619)包括有效的一组一个或多个指令,将所述有效的一组一个或多个指令用作所述接收的一组一个或多个指令。
12.根据权利要求2至4中任一项所述的取指单元(602),其中,所述部分解码逻辑(616)被配置为通过以下方式使得存储在所述返回预测栈(604)中的预测目标组的一个或多个指令成为下一个周期中的接收的一组一个或多个指令:
确定所述返回预测栈(604)是否包括有效预测目标组的一个或多个指令;以及
响应于确定所述返回预测栈(604)包括有效预测目标组的一个或多个指令,使得所述返回预测栈(604)中的所述有效预测目标组的一个或多个指令成为下一个周期中的接收的一组一个或多个指令。
13.根据权利要求12所述的取指单元(602),还包括下一个束逻辑(620),所述下一个束逻辑被配置为响应于所述部分解码逻辑确定所述一组一个或多个指令包括子程序返回指令,基于存储在所述返回预测栈中的预测的目标地址来生成关于待提取的下一组一个或多个指令的地址。
14.根据权利要求13所述的取指单元(602),其中,所述下一个束逻辑(620)被配置为:
响应于所述部分解码逻辑(616)确定所述返回预测栈(604)包括有效预测目标组的一个或多个指令,将关于待提取的下一组指令的地址生成为从存储在所述返回预测栈中的所述预测的目标地址偏移的地址;以及
响应于所述部分解码逻辑(616)确定所述返回预测栈(604)不包括有效预测目标组的一个或多个指令,生成关于待提取的所述下一组一个或多个指令的地址成为存储在所述返回预测栈中的所述预测的目标地址。
15.根据权利要求1至4中任一项所述的取指单元(602),还包括返回预测栈控制器(1702),其被配置为监视对指令缓存中的多组一个或多个指令的更新,以确定所述更新是否影响存储在所述返回预测栈(604)中的一个或多个预测目标组的一个或多个指令;以及响应于确定更新影响存储在所述返回预测栈(604)中的一个或多个预测目标组的一个或多个指令,使存储在所述返回预测栈(604)中的所述一个或多个预测组的一个或多个指令无效。
16.根据权利要求1至4中任一项所述的取指单元(602),其中,所述接收的一组一个或多个指令是包括两个或更多个指令的指令束。
17.一种在处理器的多级取指单元中提取指令的方法(800),所述方法在周期中包括:
接收用于执行的一组一个或多个指令;
至少部分地解码接收的一组一个或多个指令,以确定所述接收的一组一个或多个指令是否包括子程序调用和链接指令或子程序返回指令;
响应于确定所述接收的一组一个或多个指令包括子程序调用和链接指令,使关于对应的子程序返回指令的预测目标组的一个或多个指令存储在返回预测栈中(802);以及
响应于确定所述接收的一组一个或多个指令包括子程序返回指令,使存储在所述返回预测栈中的预测目标组的一个或多个指令成为下一个周期中的接收的一组一个或多个指令(804)。
18.根据权利要求17所述的方法(800),其中,使存储在所述返回预测栈中的预测目标组的一个或多个指令成为下一个周期中的接收的一组一个或多个指令包括将所述预测目标组的一个或多个指令存储在指令存储模块中。
CN201610853165.2A 2015-09-30 2016-09-26 用于预测子程序返回指令的目标的取指单元 Active CN106557304B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210097700.1A CN114546485A (zh) 2015-09-30 2016-09-26 用于预测子程序返回指令的目标的取指单元

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
GB1517321.4 2015-09-30
GB1517321.4A GB2542831B (en) 2015-09-30 2015-09-30 Fetch unit for predicting target for subroutine return instructions

Related Child Applications (1)

Application Number Title Priority Date Filing Date
CN202210097700.1A Division CN114546485A (zh) 2015-09-30 2016-09-26 用于预测子程序返回指令的目标的取指单元

Publications (2)

Publication Number Publication Date
CN106557304A true CN106557304A (zh) 2017-04-05
CN106557304B CN106557304B (zh) 2022-02-18

Family

ID=54544373

Family Applications (2)

Application Number Title Priority Date Filing Date
CN201610853165.2A Active CN106557304B (zh) 2015-09-30 2016-09-26 用于预测子程序返回指令的目标的取指单元
CN202210097700.1A Pending CN114546485A (zh) 2015-09-30 2016-09-26 用于预测子程序返回指令的目标的取指单元

Family Applications After (1)

Application Number Title Priority Date Filing Date
CN202210097700.1A Pending CN114546485A (zh) 2015-09-30 2016-09-26 用于预测子程序返回指令的目标的取指单元

Country Status (3)

Country Link
US (1) US10360037B2 (zh)
CN (2) CN106557304B (zh)
GB (1) GB2542831B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB2571996B (en) * 2018-03-16 2020-09-09 Advanced Risc Mach Ltd Branch target variant of branch-with-link instruction
US10705846B2 (en) 2018-08-15 2020-07-07 Intel Corporation Methods and apparatus to insert profiling instructions into a graphics processing unit kernel
US10990405B2 (en) 2019-02-19 2021-04-27 International Business Machines Corporation Call/return stack branch target predictor to multiple next sequential instruction addresses
US11941401B1 (en) * 2022-06-09 2024-03-26 Apple Inc. Instruction fetch using a return prediction circuit

Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5968169A (en) * 1995-06-07 1999-10-19 Advanced Micro Devices, Inc. Superscalar microprocessor stack structure for judging validity of predicted subroutine return addresses
CN1560734A (zh) * 2004-03-09 2005-01-05 中国人民解放军国防科学技术大学 双栈返回地址预测器设计方法
CN1632877A (zh) * 2004-01-16 2005-06-29 智权第一公司 可变延滞时间堆栈快取存储器及提供资料的方法
US20060026410A1 (en) * 2004-07-29 2006-02-02 Fujitsu Limited Branch predicting apparatus and branch predicting method
US20060224870A1 (en) * 1999-09-29 2006-10-05 Tago Shin-Ichiro Information processing device
EP1853995A2 (en) * 2005-02-18 2007-11-14 Qualcomm Incorporated Method and apparatus for managing a return stack
CN101604235A (zh) * 2009-07-10 2009-12-16 杭州电子科技大学 一种嵌入式处理器分支预测的方法
US20120297167A1 (en) * 2011-05-20 2012-11-22 Shah Manish K Efficient call return stack technique
CN104252335A (zh) * 2013-06-28 2014-12-31 国际商业机器公司 用于选择的返回指令的预测获取和解码方法和系统
US20150089208A1 (en) * 2013-06-28 2015-03-26 International Business Machines Corporation Predictor data structure for use in pipelined processing

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH07239782A (ja) * 1994-02-28 1995-09-12 Toshiba Corp 演算処理装置
JP4247132B2 (ja) * 2004-01-29 2009-04-02 株式会社ルネサステクノロジ 情報処理装置
US8341383B2 (en) * 2007-11-02 2012-12-25 Qualcomm Incorporated Method and a system for accelerating procedure return sequences
US7882338B2 (en) * 2008-02-20 2011-02-01 International Business Machines Corporation Method, system and computer program product for an implicit predicted return from a predicted subroutine
US9317293B2 (en) * 2012-11-28 2016-04-19 Qualcomm Incorporated Establishing a branch target instruction cache (BTIC) entry for subroutine returns to reduce execution pipeline bubbles, and related systems, methods, and computer-readable media
CN105511838B (zh) * 2014-09-29 2018-06-29 上海兆芯集成电路有限公司 处理器及其执行方法

Patent Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5968169A (en) * 1995-06-07 1999-10-19 Advanced Micro Devices, Inc. Superscalar microprocessor stack structure for judging validity of predicted subroutine return addresses
US20060224870A1 (en) * 1999-09-29 2006-10-05 Tago Shin-Ichiro Information processing device
CN1632877A (zh) * 2004-01-16 2005-06-29 智权第一公司 可变延滞时间堆栈快取存储器及提供资料的方法
CN1560734A (zh) * 2004-03-09 2005-01-05 中国人民解放军国防科学技术大学 双栈返回地址预测器设计方法
US20060026410A1 (en) * 2004-07-29 2006-02-02 Fujitsu Limited Branch predicting apparatus and branch predicting method
EP1853995A2 (en) * 2005-02-18 2007-11-14 Qualcomm Incorporated Method and apparatus for managing a return stack
CN101604235A (zh) * 2009-07-10 2009-12-16 杭州电子科技大学 一种嵌入式处理器分支预测的方法
US20120297167A1 (en) * 2011-05-20 2012-11-22 Shah Manish K Efficient call return stack technique
CN104252335A (zh) * 2013-06-28 2014-12-31 国际商业机器公司 用于选择的返回指令的预测获取和解码方法和系统
US20150089208A1 (en) * 2013-06-28 2015-03-26 International Business Machines Corporation Predictor data structure for use in pipelined processing

Also Published As

Publication number Publication date
GB2542831A (en) 2017-04-05
CN114546485A (zh) 2022-05-27
US20170090933A1 (en) 2017-03-30
CN106557304B (zh) 2022-02-18
GB2542831B (en) 2018-05-30
GB201517321D0 (en) 2015-11-11
US10360037B2 (en) 2019-07-23

Similar Documents

Publication Publication Date Title
CN205176828U (zh) 条件分支预测器逻辑单元
US7707397B2 (en) Variable group associativity branch target address cache delivering multiple target addresses per cache line
CN103250131B (zh) 包括用于早期远分支预测的影子缓存的单周期多分支预测
CN104794067B (zh) 预测在堆栈中存储的变量的值的方法和设备
KR100341431B1 (ko) 다수의 예측 분기 명령을 통한 명령 페치의 정렬 명령캐시 제어
CN1632877B (zh) 可变延滞时间高速缓冲存储器及提供数据的方法
US7409535B2 (en) Branch target prediction for multi-target branches by identifying a repeated pattern
CN101449238A (zh) 本地和全局分支预测信息存储
CN106528049B (zh) 在多存储体条件分支预测器中用于更新事件的随机数产生
CN106557304A (zh) 用于预测子程序返回指令的目标的取指单元
CN109284132A (zh) 改进的返回堆栈缓存
CN101158925B (zh) 用于支持跟踪和标准高速缓存行的同时存储的装置和方法
JPS5991546A (ja) 中央処理装置
CN101449237A (zh) 快速和廉价的存储-加载冲突调度和转送机制
CN101176060A (zh) 每索引存储两个或更多分支目标地址的分支目标地址高速缓冲存储器
US20070033385A1 (en) Call return stack way prediction repair
CN104793920A (zh) 堆栈指针值预测
CN101460922B (zh) 滑动窗口、基于区块的分支目标地址高速缓冲存储器
CN101013401A (zh) 用于预取数据线的方法和处理器
TW201423584A (zh) 提取寬度預測器
CN101506773A (zh) 用于模拟显式子例行程序调用的分支预测行为的方法和设备
CN106681695A (zh) 提前取出分支目标缓冲器
CN101013360A (zh) 用于预取指令线的方法和处理器
US10318172B2 (en) Cache operation in a multi-threaded processor
CN109643237A (zh) 分支目标缓冲器压缩

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
CB02 Change of applicant information

Address after: Hertfordshire

Applicant after: Mex Technology Co.,Ltd.

Address before: Hertfordshire

Applicant before: Hai Luo Software Co.,Ltd.

TA01 Transfer of patent application right

Effective date of registration: 20180713

Address after: California, USA

Applicant after: Imagination Technologies Ltd.

Address before: Hertfordshire

Applicant before: Mex Technology Co.,Ltd.

Effective date of registration: 20180713

Address after: Hertfordshire

Applicant after: Hai Luo Software Co.,Ltd.

Address before: Hertfordshire

Applicant before: Imagination Technologies Ltd.

SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant