Question

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?

Was it helpful?

Solution

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) of 0xf, and this form of it encodes the sync type in the shift amount field (bits 10..6). So, e.g. for sync 0x10:

__asm__ volatile(".word (0x0000000f | (0x10 << 6))");
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top