2

MIPS32 ISA 为同步指令定义了以下格式:

SYNC (stype = 0 implied)
SYNC stype

在这里,stype 可能是 SYNC_WMB (SYNC 4)、SYNC_MB (SYNC 16) 等。在内联汇编器中,我可以使用默认同步:__asm__ volatile ("sync" ::);

但是,如果我写类似的东西__asm__ volatile ("sync 0x10" ::),它不会编译:

Error: illegal operands 'sync 0x10'

如果将-mips32r2选项传递给 gcc,则相同。

所以,问题是:如何使用来自 GCC 内联汇编的 SYNC_* (WYNC_WMB, SYNC_MB, SYNC_ACQUIRE, ...) 指令?

4

1 回答 1

2

我怀疑您的binutils太旧了 - 似乎只在 2.20 版中添加了对此的支持。

作为一种解决方法,如果您不能轻松升级您的 binutils,您可以手动构建操作码。

sync是一个功能码(位 5..0)为 的操作码 0 指令,0xf它的这种形式在移位量字段(位 10..6)中编码同步类型。所以,例如sync 0x10

__asm__ volatile(".word (0x0000000f | (0x10 << 6))");
于 2010-08-30T15:04:38.797 回答