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

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

SYNC (stype = 0 implied)
SYNC stype

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

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

Error: illegal operands 'sync 0x10'

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

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


person Andy    schedule 30.08.2010    source источник


Ответы (1)


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

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

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

__asm__ volatile(".word (0x0000000f | (0x10 << 6))");
person Matthew Slattery    schedule 30.08.2010
comment
Ну, я боюсь, что это не так просто, мой GCC совсем новый: mips-linux-gnu-gcc (Sourcery G++ Lite 4.2-85) 4.2.1 Кстати, я также пока использую ручное кодирование инструкций: #define EMIT_SYNC(stype) __asm__ volatile (".int (%0 << 6) | 0x0f " : : "n" (stype) : "memory"); Но это просто уродливый обходной путь. - person Andy; 31.08.2010
comment
Здесь важна версия ассемблера, а не версия GCC. (Если вы знаете, где установлен ассемблер и как он называется, вы можете найти версию, например, с mips-linux-gnu-as --version; если нет, используйте флаг -v при компиляции чего-либо с помощью GCC и найдите строку в выводе, которая говорит что-то вроде GNU assembler version N.NN .) - person Matthew Slattery; 31.08.2010
comment
Похоже, вы были правы, моя версия ассемблера 2.18.50.20070820. Спасибо, попробую обновить до 2.20. - person Andy; 01.09.2010