Comment BSWAP le registre inférieur 32 bits du registre 64 bits?

Je cherchais la solution pour utiliser BSWAP dans le sous-registre inférieur de 32 bits du registre 64 bits. Par exemple, 0x0123456789abcdef trouve dans le registre RAX et je souhaite le remplacer par 0x01234567efcdab89 avec une seule instruction (en raison des performances).

J’ai donc essayé de suivre la fonction inline:

 #define BSWAP(T) { \ __asm__ __volatile__ ( \ "bswap %k0" \ : "=q" (T) \ : "q" (T)); \ } 

Et le résultat était 0x00000000efcdab89 . Je ne comprends pas pourquoi le compilateur agit comme ceci. Est-ce que quelqu’un connaît la solution efficace?

Ah oui, je comprends le problème maintenant:

les processeurs x86-64 étendent implicitement les extensions 32 bits aux registres 32 bits lors d’opérations 32 bits (sur% eax,% ebx, etc.). Ceci afin de maintenir la compatibilité avec le code existant qui attend une sémantique 32 bits pour ces registres, si je comprends bien.

Je crains donc qu’il n’existe aucun moyen d’ ror uniquement les 32 bits inférieurs d’un registre 64 bits. Vous devrez utiliser une série de plusieurs instructions …

Vérifiez la sortie de l’assembly générée par gcc! Utilisez l’indicateur gcc -s pour comstackr le code et générer une sortie asm.

IIRC, x86-64 utilise par défaut des entiers 32 bits lorsqu’il n’est pas explicitement demandé autrement, ce qui peut (partiellement) être le problème