我正在使用带有 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 的加载仍必须引发任何异常并导致任何其他副作用。这里到底发生了什么?编译器是否产生错误的输出?
1 回答
守着一只汪
TA贡献1872条经验 获得超3个赞
我对继续 riscv 一无所知,但这是一种常见的模式。
内存访问仅检查 [gp+0] 是否可访问和可读,而无需实际读取。
这对于以下情况很有用:
func f(a *[0x100001]byte) {
(*a)[0x100000] = 1;
}
编译器必须生成以下伪代码:
check_not_null(a)
store(a + 0x100000, 1)
可以使用您发现的相同构造来实现空检查,而无需分支。
- 1 回答
- 0 关注
- 91 浏览
添加回答
举报
0/150
提交
取消