什么会导致 Go 无法在不损失精度的情况下将浮点数放入寄存器? (使用 bpf 进行跟踪)

问题描述 投票:0回答:0

我正在使用 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

go arm calling-convention ebpf bpf
© www.soinside.com 2019 - 2024. All rights reserved.