首页 > 解决方案 > 如何使用内联 x86 程序集添加两个浮点数?

问题描述

第一:我知道这是没有意义的,我稍后会写更复杂的东西(这是一个作业),这是一个起点。

这是我写的代码:

#![feature(asm)]
fn my_add(a: f32, b: f32) -> f32 {
    let x: f32;
    unsafe {
        asm!(
        "addss {0}, {1}",
        inlateout(xmm_reg) a => x,
        in(xmm_reg) b,
        );
    };
    x
}

这编译为:

example::my_add:
        sub     rsp, 4

        addss   xmm0, xmm1

        movss   dword ptr [rsp], xmm0
        movss   xmm0, dword ptr [rsp]
        add     rsp, 4
        ret

这些 movss 是从哪里来的?为什么它写入内存然后再次读取?

此外,这仅适用于 f32 而不适用于 f64,我不明白为什么:返回值是第一个参数的值 我没有注意到我在 f64 中使用了添加而不是添加。

我用rustc 1.57.0-nightly (25ec82738 2021-10-05).

标签: assemblyrustx86-64compiler-optimizationinline-assembly

解决方案


推荐阅读