条件分支的两种基本翻译方法:
1. 使用条件控制
if(test-expr)
then-statement
else
else-statement
->
t = test-expr
if(!t)
goto false;
then-statement
goto done;
false:
else-statement
done:
2. 使用条件传送
v = test-expr ? then-expr : else-expr;
->
v = then-expr;
ve = else-expt;
t = test-expr;
if(!t)
v = ve;
总结
编译器会综合考虑来使用哪种方法?
- 使用条件传送来翻译是有限制的,并不是所有情况都能使用条件传送来翻译
- 会考虑条件传送浪费的计算和条件控制由于分支预测错误所造成的性能处罚之间的相对性能。
- 根据实验测试,只有当两个表达式都很容易计算时,例如一条加法指令,才会使用条件传送。