compiler-optimization - Watcom 中的 C 优化不佳
问题描述
我正在使用 Watcom C 编译器 (wcc) 2.0 版。我编译这个简单的代码并启用了许多优化,但生成的 ASM 对我来说似乎非常未优化。
int test(int x) {
return x ? 1 : 2;
}
以 8086 为目标进行编译,最快的优化 ( -otexan
)。
wcc test.c -i="C:\Data\Projects\WATCOM/h" -otexan -d2 -bt=dos -fo=.obj -mc
然后拆卸:
wdis test.obj -s > test.dasm
生成的汇编程序如下所示:
...
return x ? 1 : 2;
02C7 83 7E FA 00 cmp word ptr -0x6[bp],0x0000
02CB 74 03 je L$39
02CD E9 02 00 jmp L$40
02D0 L$39:
02D0 EB 07 jmp L$41
02D2 L$40:
02D2 C7 46 FE 01 00 mov word ptr -0x2[bp],0x0001
02D7 EB 05 jmp L$42
02D9 L$41:
02D9 C7 46 FE 02 00 mov word ptr -0x2[bp],0x0002
02DE L$42:
02DE 8B 46 FE mov ax,word ptr -0x2[bp]
02E1 89 46 FC mov word ptr -0x4[bp],ax
02E4 8B 46 FC mov ax,word ptr -0x4[bp]
...
这些跳跃对我来说看起来没有经过优化。我希望减少不必要的跳转,并且可能将结果直接放在 AX 上,而不是把它放在 BP 位置和后面(最后两行)。
cmp word ptr -0x6[bp],0x0000
jz L$39
mov ax,0x0001
jmp L$40
L$39:
mov ax,0x0002
L$40:
...
我在那里错过了什么吗?wcc 是否出于某种原因忽略了我的开关?谢谢。
解决方案
问题是-d2
生成详细调试信息的开关。它可能会插入不必要的行以对应于原始 C 文件的行(也许可以在那里放置硬件断点?)。我-d1
代替了,瞧:
01A0 test_:
01A0 85 C0 test ax,ax
01A2 74 04 je L$15
01A4 B8 01 00 mov ax,0x0001
01A7 C3 ret
01A8 L$15:
01A8 B8 02 00 mov ax,0x0002
01AB C3 ret
推荐阅读
- json - 如何使用 Azure 数据工厂在 Rest API 参数中传递日期值
- python - 结构化程序以处理来自 GUI 对象的数据对象
- powershell - powershell如何找到可变路径?
- python - 在 pyspark 数据框中查找所有空的空白和 nan 列
- javascript - React-Native 对象作为 React 子对象无效
- c++ - 私有、公共和受保护的 C++ 自定义继承
- html - 使用 Angular 在表中保留前导空格
- sql - 如何在 SQL Server Management Studio 18 中获取两个表的 SQL 中的 2 个小数百分比
- sqlite - 如何将在线图像字符串放入 SQLite 数据库并在 Flutter 中离线检索它们?
- vue.js - vue.js 组件是否需要名称选项?