Como BSWAP o menor 32 bits do registro de 64 bits?

Eu tenho procurado a resposta para como usar BSWAP para sub-registro inferior de 32 bits do registro de 64 bits. Por exemplo,0x0123456789abcdef está dentro do registro RAX, e eu quero mudá-lo para0x01234567efcdab89 com uma única instrução (por causa do desempenho).

Então eu tentei seguir a função inline:

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

E o resultado foi0x00000000efcdab89. Eu não entendo porque o compilador age assim. Alguém conhece a solução eficiente?

questionAnswers(2)

yourAnswerToTheQuestion