19、浮点数运算与比较的深入解析

浮点数运算与比较的深入解析

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值