如何BSWAP低32位的64位寄存器?

我一直在寻找如何将BSWAP用于64位寄存器的低32位子寄存器的答案。 例如, 0x0123456789abcdef在RAX寄存器中,我想用一条指令将其更改为0x01234567efcdab89 (因为性能)。

所以我尝试了以下内联函数:

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

结果是0x00000000efcdab89 。 我不明白为什么编译器就像这样。 有人知道有效的解决方案吗?

啊,是的,我现在明白了这个问题:

执行32位操作时,x86-64处理器 32位寄存器隐式零扩展为64位(在%eax,%ebx等上)。 这是为了保持与遗留代码的兼容性,遗留代码需要这些寄存器的32位语义,据我所知。

所以我担心没有办法只对64位寄存器的低32位进行操作。 你必须使用一系列的几个指令……

检查gcc生成的汇编输出! 使用gcc -s标志编译代码并生成asm输出。

IIRC,x86-64在没有明确指示的情况下默认使用32位整数,因此这可能是(部分)问题。