Watcom 中的 C 语言优化不佳
Poor C optimization in Watcom
我正在使用 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
02CD E9 02 00 jmp L
02D0 L:
02D0 EB 07 jmp L
02D2 L:
02D2 C7 46 FE 01 00 mov word ptr -0x2[bp],0x0001
02D7 EB 05 jmp L
02D9 L:
02D9 C7 46 FE 02 00 mov word ptr -0x2[bp],0x0002
02DE L:
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
mov ax,0x0001
jmp L
L:
mov ax,0x0002
L:
...
我是不是遗漏了什么? wcc 是否出于某种原因忽略了我的开关?谢谢。
问题出在生成详细调试信息的 -d2
开关上。它可能会插入不必要的行以对应原始 C 文件的行(以便能够在那里放置硬件断点,也许吧?)。我改用 -d1
瞧:
01A0 test_:
01A0 85 C0 test ax,ax
01A2 74 04 je L
01A4 B8 01 00 mov ax,0x0001
01A7 C3 ret
01A8 L:
01A8 B8 02 00 mov ax,0x0002
01AB C3 ret
我正在使用 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
02CD E9 02 00 jmp L
02D0 L:
02D0 EB 07 jmp L
02D2 L:
02D2 C7 46 FE 01 00 mov word ptr -0x2[bp],0x0001
02D7 EB 05 jmp L
02D9 L:
02D9 C7 46 FE 02 00 mov word ptr -0x2[bp],0x0002
02DE L:
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
mov ax,0x0001
jmp L
L:
mov ax,0x0002
L:
...
我是不是遗漏了什么? wcc 是否出于某种原因忽略了我的开关?谢谢。
问题出在生成详细调试信息的 -d2
开关上。它可能会插入不必要的行以对应原始 C 文件的行(以便能够在那里放置硬件断点,也许吧?)。我改用 -d1
瞧:
01A0 test_:
01A0 85 C0 test ax,ax
01A2 74 04 je L
01A4 B8 01 00 mov ax,0x0001
01A7 C3 ret
01A8 L:
01A8 B8 02 00 mov ax,0x0002
01AB C3 ret