RV64I基础整数指令集
本帖最后由 sky 于 2021-3-6 12:53 编辑RV64I是RV32I的超集,RV32I是RV64I的子集。RV64I包括RV32I的所有40条指令,另外增加了12条RV32I中没有的指令,还有三条移位指令(slli, srli,srai)也进行小小的改动。
在RV64I中,整数寄存器是64位的,即xlen=64,所以每条指令中的寄存器都是64位运算,立即数符号位扩展也是到64位。
下面介绍一下RV64I中新增的指令,对于同一条指令在RV64I和RV32I中,操作的不同,会在RV32I指令集的介绍中给出备注。
ldld rd, offset(rs1) //x = M + sext(offset)]
双字加载 (Load Doubleword). I-type, RV64I.
从地址 x + sign-extend(offset)读取八个字节,写入 x。
压缩形式: c.ldsp rd, offset; c.ld rd, offset(rs1)
imm
11109876543210rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
ldI 011 0000011
例子:0000000000000000 <.text>:
0: 00513503 ld x10,5(x2)
4: fec1b283 ld x5,-20(x3)
lwu
lwu rd, offset(rs1) //x = M + sext(offset)]
无符号字加载 (Load Word, Unsigned). I-type, RV64I.
从地址 x + sign-extend(offset)读取四个字节,零扩展后写入 x。
imm
11109876543210rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
lwuI 110 0000011
例子:0: 00516503 lwu x10,5(x2)
4: fec1e283 lwu x5,-20(x3)
sd
sd rs2, offset(rs1) //M + sext(offset) ]= x
存双字(Store Doubleword). S-type, RV64I.
将 x中的 8 字节存入内存地址 x+sign-extend(offset)。
压缩形式: c.sdsp rs2, offset; c.sd rs2, offset(rs1)
imm imm
111098765rs2rs1func343210opcode
nametype313029282726252423222120191817161514131211109876543210
sdS 011 0100011
例子:0: 00a132a3 sd x10,5(x2)
4: fe51b623 sd x5,-20(x3)
addiw
addiw rd, rs1, immediate //x = sext((x + sext(immediate)))
加立即数字(Add Word Immediate). I-type, RV64I.
把符号位扩展的立即数加到 x,将结果截断为 32 位,把符号位扩展的结果写入 x。忽略算术溢出。
压缩形式: c.addiw rd, imm
imm
11109876543210rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
addiwI 000 0011011
例子:0: 0142851b addiw x10,x5,20
4: fec2851b addiw x10,x5,-20
slliw
slliw rd, rs1, shamt //x = sext((x ≪ shamt))
立即数逻辑左移字(Shift Left Logical Word Immediate). I-type, RV64I.
把寄存器 x左移 shamt 位,空出的位置填入 0,结果截为 32 位,进行有符号扩展后写入x。仅当 shamt=0 时,指令才是有效的。
shamt
543210rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
slliwI000000 001 0011011
例子:0: 0064951b slliw x10,x9,0x6
4: 0024951b slliw x10,x9,0x2
srliw
srliw rd, rs1, shamt //x = sext(x ≫u shamt)
立即数逻辑右移字(Shift Right Logical Word Immediate). I-type, RV64I.
把寄存器 x右移 shamt 位,空出的位置填入 0,结果截为 32 位,进行有符号扩展后写入x。仅当 shamt=0 时,指令才是有效的。
shamt
543210rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
srliwI000000 101 0011011
例子:0: 0064d51b srliw x10,x9,0x6
4: 0024d51b srliw x10,x9,0x2
sraiw
sraiw rd, rs1, shamt //x = sext(x ≫s shamt)
立即数算术右移字(Shift Right Arithmetic Word Immediate). I-type, RV64I.
把寄存器 x的低 32 位右移 shamt 位,空位用 x填充,结果进行有符号扩展后写入 x。仅当 shamt=0 时指令有效。
压缩形式: c.srai rd, shamt
shamt
543210rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
sraiwI010000 101 0011011
例子:0: 4064d51b sraiw x10,x9,0x6
4: 4024d51b sraiw x10,x9,0x2
addw
addw rd, rs1, rs2 //x = sext((x + x))
加字(Add Word). R-type, RV64I.
把寄存器 x加到寄存器 x上,将结果截断为 32 位,把符号位扩展的结果写入 x。忽略算术溢出。
压缩形式: c.addw rd, rs2
func7rs2rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
addwR0000000 000 0111011
例子:0: 0034853b addw x10,x9,x3
subw
subw rd, rs1, rs2 //x = sext((x - x))
减去字(Substract Word). R-type, RV64I.
x减去 x,结果截为 32 位,有符号扩展后写入 x。忽略算术溢出。
压缩形式: c.subw rd, rs2
func7rs2rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
subwR0100000 000 0111011
例子:4: 4034853b subw x10,x9,x3
sllw
sllw rd, rs1, rs2 //x = sext((x ≪ x))
逻辑左移字(Shift Left Logical Word). R-type, RV64I.
把寄存器 x的低 32 位左移 x位,空出的位置填入 0,结果进行有符号扩展后写入x。 x的低 5 位代表移动位数,其高位则被忽略。
func7rs2rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
sllwR0000000 001 0111011
例子:8: 0034953b sllw x10,x9,x3
srlw
srlw rd, rs1, rs2 //x = sext(x ≫u x)
逻辑右移字(Shift Right Logical Word). R-type, RV64I.
把寄存器 x的低 32 位右移 x位,空出的位置填入 0,结果进行有符号扩展后写入x。 x的低 5 位代表移动位数,其高位则被忽略。
func7rs2rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
srlwR0000000 101 0111011
例子:c: 0034d53b srlw x10,x9,x3
sraw
sraw rd, rs1, rs2 //x = sext(x ≫s x)
算术右移字(Shift Right Arithmetic Word). R-type, RV64I only.
把寄存器 x的低 32 位右移 x位,空位用 x填充,结果进行有符号扩展后写 入 x。
x的低 5 位为移动位数,高位则被忽略。
func7rs2rs1func3rdopcode
nametype313029282726252423222120191817161514131211109876543210
srawR0101000 101 0111011
例子:10: 4034d53b sraw x10,x9,x3
完
页:
[1]