分类: 嵌入式
2012-05-20 14:43:57
在E500内核中,无条件转移指令使用这个指令格式。B-Form类指令格式如下所示:
0~5 |
6~10 |
11~15 |
16~29 |
30 |
31 |
OPCD |
BO |
BI |
BD |
AA |
LK |
B-Form类指令共包含以下几种指令:
l bc BO,BI,BD // AA=0,LK=0
l bca BO,BI,BD // AA=1,LK=0
l bcl BO,BI,BD // AA=0,LK=1
l bcla BO,BI,BD // AA=1,LK=1
BI字段用来确定使用CR寄存器CRn的字段中哪个状态位作为指令跳转的条件。其中BI的第0~2字段用来选择使用哪个CRn作为状态字段,该字段为0时表示使用CR0字段作为转移指令使用状态字段,为1时表示使用CR1字段作为转移指令使用状态字段。而BI的第3~4字段选择使用什么条件作为转移条件,如下所示:
BI[3:4] 描述
00 使用LT状态位用做指令转移条件
01 使用GT状态位用做指令转移条件
10 使用EQ状态位用做指令转移条件
11 使用SO状态位用做指令转移条件
BO字段用来表示指令根据什么条件进行跳转。
(1)第0位。如果此位为1,bc类指令将不根据CR寄存器的状态进行条件转移,此时bc指令只能根据CTR寄存器的值为0或不为0决定是否进行条件转移。程序使用简单的Loop循环语句时,可以将此位置1。此位为0时,表示bc类指令将根据CR寄存器的相应字段和存放在BI中的条件决定是否进行跳转。
(2)第1位。如果此位为1,则当指令执行的条件为真时进行转移;为0时,当指令执行的条件为假时进行转移。此位可以用来实现布尔表达式中的非操作。在CR寄存器的CRn字段中只定义了LT,GT,EQ位,这些位可以实现“小于”,“大于”或“等于”这些布尔条件,如果程序需要实现“不小于”、“不大于”和“不等于”这些布尔条件,需要使用此位。例如将此位置0,并将BI[3:4]置00,即可实现“不小于”这种转移指令。
(3)第2位。如果该位为1,执行bc指令时,CTR寄存器的值保持不变;如果改位为0,执行bc指令时,CTR寄存器将做自减操作。
(4)第3位。如果该位为1,表示当CTR寄存器为0时进行条件转移。当此位为0时,表示当CTR寄存器不为0时进行条件转移。
(5)第4位:“y”位。此位用来支持静态分支预测功能。
Note:E500内核不支持指令的静态预取操作,因此不支持这一位。E500内核使用指令动态预取来增强转移语句命中的效率。
使用“bc 16,0,BD”表示将CTR寄存器进行自减操作,如果CTR不为0则进行跳转;使用“bc 4,0,BD”表示运算或比较结果为0是进行跳转。E500内核使用了许多助记符来表示各种条件跳转指令,如使用“bdnz”助记符表示“bc 16,0,BD”,使用“beq”助记符表示“bc 4,0,BD”。常用的助记符还有lt(小于),le(小于等于),eq(等于),so(溢出)等。
在PowerPC处理器中,转移指令非常少,常用的条件转移指令只有bc和bcl。