RISC-V有32個通用寄存器,其中第1個寄存器x0寫死為0,即讀出來總是0,寫進去總是被丢棄。x0為RISC-V指令集的簡化可貢獻不少啊。
mingdu.zheng at gmail dot com
搞過Linux的都知道Linux有兩個特殊的裝置:
/dev/zero
和
/dev/null
。從
/dev/zero
可以源源不斷地讀到0,往
/dev/null
寫的任何内容都被丢棄。如果要建立一個需要填0的檔案,就從
/dev/zero
拷貝,如果要丢棄一些輸出,就把輸出重定向到
/dev/null
。
RISC-V的x0寄存器就相當于是硬體版的
/dev/zero
和
/dev/null
的組合體。從x0讀出來的總是0,往x0寫進去的總是被丢棄。是以這x0提供了兩種功能,一是提供常量0,在軟體程式設計中0可以說是最常用的常量了;二是提供一個可以丢棄結果的場所。有了這個x0,很多本來需要單獨指令的操作隻要更普通的指令加上x0就可以實作了。
比如
nop
空指令,RISC-V沒有提供
nop
指令噢,RISC-V用
addi x0, x0, 0
來實作空指令的,這條
addi
使用x0作為目标寄存器,x0是會丢棄結果的,是以這條指令不會對程式狀态産生任何影響,和空指令是完全等價的。這就不需要單獨的空指令了。
比如
neg
取負數指令,RISC-V用
sub rd, x0, rs
來實作,
x0 - rs
等價于
0 - rs
等價于
-rs
,有了x0,就可以用更普通的減法指令來實作取負數指令。
比如
j
跳轉指令,RISC-V沒有單獨的
j
跳轉指令,隻有
jal
跳轉連結指令,跳轉之前總是要把下一條指令的位址拷貝到寄存器,但是如果用x0作為jal的操作寄存器,即把下一條指令的位址拷貝到x0,那麼效果就等價于
j
跳轉指令了,因為寫入x0的任何值都是會被丢棄的呀。