CN101853148B - 适用于微处理器的装置及方法 - Google Patents
适用于微处理器的装置及方法 Download PDFInfo
- Publication number
- CN101853148B CN101853148B CN201010185661.8A CN201010185661A CN101853148B CN 101853148 B CN101853148 B CN 101853148B CN 201010185661 A CN201010185661 A CN 201010185661A CN 101853148 B CN101853148 B CN 101853148B
- Authority
- CN
- China
- Prior art keywords
- instruction
- byte
- logic unit
- queue
- prefix
- 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.)
- Active
Links
Images
Landscapes
- Advance Control (AREA)
- Executing Machine-Instructions (AREA)
Abstract
一种适用于微处理器的装置和方法,其中该微处理器的指令集架构包含可变数目的前置字节,该装置用以有效地自一指令字节串流中提取指令,该装置包含:一解码逻辑单元,用以对该指令字节串流中多个指令的每一指令判断其操作码字节,其中该操作码字节为相应的该指令的第一非前置字节,该解码逻辑单元还累积该多个指令的每一指令的前置消息至相应的该操作码字节;一队列,耦接至该解码逻辑单元,用以暂存该指令字节串流及该累积前置消息;及一提取逻辑单元,耦接至该队列,用以于一时钟周期内,自该队列提取该多个指令,其不受该多个指令的每一指令中的前置字节数目所影响。
Description
技术领域
本发明是有关微处理器领域,特别是关于从一种具有可变长度指令的指令集架构的微处理器的指令字节串流中取得指令。
背景技术
微处理器包含一或多个执行单元,用以进行实际的指令执行。超纯量(superscalar)微处理器可于每一时钟周期内发出多个指令至各个执行单元,因而得以增进总处理能力或增进每一时钟周期内的平均指令。然而,微处理器管线上端的指令提取及解码功能必须以有效率的速度来提供一指令串流给执行单元,藉以有效地使用执行单元及增进总处理能力。x86架构由于其指令长度并非固定,因此使得此工作更加困难,在此架构下,其每一指令的长度是变动的,此将于以下详述。因此,x86微处理器必须包含很多的逻辑电路以处理进来的指令字节串流,以决定指令的开始及结束位置。因此,必须增进x86微处理器解析指令字节串流以得到各个指令的处理速率。
发明内容
根据本发明特征之一,本发明提供一种适用于微处理器的装置,该微处理器的指令集架构包含可变数目的前置字节,该装置用以有效地自一指令字节串流中提取指令。该装置包含:一解码逻辑单元,用以对该指令字节串流中多个指令的每一指令判断其操作码字节,其中该操作码字节为相应的该指令的第一非前置字节,该解码逻辑单元还累积该多个指令的每一指令的前置消息至相应的该操作码字节;一队列,耦接至该解码逻辑单元,用以暂存该指令字节串流及该累积前置消息;及一提取逻辑单元,耦接至该队列,用以于一时钟周期内,自该队列提取该多个指令,其不受该多个指令的每一指令中的前置字节数目所影响。
根据本发明特征之一,本发明提供一种适用于微处理器的方法,该微处理器的指令集架构包含可变数目的前置字节,该方法用以有效地自一指令字节串流中提取指令。该方法包含:对于该指令字节串流中多个指令的每一指令,判断其操作码字节,其中该操作码字节为相应的该指令的第一非前置字节;对于该多个指令的每一指令,累积其前置消息至相应的该指令的该操作字节;及于一时钟周期内,自一队列提取该多个指令,其不受该多个指令的每一指令中的前置字节数目所影响。
附图说明
图1显示本发明实施例的微处理器的方块图。
图2显示图1的指令格式器的L级的方块图。
图3显示图2的累积前置消息238。
图4显示图1的微处理器的操作。
图5显示图1的指令格式器的部分L级和M级方块图。
图6显示图5所示的微处理器元件的操作流程图,用以自指令字节串流中取出指令(在一实施例中最多可取出三指令),其不会产生时间延迟且与指令中的前置字节数目无关。
图7显示图1的指令格式器的一部分的方块图。
图8a和图8b显示图7的部分指令格式器的操作流程图。
图9显示图5的多工队列的详细方块图。
图10显示图1的指令格式器的部分M级的方块图。
图11显示图5的M级控制逻辑单元的方块图。
图12显示图1的指令格式器的部分M级的操作流程图。
图13显示图5的多工队列于连续两个时钟周期的内容,以例示M级的操作。
图14显示图5的多工队列于连续两个时钟周期的内容,以例示M级的操作。
图15显示图14中指令格式器于一时钟周期内,将含有最多四十个指令字节的三个指令取得并传送出去。
图16显示图1的BTAC作了不良预测因而造成微处理器的分支错误,亦即,图1的分支发生指示为逻辑真值但非为指令的操作码。
图17显示涟波逻辑单元输出的组成信号。
图18显示图1的微处理器的操作流程图。
图19显示图2的长度解码器的详细方块图。
图20显示十六个长度解码器的配置。
图21显示图20的长度解码器的操作流程图。
[主要元件标号说明]
100 微处理器 102 指令高速缓存
104 x86指令字节队列 106 指令格式器
108 格式化指令队列 112 指令转译器
114 转译指令队列 116 暂存器别名表
118 保留站 122 执行单元
124 引退单元 126 提取单元
128 分支目标地址高速缓存 132 指令字节
134 指令字节 136 x86指令串流
142 目前提取地址 144 加法器
146 预测目标地址 148 执行目标地址
152 下一个连续提取地址 154 分支发生指示
202 长度解码器 204 涟波逻辑单元
208 控制逻辑单元 212 长度解码器的输出
214 涟波逻辑单元的输出 218 操作数及地址尺寸
222 指令长度 224 解码任一前置指示符
226 解码LMP指示符 228 受LMP影响指示符
229 前置消息 232 开始位
234 结束位 236 有效位
238 累积前置消息 252 预设操作数及地址尺寸
302 OS 304 AS
306 REX出现 308 REX.W
312 REX.R 314 REX.X
316 REX.B 318 REP
322 REPNE 324 LOCK
326 片段超出出现 328 编码段超出[2:0]
332 任一前置出现 402-414 步骤
502 多工队列 504 I1多工器
506 I2多工器 508 I3多工器
512 M级控制逻辑单元 514 控制信号
516 控制信号 518 控制信号
524 第一指令I1 526 第二指令I2
528 第三指令I3 534,536,538 有效指示符
602-608 步骤 702 XIBQ控制逻辑单元
802-824 步骤 1002 累积前置阵列
1004 指令字节阵列 1102 减法器
1104 部分LEN 1106 剩余LEN1
1108 字节位置END1 1112 字节位置END0
1114 多工器 1116 加法器
1118 暂存器 1122 指令长度LEN1
1201-1222 步骤 1702 不良BTAC位
1802-1816 步骤 1902 可编程逻辑阵列(PLA)
1904 加法器 1906 多工器
1912 eaLen值 1914 控制信号
1916 immLen值 1918 eaLen值
2102-2116 步骤
具体实施方式
图1显示本发明实施例的微处理器100的方块图。微处理器100包含由多级或多个功能单元所组成的管线(pipeline),其包含四级指令高速缓存(four-stage instruction cache)102、x86指令字节队列(x86 instructionbyte queue,XIBQ)104、指令格式器(instruction formatter)106(其包含三级L、M及F)、格式化指令队列(formatted instruction queue)108、指令转译器(instruction translator)112、转译指令队列(translatedinstruction queue)114、暂存器别名表(register alias table)116、保留站(reservation station)118、执行单元(execution units)122及引退单元(retire unit)124。微处理器100还包含提取单元(fetch unit)126,其提供目前提取地址142给指令高速缓存102,用以选择一指令字节(byte)132快取列至XIBQ104。微处理器100还包含加法器144,其增加目前提取地址142以产生下一个连续提取地址152,再反馈至提取单元126。提取单元126还从分支目标地址高速缓存(branch target address cache,BTAC)128接收预测目标地址146。最后,提取单元126从执行单元122接收执行目标地址(executedtarget address)148。
XIBQ104的队列含有多个项目(entry),每一个项目包含来自指令高速缓存102的十六字节数据。再者,XIBQ104的每一个项目包含数据字节相关的预解码(pre-decoded)消息。预解码消息为当数据字节从指令高速缓存102流至XIBQ104时所产生的。来自XIBQ104的快取数据为指令字节134串流,其形式为多个十六字节区块,然而并不知道串流内或区块内的x86指令的开始或结束位置。指令格式器106即用以决定串流内每一指令的开始及结束字节,从而将字节串流分离为x86指令串流136,其再馈至并储存于格式化指令队列108,以待微处理器100管线的其它部分进行处理。当发生重置或执行/预测到流量控制指令(例如跳越(jump)指令、子例程呼叫(subroutine call)指令或自子例程返回指令)时,则提供重置地址或分支目标地址给指令格式器106作为指令指针(pointer),用以致能指令格式器106,使其决定出指令串流的目前的十六字节区块内的第一有效指令的第一字节。因此,指令格式器106即可根据第一目标指令的开始位置加上第一目标指令的长度,以决定下一指令的开始位置。指令格式器106重复上述程序,直到执行或预测到另一流量控制指令。
BTAC128还提供分支发生(taken)指示154给XIBQ104。指令高速缓存102提供给XIBQ104的每一指令字节132对应有一个分支发生指示154。分支发生指示154用以表示BTAC128预测提供给XIBQ104的指令字节132列是否具有分支指令;如果为是,则提取单元126将会选取BTAC128所提供的预测目标地址146。详而言之,BTAC128对于分支指令的第一字节(即使该第一字节为前置字节)会相应输出逻辑真值的分支发生指示154,但对于指令的其它字节则会输出逻辑假值的分支发生指示154。
微处理器100为x86架构的微处理器100。当微处理器可正确地执行专为x86微处理器所执行的大部分应用程序时,则该微处理器即可视为x86架构的微处理器。当可以得到预期结果时,则该应用程序即可视为可正确地执行。X86架构的特征之一为其指令集架构中的指令长度是可变的,而非像一些指令集架构中的指令长度是固定的。再者,对于某一x86操作码(opcode),可能会因为操作码之前是否具有前置(prefix)而影响指令的长度。此外,一些指令的长度可能为微处理器100操作模式下的预设操作数(operand)及/或地址尺寸的函数(例如码段描述符(code segment descriptor)的D位,或者微处理器100是否操作于IA-32e或64位模式)。最后,于预设地址/操作数尺寸之外,指令还可包含一长度修改前置(length-modifying prefix),用以选择地址/操作数尺寸。例如,可使用操作数尺寸(operand size,OS)前置(0x66)、地址尺寸(AS)前置(0x67)及REX前置(0x4x)的REX.W位(位3)以改变预设的地址/操作数尺寸。英特尔(Intel)公司称这些为长度改变前置(length-changing prefix,LCP),然而在本说明书中则称为长度修改前置(length-modifying prefix,LMP)。X86指令的格式及长度为大家所熟知,细节可参考IA-32英特尔架构软件开发手册(IA-32Intel ArchitectureSof tware Developer’s Manual),第2A集的第二章:指令集参考(InstructionSet Reference),A-M,公元2006年六月。
根据英特尔64及IA-32架构最佳化参考手册(64and IA-32Architectures Optimization Reference Manual),公元2009年三月,页3-21至3-23(可自下列网页下载http://www.intel.com/Assets/PDF/manual/248966.pdf):「当预解码器于提取列中遇到LCP,则必须使用较慢的长度解码算法。当使用较慢的长度解码算法时,预解码器于六个周期内进行解码,而非一般的一个周期。于机器管线内的队列(queuing)一般是无法避免LCP造成的延迟。」
图2显示图1的指令格式器106的L级的方块图。指令格式器106包含多个长度解码器202,其输出212分别耦接至多个涟波(ripple)逻辑单元204,涟波逻辑单元204的输出214耦接至控制逻辑单元208并提供给指令格式器106的M级。在一实施例中,长度解码器202于微处理器100的二相位时钟信号的第一相位期间产生输出212,而涟波逻辑单元204于二相位时钟信号的第二相位期间产生输出214。
长度解码器202从XIBQ104接收指令字节134。在一实施例中,XIBQ104的每一项目宽度为十六字节,因而相应有十六个长度解码器202,如图2所示的0至15。每一个长度解码器202自XIBQ104的底部项目接收并解码相应的指令字节。此外,每一个长度解码器202接收并解码接下来的三个相邻指令字节。对于最后三个长度解码器202,其自XIBQ104的底部倒数第二个项目接收一或多个指令字节(如果XIBQ104的底部倒数第二个项目为无效,则最后三个长度解码器202必须等待下一个时钟周期中产生有效输出)。长度解码器202的细节将于图19说明。藉此,使得长度解码器202可以决定及输出XIBQ104的底部项目中的指令的指令长度222。在一实施例中,指令长度222表示该指令除了前置字节以外的字节数目。换句话说,指令长度222表示指令当中,从操作码至最后一个字节的字节数目。具体来说,由对应于指令的第一指令字节的长度解码器202所输出的指令长度为指令长度222。
为了产生指令长度222,长度解码器202还使用接收自控制逻辑单元208的操作数及地址尺寸218。控制逻辑单元208对于每一指令字节134会输出操作数及地址尺寸218。控制逻辑单元208根据目前微处理器100的预设操作数及地址尺寸252和涟波逻辑单元204的输出214以决定操作数及地址尺寸218。如果涟波逻辑单元204的输出214表示指令中无LMP,则控制逻辑单元208对于每一指令字节会输出预设操作数及地址尺寸给相应的长度解码器202。然而,如果涟波逻辑单元204的输出214表示指令中有一或多个LMP,则控制逻辑单元208对于每一指令字节会修改预设操作数及地址尺寸252而输出操作数及地址尺寸218给相应的长度解码器202,其中控制逻辑单元208根据OS 302、AS 304及REX.W 308位的值修改预设操作数及地址尺寸252,这些位包含于涟波逻辑单元204的输出214的累积前置消息238中,如图3所示。
如图2所示,每一长度解码器202的输出212包含指令字节134、指令长度222、解码任一前置指示符(decoded any prefix indicator)224、解码LMP指示符(decoded LMP indicator)226、受LMP影响指示符(susceptible toLMP indicator)228及前置消息229。
当长度解码器202所解码的字节对应到任一x86前置(无论其是否为LMP),则解码任一前置指示符224为逻辑真值;否则,为逻辑假值。
当长度解码器202所解码的字节对应到任一x86LMP,亦即OS前置(0x66)、AS前置(0x67)或REX.W前置(0x48-0x4F),则解码LMP指示符226为逻辑真值;否则,为逻辑假值。
当长度解码器202所解码的字节是操作码字节,其中操作码的指令长度不受LMP影响(例如,OS前置对于一些SIMD指令为强制的,因此不能改变其长度),则受LMP影响指示符228为逻辑假值;否则,为逻辑真值。
前置消息229包含多个位(bit),用以表示指令字节是否具有各种x86前置其中之一。这些位类似于图3所示的累积前置消息238。然而,长度解码器202输出的前置消息229仅表示单一前置,亦即,受长度解码器202解码的单一对应的指令字节的前置值。相反的,由于涟波逻辑单元204将所有长度解码器202提供的前置消息229予以累积,因此累积前置消息238则表示指令中的所有前置。
如图2所示,每一涟波逻辑单元204的输出214包含指令字节134、开始位232、结束位234、有效位236及累积前置消息238。每一涟波逻辑单元204的输出214还馈至下一相邻的涟波逻辑单元204。在一实施例中,十六个涟波逻辑单元204组织成四个逻辑区块,每一区块处理四个指令字节及其相关消息。每一涟波逻辑单元区块204还输出相应的指令字节。
当涟波逻辑单元204所处理的字节为指令的操作码字节时(例如指令的第一字节非为前置字节),则开始位232为逻辑真值。指令格式器106增加一指标,其指向所有前置字节,使得当指针指向一非前置字节时,该指针将会指向指令的操作数字节。
当涟波逻辑单元204所处理的字节为指令的最后字节时,则结束位234为逻辑真值;否则,为逻辑假值。
从涟波逻辑单元204输出的十六个有效位236的第一个开始,直到出现第一个未处理的LMP为止,每一有效位236为逻辑真值。
累积前置消息238显示于图3并讨论如上。控制逻辑单元208使用累积前置消息238并配合有效位236,以决定是否使用预设操作数及地址尺寸252或对其进行修改。
值得注意的是,长度解码器202的输出212属于一种试验性质。换句话说,其产生输出时并不知道相关指令字节在指令内的地址。尤其是,与前置相关的指示符224/226/228/229是在假设该字节为有效前置的前提下所产生的,而此假设可能是一个错误的假设。因此,该字节可能恰巧具有一前置的值,但该字节其实是具有与LMP相同的值的位移(displacement)字节。例如,0x67为AS前置的值,其为LMP。然而,地址位移字节或立即数据值(immediatedata value)字节或Mod R/M字节或指令的SIB字节皆不是前置字节,但可能具有0x67值。仅当指令字节的目前区块中的所有LMP都已处理,才能确定相应于区块中所有字节的输出212及214都为正确。
如果在目前时钟周期内,XIBQ104项目中的所有指令字节并未被解码出任何LMP,则L级会在单一时钟周期内产生整个项目的涟波逻辑单元204输出214(特别是开始位232和结束位234)。如果XIBQ104目前的项目中被解码出一或多个LMP,则产生具正确开始位232和结束位234的涟波逻辑单元204输出214所需的时钟周期数为N+1,其中N为XIBQ104目前的项目中具有至少一LMP的指令的数目。无论项目中的任一指令的前置数目为多少,L级均可执行上述工作,此显示于图4的流程图中。控制逻辑单元208包含一状态,用以表示指令字节的目前区块中的哪些字节已被处理过,哪些尚未处理。该状态使得控制逻辑单元208可针对每一指令字节产生有效位236及操作数及地址尺寸218。由于具有含LMP的指令的指令字节区块的处理具有迭代(iterative)特性,即使于第一时钟周期时,含LMP的第一指令的指令长度222、开始位232和结束位234可能并不正确;然而,于下一时钟周期时,第一指令和任一不含LMP的相邻指令的指令长度222、开始位232和结束位234则会变为正确;且于接续时钟周期中,第一指令的下一含LMP的指令及其相邻不含LMP的指令的指令长度222、开始位232和结束位234均会正确。在一实施例中,该状态包含十六位暂存器,用以表示相关指令字节是否已被处理。
[针对含有LMP的指令标示出开始及结束字节]
图4显示图1的微处理器100的操作,该流程始于步骤402。
于步骤402,控制逻辑单元208输出预设操作数及地址尺寸218给长度解码器202。接着,流程进入步骤404。
于步骤404,于时钟周期的第一相位,长度解码器202根据控制逻辑单元208提供的操作数及地址尺寸218,以解码XIBQ104的底部项目的指令字节并产生其输出212。如前所述,对于XIBQ104的底部项目的每一指令字节,长度解码器202的输出212包含指令长度222及与前置相关的指示符224/226/228/229(图2)。接着,流程进入步骤406。
于步骤406,于时钟周期的第二相位,涟波逻辑单元204根据长度解码器202的输出212以产生输出214。如前所述,涟波逻辑单元204的输出214包含开始位232、结束位234、有效位236及累积前置消息238(图3)。接着,流程进入步骤408。
于步骤408,控制逻辑单元208检视(examine)涟波逻辑单元204的输出214,以判断XIBQ104的底部项目中是否还有任何指令包含未处理的LMP(长度修改前置符)。如果为是,则进入步骤412:否则,进入步骤414。
于步骤412,控制逻辑单元208根据涟波逻辑单元204提供的累积前置消息238,以更新内部状态及操作数及地址尺寸。接着,流程返回步骤404,依据新的操作数尺寸及地址尺寸,再次处理底部项目的指令字节。
于步骤414,控制逻辑单元208判断底部项目的指令字节已完全处理完,因而将其自XIBQ104移出,并将其连同每一指令字节134相应的涟波逻辑单元204的输出214一起送至M级。特别的是,如前所述,由于涟波逻辑单元204的输出214包含开始位232及结束位234,其表示出指令高速缓存102所提供的指令串流当中每一指令的边界,因而使得指令格式器106的M级和F级得以进一步处理指令串流,并将个别指令置入FIQ(格式化指令队列)108,让指令转译器112进行处理。流程结束于步骤414。
根据前述,如果指令字节中未含有LMP(长度修改前置符),则L级可于单一时钟周期中针对XIBQ(x86字节字队列)104的整个项目以产生开始位232及结束位234;如果XIBQ104的项目中有一个或更多指令具有LMP(长度修改前置符),则产生开始位232及结束位234所需的时钟周期数变为N+1,其中N为XIBQ104项目中含有至少一LMP(长度修改前置符)的指令数目,且无论指令中含有的前置数目为何,L级都可以进行。
[累积前置以有效地处理含多个前置字节的指令]
x86架构允许指令含有0至14个前置字节。此造成管线(pipeline)前端于处理指令字节串流时的困难。以往于处理含相当数目的前置字节的指令时,会遭遇时间的延迟。根据英特尔64及IA-32架构最佳化参考手册(64and IA-32 Architectures Optimization Reference Manual),公元2009年三月,页12-5,英特尔针对ATOM微架构提到:「含三个以上前置的指令会产生MSROM转移,造成前端的二个时钟周期延迟。」根据另一研究文献-英特尔及AMD中央处理器的微架构(The microarchitecture of Intel and AMD CPU’s),作者Agner Fog,Copenhagen University College of Enginerring,公元2009年5月5日最后一次更新,页93(可于以下网页下载www.agner.org/optimize/microarchitecture.pdf),其提到:「含多个前置的指令需要额外时间以进行解码。P4的指令解码器于一时钟周期内仅可处理一前置。于P4上,含多个前置的指令其每一个前置需花费一时钟周期解码」,且「P4E的指令解码器可于一时钟周期处理二个前置。因此,单一时钟周期内可解码含有至多二前置的指令,而含三或四个前置的指令则需于二时钟周期内进行解码。P4E的所以增加此功能,乃因为在64位模式下,很多指令都含有二前置(例如操作数尺寸前置及REX前置)。」
然而,本发明实施例在不需增加时间延迟的条件下,可处理一个指令中架构所允许的所有(至多14个)前置字节,无论前置字节的数量为何(只要该前置非为LMP(长度修改前置符),若该前置为LMP,则含一或多个前置的每一指令会额外增加一时钟周期的处理时间,如前所述)。本发明实施例的所以能够达成此目的,是因为长度解码器202产生前置消息229,而涟波逻辑单元204则累积前置消息229以产生累积前置消息238给指令的操作码字节,此将于以下详述。
图5显示图1的指令格式器106的部分L级和M级(多工级)方块图。M级包含多工队列(mux queue)502。在一实施例中,多工队列502包含四个项目,每一项目储存十六字节。多工队列502的下一空白项目接收相应涟波逻辑单元204的输出214(图2),其包含指令字节134、开始位232、结束位234及累积前置消息238。
M级还包含M级控制逻辑单元512,其自多工队列502的底部项目接收开始/结束位232/234,且(在一实施例中)接收多工队列502的底部倒数第二项目(next-to-bottom entry,NTBE)的前十字节。根据开始/结束位232/234,M级控制逻辑单元512控制三组多工逻辑单元,分别为I1多工器504、I2多工器506及I3多工器508。I1多工器504输出第一指令I1524至指令格式器106的F级;I2多工器506输出第二指令I2526至F级;I3多工器508输出第三指令I3528至F级。此外,M级控制逻辑单元512输出三个有效指示符534/536/538,用以表示相应的第一、第二、第三指令524/526/528是否有效。藉此,M级得以从指令串流中最多取出(extract)三个格式化指令,并在单一时钟周期内将其提供给F级。在其它实施例中,M级可在单一时钟周期内取出并提供多于三个格式化指令给F级。三个指令524/526/528中的每一指令包含相应指令字节134,并且其前置字节被置换为相应的累积前置消息238。换句话说,每一指令524/526/528包含操作码字节及指令字节的其它部分以及累积前置消息238。每一多工器504/506/508自多工队列502的相应底部项目分别接收消息214(但开始位232、结束位234除外),且(在一实施例中)自多工队列502的相应NTBE接收前十字节,用以个别选取及输出指令524/526/528。
图6显示图5所示的微处理器100元件的操作流程图,用以自指令字节串流中取出指令(在一实施例中最多可取出三指令),其不会产生时间延迟且与指令中的前置字节数目无关。如前所述,涟波逻辑单元204会累积前置消息229以产生累积前置消息238给指令的操作码字节。所示流程始于步骤602。
于步骤602,于时钟周期的第一相位,长度解码器202解码指令字节134串流以产生输出212(图2),特别是前置消息229,此和步骤404的操作类似。接着,进入步骤604。
于步骤604,于时钟周期的第二相位,涟波逻辑单元204依据前置消息229以决定串流的每一个指令中哪一字节为操作码字节(亦即第一非前置字节)。再者,涟波逻辑单元204针对指令中的所有(最多为十四个)前置字节累积其前置消息229,以产生累积前置消息238给指令的操作码字节。特别的是,涟波逻辑单元204自指令的第一前置字节开始累积前置消息229,并且逐一累积每个字节的前置消息229,直到其检测到操作码字节为止。届时,涟波逻辑单元204停止前置消息的累积,使得目前指令的累积前置消息238不会继续累积到下一指令去。涟波逻辑单元204自下一指令的第一前置字节开始进行前置消息229的累积,并停止于操作码字节。对于串流中的每一指令,重复此程序。涟波逻辑单元204使用长度解码器202的另一输出212以完成前置消息的累积。例如,如前所述,涟波逻辑单元204使用指令长度222以决定每一指令的第一字节,其可能为前置字节,用以开始前置消息的累积程序。涟波逻辑单元204还使用其它消息224/226/228以决定操作码字节的位置,其为不含前置的指令的第一字节(由开始位232表示),并决定指令最后字节的位置(由结束位234表示)。接着,流程进入步骤606。
于步骤606,指令字节134及相应的开始/结束位232/234、累积前置消息238被加载多工队列502的下一可用项目中。在一实施例中,步骤602、604、606所示的步骤被于单一时钟周期内执行(假设指令不含有LMP(长度修改前置符))。接着,进入步骤608。
于步骤608,在下一时钟周期,M级控制逻辑单元512控制多工器504/506/508,使其至多可取出三个指令。换句话说,不管前置字节的数量为何,M级不需增加时间延迟而能够取得指令。经多工(muxed)后,指令524/526/528可各个馈至F级。特别的是,M级随着累积前置消息238可取出每一指令的操作码字节及后续字节。F级依据指令型态、一些可能的例外情形、可配对性(pairability)及其它特性以解码指令524/526/528,以开始指令524/526/528的转译。F级和指令转译器112可利用累积前置消息238。流程结束于步骤608。
本实施例不同于传统的设计。如前所述,涟波逻辑单元204较传统来得复杂,其所产生的开始位232是指向指令的操作码字节,而非如传统般指向指令的第一字节(其可能为前置字节),且产生累积前置消息238,因此,无论前置字节的数量为何均可取得指令且不会造成时间延迟(除非是LMP(长度修改前置),已如前述)。相反地,传统的作法是指出指令实际的第一字节为第一字节,如果指令含有前置字节,则该前置字节被表示为第一指令。当指令含有多个前置字节时,为了除去前置字节,传统的多工逻辑因此会造成时间延迟。
[当指令部分出现时,以开始/结束标示使得快取数据能尽快释放]
图7显示图1的指令格式器106的一部分的方块图。在图1中,指令高速缓存102提供指令字节132至XIBQ104。在一实施例中,指令格式器106包含预解码(pre-decode)逻辑单元(未显示于图式中),用以对来自指令高速缓存102的指令字节132进行预解码,而经预解码消息则连同指令字节132一并载至XIBQ104。指令格式器106包含XIBQ控制逻辑单元702,其控制XIBQ104的项目加载及移出。
长度解码器202及涟波逻辑单元204(图2)自XIBQ104接收指令字节134并产生输出214,用以提供给图5的多工队列502及指令格式器106的M级控制逻辑单元512。M级控制逻辑单元512控制多工队列502的项目加载及移出。多工队列502自其项目中提供消息214给多工器504/506/508和M级控制逻辑单元512,M级控制逻辑单元512又控制多工器504/506/508,如前所述。
当以下情形时会产生问题:(1)XIBQ104的底部项目包含有效指令字节但是NTBE则未包含;(2)只有部分的指令(例如指令的第一或第二字节)在底部项目;(3)部分的指令未提供足够消息让长度解码器202/涟波逻辑单元204决定指令长度222(及开始/结束位232/234),亦即,指令还有一些字节位于NTBE。例如,假设在XIBQ104底部项目的字节15(亦即最后字节)的开始位232为逻辑真值,且该字节的值为0x0F。在x86的指令中,第一非前置字节的值为0x0F表示一具延伸的操作码,因此需要根据其后续字节以决定指令型态。换句话说,无法只从0x0F字节以决定指令长度(在一些情形下,可能需要至多到第五字节以决定指令长度)。然而,等到指令高速缓存102提供下一列快取数据给XIBQ104时,将需要一段时间,例如,可能发生指令高速缓存102的失误(miss),或指令转译寻找缓冲器(translation lookaside buffer,TLB)的失误,因此,需要一种不等待其它指令字节而径行处理的方案。再者,在一些情形下,微处理器100必须得到未知长度指令之前的指令,因此如果这些指令未进行处理,则微处理器100就要一直等待。因此,需要一种径行处理的方式。
图8显示图7的部分指令格式器106的操作流程图。此流程始于步骤802。
于步骤802,XIBQ控制逻辑单元702检测到XIBQ104的底部项目终端的指令跨至指令快取数据串流的另一列,而XIBQ104底部项目中的指令不足以让长度解码器202/涟波逻辑单元204决定指令长度(及开始/结束位232/234),而决定指令长度所需的后续指令字节尚未置于XIBQ104NTBE中,亦即,XIBQ104NTBE为无效或空白的。接着,流程进入步骤804。
于步骤804,M级控制逻辑单元512将相应于XIBQ104底部项目所产生的涟波逻辑单元204的输出214载至多工队列502。然而,M级控制逻辑单元512并不将XIBQ104的底部项目移出,因为仍需要决定出未知长度指令的结束位234。换句话说,对于未知长度的指令,其位于XIBQ104底部项目的字节必须保留,当指令的其它字节来到XIBQ104时,得以决定出指令长度及结束位。接着,流程进入步骤806。
于步骤806,前一步骤804所载入的输出214到达多工队列502的底部项目。此时,M级控制逻辑单元512取出所有指令并将其传至F级,但不传送未知长度的指令。然而,M级控制逻辑单元512并不移出多工队列502的底部项目,因为未知长度的指令的结束位234还未得知,且指令的其余字节尚未可得。M级控制逻辑单元512知道未知长度指令的存在,因为该指令不具有效结束位234。换句话说,已具有效开始位232指向指令的第一字节,但是不具有效结束位234指向多工队列502的底部项目的字节且NTBE为无效。接着,流程进入808。
于步骤808,M级控制逻辑单元512停止(stall)多工队列502,直到NTBE填入有效输出214。接着,流程进入步骤812。
于步骤812,XIBQ104终于自指令高速缓存102接收到一列的指令字节132,其被载至NTBE中。该列的指令字节132包含未知长度指令的其余字节。接着,流程进入步骤814。
于步骤814,长度解码器202/涟波逻辑单元204针对未知长度指令产生指令长度222及开始/结束位232/234。在一实施例中,XIBQ控制逻辑单元702依据指令长度222以计算未知长度指令的其余字节数量(其位于步骤812载至XIBQ104的NTBE中)。该其余字节数量于接下来的步骤818中是用以决定结束位234的位置。接着,流程进入步骤816。
于步骤816,XIBQ控制逻辑单元702将底部项目移出。然而,M级控制逻辑单元512并不将相应底部项目的涟波逻辑单元204的输出214加载,因为其根据步骤804已置于多工队列502中。接着,流程进入步骤818。
于步骤818,长度解码器202/涟波逻辑单元204处理新的XIBQ104底部项目(亦即,于步骤812所接收的快取数据),且M级控制逻辑单元512将涟波逻辑单元204的输出214(其包含未知长度指令的结束位234)载至多工队列502的NTBE中。接着,流程进入步骤822。
于步骤822,M级控制逻辑单元512自多工队列502的底部项目及NTBE取出未知长度指令(以及其它可取出的指令),并传送至F级。接着,流程进入步骤824。
于步骤824,M级控制逻辑单元512将多工队列502的底部项目移出。流程结束于步骤824。
根据上述,本实施例的指令格式器106即使在XIBQ(x86指令字节队列)104底部项目的相关消息尚未可用的情况下,对于具有可用消息的指令,通过让消息(指令字节、开始/结束位及累积前置消息)尽快从L级释出,因而得以解决了前述问题。
[通过前置累积以增进指令的取得]
图9显示图5的多工队列502的详细方块图。在图9的实施例中,多工队列502包含四个项目,分别为底部项目(bottom entry,BE)、NTBE、底部倒数第三项目(second-from-bottom entry,SFBE)及底部倒数第四项目(third-from-bottom entry,TFBE)。多工队列502的每一项目含有十六个字节,每一字节存放一个指令字节及其开始位232、结束位234及累积前置消息238。如图所示,BE分别标示为0至15。NTBE分别标示为16至31。这些标号也显示于图10。SFBE分别标示为32至47。
图10显示图1的指令格式器106的部分M级的方块图。图10显示多工队列502的累积前置阵列(accumulated prefix array)1002及指令字节阵列(instruction byte array)1004。累积前置阵列1002及指令字节阵列1004的消息实际上是储存于多工队列502的BE和NTBE。然而,多工队列502消息的提供是通过导线至选择电路(在一实施例中,其为动态逻辑单元),其包含图5的多工器504/506/508。图10仅显示出I1多工器504,然而I2多工器506及I3多工器508所接收的输入也如同I1多工器504。指令多工器504/506/508为16:1多工器。如图10所示,I1多工器504的输入分别标示为0至15。每一个I1多工器504的输入接收十一个指令字节及累积前置消息238,其中累积前置消息238相应于所接收十一个指令字节的最低位(lowest order)字节。该最低位字节为指令字节阵列1004的字节号码,其对应至I1多工器504的输入号码。例如,I1多工器504的输入8接收多工队列502的字节8至18(亦即BE的字节8-15及NTBE的字节16-18)及相应字节8的累积前置消息238。I1多工器504接收十一个指令字节的理由为:虽然x86指令允许最多十五字节,然非前置字节最多为十一字节,前述实施例仅取得并传送非前置字节至管线的其余部分(亦即,去除前置字节并以累积前置消息238置换前置字节),因而可以大量减少管线后续级的解码工作量并让微处理器100实现各种好处。
图11显示图5的M级控制逻辑单元512的方块图。M级控制逻辑单元512包含2:1多工器1114,用以产生指令长度LEN1 1122,其为通过指令格式器106的指令串流的一指令(图5的第一指令I1524)的指令长度。指令长度LEN11122连同第一指令I1524继续通过管线传送并被处理。多工器1114根据前一时钟周期中是否有部分长度的情形存在,以选择减法器1102的输出或加法器1116的输出。多工器1114受控于暂存器1118,其储存一位用以表示前一时钟周期是否存在有部分长度的情形,此将于图12至图14详述。如果有部分长度情形发生,多工器1114选择加法器1116的输出;否则,多工器1114选择减法器1102的输出。加法器1116的第一输入为指令剩余长度,标示为剩余LEN11106,其将于图12至图14详述。M级控制逻辑单元512还包含其它逻辑单元(未显示于图式中),其依据第一指令I 1524的结束位234(其是由多工队列502提供给M级控制逻辑单元512)以计算剩余LEN1 1106。加法器1116的第二输入为目前指令的部分长度,标示为部分LEN 1104,其是由前一时钟周期加载的暂存器所提供,将于图12详述。减法器1102以前一指令的结束位234在多工队列502中的字节位置(END0 1112)减去第一指令I1524的结束位234在多工队列502中的字节位置(END1 1108)。值得注意的是,虽然M级控制逻辑单元512执行如图11所示的数学运算,然而M级控制逻辑单元512不能使用传统加法器/减法器,而是以组合逻辑单元来实施。例如,在一实施例中,位是以解码形式来执行的;例如,减法运算可使用布尔(Boolean)AND-OR运算。第二指令I2 526和第三指令I3 528的长度计算所使用的减法器(未显示于图式中)类似于第一指令I1 524的减法器,但是分别为END1减去END2以及END2减去END3。最后,多工队列502项目的目前偏移(offset)的决定是选择来自多工器504/506/508的最后指令最后字节的后一字节。
图12显示图1的指令格式器106的部分M级的操作流程图。此流程始于步骤1201。
于步骤1201,新时钟周期开始,且M级控制逻辑单元512检视多工队列502的BE及NTBE(图9)。接着,流程进入步骤1202。
于步骤1202,M级控制逻辑单元512控制多工器504/506/508,将多工队列502的BE及NTBE(可能的话)的指令传送至指令格式器106的F级。如前所述,在一实施例中,M级可于一时钟周期内取得三指令。由于x86指令的长度可为零至十五字节,因此多工队列502的底部项目可能存有一至十六个x86指令。因此,需要多个时钟周期以取得多工队列502的BE的所有指令。再者,依据BE的最后字节究竟为前置字节、结束字节或其它类型字节,指令可能跨越BE和NTBE,因此,M级控制逻辑单元512在取得指令及移出多工队列502的BE时,其操作方式会有不同,此将于以下详述。再者,M级控制逻辑单元512计算每一取得/传送指令的长度,特别是使用图11的逻辑以计算第一指令I1 524(图11的指令长度LEN1 1122)。如果为前一时钟周期的部分长度(此将于步骤1212详述),则M级控制逻辑单元512使用储存的部分LEN1104以计算指令长度LEN1 1122;否则,M级控制逻辑单元512使用减法器1102(图11)以计算指令长度LEN1 1122。接着,流程进入步骤1204。
于步骤1204,M级控制逻辑单元512判定是否结束于BE的所有指令都已传送至F级。在一实施例中,于一时钟周期内,M级最多可取得及传送三个指令给F级。因此,如果M级自底部项目取得三指令,且尚有至少另一指令的开始位232在底部项目中,则另一指令必须于下一时钟周期取得。如果结束于BE的所有指令都已传送至F级,则流程进入步骤1206;否则,流程进入步骤1205。
于步骤1205,M级控制逻辑单元512不移出BE,使得于下一时钟周期时,M级控制逻辑单元512可以自BE取得及传送更多的指令。流程返回至步骤1201,以进行下一时钟周期的程序。
于步骤1206,M级控制逻辑单元512判定BE的最后字节究竟为前置或者为非前置字节。如果BE的最后字节为非前置字节,则流程进入步骤1216;如果BE的最后字节为前置字节,则流程进入步骤1212。
于步骤1212,M级控制逻辑单元512计算位于BE最后包含前置字节的指令的部分长度,亦即,从前一指令的结束字节一直到BE的最后字节15之间的前置字节数目,该计算是由M级控制逻辑单元512的数学逻辑单元(未显示于图式中)执行。例如,于图13的例子中,指令b的部分长度为14。位于结束字节和开始字节之间的前置字节是处于“三不管地带”(no-man’s land),而前置字节于多工队列502中事实上为多余的,因为其内容已经存在于累积前置消息238,其和指令的操作码字节储存于多工队列502内。藉此,如果BE的最后为前置字节且在BE中的所有其它指令于该时钟周期皆已取得,则M级控制逻辑单元512即可将BE(1214)移出(步骤1214),因为,这些前置字节是存在的(其将于接下来的十六字节列当中累积于操作码字节)且M级控制逻辑单元512将前置字节数目储存起来(储存至图11的部分长度暂存器1104)并自多工队列502移出。另一方面,如果BE的最后为非前置字节且其尚未被取得或传送,则M级控制逻辑单元512不能将其自多工队列502移出(参阅步骤1222)。接着,流程进入步骤1214。
于步骤1214,M级控制逻辑单元512控制多工队列502以移出BE。流程返回至步骤1201,以进行下一时钟周期的程序。
于步骤1216,M级控制逻辑单元512判定BE的最后字节是否为指令的结束字节,亦即,结束位234是否为逻辑真值。如果为是,则流程进入步骤1214;否则,流程进入步骤1218。
于步骤1218,M级控制逻辑单元512判定NTBE是否为有效。当取得的最后指令的结束字节位于BE的最后字节(亦即字节15),或者最后字节跨至NTBE且其为有效,则M级控制逻辑单元512移出BE;否则,M级控制逻辑单元512维持BE直到下一时钟周期。如果NTBE为有效,流程进入步骤1214;否则,流程进入步骤1222。
于步骤1222,M级控制逻辑单元512不移出BE。此乃因为指令的实际字节(亦即,非前置字节)跨越BE和NTBE,且NTBE为无效。在此情形,M级控制逻辑单元512无法决定指令长度,因为指令的结束位234无法自无效的NTBE得知。流程返回至步骤1201,进行下一时钟周期的程序,以等待NTBE填满有效数据。
图13显示图5的多工队列502于连续两个时钟周期的内容,以例示M级的操作。第一个多工队列502内容处于第一时钟周期0,而第二个多工队列502内容处于第二时钟周期1。图式仅显示出底部的三个项目。于图13中,“S”表示开始字节(亦即,开始位232为逻辑真值),“E”表示结束字节(亦即,结束位234为逻辑真值),“P”表示前置字节(亦即,累积前置消息238所表示)。4个指令分别以a、b、c、d来表示,并显示其开始、结束及前置字节。所示字节数目对应至图9,例如字节0至47,其位于多工队列502的BE、NTBE及SFBE。
在周期0的一开始,BE的字节1包含有指令a的结束字节Ea,且BE的字节2至15包含有十四个指令b的前置字节Pb。因为指令b开始于BE,但其开始字节是位于NTBE而不是BE,其部分长度计算为十四字节。NTBE及SFBE的内容为无效的,亦即X86指令字节队列104和长度解码器202/涟波逻辑单元204尚未提供指令串流的快取数据及其相关消息(例如开始位232、结束位234以及累积前置消息238)至除了BE之外的其它项目。
于周期0时,M级控制逻辑单元512检视BE和NTBE的内容(图12的步骤1201)并传送指令a至F级(步骤1202)。再者,M级控制逻辑单元512计算指令a的长度,其等于指令a的结束字节位置和前一指令的结束字节位置之间的差值。最后,由于结束于BE的所有指令(指令a)已传送(步骤1204)且BE的最后一字节(字节15)为前置字节(步骤1206),M级控制逻辑单元512计算指令b的部分长度为十四字节,将其储存于部分LEN 1104暂存器(步骤1212)。最后,M级控制逻辑单元512从多工队列502将BE移出(步骤1214)。
由于步骤1214于周期0进行了移出且移入另外十六字节列的涟波逻辑单元204输出214,因而开始周期1,此时BE包含:位于字节0的指令b的开始字节(Sb)及结束字节(Eb)(亦即,指令b的非前置字节仅有单一字节);位于字节1至5的指令c的五个前置字节(Pc);位于字节6的指令c的开始字节(Sc);位于字节8的指令c的结束字节(Ec);位于字节9的指令d的开始字节(Sd);及位于字节15的指令d的结束字节(Ed)。
于周期1时,M级控制逻辑单元512检视BE和NTBE的内容(步骤1201)且传送指令b、c及d至F级(步骤1202)。再者,M级控制逻辑单元512计算以下各项:指令b的长度(LEN1 1122)(步骤1202)(在此例子中为十五字节),其等于部分LEN 1104(在此例子中为十四字节)加上指令b的剩余长度(在此例子中为一字节);指令c的长度(在此例子中为八字节),其等于指令c的结束字节位置和指令b的结束字节位置两者的差值;及指令d的长度(在此例子中为七字节),其等于指令d的结束字节位置和指令c的结束字节位置两者的差值。再者,由于所有结束于BE的指令(指令b,c,d)都已传送(步骤1204)且BE的最后字节(字节15)为非前置字节(步骤1206)且BE的最后字节为结束字节(步骤1216),因此M级控制逻辑单元512从多工队列502将BE移出(步骤1214)。
根据图13所示的实施例,通过累积指令b的累积前置消息238至其操作码且储存指令b的部分LEN 1104,使得指令格式器106可将含有指令b的前置字节的BE移出,并于下一时钟周期从多工队列502取得及传送最多三个指令。如果没有累积前置消息238及储存部分LEN 1104,这将是不可能的(亦即,指令c和d无法与指令b在相同周期内取得及传送,而是必须于下一时钟周期进行)。通过使得微处理器的功能单元具足够指令可处理,可减少微处理器100资源的使用。
图14显示图5的多工队列502于连续两个时钟周期的内容,以例示M级的操作。图14的例子类似于图13的例子;然而,指令的位置及多工队列502的进入及离开时序则有差异。
于周期0的一开始,BE位于字节1包含有指令a的结束字节(Ea),且位于字节2至15包含有指令b的十四个前置字节(Pb)。另外,由于指令b开始于BE,但是其开始字节却是位于NTBE,因此部分LEN 1104计算为14。NTBE包含:位于字节16的指令b的开始字节(Sb)及指令b的结束字节(Eb)(亦即,指令b除了前置字节外,仅为单一字节);位于字节17-21的指令c的五个前置字节(Pc);位于字节22的指令c的开始字节(Sc);位于字节27的指令c的结束字节(Ec);位于字节28-30的指令d的三个前置字节(Pd);及位于字节31的指令d的开始字节(Sd)。SFBE包含:位于字节41的指令d的结束字节(Ed),及位于字节42的指令e的开始字节(Se)。
于周期0时,M级控制逻辑单元512检视BE和NTBE的内容(图12的步骤1201)并传送指令a至F级(步骤1202)。再者,M级控制逻辑单元512计算指令a的长度,其等于指令a的结束字节位置和前一指令的结束字节位置之间的差值。最后,由于结束于BE的所有指令(指令a)已传送(步骤1204)且BE的最后一字节(字节15)为前置字节(步骤1206),M级控制逻辑单元512计算指令b的部分长度为十四字节,将其储存于部分LEN1104暂存器(步骤1212)。最后,M级控制逻辑单元512从多工队列502将BE移出(步骤1214)。
由于步骤1214于周期0进行了移出,因而开始周期1,此时BE包含周期0时的NTBE的内容,而NTBE包含周期0时的SFBE的内容。
于周期1时,M级控制逻辑单元512检视BE和NTBE的内容(步骤1201)且传送指令b、c及d至F级(步骤1202)。再者,M级控制逻辑单元512计算以下各项:指令b的长度(LEN1 1122)(步骤1202)(在此例子中为十五字节),其等于部分LEN 1104(在此例子中为十四字节)加上指令b的剩余长度(在此例子中为一字节);指令c的长度(在此例子中为十一字节),其等于指令c的结束字节位置和指令b的结束字节位置两者的差值;及指令d的长度(在此例子中为十四字节),其等于指令d的结束字节位置和指令c的结束字节位置两者的差值。再者,由于所有结束于BE的指令(指令b、c、d)都已传送(步骤1204)且BE的最后字节(字节15)为非前置字节(步骤1206)且BE的最后字节非为结束字节(步骤1216)且NTBE为有效(步骤1218),因此M级控制逻辑单元512从多工队列502将BE移出(步骤1214)。
根据图14所示的实施例,指令格式器106可于一时钟周期内,将含有最多四十个指令字节的三个指令取得并传送出去,如图15所示。
[不良分支预测的检测、标示及累积,用以快速处理指令串流]
再参阅图1,当提取单元126输出目前提取地址142用以自指令高速缓存102提取一指令字节列并提供给XIBQ104时,BTAC128也同时得到该目前提取地址142。如果目前提取地址142命中(hit)BTAC128,则表示先前在此提取地址有一分支指令曾被执行过;因此,BTAC128可预测是否有分支指令发生(taken),如果为是,则BTAC128也预测了预测目标地址146。特别的是,BTAC128是在微处理器100从指令字节串流取得或解码分支指令之前即进行预测。因此,BTAC128所预测的分支指令可能并未存在于取出的指令字节的高速缓存列中,亦即,BTAC128作了不良的预测,造成微处理器100分支错误。值得注意的是,此不良预测并不等同于不正确预测。由于程序执行具动态性质,例如分支指令的状态码或状态数据的值的改变,因此所有分支预测器于本质上都有可能会预测错误。然而,此处的不良预测表示BTAC128所预测的高速缓存列不同,或者高速缓存列相同但高速缓存列内的内容已经改变。之所以发生这些情形的理由,如美国专利7,134,005所描述,理由有下列几种:由于BTAC128仅储存部分的地址标签(tag)而非完整地址标签,因而造成标签混淆(aliasing);由于BTAC128仅储存虚拟(virtual)地址标签而非物理地址,因而造成虚拟混淆;及自发性修改码(self-modifying code)。当此情形发生时,微处理器100必须确定未将不良预测指令及后续因为不良预测指令而错误取得的错误指令传送出去。
如果对于一指令字节其分支发生指示154(图1)为逻辑真值但是事实上并非为指令的第一字节,如图16所示,即表示BTAC128作了不良预测因而造成微处理器100的分支错误。如前所述,BTAC128所提供的真值分支发生指示154表示BTAC128认为该指令字节为分支指令的第一字节(亦即操作码),且提取单元126根据BTAC128所预测的预测目标地址146进行分支。
不良BTAC预测的决定方法系等待,直到个别的指令从指令字节串流中取得且长度为已知,并扫描每一指令的非第一字节以检视其分支发生指示154是否为真。然而,此种检查方法太慢,因为其需要很多的屏蔽(masking)及移出,且需将每一字节的结果经由逻辑或(OR)运算,因此会造成时序问题。
为了避免时序问题,本发明实施例累积分支发生指示154所提供的消息,其为涟波逻辑单元204执行程序的一部分,且于M级取得指令后,使用这些累积消息。特别的是,涟波逻辑单元204检测状态并将指示符传递下去直到指令的最后字节,其检视单一字节,亦即指令的最后字节。当从M级取得指令时,决定一指令是否为不良指令,亦即,该指令是否要被涵盖于指令串流并继续沿着管线传送下去。
图17显示涟波逻辑单元204输出214的组成信号。图17所示的涟波逻辑单元204输出信号类似于图2所示,但对于每一指令字节额外增加了不良BTAC位1702,其将于以下详述。此外,涟波逻辑单元204输出包含:一信号,当其为逻辑真值时,表示相应的指令字节为BTAC128所预测的分支指令的第一字节,然而BTAC128所预测的分支指令将不会发生;及另一信号,其表示前一字节为指令的结束字节。
图18显示图1的微处理器100的操作流程图。此流程始于步骤1802。
于步骤1802,BTAC(分支目标地址高速缓存)128预测于提取单元126所提供的目前提取地址142所指的高速缓存列中,存在一分支指令,且该分支指令将会发生。BTAC(分支目标地址高速缓存)128还预测分支指令的预测目标地址146。因此,XIBQ104于目前提取地址142所指处的指令高速缓存102接收十六指令字节当中的第一列,且接着于预测目标地址146所指处的指令高速缓存102接收十六指令字节当中的第二列。接着,流程进入步骤1804。
于步骤1804,XIBQ104储存每一分支发生指示154(图1)连同于步骤1802所接收的二列相应的指令字节。接着,流程进入步骤1806。
于步骤1806,长度解码器202和涟波逻辑单元204处理指令字节的第一列,并检测指令字节含有逻辑真值的分支发生指示154但该字节并非指令的第一字节的情形,如图16所示的错误情形。换句话说,涟波逻辑单元204知道指令字节的十六组列中哪一字节为第一字节,用以设定结束位234。据此,相应每个指令的第一非前置字节的涟波逻辑单元204检视分支发生指示154的逻辑真值及检测该情形。接着,流程进入步骤1808。
于步骤1808,当检测到指令的非第一字节的真值分支发生指示154为逻辑真值,涟波逻辑单元204设定该指令字节的不良BTAC位1702为逻辑真值。此外,涟波逻辑单元204将真值的不良BTAC位1702从其字节位置传递至十六字节列的其余字节。再者,如果指令的结束字节未出现于指令字节的第一列,则涟波逻辑单元204更新状态(例如正反器)(未显示于图式中),用以表示目前列中对一指令发生不良的BTAC(分支目标地址高速缓存)128预测。接着,当涟波逻辑单元204处理指令字节的第二列时,由于状态为真,涟波逻辑单元204对于指令字节第二列的所有字节设定其不良BTAC位1702。接着,流程进入步骤1812。
于步骤1812,对于指令字节的第一及第二列,多工队列502储存涟波逻辑单元204的输出214,包含不良BTAC位1702,并连同各个的指令字节一起储存。接着,流程进入步骤1814。
于步骤1814,M级控制逻辑单元512发现相应于指令字节的不良BTAC位1702为逻辑真值且该指令字节的结束位234也为逻辑真值(亦即,检测到不良BTAC(分支目标地址高速缓存)128预测的情形)。因此,M级控制逻辑单元512通过清除相应的有效位534/536/538而放弃传送发生不良情形的指令及其后续指令至F级。然而,如果在发生不良情形的指令之前有一指令,则该指令为有效且被传送至F级。如前所述,真值的不良BTAC位1702传递至发生不良情形的指令的结束字节,将使得M级控制逻辑单元512得以只检视单一字节,亦即,结束位234所指的字节,因而明显减少时序的限制。接着,流程进入1816。
于步骤1816,微处理器100让BTAC(分支目标地址高速缓存)128的错误项目变为无效。此外,微处理器100清除XIBQ104及多工队列502的所有内容并让提取单元126更新目前提取地址142,用以自BTAC(分支目标地址高速缓存)128产生不良预测处重新取得指令字节。于重新取得时,BTAC(分支目标地址高速缓存)128不会产生不良预测,因为不良项目已被清除,亦即,于重新取得时,BTAC(分支目标地址高速缓存)128将预测分支不会发生。在一实施例中,步骤1816执行于指令格式器106的F级,及/或指令转译器112。流程结束于步骤1816。
[x86指令长度的有效决定]
决定x86指令长度是非常复杂的,其描述于英特尔IA-32架构软件开发手册(Intel IA-32Architecture Software Developer’s Manual),第2A集的第二章:指令集参考(Instruction Set Reference),A-M。指令总长度系为下列之和:前置字节的数目(如果有的话)、操作字节的数目(1、2或3)、ModR/M字节出现与否、SIB字节出现与否、地址位移(displacement)长度(如果有的话)及立即(immediate)数据的长度(如果有的话)。以下为x86指令的特性或要求,其足以影响长度(前置除外)的决定:
操作码字节的数目为:
3,如果前二字节为0F 38/3A
2,如果第一字字节为0F,且第二字字节不为38/3A
1,其它情形
ModR/M字节是否出现决定于操作码,如下:
如果为三字节操作码,则ModR/M为强制的
如果为一字节或二字节操作码,则检视操作码字节
SIB字节是否出现决定于ModR/M字节。
位移是否出现决定于ModR/M字节。
位移尺寸决定于ModR/M字节及目前地址尺寸(AS)。
立即数据是否出现决定于操作码字节。
立即数据的尺寸决定于操作码字节、目前操作码尺寸(OS)、目前AS及REX.W前置;特别的是,ModR/M字节不会影响立即数据尺寸。
如果没有ModR/M字节,则没有SIB、位移或立即数据。
当决定指令长度时,指令操作码及ModR/M字节仅有五种形式:
操作码
0F+操作码
操作码+ModR/M
0F+操作码+ModR/M
0F+38/3A+操作码+ModR/M
图19显示图2的长度解码器202的详细方块图。图2显示了十六个长度解码器202。图19显示一代表性长度解码器202,标示为n。如图2所示,每一长度解码器202对应至指令字节串流134的一个字节。换句话说,长度解码器0对应至指令字节0,长度解码器1对应至指令字节1,一直到长度解码器15对应至指令字节15。长度解码器202包含可编程逻辑阵列(Programmable Logic Array,PLA)1902、4:1多工器1906及加法器1904。
PLA 1902接收图2所示的地址尺寸(AS)、操作数尺寸(OS)及REX.W值218。AS代表地址尺寸、OS代表操作数尺寸,且REX.W值表示REX.W前置的出现。PLA 1902还接收相应的指令字节134(其标示以n)及高一阶的指令字节134(其标示以n+1)。例如,PLA 3 1902接收指令字节3及4。
PLA 1902产生immLen值1916,其提供给加法器1904的第一输入。immLen值1916介于1和9(含)之间,其值为下列之和:操作码字节数目及立即数据的尺寸(0、1、2、4、8)。PLA 1902于决定immLen值1916时,是假设该二指令字节134为指令的前二操作码字节,并依据二操作码字节(如果不是0F则为一操作码字节)、地址尺寸(AS)、操作数尺寸(OS)及REX.W值218以产生immLen值1916。
PLA 1902产生eaLen值1912,其提供给三个低阶长度解码器202的多工器1906。eaLen值1912介于1和6(含)之间,其值为下列之和:ModR/M字节数目(PLA假设ModR/M字节的存在)、SIB字节数目(0或1)及位移尺寸(0、1、2、4)。PLA 1902于决定eaLen值1912时,是假设第一指令字节134为ModR/M字节,并依据ModR/M字节和地址尺寸(AS)218以产生eaLen值1912。
多工器1906的其中一个输入接收零值。多工器1906的其它三个输入接收来自三个高阶PLA 1902的eaLen值1912。多工器1906选择其中一个输入用以提供eaLen值1918作为输出,其再提供给加法器1904的第二输入。在一实施例中,为了减少传递延迟,可不使用前述的多工器1906,各个eaLen值1912被输入至加法器1904,其中eaLen值1912为三态线或(tri-statewired-OR)信号。
加法器1904将immLen值1916及被选到的eaLen值1918加总以产生图2所示的最终指令长度222。
PLA 1902产生控制信号1914以控制多工器1906,其根据前述五种形式进行检测如下:
1.对于以下所示的不具ModR/M字节的指令形式,则选择零值:
仅操作码,或
0F+操作码
2.对于以下指令形式,则选择PLA n+1:
操作码+ModR/M
3.对于以下指令形式,则选择PLA n+2:
0F+操作码+ModR/M
4.对于以下指令形式,则选择PLA n+3:
0F+38/3A+操作码+ModR/M
图20显示十六个长度解码器202的配置。PLA 15(可编程逻辑阵列)1902接收指令字节15及前一列的指令字节0,而多工器151906接收三个PLA1902(图未示)的eaLen值1912,其中该三个PLA 1902分别检视前一列的指令字节0/1、1/2及2/3。
前述每一PLA 1902每一次检视二字节的好处在于可大量减少所需的全及项(minterm)数目,因而得以减小晶圆上的逻辑电路的尺寸。此设计提供总全及项数目的减少和时序要求所允许的延迟两者之间的平衡选择。
图21显示图20的长度解码器202的操作流程图。此流程始于步骤2102。
于步骤2102,对于来自XIBQ104的每一指令字节134,相应的PLA 1902检视二指令字节134,亦即相应的指令字节134及下一指令字节134。例如,PLA 3(可编程逻辑阵列)1902检视指令字节3和4。接着,流程同时进入步骤2104和2106。
于步骤2104,每一PLA 1902假设二指令字节134为指令的前二操作码字节,且依据该二指令字节134、操作数尺寸(OS)、地址尺寸(AS)、及REX.W值以产生immLen值1916。详而言之,immLen值1916为下列之和:操作码字节的数目(1、2或3)和立即数据的尺寸(0、1、2、4或8)。接着,流程进入步骤2114。
于步骤2106,每一PLA 1902假设第一指令字节134为ModR/M字节,且依据ModR/M字节及地址尺寸(AS)以产生eaLen值1918,并提供eaLen值1918给次三个低阶多工器1906。详而言之,eaLen值1918为下列之和:ModR/M字节数目(1)、SIB字节(0或1)和位移的尺寸(0、1、2、4)。接着,流程进入步骤2108。
于步骤2108,每一多工器1906接收零输入及自三高阶PLA 1902接收的eaLen值1912。例如,PLA 3(可编程逻辑阵列)1902自PLA 4、5、6(可编程逻辑阵列)1902接收eaLen值1912。接着,流程进入步骤2112。
于步骤2112,每一PLA 1902产生控制信号1914至相应的多工器1906,并依据前述五种形式以选择其中一输入。接着,流程进入步骤2114。
于步骤2114,每一加法器1904将immLen值1916加至多工器1906所选择的eaLen值1918,以产生指令长度222。接着,流程进入步骤2116。
于步骤2116,如果出现有LMP,则L级对于含有LMP的每一指令花费额外的一个时钟周期,如前述图式所示,特别是图1至图4。
以上所述仅为本发明的实施例而已,并非用以限定本发明的权利要求范围。熟悉计算机领域的人士在未脱离发明所揭示的精神下所完成的等效改变或修饰,均应包含在上述的权利要求范围内。例如,可使用软件以启动功能、制造、建立模型、仿真、描述及/或测试所揭露的装置及方法。其达成可使用程序语言(例如C、C++)、硬件描述语言(HDL),其包含Verilog HDL、VHDL及其它程序。该软件可置于计算机可使用媒体,例如半导体、磁盘或光盘(例如CD-ROM、DVD-ROM)。所揭露的装置及方法实施例可包含于知识产权核心(IPcore),例如微处理器核心(例如置于HDL)并转换为硬件以制成集成电路。再者,所揭露的装置及方法实施例可使用硬件和软件的组合来实施。因此,本发明范围不限定于任何例示实施例,而应以权利要求范围及其等效范围来定义。详而言之,本发明可实施于微处理器装置内,该微处理器可用于一般计算机内。最后,本领域技术人员可使用所揭露的概念及特定实施例作为基础以设计或修改成其它架构,用以实现相同目的,其仍未脱离本发明的权利要求范围。
Claims (11)
1.一种适用于微处理器的装置,该微处理器的指令集架构包含可变数目的前置字节,该装置用以有效地自一指令字节串流中提取指令,该装置包含:
一解码逻辑单元,用以对该指令字节串流中多个指令的每一指令判断其操作码字节,其中该操作码字节为相应的该指令的第一非前置字节,该解码逻辑单元还累积该多个指令的每一指令的前置消息至相应的该操作码字节,每一指令的前置消息表示解码的单一对应的指令字节的前置值;
一队列,耦接至该解码逻辑单元,用以暂存该指令字节串流及该累积前置消息;及
一提取逻辑单元,耦接至该队列,用以于一时钟周期内,自该队列提取该多个指令,其不受该多个指令的每一指令中的前置字节数目所影响,
其中上述的提取逻辑单元于提取该多个指令时,提取该累积前置消息,而非提取每一指令的前置字节。
2.根据权利要求1所述的装置,其中上述的累积前置消息包含一出现/未出现指示符,用以表示该指令集架构所支持类型的前置字节是否出现。
3.根据权利要求1所述的装置,其中上述队列的每一项目暂存至少十六指令字节,藉此,该提取逻辑单元可于一时钟周期内提取该多个指令字节。
4.根据权利要求1所述的装置,其中上述的解码逻辑单元于同一时钟周期内执行上述判断该操作码字节、累积该前置消息至相应的该操作码字节且将该指令字节及该累积前置消息加载至该队列。
5.根据权利要求4所述的装置,于该解码逻辑单元执行上述判断该操作码字节、累积该前置消息至相应的该操作码字节及加载该指令字节及该累积前置消息至该队列的时钟周期的下一个时钟周期内,上述的提取逻辑单元自该队列提取该多个指令。
6.根据权利要求1所述的装置,其中上述的提取逻辑单元包含:
多个多工器,分别对应至该多个指令,每一该多工器接收该指令字节串流;及
一控制逻辑单元,耦接至该多个多工器,该控制逻辑单元针对该多个指令的每一指令自该队列接收相应的操作码字节指示符,该控制逻辑单元还根据该操作码字节指示符,以控制该多个多工器,用以自该指令字节串流中选择一字节。
7.一种适用于微处理器的方法,该微处理器的指令集架构包含可变数目的前置字节,该方法用以有效地自一指令字节串流中提取指令,该方法包含:
对于该指令字节串流中多个指令的每一指令,判断其操作码字节,其中该操作码字节为相应的该指令的第一非前置字节;
对于该多个指令的每一指令,累积其前置消息至相应的该指令的该操作码字节,每一指令的前置消息表示解码的单一对应的指令字节的前置值;及
于一时钟周期内,自一队列提取该多个指令,其不受该多个指令的每一指令中的前置字节数目所影响,
其中上述的提取该多个指令时,提取该累积前置消息,而非提取每一指令的前置字节。
8.根据权利要求7所述的方法,其中上述的累积前置消息至相应的该指令的该操作码字节包含:
连同该操作码字节,提供一出现/未出现指示符,用以表示该指令集架构所支持类型的前置字节是否出现。
9.根据权利要求7所述的方法,其中上述的提取该多个指令包含自该队列的一项目提取该多个指令,该项目暂存至少十六指令字节。
10.根据权利要求7所述的方法,还包含:
于上述的提取该多个指令之前,将该指令字节及该累积前置消息加载至该队列,
其中上述判断该操作码字节、累积该前置消息至相应的该指令的操作码字节,并将该指令字节及该累积前置消息加载至该队列于同一时钟周期内执行。
11.根据权利要求10所述的方法,于执行上述判断该操作码字节、累积该前置消息至相应的该指令的操作码字节及加载该指令字节及该累积前置消息至该队列的时钟周期的下一个时钟周期内,执行上述自该队列提取该多个指令。
Applications Claiming Priority (6)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US17961609P | 2009-05-19 | 2009-05-19 | |
US61/179,616 | 2009-05-19 | ||
US22829609P | 2009-07-24 | 2009-07-24 | |
US61/228,296 | 2009-07-24 | ||
US12/572,002 | 2009-10-01 | ||
US12/572,002 US8838938B2 (en) | 2009-05-19 | 2009-10-01 | Prefix accumulation for efficient processing of instructions with multiple prefix bytes |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101853148A CN101853148A (zh) | 2010-10-06 |
CN101853148B true CN101853148B (zh) | 2014-04-23 |
Family
ID=42804658
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201010185661.8A Active CN101853148B (zh) | 2009-05-19 | 2010-05-19 | 适用于微处理器的装置及方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101853148B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9436474B2 (en) | 2012-07-27 | 2016-09-06 | Microsoft Technology Licensing, Llc | Lock free streaming of executable code data |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1446332A (zh) * | 2000-08-09 | 2003-10-01 | 先进微装置公司 | 用以在扩充寄存器模式下存取扩充寄存器集的中央处理单元及其方法 |
CN1522404A (zh) * | 2001-05-31 | 2004-08-18 | Arm | 在多指令集系统中对未处理操作的处理 |
EP1028370B1 (en) * | 1992-03-31 | 2004-09-15 | Seiko Epson Corporation | System and method for translating a stream of non-native instructions for processing on a host processor |
CN101432692A (zh) * | 2006-05-04 | 2009-05-13 | 高通股份有限公司 | 预解码可变长度指令 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5537629A (en) * | 1994-03-01 | 1996-07-16 | Intel Corporation | Decoder for single cycle decoding of single prefixes in variable length instructions |
US7305542B2 (en) * | 2002-06-25 | 2007-12-04 | Intel Corporation | Instruction length decoder |
US7475232B2 (en) * | 2005-07-19 | 2009-01-06 | International Business Machines Corporation | Performance of an in-order processor by no longer requiring a uniform completion point across different execution pipelines |
US20070198812A1 (en) * | 2005-09-27 | 2007-08-23 | Ibm Corporation | Method and apparatus for issuing instructions from an issue queue including a main issue queue array and an auxiliary issue queue array in an information handling system |
US7716460B2 (en) * | 2006-09-29 | 2010-05-11 | Qualcomm Incorporated | Effective use of a BHT in processor having variable length instruction set execution modes |
CN101334766B (zh) * | 2008-06-30 | 2011-05-11 | 东软飞利浦医疗设备系统有限责任公司 | 一种并行微处理器及其实现方法 |
-
2010
- 2010-05-19 CN CN201010185661.8A patent/CN101853148B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1028370B1 (en) * | 1992-03-31 | 2004-09-15 | Seiko Epson Corporation | System and method for translating a stream of non-native instructions for processing on a host processor |
CN1446332A (zh) * | 2000-08-09 | 2003-10-01 | 先进微装置公司 | 用以在扩充寄存器模式下存取扩充寄存器集的中央处理单元及其方法 |
CN1522404A (zh) * | 2001-05-31 | 2004-08-18 | Arm | 在多指令集系统中对未处理操作的处理 |
CN101432692A (zh) * | 2006-05-04 | 2009-05-13 | 高通股份有限公司 | 预解码可变长度指令 |
Also Published As
Publication number | Publication date |
---|---|
CN101853148A (zh) | 2010-10-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8769539B2 (en) | Scheduling scheme for load/store operations | |
EP1116102B1 (en) | Method and apparatus for calculating indirect branch targets | |
CN101558388B (zh) | 数据高速缓存虚拟提示路线预测及其应用 | |
US4860199A (en) | Hashing indexer for branch cache | |
CN101876890B (zh) | 管线式微处理器及其执行两种条件分支指令的方法 | |
CN100468323C (zh) | 产生早期指令结果的管线式微处理器、装置以及方法 | |
US8838938B2 (en) | Prefix accumulation for efficient processing of instructions with multiple prefix bytes | |
CN101529378B (zh) | 用于处理分支历史信息的方法及管线处理器 | |
CN101876891A (zh) | 微处理器以及快速执行条件分支指令的方法 | |
CN104335168A (zh) | 分支预测预加载 | |
US5860154A (en) | Method and apparatus for calculating effective memory addresses | |
CN101884025B (zh) | 用于使过程返回序列加速的方法和系统 | |
WO2014090091A1 (en) | Tracking multiple conditions in a general purpose register and instruction therefor | |
US6799266B1 (en) | Methods and apparatus for reducing the size of code with an exposed pipeline by encoding NOP operations as instruction operands | |
CN101833437B (zh) | 适用于微处理器的装置及方法 | |
JP3736866B2 (ja) | スーパーパイプライン式スーパースカラーマイクロプロセッサ用のマイクロコントロールユニット | |
KR100431975B1 (ko) | 분기에의한중단이없는파이프라인방식의마이크로프로세서를위한다중명령디스패치시스템 | |
CN101853148B (zh) | 适用于微处理器的装置及方法 | |
KR20070011468A (ko) | 멀티-프로세서 파이프라인 병렬 계산을 위한 방법들 및장치 | |
CN101833436B (zh) | 适用于微处理器的装置及方法 | |
CN101887358B (zh) | 适用于微处理器的装置及方法 | |
CN101853151B (zh) | 适用于微处理器的装置及方法 | |
CN101819517B (zh) | 适用于微处理器的装置及方法 | |
TWI786691B (zh) | 微處理器和分支處理方法 | |
Ngu | Design and simulate RISC-V processor using verilog |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |