比较和跳转指令

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

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条件分支汇总
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容