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 に答える