MIPS32 ISA определяет следующий формат для синхронизации инструкции:GNU-ассемблер для MIPS: как испустить sync_ * инструкции?
SYNC (stype = 0 implied)
SYNC stype
здесь, тампон может быть SYNC_WMB (SYNC 4), SYNC_MB (SYNC 16) и т.д. В инлайн ассемблер, я могу использовать по умолчанию sync: __asm__ volatile ("sync" ::);
.
Но, если я пишу что-то вроде __asm__ volatile ("sync 0x10" ::)
, он не компилируется:
Error: illegal operands 'sync 0x10'
То же, если передача -mips32r2
вариант НКУ.
Итак, вопрос заключается в следующем: как использовать команды SYNC_ * (WYNC_WMB, SYNC_MB, SYNC_ACQUIRE, ...) из встроенной сборки GCC?
Ну, я боюсь, что это не так просто, мой НКУ совершенно новый: 'MIPS-Linux-гну-GCC (Sourcery G ++ Lite 4.2-85) 4.2.1' Btw, я также использую ручную инструкцию для кодировки: '#define EMIT_SYNC (stype) __asm__ volatile (" .int (% 0 << 6) | 0x0f "::" n "(stype):" memory ") ; ' Но это просто уродливое обходное решение. – Andy
Здесь важна версия ассемблера, а не версия GCC. (Если вы знаете, где установлен ассемблер и что он вызывается, вы можете найти версию, например, 'mips-linux-gnu-as -version', а если нет, используйте флаг' -v' при компиляции чего-либо с GCC , и найдите строку на выходе, которая говорит что-то вроде «GNU-сборщик версии N.NN'.) –
Похоже, вы были правы, моя версия ассемблера - 2.18.50.20070820. Спасибо, я постараюсь перейти на 2.20. – Andy