如何使用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
}
如上,如果我使用两个double或float操作,结果总是第一个参数
如
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
如何使用ARM64汇编进行加减乘除等浮点运算?
我试过了
static double __attribute__((naked, pure)) MyASMAdd(double sub1, double sub2) {
#ifndef __arm__
asm(" ADD x0, x0, x1");
asm(" RET");
#endif
}
如上,如果我使用两个double或float操作,结果总是第一个参数 如 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