首页 > 解决方案 > 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 是否出于某种原因忽略了我的开关?谢谢。

标签: compiler-optimizationwatcom

解决方案


问题是-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

推荐阅读