您的位置:首页 > 其它

条件传送指令

2014-07-09 10:34 176 查看
先上一段C代码:



gcc不做优化的编译:gcc -S test.c:



可以看到汇编代码出现了jle这样的跳转指令。对于使用了流水线的CPU,这样的跳转是存在隐患的(P140),分支预测失败就会刷新掉所有流水线中取到而未执行的指令,影响运行性能。

现在添加优化选项:gcc -S O1 test.c



可以看到经过优化后的代码没有了跳转指令,取而代之的是一个条件传送指令——cmovle。它对cmpl比较的结果进行判断,决定是否改变%eax的值。
注意,程序前面已经把a-b和b-a都求出来了,即先求出条件操作的两种结果,然后再根据条件是否满足从而选取一个。

总之,条件传送指令使得控制流不依赖于数据(关键是没了jump),流水线也更容易保持满状态。

参考:
《深入理解计算机系统》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: