如何解决防止 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
但是,如果我使用 -O3
,csrw 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 举报,一经查实,本站将立刻删除。