x86-64平台下用更少指令实现64位寄存器所有字节异或
嘿,这是个超棒的优化问题!针对x86-64平台上RAX所有字节的异或操作,我们确实能把指令数压到比你的8条更少——7条通用寄存器指令就能搞定,而且都是单周期的基础指令,效率拉满。
核心思路是利用异或的结合律和交换律,通过分治法逐步缩小异或范围:先把64位值拆成高32位和低32位异或,得到4组字节异或结果;再把这32位拆成高16位和低16位异或,得到2组字节异或结果;最后把16位拆成高8位和低8位异或,就得到所有8个字节的异或总和。
下面是具体的NASM实现:
; 输入: RAX = 待处理的64位值 ; 输出: AL = 所有8个字节的异或结果(RAX的高56位会被破坏) mov rbx, rax ; 1. 保存原RAX的副本到RBX shr rbx, 32 ; 2. 将RBX的高32位移到低32位(对应原RAX的高32位) xor eax, ebx ; 3. EAX = 原RAX低32位 ^ 原RAX高32位,得到4组字节异或结果 mov bx, ax ; 4. 保存EAX的低16位到BX shr eax, 16 ; 5. 将EAX的高16位移到低16位(对应4组中的前2组) xor ax, bx ; 6. AX = 低16位异或结果 ^ 高16位异或结果,得到2组字节异或结果 xor al, ah ; 7. AL = 低8位异或结果 ^ 高8位异或结果,最终得到所有字节的异或总和
如果需要保留原RAX的值,只需要在开头加一条push rax,结尾加一条pop rax,不过这样指令数会变成9条——但如果你不需要保留原RAX,上面的7条就是当前最优的通用寄存器方案了。
内容的提问来源于stack exchange,提问作者Henadzi Matuts
相关产品推荐
相关产品推荐

