ensamblador de GNU para MIPS: cómo emitir instrucciones sync_ *?
Pregunta
MIPS32 ISA define el siguiente formato para la sincronización instrucción:
SYNC (stype = 0 implied)
SYNC stype
aquí, stype puede ser SYNC_WMB (SYNC 4), SYNC_MB (SYNC 16), etc.
En ensamblador en línea, puedo utilizar la sincronización por defecto: __asm__ volatile ("sync" ::);
.
Pero, si escribo algo así como __asm__ volatile ("sync 0x10" ::)
, no compila:
Error: illegal operands 'sync 0x10'
Lo mismo si la opción de pase -mips32r2
a gcc.
Entonces, la pregunta es: ¿cómo utilizar SYNC_ * (WYNC_WMB, SYNC_MB, SYNC_ACQUIRE, ...) instrucciones de montaje GCC inline
Solución
Sospecho que su binutils son demasiado viejo - se ve como apoyo a esta era solamente añadido en la versión 2.20.
Como solución alternativa, si no se puede actualizar fácilmente sus binutils, se podría construir el código de operación con la mano.
sync
es una instrucción de código de operación 0 con un código de función (bits 5..0) de 0xf
, y esta forma de que codifica el tipo de sincronización en el campo de cantidad de desplazamiento (bits 10..6). Así, por ejemplo, para sync 0x10
:
__asm__ volatile(".word (0x0000000f | (0x10 << 6))");