我正在使用帶有 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] 開始,負載為零,根據(jù)規(guī)范,這應該是“異?;蚱渌保杭词辜虞d值被丟棄,目標為 x0 的加載仍必須引發(fā)任何異常并導致任何其他副作用。這里到底發(fā)生了什么?編譯器是否產(chǎn)生錯誤的輸出?
1 回答
守著一只汪
TA貢獻1872條經(jīng)驗 獲得超4個贊
我對繼續(xù) riscv 一無所知,但這是一種常見的模式。
內(nèi)存訪問僅檢查 [gp+0] 是否可訪問和可讀,而無需實際讀取。
這對于以下情況很有用:
func f(a *[0x100001]byte) {
(*a)[0x100000] = 1;
}
編譯器必須生成以下偽代碼:
check_not_null(a)
store(a + 0x100000, 1)
可以使用您發(fā)現(xiàn)的相同構(gòu)造來實現(xiàn)空檢查,而無需分支。
- 1 回答
- 0 關注
- 117 瀏覽
添加回答
舉報
0/150
提交
取消
