如果需要,,ARM的任何數據處理指令都能通過增加S操作碼來設置條件碼,。對于比較,、測試指令操作,其主要作用就是設置條件碼,,因此可不用增加S操作碼,,但對所有其他數據處理指令必須通過增加S操作碼來指明。例如,,下面代碼完成2個數的64位加法,,一個數存于[R1,R0],,另一個數存于[R3,,R2],用C條件碼標志位存立即數進位:
ADDS R2,R2,,R0 ,;32位進位輸出到C
ADC R3,R3,,R1 ,;再加到高位字中
由于操作碼的S擴展能控制指令是都修改條件碼,所以適合的時候,,需要在指令序列中把條件碼保護起來,如在中斷的情況下,。
數據處理指令加了S后,,算數操作根據算術運算的結果設置所有標志位。邏輯“或”傳送操作不產生有意義的C或V值,他們根據結果設置N和Z,,保留V,。
1)條件執(zhí)行
ARM指令集不同尋常的特征是每條指令都可以是條件執(zhí)行的。條件轉移是絕大多數指令集的標準特征,,但ARM將條件執(zhí)行擴展到所有指令,,包括監(jiān)控調用和協處理器指令。條件域cond占據32位指令域的高四位,,如圖所示,。
條件域共有16個值,每個值都根據CPSR中的N,、Z,、C和V的標志位的值來確定指令執(zhí)行還是跳過。
一條指令本來是用于跳過其后的幾條指令,,但如果利用ARM指令集所有ARM指令都可執(zhí)行這一特點,,則給予指令后的ARM指令以相反的條件,轉移將被忽略,。
例如:
CMP R0,,#5
BEQ BYPASS ;如果R0≠5
ADD R1,,R1,,R0 ;則R1=R1+R0-R2
SUB R1,,R1,,R2 ;
BYPASS
這可替代為:
CMP R0,,#5 ,;如果R0≠5
ADDNE R1,R1,,R0 ,;則R1=R1+R0-R2
SUBNE R1,R1,,R2 ,;
…
新的指令序列比原先的既短小又快速。如果被跳過的指令序列并不進行復雜的操作,,使用條件執(zhí)行都要比使用轉移好,。因為ARM轉移指令一般要用3個周期來執(zhí)行,所以上面例子中采用3條指令的方法,。如果代碼充分優(yōu)化,,那么是使用條件執(zhí)行還是轉移,,需要根據代碼動態(tài)行為的測量來決定。
有時巧妙地使用條件,,可寫出非常簡練的代碼,。例如:
;if((a==b)&&(c==d))e++
CMP R0,,R1
CMPEQ R2,,R3
ADDEQ R4,R4,,#4
注意:如果第一個比較發(fā)現操作數不同,,則第二個比較指令和后面加1指令也將跳過。由于第二個比較指令使用了條件執(zhí)行,,從而實現了if語句的邏輯“與”,。