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

防止 risc-v 内联汇编指令在 gcc -O3 中被优化掉

如何解决防止 risc-v 内联汇编指令在 gcc -O3 中被优化掉

我定义了两个函数

void func1(uint32_t val){
    asm("csrsi mstatus,0x8");
    asm("csrsi mstatus,0x8");
}

void func2(uint32_t val){
    asm("csrw mie,%0" : "=r"(val));
    asm("csrsi mstatus,0x8");
}

如果我用 -O0 中的 gcc 编译它们,我仍然可以在 objdump 中看到那些指令

000004a4 <func1>:
 4a4:   ff810113            addi    sp,sp,-8
 4a8:   00812223            sw  s0,4(sp)
 4ac:   00810413            addi    s0,8
 4b0:   fea42c23            sw  a0,-8(s0)
 4b4:   30046073            csrsi   mstatus,8           <--
 4b8:   30046073            csrsi   mstatus,8           <--
 4bc:   00000013            nop
 4c0:   00412403            lw  s0,4(sp)
 4c4:   00810113            addi    sp,8
 4c8:   00008067            ret

000004cc <func2>:
 4cc:   ff810113            addi    sp,-8
 4d0:   00812223            sw  s0,4(sp)
 4d4:   00810413            addi    s0,8
 4d8:   fea42c23            sw  a0,-8(s0)
 4dc:   30479073            csrw    mie,a5              <--
 4e0:   fef42c23            sw  a5,-8(s0)
 4e4:   30046073            csrsi   mstatus,8           <--
 4e8:   00000013            nop
 4ec:   00412403            lw  s0,4(sp)
 4f0:   00810113            addi    sp,8
 4f4:   00008067            ret

但是,如果我使用 -O3csrw mie 指令会得到优化:

000002f4 <func1>:
 2f4:   30046073            csrsi   mstatus,8
 2f8:   30046073            csrsi   mstatus,8
 2fc:   00008067            ret

00000300 <func2>:
 300:   30046073            csrsi   mstatus,8
 304:   00008067            ret

我想我应该在clobber列表中添加一些东西,但是我应该使用哪个注册名?例如,我试过:

asm("csrw mie,%0" : "=r"(val) : : "mie");

并得到以下错误

src/filename.c:70:5: error: unkNown register name 'mie' in 'asm'
   70 |     asm("csrw mie,%0" : "=r"(val) : : "mie");
      |     ^~~

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

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?