MIPS 的 GNU 汇编器:如何发出sync_* 指令?
MIPS32 ISA为sync指令定义了以下格式:
SYNC (stype = 0 implied)
SYNC stype
这里,stype可以是SYNC_WMB(SYNC 4)、SYNC_MB(SYNC 16)等。 在内联汇编器中,我可以使用默认同步:__asm__ volatile ("sync"::);
。
但是,如果我写类似 __asm__ volatile ("sync 0x10" ::)
的内容,它不会编译:
Error: invalid operands 'sync 0x10'
如果通过 < gcc 的 code>-mips32r2 选项。
那么,问题是:如何使用 GCC 内联汇编中的 SYNC_* (WYNC_WMB, SYNC_MB, SYNC_ACQUIRE, ...) 指令?
MIPS32 ISA defines the following format for the sync instruction:
SYNC (stype = 0 implied)
SYNC stype
here, stype may be SYNC_WMB (SYNC 4), SYNC_MB (SYNC 16), etc.
In inline assembler, I may use default sync: __asm__ volatile ("sync" ::);
.
But, if I write something like __asm__ volatile ("sync 0x10" ::)
, it doesn't compile:
Error: illegal operands 'sync 0x10'
Same if pass -mips32r2
option to gcc.
So, the question is: how to use SYNC_* (WYNC_WMB, SYNC_MB, SYNC_ACQUIRE, ...) instructions from GCC inlined assembly?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我怀疑您的 binutils 太旧了 - 看起来对此的支持仅添加于2.20 版。
作为解决方法,如果您无法轻松升级 binutils,则可以手动构建操作码。
sync
是一条操作码 0 指令,其功能代码(位 5..0)为0xf
,这种形式在移位量字段(位10..6)。因此,例如对于sync 0x10
:I suspect that your binutils are too old - it looks like support for this was only added in version 2.20.
As a workaround, if you can't upgrade your binutils easily, you could construct the opcode by hand.
sync
is an opcode 0 instruction with a function code (bits 5..0) of0xf
, and this form of it encodes the sync type in the shift amount field (bits 10..6). So, e.g. forsync 0x10
: