如何使用Rust内联x86汇编实现浮点数相加及编译出现多余movss指令疑问
冗余movss指令的来源
你看到的栈操作和成对的movss读写是Debug编译模式未开启优化导致的:
- Rust默认编译的Debug版本为了支持调试,会为所有
let绑定的变量分配栈空间,即使该变量完全可以直接存放在寄存器中 - 你代码里的
let x: f32;绑定了内联汇编的输出值,Debug模式下会先把xmm0里的计算结果写入栈上分配的4字节空间,再读回xmm0作为返回值,就产生了你看到的这两条多余指令 - 你可以用
rustc -O或者cargo build --release开启优化编译,生成的汇编会直接精简为:
example::my_add: addss xmm0, xmm1 ret
f64适配问题
你已经找到了问题的核心:x86 SIMD指令中单精度和双精度的标量运算指令是分开的:
addss对应32位单精度浮点数(f32)的标量加法- 处理64位双精度浮点数(f64)时替换为
addsd指令即可正常工作,寄存器约束xmm_reg对f32和f64都适用
内容的提问来源于stack exchange,提问作者DontBreakAlex
相关产品推荐
相关产品推荐

