非循序执行的微处理器及其操作方法.pdf

上传人:a*** 文档编号:1010358 上传时间:2018-03-25 格式:PDF 页数:33 大小:2.12MB
返回 下载 相关 举报
摘要
申请专利号:

CN201010185555.X

申请日:

2010.05.19

公开号:

CN101853150A

公开日:

2010.10.06

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效IPC(主分类):G06F 9/38申请日:20100519|||公开

IPC分类号:

G06F9/38

主分类号:

G06F9/38

申请人:

威盛电子股份有限公司

发明人:

马修·D·戴; 罗德尼·E·虎克

地址:

中国台湾台北县

优先权:

2009.05.29 US 61/182,283; 2009.10.23 US 12/604,930

专利代理机构:

北京市柳沈律师事务所 11105

代理人:

钱大勇

PDF下载: PDF下载
内容摘要

本发明提供一种非循序执行微处理器,用以减少因储存碰撞而重新执行加载指令的可能性,包括:第一队列存储器,包括多个项目;一第二队列存储器,包括多个项目;以及暂存器别名表,耦接于上述第一和第二队列存储器,暂存器别名表用以依据循序排列的多个指令以产生多个相依性,以便决定上述指令何时能够非循序执行,其中暂存器别名表用以指派上述第一队列存储器的一项目,并在所指派的项目中填入上述加载指令的一指令指针;指派上述第二队列存储器的一项目,并在所指派的项目中填入一相依性;以及使得上述后续执行的加载指令共享上述相依性,上述相依性用以识别上述第二队列存储器的上述所指派项目中上述储存指令为了其储存数据所依附的上述指令。

权利要求书

1: 一种非循序执行微处理器, 用以减少因储存碰撞而重新执行加载指令的可能性, 包 括: 一第一队列存储器, 包括多个项目 ; 一第二队列存储器, 包括多个项目 ; 以及 一暂存器别名表, 耦接于上述第一和第二队列存储器, 上述暂存器别名表用以依据循 序排列的多个指令以产生多个相依性, 以便决定上述指令何时能够非循序执行, 其中上述 暂存器别名表用以 : 当上述暂存器别名表判断出一加载指令必须被重新执行时, 则指派上述第一队列存储 器的一项目, 并在所指派的项目中填入上述加载指令的一指令指针 ; 当上述暂存器别名表遇到一储存指令时, 指派上述第二队列存储器的一项目, 并在所 指派的项目中填入一相依性, 而上述相依性用以识别上述储存指令为了其储存数据所依附 的一指令 ; 以及 当上述暂存器别名表遇到上述加载指令被后续执行且判断上述后续执行的加载指令 的指令指针符合于上述第一队列存储器的上述所指派的项目的指令指针时, 使得上述后续 执行的加载指令共享上述相依性, 上述相依性用以识别上述第二队列存储器的上述所指派 项目中上述储存指令为了其储存数据所依附的上述指令。
2: 根据权利要求 1 所述的非循序执行微处理器, 其中当执行上述加载指令时, 若因为 上述加载指令与一较先前的储存指令发生储存碰撞, 且发生碰撞的上述较先前的储存指令 的储存数据仍然是无效的, 而使得上述暂存器别名表判断出上述加载指令必须被重新执行 时, 上述暂存器别名表是以指派上述第一队列存储器的上述项目, 并于上述所指派的项目 中填入上述加载指令的上述指令指针。
3: 根据权利要求 1 所述的非循序执行微处理器, 其中上述暂存器别名表根据上述加载 指令的重新执行的历史, 选择上述第二队列存储器的上述项目, 使得上述后续执行的加载 指令共享上述相依性, 上述相依性用以识别上述储存指令为了其储存数据所依附的上述指 令。
4: 根据权利要求 3 所述的非循序执行微处理器, 其中上述加载指令的重新执行的上述 历史包括在上述第一队列存储器的每个上述项目中的一历史字段, 并且当上述暂存器别名 表指派上述第一队列存储器的上述项目时, 清除上述历史字段, 并根据上述后续执行的加 载指令, 选择性地增加上述历史字段的数值。
5: 根据权利要求 4 所述的非循序执行微处理器, 其中若上述历史字段的数值小于一既 定数值时, 则上述暂存器别名表选择上述第二队列存储器的上述项目的最后一者, 用以使 得上述后续执行的加载指令共享上述相依性, 上述相依性用以识别上述储存指令为了其储 存数据所依附的上述指令, 其中若上述历史字段的数值大于或等于一既定数值时, 则上述 暂存器别名表选择上述第二队列存储器的上述项目中早于上述最后一者的一较先者, 用以 使得上述后续执行的加载指令共享上述相依性, 上述相依性用以识别上述储存指令为了其 储存数据所依附的上述指令。
6: 根据权利要求 4 所述的非循序执行微处理器, 还包括 : 一发布逻辑器, 耦接于上述暂存器别名表, 用以根据上述暂存器别名表所产生的上述 相依性, 将上述指令非循序地发布执行 ; 2 其中若上述历史字段大于一既定数值, 则上述暂存器别名表用以为上述加载指令产生 一相依性, 使得上述发布逻辑器在所有上述较先的储存指令都已被发布后, 才发布上述加 载指令。
7: 根据权利要求 3 所述的非循序执行微处理器, 其中当上述暂存器别名表遇到上述后 续执行的加载指令, 并且判断出上述后续执行的加载指令的指令指针符合于上述第一队列 存储器的一项目的上述指令指针时, 上述暂存器别名表用以于上述第一队列存储器的所指 派的项目的一字段中填入上述后续执行的加载指令的一识别符, 接着当上述暂存器别名表 判断出上述加载指令必须被重新执行时, 上述暂存器别名表用以使用上述后续执行的加载 指令的上述识别符来判断是否更新上述加载指令的重新执行的上述历史字段。
8: 根据权利要求 1 所述的非循序执行微处理器, 还包括 : 一重整缓冲器, 耦接于上述暂存器别名表, 上述重整缓冲器包括一阵列, 上述阵列包括 多个项目, 并且上述重整缓冲器依照程序次序地储存多个未退返指令, 上述项目的每一者 是由写入上述阵列的一索引所识别 ; 其中第二队列存储器的每个上述项目的相依性包括上述储存指令为了其储存数据所 依附的上述指令的一重整缓冲器索引。
9: 根据权利要求 1 所述的非循序执行微处理器, 其中只有当上述加载指令的上述指令 指针不符合上述第一队列存储器的任何上述项目的上述指令指针, 上述暂存器别名表才于 判断出上述加载指令必须被重新执行时, 指派上述第一队列存储器的上述项目的一者, 并 于所指派的项目中填入一加载指令的一指令指针。
10: 一种非循序执行微处理器的操作方法, 用以减少因储存碰撞而必须在非循序执行 微处理器中重新执行加载指令的可能性, 上述非循序执行微处理器具有一暂存器别名表, 上述暂存器别名表用以依据循序排列的多个指令以产生多个相依性, 以便决定上述指令何 时能够非循序执行, 上述非循序执行微处理器的操作方法包括 : 于判断出上述加载指令必须被重新执行时, 指派上述第一队列存储器的多个项目的一 者, 并在所指派的项目中填入上述加载指令的一指令指针 ; 当上述加载指令遇到一储存指令时, 指派一第二队列存储器的多个项目的一者, 并在 所指派的项目中填入一相依性, 而上述相依性用以识别上述储存指令为了其储存数据所依 附的一指令 ; 以及 当上述暂存器别名表遇到上述加载指令被后续执行且判断上述后续执行的加载指令 的指令指针符合于上述第一队列存储器的上述所指派的项目的指令指针时, 使得上述后续 执行的加载指令共享上述相依性, 上述相依性用以识别上述第二队列存储器的上述所指派 项目中上述储存指令为了其储存数据所依附的上述指令。
11: 根据权利要求 10 所述的非循序执行微处理器的操作方法, 其中当执行上述加载指 令时, 若因为上述加载指令与一较先前的储存指令发生储存碰撞, 且发生碰撞的上述较先 前的储存指令的储存数据仍然是无效的, 而使得上述暂存器别名表判断出上述加载指令必 并于上述所 须被重新执行时, 上述暂存器别名表是指派上述第一队列存储器的上述项目, 指派的项目中填入上述加载指令的上述指令指针。
12: 根据权利要求 10 所述的非循序执行微处理器的操作方法, 还包括 : 根据上述加载指令的重新执行的历史, 选择上述第二队列存储器的上述项目, 使得上 3 述后续执行的加载指令共享上述相依性, 上述相依性用以识别上述储存指令为了其储存数 据所依附的上述指令。
13: 根据权利要求 12 所述的非循序执行微处理器的操作方法, 其中上述加载指令的重 新执行的上述历史包括在上述第一队列存储器的每个上述项目中的一历史字段, 上述非循 序执行微处理器的操作方法还包括 : 清除上述历史字段 ; 以及 根据上述后续执行的加载指令, 选择性地增加上述历史字段的数值。
14: 根据权利要求 13 所述的非循序执行微处理器的操作方法, 其中若上述历史字段 的数值小于一既定数值时, 则上述选择上述第二队列存储器的上述项目的步骤包括选择上 述第二队列存储器的上述项目的最后一者, 用以使得后续执行上述加载指令共享上述相依 性, 上述相依性用以识别上述储存指令为了其储存数据所依附的上述指令, 其中若上述历 史字段的数值大于或等于一既定数值时, 则上述选择上述第二队列存储器的上述项目的步 骤包括选择上述第二队列存储器的上述项目中早于上述最后一者的一较先者, 用以使得上 述后续执行的加载指令共享上述相依性, 上述相依性用以识别上述储存指令为了其储存数 据所依附的上述指令。
15: 根据权利要求 13 所述的非循序执行微处理器的操作方法, 其中上述非循序执行微 处理器还包括一发布逻辑器, 耦接于上述暂存器别名表, 用以根据上述暂存器别名表所产 生的上述相依性, 将上述指令非循序地发布执行, 上述非循序执行微处理器的操作方法还 包括 : 若上述历史字段大于一既定数值, 则上述暂存器别名表用以为上述加载指令产生一相 依性, 使得上述发布逻辑器在所有上述较先的储存指令都已被发布后, 才发布上述加载指 令。
16: 根据权利要求 12 所述的非循序执行微处理器的操作方法, 还包括 : 当上述暂存器别名表遇到上述后续执行的加载指令, 并且判断出上述后续执行的加载 指令的指令指针符合于上述第一队列存储器的一项目的上述指令指针时, 上述暂存器别名 表用以于上述第一队列存储器的所指派的项目的一字段中填入上述后续执行的加载指令 的一识别符 ; 以及 当上述暂存器别名表判断出上述加载指令必须被重新执行时, 上述暂存器别名表用以 接着使用上述后续执行的加载指令的上述识别符来判断是否更新上述加载指令的重新执 行的上述历史字段。
17: 根据权利要求 10 所述的非循序执行微处理器的操作方法, 其中第二队列存储器的 每个上述项目的相依性包括上述储存指令为了其储存数据所依附的上述指令的一重整缓 冲器索引。
18: 根据权利要求 10 所述的非循序执行微处理器的操作方法, 其中只有当上述加载指 令的上述指令指针不符合上述第一队列存储器的任何上述项目的上述指令指针, 上述暂存 器别名表才于判断出上述加载指令必须被重新执行时, 指派上述第一队列存储器的上述项 目的一者, 并于所指派的项目中填入一加载指令的一指令指针。

说明书


非循序执行的微处理器及其操作方法

    技术领域 本 发 明 是 有 关 于 非 循 序 执 行 微 处 理 器 (out-of-order executionmicroprocessor), 特别是有关于非循序执行微处理器内的存储器加载指令的效 能。
     背景技术 微处理器具有加载指令 (load instruction), 用以将数据由存储器来源位置 (source memory location) 加载至微处理器的暂存器 ; 以及储存指令, 用以将数据由微 处理器的暂存器储存至存储器目的地位置 (destinationmemory location)。一般而言, 微处理器会遭遇的情况是加载指令所指定 (specify) 的存储器来源地址等同于较先前的 (older) 储存指令的存储器目的地地址。 换言之, 较先前的储存指令将数据写入至加载指令 正在读取的存储器地址。这种情况通常称为储存碰撞 (store collision)。当储存碰撞发 生时, 为了要正确地执行程序, 微处理器必须确定加载指令接收由较先的地址重迭的储存 指令所写入的数据。
     非循序执行微处理器并不依照程序顺序 (out of the program order) 来执行指 令。当储存碰撞发生时, 这会是个问题, 原因在于加载指令可能会在较先前的储存指令之 前被发布 (issued) 并执行, 因此使得加载指令接收到错误的数据。在这种情况下, 加载指 令不能将加载的数据退返 (retire) 至其架构目的地暂存器 (architectural destination register)。更确切地说, 加载指令必须接收正确的储存数据, 并且将正确的数据退返至目 的地暂存器 (destination register)。
     让加载指令能够接收正确的储存数据的一种方法是重新执行 (replay)。换言之, 微处理器会检测前述的情况, 并在执行储存指令之后, 使得加载指令被重新发出并且重新 执行。 由于储存指令已经被执行, 故在后续执行操作中, 加载指令将可接收到正确的储存数 据。
     然而, 重新执行指令所付出的代价是相当大的, 特别是发生在具有非常多管线级 的微处理器中。首先, 储存指令可能依附于其它指令 ; 事实上, 储存指令是位于相依性长链 接 (long chain of dependencies) 的一端, 所以储存指令可能不会执行这么多时钟 ; 因此, 加载指令在被重新执行之前可能要等待很多时钟周期。 若加载指令在重新执行前须等待的 时钟周期愈多, 则处理加载指令所造成的效能损失 (penalty) 也就愈严重。此外, 当加载指 令被重新发布并重新执行时, 加载指令必须通过相关管线级 (relevant pipelinestages) 而被再次地传回 (pass back again), 并因此花费更多时钟周期。 若加载指令需要通过愈多 的管线级才能将加载指令传回, 以处理加载指令的时钟周期数来看, 则效能损失也就愈严 重。
     Panwar 等人的专利 ( 美国专利号 : 6,006,326) 借着使用储存关于加载指令和储存 指令的彩色位 (color bits) 的特殊阵列 (special array) 试图解决这个问题。彩色位阵 列中所包含的项目 (entries) 对应于指令高速缓存的项目, 当加载指令或储存指令由指令
     高速缓存 (instruction cache) 被读取时, 彩色位阵列亦会被读取。在发布早先于储存指 令的加载指令而造成的重新执行之后, 彩色位阵列中相应的一个项目的彩色位会被更新为 相同的色彩值 (colorvalue), 用以表示加载指令和储存指令的相依性 ( 依附关系 )。当储 存指令和加载指令再度被设置于管线中而执行时, 相依性比对逻辑 (dependencychecking logic) 检测到储存指令和加载指令具有相同的色彩值, 故将相依性回报至指令调度逻辑 器 (instruction scheduling logic), 其中指令调度逻辑器在具有类似色彩的储存指令 (similarly colored store instruction) 已经被调度后, 才对此加载指令进行调度。
     因为彩色位阵列需要为指令高速缓存的每个加载指令和储存指令储存彩色位, 所 以彩色位阵列的大小会是指令高速缓存项目个数的函数。 因为指令高速缓存的项目数目通 常很多, 所以彩色位阵列的潜在缺点是其在微处理器中需要大量的储存空间。一个大的彩 色位阵列会消耗大量的电源和微处理器的物理空间。
     因此, 需要一种新的机制, 用以减少在非循序执行微处理器中发生储存碰撞时, 重 新执行加载指令的次数。 发明内容 本发明实施例提供一种非循序执行微处理器, 用以减少因储存碰撞而重新执行加 载指令的可能性, 包括 : 队列存储器以及暂存器别名表。队列存储器包括多个项目, 每个项 目用以存放加载指令的指令指针和用来识别储存指令的信息, 信息会使得第一加载指令在 执行时被要求重新执行。暂存器别名表耦接于队列存储器, 用于依据循序排列的多个指令 以产生多个相依性, 以便判断多个指令何时能够非循序执行, 其中暂存器别名表用以在遇 到第二加载指令时, 判断第二加载指令的指令指针是否符合于队列存储器的项目的一者的 指令指针, 以及当判断符合时, 使得第二加载指令依附于所符合的项目中的信息所识别的 储存指令。
     本发明实施例提供一种非循序执行微处理器的操作方法, 用以减少因储存碰撞而 必须在非循序执行微处理器中重新执行加载指令的可能性, 非循序执行微处理器具有暂存 器别名表, 暂存器别名表用于依据循序排列的多个指令以产生多个相依性, 以便判断多个 指令何时能够非循序执行, 非循序执行微处理器的操作方法包括 : 在第一加载指令重新执 行时, 指派队列存储器的多个项目的一者 ; 于所指派的项目中存放加载指令的指令指针和 用来识别储存指令的信息, 信息会使得第一加载指令重新执行 ; 于上述暂存器别名表遇到 第二加载指令时, 判断第二加载指令的指令指针是否符合于队列存储器的项目的一者的指 令指针 ; 以及使得第二加载指令依附于所符合的项目中的信息所识别的储存指令。
     本发明实施例提供一种非循序执行微处理器, 用以减少因储存碰撞而重新执行加 载指令的可能性, 包括 : 队列存储器以及暂存器别名表。队列存储器包括多个项目, 每个项 目存放用以识别储存指令的来源的信息以及相依性, 其中相依性用以识别储存指令为了其 储存数据所依附的指令, 而储存数据的来源用以计算储存指令的储存地址。暂存器别名表 耦接于队列存储器, 暂存器别名表用于依据循序排列的多个指令以产生多个相依性, 以便 判断指令何时能够非循序执行, 其中当暂存器别名表遇到加载指令时, 暂存器别名表判断 加载指令中用以计算其加载地址的来源是否符合于队列存储器的一项目中储存指令的来 源, 且若符合, 则使得加载指令共享所符合的储存指令的相依性。
     本发明实施例提供一种非循序执行微处理器的操作方法, 用以减少因储存碰撞而 必须在非循序执行微处理器中重新执行加载指令的可能性, 非循序执行微处理器具有暂存 器别名表, 暂存器别名表用于依据循序排列的多个指令以产生多个相依性, 以便判断指令 何时能够非循序执行, 非循序执行微处理器的操作方法包括 : 当暂存器别名表遭遇到储存 指令时, 指派队列存储器的多个项目的一者 ; 于所指派的项目中, 填入用以识别储存指令的 来源的信息, 并且储存指令的来源地址用以计算储存指令的储存地址 ; 当暂存器别名表遇 到加载指令时, 判断用来计算加载指令的加载地址的来源是否符合于队列存储器的项目的 一者中的储存指令的来源地址 ; 以及若加载指令的来源符合于队列存储器的项目的一者中 的储存指令的来源, 则使得加载指令共享所符合的储存指令的相依性。
     本发明实施例提供一种非循序执行微处理器, 用以减少因储存碰撞而重新执行加 载指令的可能性, 包括 : 第一队列存储器、 第二队列存储器以及暂存器别名表。第一队列存 储器包括多个项目。第二队列存储器包括多个项目。暂存器别名表耦接于第一和第二队列 存储器, 暂存器别名表用以依据循序排列的多个指令以产生多个相依性, 以便决定指令何 时能够非循序执行, 其中暂存器别名表用以 : 当暂存器别名表判断出加载指令必须被重新 执行时, 则指派第一队列存储器的项目, 并在所指派的项目中填入加载指令的指令指针 ; 当 暂存器别名表遇到储存指令时, 指派第二队列存储器的项目, 并在所指派的项目中填入相 依性, 而相依性用以识别储存指令为了其储存数据所依附的指令 ; 以及当暂存器别名表遇 到加载指令被后续执行且判断后续执行的加载指令的指令指针符合于第一队列存储器的 所指派的项目的指令指针时, 使得后续执行的加载指令共享相依性, 相依性用以识别第二 队列存储器的所指派项目中储存指令为了其储存数据所依附的指令。 本发明实施例提供一种非循序执行微处理器的操作方法, 用以减少因储存碰撞而 必须在非循序执行微处理器中重新执行加载指令的可能性, 非循序执行微处理器具有暂存 器别名表, 暂存器别名表用以依据循序排列的多个指令以产生多个相依性, 以便决定指令 何时能够非循序执行, 非循序执行微处理器的操作方法包括 : 于判断出加载指令必须被重 新执行时, 指派第一队列存储器的多个项目的一者, 并在所指派的项目中填入加载指令的 指令指针 ; 当加载指令遇到储存指令时, 指派第二队列存储器的多个项目的一者, 并在所指 派的项目中填入相依性, 而相依性用以识别储存指令为了其储存数据所依附的指令 ; 以及 当暂存器别名表遇到加载指令被后续执行且判断后续执行的加载指令的指令指针符合于 第一队列存储器的所指派的项目的指令指针时, 使得后续执行的加载指令共享相依性, 相 依性用以识别第二队列存储器的所指派项目中储存指令为了其储存数据所依附的指令。
     附图说明
     图 1 为本发明中具有扩充式 RAT 的微处理器的方块图 ;
     图 2 为本发明中图 1 的 SACQ 的项目的方块图 ;
     图 3 为本发明中图 1 的 RAT 的操作流程图 ;
     图 4 为本发明中图 1 的 ROB 的操作流程图 ;
     图 5 为本发明中图 1 的保留站的操作流程图 ;
     图 6 为本发明中图 1 的 SAAQ 的项目的方块图 ;
     图 7 显示图 1 的微处理器产生加载指令的扩充式相依性信息的流程图, 用以说明当发生储存碰撞时避免重新执行的操作 ;
     图 8 为本发明中图 1 的 SDAQ 的项目的方块图 ;
     图 9 为本发明中图 1 的 SDDQ 的项目的方块图 ;
     图 10 显示图 1 的微处理器产生加载指令的扩充式相依性信息的流程图, 用以说明 当发生储存碰撞时避免重新执行的操作 ;
     图 11 为本发明中图 1 的微处理器指定并更新 SDAQ 项目的流程图。 具体实施方式
     本文所述实施例为管线化 (pipelined) 的非循序执行微处理器, 用以在发生储存 碰撞时, 减少加载指令重新执行的次数。微处理器包括一暂存器别名表 (register alias table, RAT), 用以预测加载指令何时会发生储存碰撞, 并使得加载指令与一个附加指令 (additional instruction) 具有依附关系, 而加载指令通常不会与该附加指令具有依附 关系。在本文中, 通过 RAT 而被加载指令依附的附加指令称为被依赖者指令 (dependee instruction)。 这种附加或扩充式的相依性会使得微处理器的发布逻辑器等到被依赖者指 令已经执行后 ( 即已经产生其执行结果 ), 才发布加载指令。故被依赖者指令的执行结果 能够被发送 ( 转交 ) 至加载指令, 或是能够自数据高速缓存而被读取。因此, 当发布逻辑器 (issue logic) 将加载指令发布来执行时, 因为加载指令将会接收到正确的数据, 所以加载 指令不需被重新执行。 在一实施例中, RAT 将用以识别 (identify) 操作数来源 (sources ofoperands) 的 信息储存在队列存储器 (queue) 中, 其中用以识别操作数来源的信息由 RAT 用以计算所遭 遇到的最近的 (most recent) 储存指令的储存地址。当遇到加载指令时, RAT 会比较用以 计算加载地址的来源与队列存储器中储存地址的来源。若符合, 则 RAT 预测储存碰撞会发 生, 故使得加载指令和储存指令具有相依性 ( 依附关系 )。换言之, RAT 使得加载指令与储 存指令依附于同一个被依赖者指令, 而储存指令则为了其储存数据亦依附于此被依赖者指 令。
     在另一实施例中, 当加载指令与具有未解析储存位置的较先的储存指令发生 储存碰撞而接收到错误的数据, 并因而被重新执行时, RAT 会将此加载指令的指令指针 (instruction pointer) 和用以识别此储存指令的信息储存在一队列存储器中。随后, 当 RAT 遇到另一个加载指令 (RAT 是由于储存指令的指令指针值符合于队列存储器中的其中 一个指令指针, 而判断出遇到另一个加载指令 ) 时, RAT 使得加载指令依附于相符的队列存 储器项目所识别的储存指令。
     在另一实施例中, 当 RAT 遇到一储存指令时, RAT 将一信息推入 (pushinto) 一 第一队列存储器, 其中上述信息用以识别储存指令为了其储存数据所依附到的指令。因 此第一队列存储器用以储存有关于 RAT 最近遇到的储存指令的相依性信息 (dependency information)。当加载指令与不具有储存数据 ( 储存数据尚不存在或尚未有效 ) 的较先的 储存指令发生储存碰撞而接收到错误的数据, 而加载指令因而被重新执行时, RAT 将加载指 令的指令指针储存于一第二队列存储器中。接着, 当 RAT 遇到另一个储存指令 (RAT 是由于 储存指令的指令指针值符合于队列存储器中的其中一个指令指针, 而判断出遇到另一个储 存指令 ) 时, RAT 使得加载指令依附于储存指令由于其储存数据而在第一队列存储器中所
     依附到的指令。RAT 根据第二队列存储器中的每个项目中所存放的加载指令的重新执行历 史, 由第一队列存储器中选择储存指令。当 RAT 指派 (allocates) 加载指令到第二队列存 储器的某一项目时, RAT 清除该项目所对应的重新执行历史, 并且在每次该加载指令重新执 行后, 增加重新执行历史的次数。若重新执行历史的次数超出一既定值, 则 RAT 让加载指令 成为循序的 (ordered) 加载指令, 使得加载指令在所有较先的储存指令都被发布后, RAT 才 会发布加载指令。
     参考图 1, 其显示本发明中具有扩充式的 RAT 134 的微处理器 100 的方块图。 在一 实施例中, 微处理器 100 是 x86 巨架构微处理器 (macroarchitecture microprocessor)。 所谓 x86 巨架构微处理器是指能够正确地执行为 x86 架构微处理器设计的大部分应用程序 的微处理器。若微处理器 100 能够获得其预期的结果, 则称其应用程序能够正确地执行。 具体而言, 微处理器 100 用以执行 x86 指令集的指令, 并且包括 x86 可见暂存器集合 (x86 user-visible register set)。然而, 本文中所述的用以降低加载指令被重新执行的机制 (reduction mechanics) 亦可使用于目前的或是未来的其它架构的微处理器。
     微处理器 100 包括一指令高速缓存 (instruction cache)106, 用以储存来自系 统存储器 ( 图 1 未图标 ) 的程序指令。微处理器 100 亦包括一指令解码器 (instruction decorder)108, 用 以 接 收 来 自 指 令 高 速 缓 存 106 的 指 令 并 将 其 解 码。 在 一 实 施 例 中, 指 令 解 码 器 108 包 括 指 令 转 译 器 (instructiontranslator), 用 以 将 微 处 理 器 100 的 一 宏 指 令 集 (macroinstruction set) 的 宏 指 令 转 译 为 微 处 理 器 100 的 一 微 指 令 集 (microinstruction set) 的微指令。 具体而言, 指令解码器 108 将存储器存取指令 (memory accessinstructions)( 例如 x86 MOV、 PUSH、 POP、 CALL、 RET 等指令 ) 转译为一个微指令的 序列, 上述序列包括一或多个加载微指令或储存微指令, 其中为了简化说明将其称为一个 加载指令或一个储存指令。在其它实施例中, 上述加载指令和储存指令是微处理器 100 原 生指令集 (native instruction set) 的一部分。
     微处理器 100 亦包括一 RAT 134, 耦接于指令解码器 108 ; 一保留站 (reservation station)136, 耦 接 于 RAT 134 ; 一 重 整 缓 冲 器 (reorder buffer, 简 称 为 ROB)172, 耦接 于 RAT 134 和保留站 136 ; 执行单元 138, 耦接于保留站 136 和 ROB 172 ; 以及架构暂存器 (architectural register)162, 耦接于 ROB 172 和执行单元 138。
     执行单元 138 包括存储器重整缓冲器 (memory order buffer, 简称为 MOB)182 或 者称为存储器子系统 182, 用以执行存储器存取指令, 例如加载指令与储存指令。 具体而言, MOB 182 根据加载指令与储存指令, 由与其耦接的数据高速缓存 186 中读出数据, 或者是写 入数据至与其耦接的高速缓存 186 中。此外, MOB 182 对应于一总线接口单元 ( 图 1 未显 示 ), 用以将数据由系统存储器读出, 或者是写入系统存储器。虽然 MOB 182 并非依照程序 次序地接收加载和储存指令来加以执行, 但是 MOB 182 仍可以正确地解析出储存碰撞。换 言之, MOB 182 会确保每个加载指令接收到正确的数据, 具体而言, 接收到来自正确的储存 指令 ( 或多个储存指令, 单一加载指令所指定的数据由多个储存指令所提供的情况下 ) 的 正确的数据以免发生储存碰撞。 如有必要, MOB 182 会产生一重新执行信号 166 至 ROB 172, 用以要求 ROB 172 将加载指令重新执行, 以确保本身 (MOB 182) 能够接收到正确的数据。 然 而, 本实施例试图减少 MOB 182 必须提出请求以重新执行加载指令的次数。执行单元 138 亦包括用以执行非存储器存取指令的其它执行单元 184, 例如整数指令执行单元、 浮点数指令执行单元、 多媒体指令执行单元, 以及类似的执行单元。
     RAT 134 依照程序次序地由指令解码器 108 接收解码的指令, 并且判断微处理器 100 中每一个指令与其它未退返指令的相依性。RAT 134 会储存微处理器 100 中有关于每 个未退返指令的暂存器更名信息 (register renaminginformation)。 暂存器更名信息包括 (incorporates) 这些未退返指令的程序次序。此外, RAT 134 包括一复杂状态机 (complex state machine), 用以根据更名信息和 RAT 134 的其它输入, 控制微处理器 100 的多种操 作。
     RAT 134 包括一相依性产生器 (dependency generator)188, 用以根据每个指令的 程序次序、 每个指令所指定的操作数来源, 以及更名信息 (renaminginformation) 来产生 每个指令的相依性信息 (dependency information)158。相依性信息 158 包括指令中每个 输入操作数的一识别符 (identifier), 即输入操作数所依附的被依赖者指令的识别符。在 一实施例中, 识别器是 ROB 172 中的项目的一个索引 (index), 用以识别 ROB 172 中的一个 项目, 而该项目用以储存被依赖者指令以及被依赖者指令所相关的状态信息, 如下所述。
     相依性信息 158 包括一般的 (normal) 相依性信息。相依性信息 158 亦包括有关 于加载指令的扩充式或附加的相依性信息, 用以降低由于储存碰撞导致加载指令被重新执 行的可能性。 RAT 134 根据提供来源操作数 (sourceoperands) 的指令的暂存器来产生一般 的相依性信息。举例而言, 在下列表 1 所示的程序码序列 (code sequence) 中, 第 (1) 列中 的指令 ADD 将 R5 和 R6 的内容相加并将结果放入 R3。第 (2) 列中的指令 SUB 将 R3 的内容 减掉 R8 的内容并将结果放入 R7。因为指令 ADD 在程序次序上先前于指令 SUB, 且指令 SUB 指定 R3 作为其操作数来源之一, 并且指令 ADD 指定 R3 作为其结果的目的地, 所以指令 SUB 与指令 ADD 具有相依性 ( 或是依附关系 )。因此, 指令 SUB 中第一操作数来源的一般的相 依性信息包括指令 ADD 的 ROB 索引, 使得保留站 136 在指令 ADD 被执行后 ( 即指令 ADD 已 经产生其结果并且该结果对指令 SUB 是有效的 ( 存在的或可取得的时候 )) 才会发布指令 SUB。在一实施例中, 微处理器 100 执行暂存器更名, ROB 172 中由架构暂存器 162 更名而 成的临时暂存器 (temporary register) 是作为用以提供输入操作数的暂存器。
     (1)ADD R3, R5, R6
     (2)SUB R7, R3, R8
     表1
     RAT 134 被加以扩充 (enhanced), 用以预测加载指令何时会发生储存碰撞, 并在 一般的相依性信息之外亦产生扩充式相依性信息, 使得加载指令依附于一个附加指令, 而 加载指令通常不会依附于该附加指令。RAT 134 产生扩充式相依性信息是为了减少加载指 令需被重新执行的可能性。在一实施例中, RAT 134 将一被依赖者指令的 ROB 索引包括于 一加载指令的一个未使用的输入操作数字段 ( 一第三输入操作数字段 ) 内, 以便让上述加 载指令依附于上述被依赖者指令。
     RAT 134 包括多个队列存储器, RAT 134 借着上述队列存储器作出储存碰撞的 预测, 并产生扩充式的加载指令相依性。上述队列存储器包括储存地址碰撞队列存储器 (store address collision queue, 简称为 SACQ)192、 储存地址别名队列存储器 (store address alias queue, 简称为 SAAQ)194、 储存数据别名队列存储器 (store data alias queue, 简称为 SDAQ)196 以及储存数据相依性队列存储器 (store data dependency queue,简称为 SDDQ)198, 图 2、 图 6、 图 8 和图 9 将分别详细说明每个上述队列存储器的项目。
     RAT 134 会派送 (dispatches) 已解码指令 (decoded instruction) 和有关于已解 码指令的相依性信息 158 至保留站 136。在派送指令之前, RAT 134 会为指令指派 ROB 172 的一个项目。因此, 指令会依照程序次序地被指派至 ROB172, 其中 ROB 172 是环形队列存 储器 (circular queue)。这使得 ROB 172 得以确保指令能够依照程序次序地被退返。RAT 134 亦将相依性信息 158 提供予 ROB 172, 用以将指令的项目储存于 ROB 172。当 ROB 172 重新执行一指令 ( 如加载指令 ) 时, ROB 172 在重新执行该指令的期间, 将储存在 ROB 项目 中的相依性信息提供予保留站 136。
     保留站 136 包括多个队列存储器, 用以存放 (hold) 由 RAT 134 接收的指令和相依 性信息 158。保留站 136 亦包括一发布逻辑器, 用以当指令准备好将被执行时, 将指令由队 列存储器发布至执行单元 138。当一指令的所有相依性都是已解析的 (resolved) 时, 该指 令是准备好将被发布且执行的。当被依赖者指令已经执行并使得其执行结果对所依附指 令 ( 依赖者指令 ) 是有效的时, 依赖者指令的相依性则是已解析的 ( 即此执行结果对即将 执行所依附指令的执行单元而言是有效的 )。执行单元 138 经由架构暂存器 162、 经由 ROB 172 中由架构暂存器 162 更名而得的临时暂存器 ( 图 1 未图示 ), 或者经由直接来自执行单 元 138 本身的转发路径 (forwarding paths)176, 来接收已执行指令的结果 164。执行单元 138 亦提供其结果 164 至 ROB 172, 以便写入至临时暂存器。 MOB 182 使用由加载指令和储存指令所指定的来源操作数来为加载指令解析 ( 即 计算 ) 加载地址, 以及为储存指令解析储存地址。 操作数的来源包括架构暂存器 162、 常数, 及 / 或由指令指定的位移 (displacements)。 MOB 182 亦通过所解析的加载地址 (resolved load address) 由数据高速缓存 186 中读取加载数据。MOB 182 亦通过所解析储存地址将 储存数据写入至数据高速缓存 186 中。在一实施例中, MOB 182 包括用以执行加载指令的 一加载单元, 以及用以执行储存指令的一或多个储存单元。
     如上所述, 在一些情况下, MOB 182 必须要求加载指令的重新执行, 其中重新执行 以提供至 ROB 172 的重新执行信号 166 表示。重新执行信号 166 指定需被重新执行的指令 ( 例如加载指令 ) 的 ROB 索引, 使得 ROB 172 能够以重新执行所需的指示 (indication) 将 索引项目 (indexed entry) 加以更新。在一实施例中, 重新执行信号 166 亦指定与加载指 令碰撞的储存指令的 ROB 索引, 该碰撞使得加载指令必须重新执行。当具有被标记为需被 重新执行的 ROB 索引的指令将紧接着被退返时 ( 即最先的未退反指令 ), ROB 172 重新执行 加载指令。换言之, ROB 172 将加载指令和其相关的相依性信息 158 由 ROB 172 重新派送 (re-dispatches) 至保留站 136, 等待以后重新发布 (re-issuance) 至执行单元 138 并被其 重新执行 (re-execution)。在一实施例中, ROB 172 不仅将加载指令重新执行, 亦将后于 (newer) 加载指令的所有指令重新执行。当 ROB 172 重新执行加载指令时, ROB 172 以重新 执行信号 168 通知 (signals)RAT 134 此事件 (event)。重新执行信号 168 用以指定被重新 执行的加载指令的 ROB 索引。
     参考图 2, 其显示用以说明本发明图 1 的 SACQ 192 的项目 202( 以下简称 SACQ 项 目 202) 的方块图。SACQ 项目 202 用以存放 RAT 134 所遇到的储存指令的信息。RAT 134 会如图 3 和图 4 所述地指派、 填入 (populates) 并使用 SACQ 项目 202。SACQ 项目 202 包括 一有效位 (valid bit)204, 用以指出此 SACQ 项目 202 是否有效。在重置时, 微处理器 100
     将所有的 SACQ 项目 202 初始化为无效的 (invalid), 意即清除每个 SACQ 项目 202 的有效 位 204。SACQ 项目 202 亦包括一 srcA 字段 (srcA field)206 和一 srcB(srcB field) 字段 208, 分别用以识别第一和第二操作数的来源, 其中 MOB 182 使用 srcA 字段 206 和 srcB 字段 208 来计算储存指令的储存地址。srcA 字段 206 和 srcB 字段 208 用以识别存放有操作数 或作为操作数的常数的架构暂存器 162。SACQ 项目 202 亦包括一位移字段 (displacement field)212, 用以存放由储存指令所指定的位移, 其中 MOB 182 使用位移字段 212 来计算其 储存地址。SACQ 项目 202 亦包括位移有效位 (displacement valid bit)214, 用以指出位 移字段 212 的数值是否有效。若储存指令为了其储存数据依附至被依赖者指令, SACQ 项目 202 亦会包括一索引字段 (index field)216, 用以存放被依赖者指令的 ROB 索引。在一实 施例中, RAT 134 将一既定值填入索引字段 216, 用以指出储存指令与其储存数据并无相依 性。
     参考图 3, 其显示用以说明本发明图 1 的 RAT 134 的操作的流程图。 流程始于步骤 304。
     在步骤 304, RAT 134 解码一指令并产生其一般的相依性信息, 其中一般的相依性 信息被包括于图 1 的相依性信息 158 中。流程前进至判断步骤 306。 在判断步骤 306, RAT 134 判断已解码指令是否为一储存指令。若是, 流程前进至 步骤 308 ; 否则, 流程前进至判断步骤 312。
     在步骤 308, RAT 134 会指派 SACQ 项目 202。换言之, 就逻辑上而言, RAT 134 用以 将 SACQ 项目 202 推入 SACQ 192 的尾端 (tail), 亦用以将 SACQ 项目 202 由 SACQ 192 的前 端 (head) 推出。接着, RAT 134 将来自储存指令的合适的信息填入所指派的 SACQ 项目 202 的 srcA 字段 206、 srcB 字段 208 和位移字段 212 中。 若储存指令指定一位移, 则 RAT 134 设 定 (sets) 位移有效位 214 ; 否则, RAT 134 会清除位移有效位 214。储存指令若由于其储存 数据依附至一被依赖者指令, RAT 134 亦会将被依赖者指令的 ROB 索引填入索引字段 216。 最后, RAT 134 会设定有效位 204。 在一实施例中, 储存指令实际上是两个独立的微指令 : 一 个是储存地址 (store address, 简写为 STA) 微指令, 另一个则是储存数据 (store data, 简 写为 STD) 微指令。STA 微指令被发布至 MOB 182 的储存地址单元, 其中储存地址单元用以 计算储存地址。 STD 微指令被发布至 MOB 182 的储存数据单元, 其中储存数据单元用以由来 源暂存器 (source register) 取得储存数据, 并且将储存数据发布 (posts) 至储存缓冲器, 以便后续写入存储器。在本实施例中, 当 RAT 134 遇见 (sees)STA 微指令时, RAT 134 会指 派 SACQ 192 的项目 202 并且将来自储存指令的合适的信息填入 srcA 字段 206、 srcB 字段 208 和位移字段 212 中, 而当 RAT 134 遇见 (sees)STD 微指令时, 若储存指令为了其储存数 据依附至被依赖者指令, RAT 134 则会将被依赖者指令的 ROB 索引填入索引字段 216, 并且 设定有效位 204。流程退回至步骤 304。
     在判断步骤 312, RAT 134 判断已解码指令是否为一加载指令。若是, 流程前进至 判断步骤 314 ; 否则, 流程前进至判断步骤 318。
     在判断步骤 314, RAT 134 会比较加载指令所指定的来源与 SACQ 项目 202 所指定 的储存指令的来源, 用以判断其 ( 由加载指令指定的来源 ) 是否符合于与 SACQ 项目 202 有关的任何储存指令。换言之, RAT 134 会比较加载指令的第一来源操作数的字段与每个 SACQ 项目 202 的 srcA 字段 206、 比较加载指令的第二操作数的字段与每个 SACQ 项目 202
     的 srcB 字段 208, 以及比较加载指令的位移字段与每个 SACQ 项目 202 的位移字段 212。在 一实施例中, RAT134 亦允许加载指令以调换次序的方式 (swapped order) 指定相同的来源 暂存器。若对任何一个 SACQ 项目 202 而言, 上述三种字段均符合, 而加载指令用以指定一 位移且该位移有效位 214 是被设定的, 或加载指令未指定一位移且该位移有效位 214 是被 清除的, 则流程前进至步骤 316 ; 否则, 流程退回步骤 304。
     在步骤 316, RAT 134 预测出加载指令将与符合于 SACQ 项目 202 的较先的加载指 令发生碰撞, 故因而使得加载指令为了储存指令的储存数据, 而分享 ( 共享 ) 储存指令的相 依性。换言之, RAT 134 为加载指令产生扩充式相依性 (enhanced dependency)158, 其中扩 充式相依性 158 用以指定符合于 SACQ 项目 202 的指针字段 216 的数值, 如步骤 314 所述。 在一实施例中, MOB 182 的作用在于 : 若 MOB 182 在相同时钟周期接收到发生储存碰撞的加 载和储存指令, 则 MOB 182 能够将正确的数据由储存指令转发 (forwarding) 至加载指令, 使得加载指令不需被重新执行。因此, 通过产生扩充式相依性让加载指令依附于被预测为 将发生碰撞的储存指令, 且储存指令是为了其储存数据依附至被依赖者指令, RAT 134 将让 保留站 136 等待至被依赖者指令之后, 才将加载指令和被预测为将发生碰撞的储存指令发 布出去, 而在多数情况中, 加载指令将不会早于被预测为将发生碰撞的储存指令被发布。 流 程退回步骤 304。
     在判断步骤 318, RAT 134 判断已解码指令是否为能够修正由任何 SACQ 项目 202 的 srcA 字段 206 或 srcB 字段 208 指定为 ( 储存地址 ) 来源的一指令。若是, 则流程前进 至步骤 322 ; 否则, 流程退回步骤 304。
     在步骤 322, RAT 134 清除每个 SACQ 项目 202 的有效位 204, 其中有效位 204 用以 指定 SACQ 项目 202 的 srcA 字段 206 或 srcB 字段 208 中的暂存器是否由步骤 318 判断后 的已解码指令所修正。因为加载地址和储存地址将不会重迭, 所以 RAT 134 会清除有效位 204 ; 因此, 让后续的加载指令与 SACQ 项目 202 所相关的储存指令共享 ( 分享 ) 储存数据的 相依性不太可能会具有帮助。流程退回步骤 304。
     参考图 4, 其显示用以说明本发明图 1 的 ROB 172 的操作的流程图。 流程始于步骤 402。
     在步骤 402, ROB 172 退返一指令并通知 (notify)RAT 134。流程前进至判断步骤 404。
     在步骤 404, RAT 134 扫描 SACQ 192, 用以判断是否有任何 SACQ 项目 202 的索引 字段 216 符合于被 ROB 172 退返的指令的索引。若有, 则流程前进至步骤 406 ; 否则, 流程 退回步骤 402。
     在步骤 406 中, RAT 134 清除符合的 SACQ 项目 202 的有效位 204。这样能够确保 RAT 134 不会为后续的加载指令产生扩充式相依性去依附至一个已被退返的指令。流程退 回步骤 402。
     参考图 5, 其显示用以说明本发明图 1 的保留站 136 的操作的流程图。 流程始于步 骤 502。
     在步骤 502, 保留站 136 检查 (examines) 指令的相依性信息。流程前进至判断步 骤 504。
     在步骤 504, 保留站 136 判断由有关于一指令的相依性信息指定的所有相依性(dependencies) 是否都已被解析。在一实施例中, 保留站 136 会检查由相依性信息 158 的 ROB 索引所指定的 ROB 172 项目中的完成位 (completebit)。当所有的完成位都是设定的 时候, 则相依性已被解析。当一执行单元 138 产生一指令的执行结果时, 执行单元 138 会设 定 ROB172 项目中有关于该指令的完成位。具体而言, 在 RAT 134 为加载指令产生扩充式相 依性后 ( 如图 3 步骤 316 所述 ), 保留站 136 判断被预测为将发生碰撞的储存指令为了其 储存数据所依附的该 ( 加载 ) 指令是否为完成的。若 ( 加载 ) 指令的所有相依性都已被解 析, 则流程前进至步骤 506 ; 否则, 流程退回步骤 502。
     在步骤 506, 保留站 136 发布具有已被解析的相依性的指令至执行单元 138。流程 退回步骤 402。该已被解析的相依性的指令包含加载指令以及其它种类的指令。
     根据图 2 至图 5 的实施例, 图 1 的微处理器 100 的操作将以下列表 2 和表 3 中 程序码序列的处理加以说明。为了简化, 在本实施例中, 加载和储存指令不包括位移值 (displacement value)。第 (1) 列中的加法指令 ADD 将暂存器 R5 和 R6 的内容相加并将结 果放入暂存器 R3。第 (2) 列中的储存指令 ST 将暂存器 R3 的内容储存至存储器的储存地 址, 其中储存地址是将暂存器 R1 和 R2 的内容相加而得。第 (3) 列中的加载指令 LD 将存储 器的加载地址加载暂存器 R7, 其中加载地址是将暂存器 R1 和 R2 的内容相加而得。
     (1)ADD R3, R5, R6
     (2)ST R3, R1, R2
     (3)LD R7, R1, R2
     表2
     当 RAT 134 遇到第 (2) 列的储存指令 ST 时, RAT 134 会执行图 3 的步骤 304 至步 骤 308。换言之, RAT 134 产生一般的相依性信息 158、 指派 SACQ 192 的项目, 以及将暂存 器 R1 和 R2 分别填入 srcA 字段 206 和 srcB 字段 208。此外, 因为暂存器 R3 是储存指令 ST 的储存数据的来源暂存器 (sourceregister) 且暂存器 R3 亦是加法指令 ADD 执行结果的目 的地暂存器, 储存指令 ST 会由于其储存数据 ( 暂存器 R3 的储存数据 ) 而依附至加法指令 ADD, 因此 RAT 134 会将加法指令 ADD 的 ROB 索引填入索引字段 216。最后, RAT 134 会清除 位移有效位 214 并且设定有效位 204。
     当 RAT 134 遇到第 (3) 行的加载指令 LD 时, RAT 134 执行程序的流程是由图 3 的 步骤 304, 经步骤 312 至步骤 316。换言之, 在步骤 304 时, RAT 134 产生一般的相依性信息 158 ; 在判断步骤 314 时, RAT 134 检测到加载地址的来源 ( 即暂存器 R1 和 R2) 正好符合于 刚才为储存指令 ST 所填入的 SACQ 项目 202 的 srcA 字段 206 和 srcB 字段 208, 故因而产生 扩充式相依性信息 158。扩充式相依性信息 158 为刚才为储存指令 ST 所填入的 SACQ 项目 202 的索引字段 216 的值, 并且扩充式相依性信息 158 会使得加载指令 LD 依附至第 (1) 列 的加法指令 ADD, 意即使得加载指令 LD 为了储存指令 ST 的储存数据, 而共享储存指令 ST 的 相依性, 依附至加法指令 ADD。因此, 根据图 5, 保留站 136 在加法指令 ADD 已经完成后 ( 即 加法指令 ADD 的执行结果对储存指令 ST 是有效的 ) 才会发布加载指令 LD, 其中储存指令 ST 会将执行结果转发至加载指令 LD。
     接着, 如图 4 所述, 当 ROB 172 退返第 (1) 列的加法指令 ADD 时, RAT 134 清除有 关于第 (2) 列储存指令 ST 所对应的 SACQ 项目 202 的有效位 204。
     表 3 中的的程序码序列类似于表 2 中的程序码序列 ; 然而, 在第 (2) 列的储存指令ST 和第 (3) 列的加载指令 LD 间的第 (2’ ) 列中, 有一减法指令 SUB, 用以将暂存器 R8 的内 容减去暂存器 R9 的内容, 然后将结果放入暂存器 R1。
     (1)ADD R3, R5, R6
     (2)ST R3, R1, R2
     (2’ )SUB R1, R8, R9
     (3)LD R7, R1, R2
     表3
     当 RAT 134 遇到第 (2’ ) 列的减法指令 SUB 时, RAT 134 执行程序的流程是由图 3 的步骤 304, 经步骤 318 至步骤 322。换言之, 因为减法指令 SUB 修改了被 SACQ 项目 202 的 scrA 字段 206 所指定的暂存器 R1 的内容, 所以 RAT134 会产生一般的相依性信息 158 并且 清除有关于第 (2) 列的储存指令 ST 的 SACQ 项目 202 的有效位 204。
     由图 1 ~图 5 和表 1 ~表 3 中的说明可以发现本发明的优点在于 : RAT 134 产生 的扩充式相依性能够使得加载指令 LD 和储存指令 ST 依附于相同的指令。当 RAT 134 遇到 加载指令 LD 和储存指令 ST 时, 因为加载地址和储存地址仍未产生, 故即使加载地址和储存 地址会发生碰撞, RAT 134 亦不会由于储存指令 ST 因此为加载指令产生一般的相依性。 相较于 Panwar 等人以彩色位阵列为基础的系统 ( 美国专利案号 6,006,326), 图 2 ~图 5 的实施例的优点是 : 为了预测储存碰撞并产生扩充式相依性信息, 在本实施例中, 不需要让加载指令重新执行其先前的执行 ; 更确切地说, 本实施例能够完全避免加载指令 的重新执行, 意即若用以计算加载地址和储存地址的来源是相同的, 则本实施例能够避免 加载和储存指令在第一次执行后的重新执行。如前所述, 如果时钟周期的严重效能损失是 源自于指令的重新执行, 则这是显著的优点。
     然而, RAT 产生的扩充式相依性却可能是错误的相依性。换言之, 虽然加载地址和 储存地址并未重迭, 但是 RAT 134 却错误地预测了一次储存碰撞, 这项错误实际上会让微 处里器花费更多时间来执行加载指令, 这是因为 : 加载指令可能在扩充式相依性的被依赖 者指令之前就已经被发布, 而加载指令不需要被重新执行。然而, 发明人发现, 对多数程序 而言, 加载指令重新执行次数的减少所得到的益处远大于错误预测的后果。这可能是重新 执行的效能损失相对较大所导致, 其中在一实施例中, 因为重新执行而导致的效能损失为 50 个时钟周期, 而由错误预测所导致的效能损失为 1 或 2 个时钟周期, 并且若加载地址和储 存地址的来源是相同的, 则其重迭的机率也很高。
     相较于 Panwar 等人以彩色位阵列为基础的系统 ( 美国专利案号 6,006,326), 图 2 ~图 5 的实施例的另一种优点是 : 相较于彩色位阵列, 本实施例不需要太多的储存空间, 并且具有提供附加 (concomitant) 空间和节能的优点。 虽然 SACQ 的每个项目都可能储存比 彩色位实施例更多的位, 但是因为彩色位阵列的大小相应于指令高速缓存的每个指令 ( 或 指令区块 ) 的项目数量, 而 SACQ 项目的数量远少于彩色位项目的数量, 因此, SACQ 项目的数 量反而比较少。举例而言, 在微处理器的一实施例中, 发明人发现具有 4 个项目的 SACQ 能 够大幅减少加载指令重新执行的次数。
     相较于 Panwar 等人以彩色位阵列为基础的系统 ( 美国专利案号 6,006,326), 图 2 ~图 5 的实施例的另一种优点是 : 本实施例能够让加载指令比彩色字节更快被发布。具 体而言, 彩色位阵列根据其本身的储存指令来产生加载指令的相依性, 这表示加载指令只
     能够在储存指令执行后被发布 ; 反之, 图 2 ~图 5 和图 8 ~图 11 的实施例根据发生碰撞的 储存指令为了其储存数据而依附的被依赖者指令来产生扩充式相依性, 并不是如同 Panwar 等人是根据有关于发生碰撞的储存指令本身来产生相依性, 这表示在一些情况下, 通过本 处所述实施例, 加载指令会比 Panwar 等人的实施例更快被发布。
     如同即将被说明的表 4 中的程序码片段, 在一些情况下, 图 2 ~图 4 的实施例并未 预测到储存碰撞。然而, 图 6 ~图 11 的实施例能够预测到该等情况下的储存碰撞。表 4 中 的程序码片段类似于表 2 中的程序码片段 ; 然而, 第 (3) 列的加载指令 LD 将暂存器 R8( 而 非暂存器 R2) 的内容和暂存器 R1 的内容相加以计算加载地址。因为在第 (2) 列的储存指 令用以计算储存地址的来源与第 (3) 列的加载指令用以计算加载地址的来源并不相同, 所 以即使加载地址储存地址互相符合, SACQ 192 也不会如同图 2 ~图 5 预测可能发生的储存 碰撞 ; 然而, 图 6 ~图 11 的实施例能够预测到可能的储存碰撞。
     (1)ADD R3, R5, R6
     (2)ST R3, R1, R2
     (3)LD R7, R1, R8
     表4 参考图 6, 其显示用以说明本发明图 1 的 SAAQ 194 的项目 602( 以下简称 SAAQ 项 目 602) 的方块图。因为加载指令的加载地址与具有仍未被产生的储存地址的较先的储 存指令发生储存碰撞, 所以加载指令接收到错误的数据, 且加载指令因此而被重新执行, 故 SAAQ 项目 602 用以存放被重新执行的加载指令的信息。RAT 134 会如图 7 所述地指派、 填 入并使用 SAAQ 项目 602。SAAQ 项目 602 包括一有效位 602, 用以指出 SAAQ 项目 602 是否有 效。 在重置时, 微处理器 100 将所有的 SAAQ 项目 602 初始化为无效的 ( 即清除每个 SAAQ 项 目 602 的有效位 604)。此外, 在一实施例中, 每当 x86 程序码片段的片段描述符 (segment descriptor) 中的程序码限制数值 (code segment limit value) 被写入时, 每个 SAAQ 项 目 602 的有效位 604 便被清除。SAAQ 项目 602 亦包括一指令指针 (instruction pointer, 简写为 IP) 字段 606, 用以储存加载指令所停留的存储器地址。在一实施例中, IP 字段 606 用于记录在加载指令之后的下一个指令的存储器地址, 而非记录加载指令本身的存储器地 址。SAAQ602 亦包括一差值 (delta) 字段 608, 用以储存介于加载指令的 ROB 索引和储存指 令的 ( 在一实施例中, 该储存指令为一 STA 指令 )ROB 索引之间的差值, 该差值是造成加载 指令重新执行的原因, 如下所述。
     参考图 7, 其显示本发明中图 1 的微处理器 100 产生加载指令的扩充式相依性信息 的流程图, 用以说明当发生储存碰撞时避免重新执行的操作。流程始于步骤 702。
     在步骤 702, 因为加载指令与仍未被 MOB 182 产生的地址的一较先的储存指令发 生储存碰撞, 所以 MOB 182 检测到已完成的加载指令接收到错误的数据。因此, MOB 182 并 不知道 MOB182 或执行单元 138 必需将发生碰撞的储存指令的数据转发至加载指令。在一 实施例中, 即使 MOB 182 知道有一或多个较先的储存指令的储存地址仍未被解析, 也就是 即使 MOB 182 知道在加载指令和具有未解析储存地址的储存指令之间有可能发生储存碰 撞, MOB 182 仍允许加载指令存取数据高速缓存 186。MOB 182 这样作是希望储存碰撞从未 发生, 在这种情况下, 相较于 MOB 182 在储存地址被解析后才让加载指令停止等待 ( 才发布 加载指令 ), 加载指令能够执行得更快。若存在储存碰撞的情况, 即因为 MOB 182 应该都已
     经将正确的数据从具有未解析地址的发生碰撞的储存指令之处转发出去, 加载指令因而接 收到错误的数据时, 则这么作的后果是加载指令必须被重新执行。流程前进至步骤 704。
     在步骤 704, MOB 182 产生重新执行信号 166 至 ROB 172, 用以指出步骤 702 所检 测到的情况。具体而言, MOB 182 输出加载指令的 ROB 索引和储存指令, 其中 ROB 172 使用 加载指令的 ROB 索引来更新加载指令的 ROB 项目的状态, 以便指出加载指令需要被重新执 行。流程前进至步骤 706。
     在步骤 706, RAT 134 监测 (snoops)MOB 182 在步骤 704 产生的重新执行信号 166、 记录 (notes) 加载指令的重新执行请求, 以及计算加载指令的 ROB 索引和储存指令的 ROB 索引之间的差值并将该差值储存于其中。在一实施例中, 当 RAT 134 在计算差值时, RAT 134 会考虑 ROB 172 的环形队列存储器特性的绕回影响 (wrap around affect)。在表 4 的 实施例中, 在步骤 704, MOB 182 输出第 (3) 列的加载指令 LD 的 ROB 索引和第 (4) 列的储存 指令 ST 的 ROB 索引 ; 因为上述两个指令在程序次序上是相邻的, 所以 RAT 134 计算其 ROB 索引之间的差值为 1。如上所述, 在一实施例中, 储存指令 ST 实际上是两个独立的微指令 : 一个是储存地址 STA 微指令, 其次是紧接其后的 STD 微指令。 在本实施例中, 在步骤 704 中, ROB 172 输出 STA 微指令的 ROB 索引, 其中 STA 微指令在程序次序上先前于 STD 微指令 ; 因 此, RAT 134 计算加载指令的 ROB 索引和 STA 微指令的 ROB 索引之间的差值为 2。流程前进 至步骤 708。
     在步骤 708, ROB 172 判断紧接的加载指令要被退返, 即加载指令已经成为 ROB 172 中最先的指令。ROB 172 发现 (sees) 加载指令被标记为需被重新执行并重新执行加载 指令。换言之, ROB 172 重新派送加载指令和其相依性信息 158 至保留站 136, 用以等待后 续被重新发布至执行单元 138, 以便重新执行。在一实施例中, ROB 172 不仅将加载指令重 新执行, 亦将后于加载指令的所有指令重新执行。此外, ROB 172 产生重新执行信号 168 至 RAT 134。流程前进至步骤 712。
     在步骤 712, RAT 134 会根据步骤 708 产生的重新执行指令 168 而指派 SAAQ 项目 602。换言之, RAT 134 将被指派的新 SAAQ 项目 602 推入 SAAQ 194 的尾端 (tail), 亦将由 SAAQ 194 的前端推出一个 SAAQ 项目 602。接着, RAT134 将来自储存指令的 IP 数值填入 IP 字段 606。RAT 134 亦将步骤 706 计算的差值填入差值字段 608。最后, RAT 134 设定有效 位 604。流程前进至步骤 714。
     在步骤 714, RAT 134 遇到一第二加载指令并为该加载指令产生其一般的相依性 信息。此外, RAT 134 会比较每个有效的 SAAQ 项目 602 的 IP 字段 606 与加载指令的 IP 数 值。流程前进至判断步骤 716。
     在判断步骤 716, RAT 134 判断步骤 714 所执行的比较是否显示具有任何 SAAQ 项 目 602 符合于加载指令的 IP 数值。若无, 则流程结束 ; 否则流程前进至步骤 718。要注意 的是, RAT 134 在步骤 714/716/718 遇到的第二加载指令不同于 RAT 134 在步骤 712 填入 的 IP 所属的加载指令。因此, 当加载指令被重新执行时, RAT 134 不会将储存指令目前的 (actual)ROB 索引填入 SAAQ 项目 602。 更确切地说, 本发明的优点在于当加载指令被重新执 行时, RAT 134 会先将第一次遭遇到的加载指令和储存指令之间 ROB 索引的差值填入 SAAQ 项目 602, 以便 RAT 134 在下一次遇到第二加载指令或在其之后的加载指令时, RAT 134 能 够为较先的储存指令在先前已决定的差值字段 608 和目前的加载指令产生一扩充式相依性, 如以下步骤 718 所述。发明人已经确认加载指令所需要等待的加载指令和储存指令之 间 ROB 索引的差值极有可能相同于重新执行后的 ROB 索引。
     在步骤 718, RAT 134 预测加载指令会与较先的储存指令发生碰撞, 因而使得加载 指令依附于储存指令, 其中较先的储存指令的 ROB 索引是由符合的 SAAQ 项目 602 的差值字 段 608 的数值计算而得。换言之, RAT 134 为加载指令产生扩充式相依性 158, 其中扩充式 相依性 158 用以指定 ROB 索引, 而此 ROB 索引是一个差值, 其等于加载指令的 ROB 索引减去 在步骤 716 所决定的符合的 SACQ 项目 602 的差值字段 608 的数值 ( 即储存指令的 ROB 索 引 )。本发明的优点在于 : 因为加载指令依附于储存指令, 所以加载和储存指令将依程序次 序被发布。 具体而言, 储存指令会被及时地 (in time) 执行 ( 即产生其储存地址 ), 以便 MOB 182 检测其与加载地址碰撞的地址。因此, 当加载指令到达 MOB 182 时, 而储存数据是可取 得的 ( 有效的、 存在的 ), MOB 182 将检测到加载和储存指令间发生碰撞, 并且将储存数据转 发给加载指令。若储存数据是无法取得的 ( 无效的、 不存在的 ), 则 MOB 182 将重新执行加 载指令, 如以下图 8 ~图 11 所讨论的实施例。在表 4 的实施例中, 因为差值字段 608 的数 值为 1( 若是 STA 微指令, 则数值是 2), 所以 RAT 134 将为第 (3) 列的加载指令 LD 产生扩充 式相依性 158, 用以指定第 (2) 列的储存指令 ST, 使得保留站 136 进行等待, 然后在储存指 令 ST( 或 STA 微指令 ) 已经发布之后, 才发布加载指令 LD。流程中止于步骤 718。
     根据一实施例, SAAQ 194 的 IP 字段 606 的长度少于 IP 地址的位数。因此, 即使 在步骤 716 判断有 SAAQ 项目的 IP 字段 606 符合于加载指令的 IP 数值, 亦不能保证加载指 令与在步骤 708/712 被重新执行的加载指令是相同的。 此外, 亦不能保证在索引的 ROB 172 项目中有一个储存指令, 或者是其储存地址与加载指令的加载地址发生碰撞。 更确切地说, RAT 134 只是作出预测而已。 然而, 发明人发现, 虽然 RAT 134 有预测错误的可能性, 但是使 用图 6 ~图 7 的实施例仍可大幅减少加载指令重新执行的次数。
     相较于 Panwar 等人以彩色位阵列为基础的系统 ( 美国专利案号 6,006,326), 上述 图 6 ~图 7 和下述图 8 ~图 11 的实施例的一种优点是 : 上述实施例所需的储存空间少于彩 色位阵列, 并且具有提供附加空间和节能的优点, 如上所述。虽然 SAAQ 或 SAAQ+SDDQ 的每 个项目都可能比彩色位阵列储存更多位数, 但是因为彩色位阵列的项目必须对应到指令高 速缓存的每个指令 ( 或指令区块 ), 所以 SAAQ 或 SAAQ+SDDQ 项目的数量却可能远少于彩色 位阵列的项目数量 ; 因此, SAAQ 或 SAAQ+SDDQ 项目的总存储器数量反而比较少。举例而言, 在微处理器的一实施例中, 发明人发现具有 4 个项目的 SAAQ、 具有 4 个项目的 SDAQ, 以及具 有 2 个项目的 SDDQ 能够大幅减少加载指令重新执行的次数。
     相较于 Panwar 等人以彩色位阵列为基础的系统 ( 美国专利案号 6,006,326), 上述 图 6 ~图 7 和下述图 8 ~图 11 的实施例的另一种优点是 : 因为上述实施例提供加载指令重 新执行的理由较多较细致, 并且试图根据重新执行的不同理由, 使用不同方法来预测储存 碰撞, 所以上述实施例能够大幅减少加载指令重新执行的次数。
     只有当重新执行是因为已完成的加载指令接收到错误的数据所造成时, 图 6 ~图 7 的实施例才会填入 SAAQ 194 的项目, 上述成因是加载指令与仍未被 MOB 182 产生的地址 的较先的加载指令发生碰撞, MOB 182 因而并未检测到其必需将发生碰撞的数据转发至加 载指令。 然而, 发明人已经确定 : 有一些储存碰撞引起的 (store collision-induced) 加载 指令重新执行是不能通过图 6 ~图 7 的实施例而预测的。 具体而言, 有一些重新执行的起因在于 MOB182 检测到在执行了一加载指令时, MOB 182 提供了错误的数据给该加载指令 ( 因 为其检测到在加载指令和储存指令间的储存碰撞 ), 但是发生碰撞的储存指令的储存数据 却是无效的 ( 不存在的或无法取得的 )。本发明的优点在于 : 图 8 ~图 11 的实施例解决了 这个问题。具体而言, RAT 134 会试图为加载指令产生扩充式相依性, 让加载指令分享储存 指令的相依性, 使得加载指令在储存指令为了其储存数据所依附的指令已经发布后, 加载 指令才会被发布执行, 其细节如下所述。
     参考图 8, 其显示用以说明本发明图 1 的 SDAQ 196 的项目 802( 以下简称 『SDAQ 项 目 802』 ) 的方块图。SDAQ 项目 802 用以存放被重新执行的加载指令的信息, 加载指令被重 新执行的原因是 : 当 MOB 182 执行加载指令时, 因为加载指令的加载地址与具有无效的 ( 不 存在的或无法取得的 ) 储存数据的储存指令发生碰撞, 所以加载指令接收到错误的数据, 加载指令因而被重新执行。RAT 134 会如图 10 和图 11 所述地指派、 填入并使用 SDAQ 项目 802。SDAQ 项目 802 包括一有效位 804, 用以指出 SDAQ 项目 802 是否有效。在重置时, 微处 理器 100 将所有的 SDAQ 项目 802 初始化为无效的 ( 即清除每个 SDAQ 项目 802 的有效位 804)。此外, 在一实施例中, 每当 x86 程序码片段的片段描述符中的程序码限制数值被写入 时, 每个 SDAQ 项目 802 的有效位 804 便被清除。SDAQ 项目 802 亦包括一 IP 字段 806, 用以 储存加载指令所停留的存储器地址。在一实施例中, IP 字段 806 记录在加载指令之后的下 一个指令的存储器地址, 而非加载指令本身的存储器地址。SDAQ 项目 802 亦包括一历史字 段 (historyfield)808, 用以估计 (approximates) 加载指令的 IP 字段 806 的重新执行次 数, 其细节如以下详述。在一实施例中, 历史字段 808 的数值逐渐递增并在数值等于 4 时饱 和。SDAQ 项目 802 亦包括一索引字段 812, 用以存放 IP 字段 806 所指定地址上最近的加载 指令的 ROB 索引。SDAQ 项目 802 亦包括一索引有效字段 814, 用以指出索引字段 812 的数 值是否有效。
     参考图 9, 其显示用以说明本发明图 1 的 SDDQ 198 的项目 902( 以下简称 『SDDQ 项目 902』 ) 的方块图。SDDQ 项目 902 用以存放有关于 RAT 134 最近遇到的储存指令的相 依性信息。RAT 134 会如图 10 和图 11 所述地指派、 填入并使用 SDDQ 项目 902。SDDQ 项目 902 包括一有效位 04, 用以指出 SDDQ 项目 902 是否有效。在重置时, 微处理器 100 将所有 的 SDDQ 项目 902 初始化为无效的 ( 即清除每个 SDDQ 项目 902 的有效位 904)。此外, 类似 于图 4 中的 ROB172 将 SACQ 172 无效化 (invalidates) 的方式, 当 ROB 172 将具有符合于 SDDQ 项目 902 的索引字段 906 的索引字段的指令退返时, ROB 172 将 SDDQ 项目 902 无效 化。若储存指令为了其储存数据依附至一被依赖者指令, SDDQ 项目 902 亦会包括索引字段 906, 用以存放被依赖者指令的 ROB 索引。在一实施例中, RAT 134 将一既定值填入索引字 段 906, 指出储存指令不会由于其储存数据而具有依附关系。
     参考图 10, 其显示本发明中图 1 的微处理器 100 产生加载指令的扩充式相依性信 息的流程图, 用以说明当发生储存碰撞时避免重新执行的操作。流程始于步骤 1004。
     在步骤 1004, RAT 134 解码一指令并产生其一般的相依性信息, 其中一般的相依 性信息被包括于图 1 的相依性信息 158 中。流程前进至判断步骤 1006。
     在判断步骤 1006, RAT 134 判断已解码指令是否为一储存指令。若是, 流程前进至 步骤 1008 ; 否则, 流程前进至判断步骤 1012。
     在判断步骤 1008, RAT 134 指派 SDDQ 项目 902。换言之, 在队列存储器逻辑结构上而言, RAT 134 会将 SDDQ 项目 902 推入 SDDQ 902 的尾端 (tail), 亦会将 SDDQ 项目 902 由 SDDQ 902 的前端 (head) 推出。接着, 若储存指令为了其储存数据相依至被依赖者指令, RAT 134 则将被依赖者指令的 ROB 索引填入索引字段 906。最后, RAT 134 设定有效位 904。 在一实施例中, 储存指令实际上是两个独立的微指令 : 一个是 STA 微指令, 另一个则是 STD 微指令。在本实施例中, 当 RAT 134 遇见 STD 微指令时, RAT 134 指派 SDDQ 项目 902、 将被 依赖者指令的 ROB 索引填入索引字段 906( 若储存指令为了其储存数据依附至被依赖者指 令 ), 以及设定有效位 904。流程退回步骤 1004。
     在步骤 1012, RAT 134 判断已解码指令是否为一加载指令。若否, 流程退回步骤 1004 ; 否则, 流程前进至步骤 1014。
     在步骤 1014, RAT 134 会比较每个有效的 SDAQ 项目 802 的 IP 字段 806 与加载指 令的 IP 数值。流程前进至判断步骤 1016。
     在判断步骤 1016, RAT 134 判断步骤 1014 所执行的比较是否显示具有任何 SDAQ 项目 802 符合于加载指令的 IP 数值。若无, 则流程退回步骤 1004 ; 否则, 流程前进至步骤 1018。根据一实施例, SDAQ 196 的 IP 字段 806 长度少于 IP 地址的位数。因此, 即使在步 骤 1016 判断有 SDAQ 项目符合于加载指令的 IP 数值, 亦不能保证加载指令与在步骤 1104 中 ( 图 11) 被重新执行的加载指令是同一个的。
     在步骤 1018, RAT 134 检查符合的 SDAQ 项目 802 的历史字段 808 的数值。若历史 字段 808 的数值为 0 或 1, 则 RAT 134 让加载指令分享 ( 共享 ) 被较后 ( 新 ) 的 SDAQ 项目 902 的索引字段 906 所指定的储存指令的相依性。若历史字段 808 的数值为 2 或 3, 则 RAT 134 让加载指令共享 ( 分享 ) 较先的 SDAQ 项目 902 的索引字段 906 所指定的储存指令的 相依性 ( 在一实施例中, SDDQ 项目 902 的数目为 2)。若历史字段 808 的数值大于 3, 则 RAT 134 让加载指令成为强制依照顺序执行的加载指令。换言之, RAT 134 为加载指令产生扩充 式相依性 158, 使得保留站 136 进行等待, 然后在所有较先的储存指令 ( 或 STA 微指令 ) 已 经发布之后, 才发布加载指令 LD。在其它实施例中, SDDQ 项目 902 的数目不为 2, 并且随着 历史字段 808 的数值的增加, RAT 134 选择的 SDDQ 198 中更加老旧的储存指令。再者, 在 其它实施例中, 历史字段 808 的最大数值大于 4, 且历史字段 808 的临界数值亦不同于图 10 的实施例。只有当 SDDQ 项目 902 有效时, RAT 134 才会让加载指令共享 ( 分享 )SDDQ 项目 902 所指定的储存指令的相依性 ; 否则, 若所有 SDDQ 项目 902 都无效时, 根据一实施例, 则 RAT 134 让加载指令成为强制依照顺序执行的加载指令, 并且根据另一实施例, 则 RAT 134 并不为加载指令产生扩充式相依性。流程前进至判断步骤 1022。
     在判断步骤 1022, RAT 134 判断索引有效字段 814 是否为了步骤 1016 被判断为符 合的 SDAQ 项目 802 而被设定的。若 SQAQ 项目 802 是有效的, 流程退回步骤 1004 ; 否则, 步 骤前进至步骤 1024。
     在步骤 1024, RAT 134 以目前的加载指令的 ROB 索引填入 SDAQ 项目 802 的索引 字段 812, 并设定索引有效位字段 814, 其中目前的加载指令的地址是被 IP 字段指定的 ( 即 RAT 134 在步骤 1004 所遇到的加载指令的 ROB 索引 )。流程退回步骤 1004。
     参考图 11, 其显示本发明中图 1 的微处理器 100 指定并更新 SDAQ 196 的项目 802( 以下简称 『SDAQ 项目 802』 ) 的流程图。流程始于步骤 1102。
     在步骤 1102, 当 MOB 182 执行加载指令时, MOB 182 检测到加载指令与不具有储存数据 ( 即储存数据是无效的、 不存在的或无法取得的 ) 的储存指令发生碰撞, 而且 MOB 182 提供给加载指令的数据是错误的。因此, MOB 182 产生重新执行信号 166 给 ROB 172, 用以 告知 MOB 182 所检测到的情况。具体而言, MOB 182 输出加载指令的 ROB 索引给 ROB 172, 其中 ROB 172 使用加载指令的 ROB 索引来更新 ROB 172 的项目的状态, 以便指出加载指令 需要被重新执行。流程前进至步骤 1104。
     在步骤 1104, ROB 172 判断出步骤 1105 所检测到的加载指令紧接着要被退返, 即 加载指令已经成为 ROB 172 中最先的指令。 ROB 172 发现加载指令被标记为需被重新执行, 因而重新执行加载指令。换言之, ROB 172 从 ROB 172 重新派送加载指令和其相依性信息 158 至保留站 136, 用以等待后续被重新发布至执行单元 138 并加以重新执行。在一实施例 中, ROB 172 不仅将加载指令重新执行, 亦将后于加载指令的所有指令重新执行。此外, ROB 172 产生重新执行信号 168 至 RAT 134。流程前进至步骤 1106。
     在步骤 1106, RAT 134 会比较重新执行的加载指令的 IP 数值与每个有效的 SDAQ 项目 802 的 IP 字段 806。流程前进至判断步骤 1108。
     在判断步骤 1108, RAT 134 判断步骤 1106 所执行的比较是否显示具有任何 SDAQ 项目 802 符合于加载指令的 IP 数值。若无, 则流程前进至步骤 1112 ; 否则, 流程前进至步 骤 1114。
     在步骤 1112, RAT 134 会指派 SDAQ 项目 802。换言之, 逻辑上而言, RAT134 会将 SDAQ 项目 802 推入 SDAQ 802 的尾端 (tail), 亦会将 SDAQ 项目 802 由 SDAQ 802 的前端 (head) 推出。接着, RAT 134 将加载指令的 IP 数值填入 IP 字段 806。RAT 134 亦将历史字 段 808 清除为 0。最后, RAT 134 设定有效位 804。流程中止于步骤 1112。
     在步骤 1114, RAT 134 会比较加载指令的 ROB 索引与每个有效的 SDAQ 项目 802 的 索引字段 812, 其中每个有效的 SDAQ 项目 802 的索引有效位是被设定为有效的。流程前进 至判断步骤 1116。
     在步骤 1116, RAT 134 判断步骤 1114 所执行的比较是否显示具有任何 SDAQ 项目 802 符合于加载指令的 ROB 索引。若无, 则流程结束 ; 否则, 流程前进至步骤 1118。
     在步骤 1118, RAT 134 将符合的 SDAQ 项目 802 的历史字段 808 增量。因为在步骤 1102 决定将加载指令重新执行, 所以加载指令在步骤 1104 被重新执行, RAT 134 因而将历 史字段 808 增量。然而, 要注意的是, 若加载指令是由于其它原因而被重新执行, 例如图 7 的步骤 702, 则 RAT 134 不会将历史字段 808 增量。此外, RAT 134 将索引有效字段 814 清 除。流程中止于步骤 1118。
     根据图 8 ~图 11 的实施例, 图 1 的微处理器 100 的操作将以下列表 5 之中程序码 序列的处理加以说明。为了简化, 在本实施例中, 加载和储存指令不包括位移值。表 5 的第 3 列至第 5 列类似于表 4 的第 1 列至第 3 列。然而, 在表 5, 第 1 列的加法指令 ADD 和第 2 列的储存指令 ST 在程序次序上是先前于的第 3 列至第 5 列的指令, 其中第 1 列的加法指令 ADD 将暂存器 R8 和 R9 的内容相加并将结果放入暂存器 R4。第 (2) 列中的储存指令 ST 将 暂存器 R4 的内容储存至存储器的储存地址, 其中储存地址是将暂存器 R1 和 R2 的内容相加 而得。因此, 第 2 列的储存指令 ST 与第 1 列的加法指令 ADD 具有一般的相依性, 如同第 4 列的储存指令 ST 与第 3 列的加法指令 ADD 具有一般的相依性。
     (1)ADD R4, R8, R9(2)ST R4, R1, R2
     (3)ADD R3, R5, R6
     (4)ST R3, R1, R2
     (5)LD R7, R1, R8
     表5
     根据图 11 的步骤 1104, 假设第 5 列的加载指令会被重新执行, 并且根据图 11 的步 骤 1112, RAT 134 指派 SDAQ 项目 802, 并将有关于重新执行的加载指令的 IP 数值填入 SDAQ 项目 802。 一般而言, 因为发生碰撞的储存指令已经被退返, 所以当加载指令重新执行时, 被 重新执行的加载指令将成功地执行和退返, 这是因为加载指令会在微处理器 100 中最先的 未退返指令 ( 即较先的发生碰撞的储存指令 ) 已经退返后, 才被重新执行。 假设表 5 中的指 令是程序循环的一部分, 并且接着程序会第二次执行表 5 中的指令, 根据图 10 的步骤 1008, RAT 134 指派 SDDQ 项目 902, 并将第 2 列储存指令 ST 为了其储存数据所依附的指令的 ROB 索引填入 SDDQ 项目 902 ; 根据步骤 1008, RAT 134 将第 4 列储存指令 ST 为了其储存数据所 依附到的指令的 ROB 索引填入 SDDQ 项目 902 ; 根据图 10 的步骤 1018, RAT 134 为第 5 列的 加载指令 LD 产生扩充式相依性 158, 使得第 5 列的加载指令 LD 与第 4 列的加载指令 ST 共 享 ( 分享 ) 相依性 ; 以及根据图 10 的步骤 1024, RAT 134 以加载指令 LD 的索引填入 IP 符 合的 (IP-matching)SDAQ 项目 802 的索引字段 812, 并且将索引有效字段设定为有效的。 这 会使得保留站 136 进行等待, 在第 3 列的加法指令 ADD 执行后, 才会发布加载指令 LD, 亦通 常会使得加载指令 LD 不会早于第 4 列的储存指令被发布。藉此将能避免因储存碰撞而产 生的加载指令重新执行。 然而, 假设这样作无法避免重新执行且加载指令 LD 需要被第二次重新执行 ( 因为 步骤 1102 决定的原因 ), RAT 134 则会根据步骤 1118 将历史字段 808 增量 ( 此时为 1) 并 且清除索引有效字段 814。进一步假设程序接着第三次执行表 5 中的指令, RAT 134 则会根 据步骤 1008 为两个储存指令 ST 指派 SDDQ 项目 902 并且填入 SDDQ 项目 ; 根据步骤 1018, 为加载指令 LD 产生扩充式相依性 158, 使得加载指令 LD 共享 ( 分享 ) 储存指令 ST 的相依 性; 并根据步骤 1024, 以加载指令的 ROB 索引填入索引字段 812, 并且将索引有效字段 814 设定为有效的。
     假设这样作仍无法避免重新执行且加载指令 LD 需要被第三次重新执行 ( 因为步 骤 1102 决定的原因 ), RAT 134 则会根据步骤 1118 再将历史字段 808 增量 ( 此时为 2) 并 且清除索引有效字段 814。进一步假设程序接着第三次执行表 5 中的指令, RAT 134 则根据 步骤 1008 为两个储存指令 ST 指派 SDDQ 项目 902 并且填入 SDDQ 项目。在第三次重新执行 中, 因为历史字段 808 的数值为 2, 所以 RAT 134 会根据步骤 1018 为加载指令 LD 产生扩充 式相依性 158, 使得加载指令 LD 共享 ( 分享 ) 第 2 列储存指令 LD 的相依性 ; 并且根据步骤 1024, 以加载指令的 ROB 索引填入索引字段 812。 藉此将能避免因储存碰撞而产生的加载指 令重新执行。然而, 若这样作仍无法避免重新执行, 则在历史字段 808 的数值等于 4 后, 这 种模式将不继续操作下去, 根据步骤 1018, 此时 RAT134 为加载指令产生扩充式相依性 158, 使得加载指令成为强制依照顺序执行的加载指令, 藉此将能避免因储存碰撞而产生的加载 指令重新执行。
     根据本发明的数个实施例, 微处理器 100 能够通过多种方式来避免加载指令重新
     执行。然而如上所述, 要注意的是, 在本发明实施例中, 可能有其它因素会让微处理器花费 更多时间来执行加载指令。 举例而言, 在一些情况下, 由加载指令指定的来源地址可能不会 与由储存指令指定的目的地地址发生碰撞, 这使得 RAT 产生错误的预测, 在上述情况中, 扩 充式相依性让保留站不必要地延迟了加载指令的发布。 换言之, 若无扩充式相依性, 则保留 站便能够将加载指令发布执行, 并且加载指令亦能够正确且快速地被执行而无需被重新执 行。然而, 发明人发现, 对多数程序而言, 减少加载指令重新执行次数所得到的益处远大于 错误预测的后果。 这可能是重新执行的效能损失相对较大所导致, 其中在一实施例中, 因为 重新执行而导致的效能损失为 15 个时钟周期, 而由错误预测所导致的效能损失为 1 或 2 个 时钟周期, 并且若加载地址和储存地址的来源是相同的, 则其重迭的机率也很高。 产生上述 益处的另外一种原因是 RAT 能够极正确地预测储存碰撞。
     虽然本发明已经由数种实施例揭露如上, 但其仅用以作为例子, 并非用以限定本 发明。 计算器领域的本领域技术人员应能理解, 在不脱离本发明的精神的前提下, 当可对本 发明作些许更动。举例而言, 软件能够致能本发明的装置和方法的功能、 制造、 模型建立、 仿真、 各种性质, 以及 / 或测试。其能够通过不同的程序语言而达成, 例如程序语言 ( 如 C、 C++)、 硬件描述语言 (hardware description language, HDL, 如 Verilog HDL、 VHDL), 或是 其它可能的程序语言。上述软件能够设置于任何已知的计算器可读取储存媒体 (computer usable medium), 例如半导体、 磁盘, 或光盘 ( 如 CD-ROM、 DVD-ROM)。 本发明的装置和方法可 能包括于任何半导体知识产权核心 (semiconductorIP core) 之内, 例如 ( 以 HDL 嵌入的 ) 微处理器核心, 或是当集成电路制造时, 转移至硬件。此外, 本发明可能通过硬件和软件的 组合而实现。 因此, 本发明不应被此处所述的任何实施例所限制, 本发明应该是根据所附权 利要求范围与其等效的装置 / 方法而被定义。特别的是, 本发明能够设置于一般用途计算 器的微处理器装置内。 最后, 本领域技术人员应能理解到 : 在不脱离由权利要求范围定义的 本发明范畴的前提下, 其能够以本发明揭露的概念和特定的实施例作为基础, 用以设计或 修改其它架构来执行与本发明相同的目的。

非循序执行的微处理器及其操作方法.pdf_第1页
第1页 / 共33页
非循序执行的微处理器及其操作方法.pdf_第2页
第2页 / 共33页
非循序执行的微处理器及其操作方法.pdf_第3页
第3页 / 共33页
点击查看更多>>
资源描述

《非循序执行的微处理器及其操作方法.pdf》由会员分享,可在线阅读,更多相关《非循序执行的微处理器及其操作方法.pdf(33页珍藏版)》请在专利查询网上搜索。

本发明提供一种非循序执行微处理器,用以减少因储存碰撞而重新执行加载指令的可能性,包括:第一队列存储器,包括多个项目;一第二队列存储器,包括多个项目;以及暂存器别名表,耦接于上述第一和第二队列存储器,暂存器别名表用以依据循序排列的多个指令以产生多个相依性,以便决定上述指令何时能够非循序执行,其中暂存器别名表用以指派上述第一队列存储器的一项目,并在所指派的项目中填入上述加载指令的一指令指针;指派上述第。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1