x86 GAS语法下不影响标志位的2的幂乘法替代mulx实现方案
可行实现方案
方案1:BMI2指令集版本(酷睿i7 Haswell及以上架构推荐)
movq %rdx, %rax shlx $24, %rax, %rax shrx $40, %rdx, %r11
- 核心优势:指令数少、执行延迟低,完全不修改任何整数标志位,运算逻辑与原
mulx指令100%等价 - 原理说明:
shlx/shrx是BMI2扩展提供的无标志移位指令,设计上就不会修改包括进位标志CF在内的所有标志寄存器,%rax存储%rdx << 24的低64位结果,%r11存储%rdx >> 40的高24位结果,拼接后就是%rdx * 2^24的完整128位运算结果。
方案2:SSE2兼容版本(兼容所有x86-64架构酷睿i7)
movq %rdx, %xmm0 psllq $24, %xmm0 movq %xmm0, %rax psrlq $40, %xmm0 movq %xmm0, %r11
- 核心优势:无需依赖BMI2扩展,所有64位英特尔处理器原生支持,SSE向量运算指令默认不触碰整数标志寄存器,完全符合需求。
- 适用场景:针对早于Haswell架构的老款酷睿i7处理器使用。
原实现问题说明
你之前使用的普通shl/shr属于基础整数移位指令,执行时会根据运算结果修改CF、OF等标志位,因此不符合不修改标志位的要求。
内容的提问来源于stack exchange,提问作者DDT
相关产品推荐
相关产品推荐

