條件分支的兩種方式的對比——條件控制與條件數據

1.條件碼
前提:在機器代碼中,寄存器裏有一組單個字的條件碼寄存器,他們描述了最近的算術或邏輯操作的屬性。可以檢測這些寄存器來執行條件分支指令。常見的條件碼如下:
條件分支的兩種方式的對比——條件控制與條件數據 - 中山爺爺 - 凝聚 的博客
但是,條件碼是不能直接訪問的,常用的方式有三種:
1.)可以根據條件碼的某種組合,將一個字節設置爲0或者1;
2.)可以條件跳轉到程序的某個其他的部分;
3.)可以有條件地傳送數據
 2.跳轉指令
機器代碼裏面的跳轉指令類似於C語言的goto,能夠跳轉至label處的代碼執行。因此,IF,else語言翻譯成機器代碼,可以參考轉換成C語言的goto語言格式。類似如下:
if(a+b>0)
c= 1;
else
   c = 2;
goto版本
if(a+b>0)
goto true;
c=2;
true:
c= 1;
3.用條件控制來實現條件分支
如上述例子一樣,條件控制方法如C語言中的if/else語句實現條件分支,通過計算a+b的值,然後間接訪問上述提及的條件碼,此處應訪問SF是否爲0,經判斷,使用跳轉指令,實現條件控制。
條件分支的兩種方式的對比——條件控制與條件數據 - 中山爺爺 - 凝聚 的博客
 
4.用條件傳送來實現條件分支
實現條件操作的傳統方法是通過使用控制的條件轉移。當條件滿足時,程序沿着一條執行路徑執行,而當條件不滿足時,就走另一條路徑。這種機制簡單而通用,但是在現代處理器上,它可能會非常低效。
一種替代的策略是使用數據的條件轉移。這種方法計算一個條件操作的兩種結果,然後再根據條件是否滿足從中選取一個。只有在一些受限制的情況中,這種策略纔可行,但是如果可行,就可以用一條簡單的條件傳送指令來實現它,條件傳送指令更符合現代處理器的性能特性。
條件分支的兩種方式的對比——條件控制與條件數據 - 中山爺爺 - 凝聚 的博客

 5.產生的原因
處理器通過使用流水線(pipelining)來獲得高性能,在流水線中,一條指令的處理要經過一系列的階段,每個階段執行所需操作的一小部分(例如,從內存取指令、確定指令類型、從內存讀數據、執行算術運算、向內存寫數據,以及更新程序計數器)。這種方法通過重疊連續指令的步驟來獲得高性能,例如,在取一條指令的同時,執行它前面一條指令的算術運算。要做到這一點,要求能夠事先確定要執行的指令序列,這樣才能保持流水線中充滿了待執行的指令。當機器遇到條件跳轉(也稱爲“分支″)時,只有當分支條件求值完成之後,才能決定分支往哪邊走。處理器採用非常精密的分支預測邏輯來猜測每條跳轉指令是否會執行。只要它的猜測還比較可靠(現代微處理器設計試圖達到90%以上的成功率),指令流水線中就會充滿着指令。另一方面,錯誤預測一個跳轉, 要求處理器丟掉它爲該跳轉指令後所有指令已做的工作,然後再開始用從正確位置處起始的指令去填充流水線。正如我們會看到的,這樣一個錯誤預測會招致很嚴重的懲罰,浪費大約15-30個時鐘週期,導致程序性能嚴重下降。
6.條件傳送的有限性
前面提及條件數據的方法更適合現代處理器,但是它是具有有限性,具體的例子如下:條件表達式的一個例子。v = (A-B)? b : c;
改寫成goto格式如下:
if(A-B)
goto true;
v = c;
true:
v = b;
改寫成條件數據傳送:
v1 = b;
v2 = c;
n = A-B;
if(n) v= b;
v = c;
不是所有的條件表達式都可以用條件傳送來編譯,但是從上述代碼可以看出A-B與v=c是肯定要執行的!如果這兩個表達式中的任意一個可能產生錯誤條件或者副作用,就會導致非法的行爲。
上面的代碼是十分合理的,但是如果是以下形式的條件表達式語句:long sample(long *xp){ return (xp ? *xp : 0;)};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章