2010-08-30 2 views
2

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?

ответ

2

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

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

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

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

Ну, я боюсь, что это не так просто, мой НКУ совершенно новый: '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

+0

Здесь важна версия ассемблера, а не версия GCC. (Если вы знаете, где установлен ассемблер и что он вызывается, вы можете найти версию, например, 'mips-linux-gnu-as -version', а если нет, используйте флаг' -v' при компиляции чего-либо с GCC , и найдите строку на выходе, которая говорит что-то вроде «GNU-сборщик версии N.NN'.) –

+0

Похоже, вы были правы, моя версия ассемблера - 2.18.50.20070820. Спасибо, я постараюсь перейти на 2.20. – Andy

Смежные вопросы