RVZicsr指令集
Riscv中每个硬件线程(hart)有4096个独立地址空间的状态寄存器。我们可以通过Zicsr指令读写csr寄存器。总共有6条csr读写指令,这些指令之前都在RV32I/RV64I基础指令集里面,在最新文档中,被放在了Zicsr扩展指令集中。
6条指令的编码如下,其中[31-20]总共12位表示4096个csr寄存器地址。
| csr | |||||||||||||||||||||||||||||||||
| 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | rs1/imm | func3 | rd | opcode | ||||||||||||||||||
| name | type | 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| csrrw | I | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | ||||||||||||||||||||||
| csrrs | I | 0 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | ||||||||||||||||||||||
| csrrc | I | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | ||||||||||||||||||||||
| csrrwi | I | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | ||||||||||||||||||||||
| csrrsi | I | 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | ||||||||||||||||||||||
| csrrci | I | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | ||||||||||||||||||||||
csr指令读写csr寄存器都是原子操作。
- 对于csrrw和csrwi,如果rd索引值为0,csr指令将不会发起csr寄存器的读操作,也不会带来任何读操作的副作用。
- 对于csrrs和csrrc指令而言,如果rs1的索引值为0,csr指令将不会发起csr寄存器的写操作,也不会带来任何写操作的副作用。
- 对于csrrsi和csrrci指令而言,如果立即数的索引值为0,csr指令将不会发起csr寄存器的写操作,也不会带来任何写操作的副作用。
下面介绍这六条指令的功能:
csrrw
csrrw rd, csr, zimm[4:0] //t = CSRs[csr]; CSRs[csr] = x[rs1]; x[rd] = t
读后写控制状态寄存器 (Control and Status Register Read and Write). I-type, RV32I and RV64I.
记控制状态寄存器 csr 中的值为 t。 把寄存器 x[rs1]的值写入 csr,再把 t 写入 x[rd]。
例子:
to do
csrrs
csrrs rd, csr, rs1 //t = CSRs[csr]; CSRs[csr] = t | x[rs1]; x[rd] = t
读后置位控制状态寄存器 (Control and Status Register Read and Set). I-type, RV32I and RV64I.
记控制状态寄存器 csr 中的值为 t。 把 t 和寄存器 x[rs1]按位或的结果写入 csr,再把 t 写入x[rd]。
例子:
to do
csrrc
csrrc rd, csr, rs1 //t = CSRs[csr]; CSRs[csr] = t &~x[rs1]; x[rd] = t
读后清除控制状态寄存器 (Control and Status Register Read and Clear). I-type, RV32I andRV64I.
记控制状态寄存器 csr 中的值为 t。 把 t 和寄存器 x[rs1]按位与的结果写入 csr,再把 t 写入x[rd]
例子:
to do
csrrwi
csrrwi rd, csr, zimm[4:0] //x[rd] = CSRs[csr]; CSRs[csr] = zimm
立即数读后写控制状态寄存器 (Control and Status Register Read and Write Immediate). I-type,RV32I and RV64I.
把控制状态寄存器 csr 中的值拷贝到 x[rd]中,再把五位的零扩展的立即数 zimm 的值写入csr。
例子:
to do
csrrsi
csrrsi rd, csr, zimm[4:0] //t = CSRs[csr]; CSRs[csr] = t | zimm; x[rd] = t
立即数读后设置控制状态寄存器 (Control and Status Register Read and Set Immediate). I-type,RV32I and RV64I.
记控制状态寄存器 csr 中的值为 t。 把 t 和五位的零扩展的立即数 zimm 按位或的结果写入csr,再把 t 写入 x[rd](csr 寄存器的第 5 位及更高位不变)。
例子:
to do
csrrci
csrrci rd, csr, zimm[4:0] //t = CSRs[csr]; CSRs[csr] = t &~zimm; x[rd] = t
立即数读后清除控制状态寄存器 (Control and Status Register Read and Clear Immediate). Itype, RV32I and RV64I.
记控制状态寄存器 csr 中的值为 t。 把 t 和五位的零扩展的立即数 zimm 按位与的结果写入csr,再把 t 写入 x[rd](csr 寄存器的第 5 位及更高位不变)。
例子:
to do
下面是一些常用的csr伪指令:
| rdinstret[h] rd | csrrs rd,instret[h],x0 | 读取过时指令计数器 |
| rdcycle[h] rd | csrrs rd,cycle[h],x1 | 读取时钟周期计数器 |
| rdtime[h] rd | csrrs rd,time[h],x2 | 读取实时时钟 |
| csrr rd, csr | csrrs rd, csr,x0 | 读csr寄存器 |
| csrw csr,rs | csrrw x0,csr,rs | 写csr寄存器 |
| csrs csr,rs | csrrs x0,csr,rs | csr寄存器置位0 |
| csrc csr,rs | csrrc x0,csr,rs | csr寄存器清0 |
| csrwi csr,imm | csrrwi x0,csr,imm | 立即数写csr |
| csrsi csr,imm | csrrsi x1,csr,imm | 立即数置位csr |
| csrci csr,imm | csrrci x2,csr,imm | 立即数复位csr |
| frcsr rd | csrrs rd,frm,x0 | 读取fp舍入模式 |
| fscsr rs | csrrw x0,frm,rs | 写入fp舍入模式 |
| frflags rd | csrrs rd,fflags,x0 | 读取fp异常模式 |
| fsflags rs | csrrw x0,fflags,rs | 写入fp异常模式 |
| fscsr rd,rs | csrrw rd,fcsr,rs | 交换fp控制状态寄存器 |
| fsrm rd,rs | csrrw rd,frm,rs | 交换fp舍入模式 |
| fsflags rd,rs | csrrw,rd,fflags,rs | 交换fp异常标志 |
RVZicsr指令集的更多相关文章
- SSE指令集学习:Compiler Intrinsic
大多数的函数是在库中,Intrinsic Function却内嵌在编译器中(built in to the compiler). 1. Intrinsic Function Intrinsic Fun ...
- ARM-汇编指令集(总结)
ARM汇编指令集 指令.伪指令 (汇编)指令: 是机器码的助记符,经过汇编器编译后,由CPU执行. (汇编)伪指令:用来指导指令执行,是汇编器的产物,最终不会生成机器码. 有两种不同风格的ARM指 ...
- iOS------苹果设备处理器指令集(iPhone初代到iPhone5s)
(via 雅香小筑) Arm处理器,因为其低功耗和小尺寸而闻名,几乎所有的手机处理器都基于arm,其在嵌入式系统中的应用非常广泛,它的性能在同等功耗产品中也很出色. Armv6.armv7.armv7 ...
- SSE指令集优化学习:双线性插值
对SSE的学习总算迈出了第一步,用2天时间对双线性插值的代码进行了优化,现将实现的过程梳理以下,算是对这段学习的一个总结. 1. 什么是SSE 说到SSE,首先要弄清楚的一个概念是SIMD(单指令多数 ...
- RISC指令集的五个周期
RISC指令集的五个周期 RISC(reduced instruction set computer,精简指令集计算机)简称为精简指令集.RISC把执行指令的精力主要放在了经常使用的指令上面.本文主要 ...
- x86指令集同频性能提升
x86近5000条指令,迄今为止最复杂的指令集.这里不研究CISC & RISC,也不考虑process制程变化,主要是看最近几代IA架构对于同频率下性能的提升. x86指令集nasm文档 h ...
- CPU指令集
cpu作为一台电脑中的核心,它的作用是无法替代的.而cpu本身只是在块硅晶片上所集成的超大规模的集成电路,集成的晶体管数量可达到上亿个,是由非常先进复杂的制造工艺制造出来的,拥有相当高的科技含量. C ...
- 在UWP应用中加入Cortana语音指令集
本文介绍小娜语音指令集的使用场景,如何将UWP应用接入小娜的语音指令集,使用户直接通过小娜启动应用并使用应用中 一些轻量级的功能.文中以必应词典作为实例讲解必应词典UWP版本是如何接入小娜语音功能的. ...
- IOS移动设备处理器指令集 armv6、armv7、armv7s及arm64
Arm处理器,因为其低功耗和小尺寸而闻名,几乎所有的手机处理器都基于arm,其在嵌入式系统中的应用非常广泛,它的性能在同等功耗产品中也很出色. Armv6.armv7.armv7s.arm64都是ar ...
随机推荐
- c++ lesson 一(命名空间输入输出)
// // main.cpp // C++lessonOne // // Created by keyan on 15/11/13. // Copyright © 2015年 keyan. All r ...
- ABP进阶教程7 - 功能按钮
点这里进入ABP进阶教程目录 下载插件 打开Datatables官网(https://datatables.net/download/) 勾选Extensions/Buttons,下载插件,复制到JD ...
- 【Servlet】JavaWeb应用的执行流程
Tomcat与Servlet简介 Tomcat Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.S ...
- MySQL 部署分布式架构 MyCAT (四)
分片(水平拆分) 2.取模分片(mod-long) cd /data/mycat/conf cp schema.xml schema.xml.rang-long vi schema.xml <? ...
- Troubleshooting ORA-30036 - Unable To Extend Undo Tablespace (Doc ID 460481.1)
Troubleshooting ORA-30036 - Unable To Extend Undo Tablespace (Doc ID 460481.1) APPLIES TO: Oracle Da ...
- js 判断当前时间是否处于某个一个时间段内
js 判断当前时间(或者所选时间)是否在某一时间段 我们可以使用 jutils - JavaScript常用函数库的 isDuringDate 函数来实现 传入 beginDateStr (开始时间) ...
- [Go] 测试go连接imap的tcp长连接
连接上imap服务后,什么都不操作,我测试大约5分钟会被服务端断掉,测试代码如下 imapClient, _ := client.Dial("imap.sina.net:143") ...
- CSP认证201812
201812-1 #include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define ll long l ...
- fetchone函数和fetchall函数返回值的区别
fetchone函数和fetchall函数返回值的区别 1.fetchone() 返回单个的元组,也就是一条记录(row),如果没有结果,则python返回 None 有结果时,如图: 没结果时,如 ...
- 事件代理/事件委托----点击li弹出对应的下标和内容
<body> <ul> <li>这是第一行</li> <li>这是第二行</li> <li>这是第三行</li ...