浮点数运算与比较的深入解析
1. 浮点数运算代码分析
首先来看一段浮点数运算的代码:
fmov
d0, x2
; D0 = b
fmov
d1, x0
; D1 = 4.1
fmul
d0, d0, d1
; D0 = D0*D1 = b*4.1
fmov
x0, d0
; X0 = D0 = b*4.1
fmov
d0, x1
; D0 = a/3.14
fmov
d1, x0
; D1 = X0 = b*4.1
fadd
d0, d0, d1
; D0 = D0+D1 = a/3.14 + b*4.1
fmov
x0, d0 ; \ redundant code
fmov
d0, x0 ; /
add
sp, sp, 16
ret
.LC25:
.word
1374389535
; 3.14
.word
1074339512
.LC26:
.word
1717986918
; 4.1
.word
1074816614
这段代码存在较多不必要的值交换,比如最后两条 FMOV
指令就是明显的冗余代码。这可能是因为编译器在生成ARM64代码方面还不够成熟。不过,ARM64具有64位寄存器,D寄存器也是64位的,编译器可以将双精度浮点数值保存在通用寄存器(GPR)中,而不是本地栈,这在32位CPU上是无法实现的。
2. 浮点数参数传递示例
以下是一个通过参数传递浮点数的示例代码:
#include <math.h>
#include <s