Go 编译器对 x0 产生奇怪的负载

Go compiler produces strange load into x0

我正在使用带有 linux/riscv64 目标的 Go 1.14,我正在编译一个 hello world,我在程序集中看到了这个:

1b078:       04813183                ld      gp,72(sp)
1b07c:       00018003                lb      zero,0(gp)
1b080:       00313423                sd      gp,8(sp)

如您所见,从 [GP+0] 加载到零,根据规范,这应该是“异常或其他”:

Loads with a destination of x0 must still raise any exceptions and cause any other side effects even though the load value is discarded.

这里到底发生了什么?编译器是否产生错误输出?

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

func f(a *[0x100001]byte) {
    (*a)[0x100000] = 1;
}

编译器必须生成以下伪代码:

check_not_null(a)
store(a + 0x100000, 1)

空值检查可以使用您发现的相同结构来实现,无需分支。