皋陶 发表于 2021-3-6 15:30:49

RVZicsr指令集

本帖最后由 皋陶 于 2021-3-6 15:30 编辑

Riscv中每个硬件线程(hart)有4096个独立地址空间的状态寄存器。我们可以通过Zicsr指令读写csr寄存器。总共有6条csr读写指令,这些指令之前都在RV32I/RV64I基础指令集里面,在最新文档中,被放在了Zicsr扩展指令集中。
   6条指令的编码如下,其中总共12位表示4096个csr寄存器地址。

  csr             
  11109876543210rs1/immfunc3rdopcode
nametype313029282726252423222120191817161514131211109876543210
csrrwI                 001     1110011
csrrsI                 010     1110011
csrrcI                 011     1110011
csrrwiI                 101     1110011
csrrsiI                 110     1110011
csrrciI                 111     1110011

   csr指令读写csr寄存器都是原子操作。
[*]   对于csrrw和csrwi,如果rd索引值为0,csr指令将不会发起csr寄存器的读操作,也不会带来任何读操作的副作用。
[*]   对于csrrs和csrrc指令而言,如果rs1的索引值为0,csr指令将不会发起csr寄存器的写操作,也不会带来任何写操作的副作用。
[*]   对于csrrsi和csrrci指令而言,如果立即数的索引值为0,csr指令将不会发起csr寄存器的写操作,也不会带来任何写操作的副作用。

    下面介绍这六条指令的功能:
csrrwcsrrw rd, csr, zimm   //t = CSRs; CSRs = x; x = t
读后写控制状态寄存器 (Control and Status Register Read and Write). I-type, RV32I and RV64I.
记控制状态寄存器 csr 中的值为 t。 把寄存器 x的值写入 csr,再把 t 写入 x。例子:to do

csrrscsrrs rd, csr, rs1      //t = CSRs; CSRs = t | x; x = t
读后置位控制状态寄存器 (Control and Status Register Read and Set). I-type, RV32I and RV64I.
记控制状态寄存器 csr 中的值为 t。 把 t 和寄存器 x按位或的结果写入 csr,再把 t 写入x。例子:to do
csrrccsrrc rd, csr, rs1      //t = CSRs; CSRs = t &~x; x = t
读后清除控制状态寄存器 (Control and Status Register Read and Clear). I-type, RV32I andRV64I.
记控制状态寄存器 csr 中的值为 t。 把 t 和寄存器 x按位与的结果写入 csr,再把 t 写入x例子:to do
csrrwicsrrwi rd, csr, zimm   //x = CSRs; CSRs = zimm
立即数读后写控制状态寄存器 (Control and Status Register Read and Write Immediate). I-type,RV32I and RV64I.
把控制状态寄存器 csr 中的值拷贝到 x中,再把五位的零扩展的立即数 zimm 的值写入csr。例子:to do
csrrsicsrrsi rd, csr, zimm    //t = CSRs; CSRs = t | zimm; x = t
立即数读后设置控制状态寄存器 (Control and Status Register Read and Set Immediate). I-type,RV32I and RV64I.
记控制状态寄存器 csr 中的值为 t。 把 t 和五位的零扩展的立即数 zimm 按位或的结果写入csr,再把 t 写入 x(csr 寄存器的第 5 位及更高位不变)。例子:to do
csrrcicsrrci rd, csr, zimm   //t = CSRs; CSRs = t &~zimm; x = t
立即数读后清除控制状态寄存器 (Control and Status Register Read and Clear Immediate). Itype, RV32I and RV64I.
记控制状态寄存器 csr 中的值为 t。 把 t 和五位的零扩展的立即数 zimm 按位与的结果写入csr,再把 t 写入 x(csr 寄存器的第 5 位及更高位不变)。例子:to do
下面是一些常用的csr伪指令:

rdinstret rdcsrrs rd,instret,x0读取过时指令计数器
rdcycle rdcsrrs rd,cycle,x1读取时钟周期计数器
rdtime rdcsrrs rd,time,x2读取实时时钟
csrr rd, csrcsrrs rd, csr,x0读csr寄存器
csrw csr,rscsrrw x0,csr,rs写csr寄存器
csrs csr,rscsrrs x0,csr,rscsr寄存器置位0
csrc csr,rscsrrc x0,csr,rscsr寄存器清0
csrwi csr,immcsrrwi x0,csr,imm立即数写csr
csrsi csr,immcsrrsi x1,csr,imm立即数置位csr
csrci csr,immcsrrci x2,csr,imm立即数复位csr
frcsr rdcsrrs rd,frm,x0读取fp舍入模式
fscsr rscsrrw x0,frm,rs写入fp舍入模式
frflags rdcsrrs rd,fflags,x0读取fp异常模式
fsflags rscsrrw x0,fflags,rs写入fp异常模式



fscsr rd,rscsrrw rd,fcsr,rs交换fp控制状态寄存器
fsrm rd,rscsrrw rd,frm,rs交换fp舍入模式
fsflags rd,rscsrrw,rd,fflags,rs交换fp异常标志

页: [1]
查看完整版本: RVZicsr指令集