Ассемблер GNU для MIPS: как генерировать инструкции sync_ *? - PullRequest
2 голосов
/ 30 августа 2010

MIPS32 ISA определяет следующий формат для инструкции sync :

SYNC (stype = 0 implied)
SYNC stype

здесь, типом может быть SYNC_WMB (SYNC 4), SYNC_MB (SYNC 16) и т. Д. Inlineассемблер, я могу использовать синхронизацию по умолчанию: __asm__ volatile ("sync" ::);.

Но, если я напишу что-то вроде __asm__ volatile ("sync 0x10" ::), он не скомпилируется:

Error: illegal operands 'sync 0x10'

То же самое, если передать -mips32r2 параметр в gcc.

Итак, вопрос: как использовать инструкции SYNC_ * (WYNC_WMB, SYNC_MB, SYNC_ACQUIRE, ...) из встроенной сборки GCC?

1 Ответ

2 голосов
/ 30 августа 2010

Я подозреваю, что ваши binutils слишком старые - похоже, поддержка этого была добавлена ​​только в версии 2.20.

В качестве обходного пути, если вы не можете легко обновить свои binutils, вы можете создать код операции вручную.

sync является командой с кодом операции 0 с кодом функции (биты 5..0) 0xf, и эта форма кодирует тип синхронизации в поле величины сдвига (биты 10..6). Так, например, для sync 0x10:

__asm__ volatile(".word (0x0000000f | (0x10 << 6))");
...