x86-64架构浮点加法指令使用及XMM、通用寄存器相关问题咨询
答复
能否用rax这类通用寄存器实现双精度浮点加法?
绝对不行,整数运算的规则不能直接套用到浮点运算场景。
x86-64架构下,rax、rbx这类通用寄存器是为整数运算设计的,硬件没有给这类寄存器配套双精度浮点运算的电路。你就算把双精度浮点数的二进制位模式存到通用寄存器里,也没有指令能直接算出正确的浮点加法结果——除非你手动按IEEE 754标准拆符号位、指数、尾数,用整数指令模拟整个浮点计算流程,这种软实现的性能比硬件指令低一到两个数量级,没有实际使用价值。
另外先纠正一个基础认知错误:不管是整数还是浮点运算指令,根本不支持「操作结果写入常量」的模式。常量是编码在指令里的立即数,属于只读内容,你列的「寄存器到常量数据」「内存到常量数据」两种模式本身就是非法的,从硬件设计层面就不可能支持。
你提到的其他三种操作模式,SSE指令集的双精度标量加法指令addsd本身就原生支持:
- 寄存器到寄存器:即你测试通过的
addsd xmm0, xmm1形式,将xmm1低64位存储的双精度值与xmm0低64位值相加,结果写回xmm0低64位 - 内存到寄存器:例如
addsd xmm0, [rsp+0x10],从指定内存地址读取8字节双精度值,与xmm0低64位值相加后写回xmm0 - 寄存器到内存:例如
addsd [rsp+0x10], xmm0,将xmm0低64位的双精度值与指定内存地址存储的8字节双精度值相加,结果写回该内存地址
xmm寄存器剩余的高位空间是冗余浪费吗?
完全不是浪费。
xmm是SSE指令集定义的128位寄存器,设计初衷就不是只给64位双精度标量运算用的:
- 支持SIMD并行计算:用
addpd这类打包运算指令时,单条指令可以同时计算2个64位双精度浮点数的加法,或是4个32位单精度浮点数的加法,这时候128位空间会被完全占满,运算性能是标量指令的数倍 - 兼容后续指令集扩展:xmm寄存器其实是后续YMM(256位,AVX指令集)、ZMM(512位,AVX-512指令集)寄存器的低128位部分,保留高位的设计能保证新旧指令集的兼容性,不用重新做寄存器切分
- 就算跑
addsd这类只操作低64位的标量指令,硬件默认不会修改高位值,省去了每次运算都清空高位的额外开销,反而能提升运行效率
除此之外,xmm寄存器还承担了整数SIMD运算、高速内存拷贝等场景的功能,128位位宽在这些场景下都能被充分利用,不存在冗余浪费的问题。
内容的提问来源于stack exchange,提问作者Citra Dewi
相关产品推荐
相关产品推荐

