如何解决SDCC 生成不必要的除以零
我正在使用 SDCC 为 STM8 微控制器进行编译。编译以下文件会导致一条看似不必要的 div
指令 - 这在 STM8 上非常慢。
char a[1];
char b;
void foo() __interrupt(1) {
char c = a[0];
b = c >> 0;
}
void main() {
}
使用 sdcc -mstm8 file.c
编译会产生以下程序集:
_foo:
clr a
div x,a
ld a,_a+0
ld _b+0,a
iret
该函数似乎按预期工作,但我不明白为什么需要前两条指令。
解决方法
看起来这是编译器中某个地方的错误,因为如果将 b = c >> 0
更改为 b = c << 0
,b = c + 0
,b = a[0]
... 那么不会发生这样的事情。在优化和未优化的代码上都会观察到这种行为。但是,如果您针对大小 (--opt-code-size
) 进行优化,那么只有 div
存在,则不会发出 clr
指令。您可能想要report that to the developers
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。