ZHCAEQ3 November 2024 F29H850TU , F29H859TU-Q1
C29 CPU 特殊的分支指令使編譯器能夠?qū)⒍鄠€分支目標折疊為一個指令。switch 是通用代碼中常見的結(jié)構(gòu),通常用于處理輔助控制任務(wù)。C29 ISA 提供多路分支指令 QDECB 和 DDECB,用于高效實現(xiàn)此語句。四路遞減分支 (QDECB) 允許最多四個分支目標,或者選擇繼續(xù)線性執(zhí)行。四路遞減分支 (DDECB) 允許最多兩個分支目標,或者選擇繼續(xù)線性執(zhí)行。
下面的代碼塊中顯示了一個包含 16 個分支的 switch 語句。在 C29 CPU 上,switch 使用一條分支指令 (BCMP) 和四條 QDECB 指令實現(xiàn),需要 10 到 17 個周期,具體取決于輸入。在 Cortex-M7 上,switch 針對每種情況使用比較指令和分支指令實現(xiàn),需要 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: