如何使用arm64汇编进行浮点运算?

How to use arm64 assembly to perform floating-point operation?

如何使用ARM64汇编进行加减乘除等浮点运算?

我试过了

static double  __attribute__((naked, pure)) MyASMAdd(double sub1, double sub2) {
#ifndef __arm__
    asm("           ADD     x0, x0, x1");
    asm("           RET");
#endif
}

如上,如果我使用两个doublefloat操作,结果总是第一个参数 如 3.2 + 4.6,应该等于7.8,但答案是3.2。 在其他情况下也是如此。 但是如果我对两个参数都使用int,我可以得到我想要的结果。

static int  __attribute__((naked, pure)) MyASMAdd(int sub1, int sub2) {
#ifndef __arm__
    asm("           ADD     x0, x0, x1");
    asm("           RET");
#endif
}

AArch64 calling convention 在 s0-7 中传递浮点数并在 d0-7 寄存器中加倍。

来自Godbolt的输出:

add_d(double, double):
        fadd    d0, d0, d1
        ret
add_f(float, float):
        fadd    s0, s0, s1
        ret