我正在使用 uprobes/bpf 跟踪 go 函数并打印寄存器/堆栈的内容以确认我理解 Go ABI 规范。
我在看一个只有浮点数作为参数的函数,我注意到有时 Go 将这些值放在堆栈上,而其他时候将它们放在寄存器中
Go ABI 规范 [1] 说明如下:“如果 T 是浮点类型并且可以在不损失精度的情况下在浮点寄存器中表示,则将 V 分配给寄存器 FP 并递增 FP。”
如果我理解正确的话,它会分配给堆栈。我会说我看到堆栈上的浮点值 ~15% 的时间
我的问题是:为什么不能在不损失精度的情况下表示浮点类型?当架构/操作系统相同时,为什么它不是确定性的
这是在 apple silicon 上运行的 linux vm(所以是 linux arm64)
[1] 去 ABI 规范:https://go.googlesource.com/go/+/refs/heads/dev.regabi/src/cmd/compile/internal-abi.md