ZHCAEQ3 November 2024 F29H850TU , F29H859TU-Q1
C29 CPU 特殊的分支指令使编译器能够将多个分支目标折叠为一个指令。switch 是通用代码中常见的结构,通常用于处理辅助控制任务。C29 ISA 提供多路分支指令 QDECB 和 DDECB,用于高效实现此语句。四路递减分支 (QDECB) 允许最多四个分支目标,或者选择继续线性执行。四路递减分支 (DDECB) 允许最多两个分支目标,或者选择继续线性执行。
下面的代码块中显示了一个包含 16 个分支的 switch 语句。在 C29 CPU 上,switch 使用一条分支指令 (BCMP) 和四条 QDECB 指令实现,需要 10 到 17 个周期,具体取决于输入。在 Cortex-M7 上,switch 针对每种情况使用比较指令和分支指令实现,需要 6 到 51 个周期,具体取决于输入。
switch(state) { case 15: .... break; case 14: .... break; case 13: .... break; ... ... case 0: .... break; default: .... break; }
C29 Implementation
LD.32 A14,@State
BCMP @default,A.GT,A14,#15 QDECBA14,#0x4,@case15,@Case14,@Case13,@Case12,@ QDECBA14,#0x4,@case11,@Case10,@Case9,@Case8,@ QDECBA14,#0x2,@case7,@case6,@case5,@case4,@
QDECBA14,#0x2,@case3,@case2,@case1,@case0,@
default:
....
....
LB @State_end
case15:
....
....
LB @State_end
case14:
....
....
LB @State_end
case13:
....
....
LB @State_end
....
....
....
case2:
....
....
LB @State_end
case1:
....
....
LB @State_end
case0:
....
....
State_end:
M7 Implementation
LDRSB R6,[State]
CMP R6,#15
BGT.N default
BEQ.N case15
CMP R6,#14
BEQ.N case14
....
CMP R6,#0
BEQ.N case0
default:
....
....
B State_end
case15:
....
....
B State_end
case14:
....
....
B State_end
case13:
....
....
B State_end
....
....
....
case2:
....
....
B State_end
case1:
....
....
B State_end
case0:
....
....
State_end: