微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SDCC 生成不必要的除以零

如何解决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

Demo on Compiler Explorer

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。