Go 编译器在 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] 开始,负载为零,根据规范,这应该是“异常或其他”:


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


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


梦里花落0921
浏览 92回答 1
1回答

守着一只汪

我对继续 riscv 一无所知,但这是一种常见的模式。内存访问仅检查 [gp+0] 是否可访问和可读,而无需实际读取。这对于以下情况很有用:func f(a *[0x100001]byte) {    (*a)[0x100000] = 1;}编译器必须生成以下伪代码:check_not_null(a)store(a + 0x100000, 1)可以使用您发现的相同构造来实现空检查,而无需分支。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go