go - Go编译器产生奇怪的加载到x0中

标签 go riscv

我正在将Go 1.14与linux / riscv64目标一起使用,并且正在编译一个hello世界,在汇编中可以看到它:

1b078:       04813183                ld      gp,72(sp)
1b07c:       00018003                lb      zero,0(gp)
1b080:       00313423                sd      gp,8(sp)
如您所见,[GP + 0]的负载为零,根据规范,该负载应为“异常或其他”:

即使丢弃了加载值,目标为x0的加载仍必须引发任何异常并引起任何其他副作用。

这到底是怎么回事?编译器会产生错误的输出吗?

最佳答案

我对riscv一无所知,但这是一种常见的模式。
内存访问仅检查[gp + 0]是否可访问且可读,而无需实际读取。
这对于以下情况很有用:

func f(a *[0x100001]byte) {
    (*a)[0x100000] = 1;
}
编译器必须生成以下伪代码:
check_not_null(a)
store(a + 0x100000, 1)
可以使用您发现的相同构造来实现null检查,而无需分支。

关于go - Go编译器产生奇怪的加载到x0中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63105488/

相关文章:

templates - 转到模板 : calling method on $variable in template

go - 我可以使用 Gin-gonic 按摩绑定(bind)到我的结构的数据吗?

go - Go 中的 groupcache 与 redis 和 memcached 相比如何?

c++ - 从 RISC-V 裸机程序调用 printf 系统调用时使用 C++ 模拟器失败

c - 关于 RISC-V 编译器?

riscv - 向 RISCV-32ima : "bad RISCV-opcode" 添加新指令

google-app-engine - 使用 Go 在 Google Cloud Storage 中压缩文件夹的最佳方法?

mysql - Go 中的 MySQL 错误

qemu - qemu-riscv 如何将 Device Tree Blob 传递给 guest 内核?

cpu-architecture - RISC-V : Implementing SLLI, SRLI 和 SRAI