打印
[RISC-V MCU 创新应用比赛]

RISCV GCC汇编结果错误

[复制链接]
2238|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elephant00|  楼主 | 2022-4-11 09:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
安装riscv的官方工具链(.ident  "GCC: (GNU) 7.2.0"),后对一个c文件进行编译,启动-O3选项时候,编译得到的汇编程序与c代码不一致。
c代码为一个memset的实现,编译错误对应于第二个while语句对应的汇编:


  • void* memset(void* dest, int byte, size_t len)
  • {
  • if ((((uintptr_t)dest | len) & (sizeof(uintptr_t)-1)) == 0) {
  • uintptr_t word = byte & 0xFF;
  • word |= word << 8;
  • word |= word << 16;
  • word |= word << 16 << 16;
  • uintptr_t *d = dest;
  • while (d < (uintptr_t*)(dest + len))
  • *d++ = word;
  • } else {
  • char *d = dest;
  • while (d < (char*)(dest + len))
  • *d++ = byte;
  • }
  • return dest;
  • }

复制代码



gcc汇编产生的代码如下:


  • memset:
  • addi    sp,sp,-16
  • or      a5,a0,a2
  • sd      s0,0(sp)
  • sd      ra,8(sp)
  • andi    a5,a5,7
  • mv      s0,a0
  • add     a2,a0,a2      ## a2=dest+len
  • beqz    a5,.L345      ## 跳入第一个if{}
  • bleu    a2,a0,.L347   ## 第2个while不成立则跳转到return
  • sub     a2,a2,a0      ## ======
  • andi    a1,a1,0xff    ## ==着3行出错
  • call    memset        ## ======递归
  • .L347:
  • mv      a0,s0
  • ld      ra,8(sp)
  • ld      s0,0(sp)
  • addi    sp,sp,16
  • jr      ra
  • .L345:
  • andi    a4,a1,0xff
  • slli    a1,a4,8
  • or      a4,a4,a1
  • slli    a1,a4,16
  • or      a4,a4,a1
  • slli    a5,a4,32
  • or      a4,a4,a5
  • bleu    a2,a0,.L347
  • mv      a5,a0
  • .L348:
  • addi    a5,a5,8
  • sd      a4,-8(a5)
  • bgtu    a2,a5,.L348
  • mv      a0,s0
  • ld      ra,8(sp)
  • ld      s0,0(sp)
  • addi    sp,sp,16
  • jr      ra

复制代码



这个可能是什么问题,如何避免?谢谢!

使用特权

评论回复

相关帖子

沙发
duo点| | 2022-4-17 19:08 | 只看该作者
我没遇到过哦,路过帮顶

使用特权

评论回复
板凳
sunny阳光| | 2022-4-28 14:51 | 只看该作者
代码有缺失吧

使用特权

评论回复
地板
一刀一级| | 2022-5-27 14:40 | 只看该作者
楼主确定这是完整代码

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

983

主题

3060

帖子

7

粉丝