2010-08-30 30 views
2

MIPS32 ISA définit le format suivant pour la synchronisation instruction:Assembleur GNU pour MIPS: comment émettre des instructions sync_ *?

SYNC (stype = 0 implied) 
SYNC stype 

ici, sType peut être SYNC_WMB (SYNC 4), SYNC_MB (SYNC 16), etc. En assembleur en ligne, je peux utiliser par défaut synchronisation: __asm__ volatile ("sync" ::);.

Mais, si j'écris quelque chose comme __asm__ volatile ("sync 0x10" ::), il ne compile pas:

Error: illegal operands 'sync 0x10'

Même si l'option passe -mips32r2 à gcc. Donc, la question est: comment utiliser les instructions SYNC_ * (WYNC_WMB, SYNC_MB, SYNC_ACQUIRE, ...) de l'assemblage en ligne GCC?

Répondre

2

Je suppose que vos binutils sont trop vieux - il semble que le support pour cela a été ajouté seulement dans la version 2.20. Pour contourner le problème, si vous ne pouvez pas mettre à niveau vos binutils facilement, vous pouvez construire l'opcode à la main.

sync est une instruction opcode 0 avec un code de fonction (bits 5..0) de 0xf, et cette forme de celui-ci code pour le type de synchronisation dans le champ de valeur de décalage (bits 10..6). Ainsi, par exemple pour sync 0x10:

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

Eh bien, je crains que ce n'est pas facile, mon CCG est tout à fait nouveau: 'mips-linux-gnu-gcc (Sourcery G ++ Lite 4,2 à 85) 4.2.1' Btw, j'utilise aussi le codage manuel d'instruction pour l'instant: '#define EMIT_SYNC (stype) __asm__ volatile (" .int (% 0 << 6) | 0x0f "::" n "(stype):" mémoire ") ; ' Mais c'est juste une solution de contournement laide. – Andy

+0

C'est la version de l'assembleur qui compte ici, pas la version de GCC. (Si vous savez où l'assembleur est installé, et comment il s'appelle, vous pouvez trouver la version avec par exemple 'mips-linux-gnu-as -version', sinon utilisez l'option' -v' pour compiler quelque chose avec GCC , et chercher une ligne dans la sortie qui dit quelque chose comme «GNU assembleur version N.NN».) –

+0

On dirait que vous aviez raison, ma version de l'assembleur est 2.18.50.20070820. Merci, je vais essayer de passer à 2.20. – Andy