比较和跳转指令

2016-11-20  本文已影响0人  rustydaar

所有的体系结构都必须要有比较和条件跳转,虽然很多相似之处,但是各个体系结构都有自己的一套实现。

SPARC使用4种传统的状态位:负数,零,进位,和溢出。所有的算术和逻辑指令都可能设置它们,旧的体系结构中,这些位可能被所有的指令设置。明确的操作更利于流水线的实现。虽然状态位可能被其他操作影响,但是显式的比较可以用r0作为目的寄存器来生成。SPARC的条件跳转会比较所有的条件位来确定所有可能的跳转。浮点使用专门的条件位。第9版SPARC分支跳转扩展了4种情况:一个是为64bit设计的独立的条件编码;一个是跟0的各种情况比较(参考下面的MIPS);3种新的浮点条件码;最后是静态编码了的分支预测。

PowerPC也是用四种状态编码:小于,大于,等于,以及溢出,不过存在8份拷贝。这种冗余设计本质上来说,就是为PowerPC多添加了8个4位寄存器,让PowerPC的指令在使用状态的时候减少冲突。每个状态码都可以是一个比较指令的目的,也可以是一个条件跳转的源。整数指令有一个可选位,来标识这个整数操作后是否有一个与零比较来设置状态寄存器。浮点指令也可以选择设置第二个状态寄存器。PowerPC提供对这8个4位寄存器的逻辑操作(CRAND,CROR,CRXOR,CRNAND,CRNOR,CREQV),为单条的分支指令提高更复杂的条件比较。

MIPS用寄存器来获取分支状态。可以用任意的两个寄存器来构造一条相等(BEQ)或者不相等(BNE)指令,通过他们的结果来决定分支是否跳转。小于置位指令(SLT,SLTI,SLTU,SLTIU)比较两个操作数然后设置目的寄存器,如果小于就设置为1,否则就将目的寄存器设置为0。这些指令就可以组合出所有的可能。因为跟0比较很常见,所以MIPS还包括一些特殊的跟0的比较跳转指令:大于等于0(BGEZ),大于0(BGTZ),小于等于0(BLEZ),还有小于0(BLTZ)。当然,等于或者不等于也可以由r0跟BEQ和BNE组合出来。跟SPARC一样,MIPS I为浮点比较和跳转指令提供一个单独的状态码;MIPS IV将状态码扩展到8个,来标识浮点的比较和条件指令状态。

Alpha指令(CMPEQ,CMPLE,CMPLE,CMPULT,CMPULE)比较两个寄存器的值,然后设置第三个寄存器的值,条件为真设置为1,否则这是为0。浮点指令(CMTEQ,CMTLT,CMTLE,CMTUN)在判断条件为真的时候将结果设置为2.0,否则设置为0。分支指令将一个寄存器的值跟0比较(BEQ,BGE,BGT,BLE,BLT,BNE),或者它的最低有效位(BLBC,BLBS),如果条件成立就跳转。

PA-RISC有很多分支选项,我们在“Alpha的指令独特点”小结会看到。最直接的是比较并且跳转(COMB),比较两个寄存器,然后根据它们的结果来判断是否跳转,并且测试比较的最低有效位。

ARM跟SPARC类似,指令中提供四种可以选择设置的状态条件码。CMP用一个操作数减去另外一个操作数的结果来设置状态位。负数比较(MN)用一个操作数加上另外一个操作数,用和来设置状态位。TST用两个操作数逻辑与来设置所有的状态码,TEQ用独有的或操作来设置前三个状态码。跟SPARC一样,ARM分支指令通过测试状态位来判断所有的有符号和无符号关系。我们会在“SPARC v.9的指令独特点”中看到,ARM的一个不常用的特点是,每条指令都可以根据状态码来选择是否执行。(这个PA-RISC的选项类似,见“Alpha的独特点”)。

显然的,Thumb跟ARM很像。不同的地方是状态码不再可选,没有了TEQ指令,也没有了条件执行的指令。

Hitachi SuperH只有一个单独的T状态位,可以通过比较指令设置。两个分支指令可以用来跳转,在T位是1的时候跳转(BT)或者T位是0的时候(BF)。这两种分支可以减少比较指令。

M32R也只有一个单独的条件状态码(C),有符号比较和无符号比较(CMP,CMPI,CMPU,CMPUI)都用C位来标识一个寄存器的值是否小于另一个,就像MIPS的小于置位指令一样。灵感废纸指令测试C位是否为1或0:BC和BNC。M32R也包含相等跳转,不相等跳转(BEQ和BNE),以及一个寄存器值跟0比较(BGEZ,BGTZ,BLEZ,BLTZ,BEQZ,BNEZ).后面这些都是32位宽指令。

MIPS16保留了小于置位指令(SLT,SLTI,SLTU,SLTIU),但是不再将结果放到8个寄存器中,而是放到一个专门的T寄存器。MIPS16总是在完整的32位MIPS指令集机器上面实现,所以,T寄存器实际上就是完整MIPS体系结构中的寄存器24。MIPS16的分支指令测试一个寄存器是否等于0(BEQZ和BNEZ)。也有测试T寄存器是否为0的(BTEQZ和BTNEZ)。为了测试两个寄存器中的值是否相等,MIPS还添加了比较指令(CMP,CMPI),指令会把或的结果存到T寄存器。MIPS16删减了寄存器是否等于的比较跳转(BEQ和BNE)。

图18和图19汇总了条件分支的设计。

图18桌面RISC条件分支汇总。PA-RISC的浮点分支实现需要将FP状态寄存器拷贝到整数寄存器,然后用分支指令测试FP的比较结果。SPARC的整数比较是由使用R0作为目的寄存器的算术指令组合出来的。 图19嵌入式RISC条件分支汇总
上一篇下一篇

猜你喜欢

热点阅读