RISCV指令集体系简读之RV32I

  1. RV32I 指令格式

  • 用于寄存器-寄存器操作的R类型指令
  • 用于短立即数和访存load操作的I型指令
  • 用于访存store操作的s型指令
  • 用于条件跳转操作的B类型指令
  • 用于长立即数的U型指令
  • 用于无条件跳转的J型指令

特点:

  • 所有指令都是32bits, 简化了指令解码;
  • RISV-V指令提供3个寄存器操作数,这样的好处就是当一个操作需要3个操作数时,一条指令就可以完成,而不需要用其他的指令来辅助;
  • 所有指令,要读写的寄存器标识符所在的位置是固定的,解码逻辑可以简化;
  • 立即数总是符号位扩展的,符号位总是在指令中最高位。这意味着可能成为关键路径的立即数符号扩展,可以在指令解码之前进行;

寄存器个数:x0~x31, 其中x0固定为0;

RV32I 整数计算

  • RISC-V中没有字节或半字宽度的整数计算操作。操作始终 是以完整的寄存器宽度。内存访问需要的能量比算术运算高几个数量级。因此低宽度的数 据访问可以节省大量的能量,但低宽度的运算不会。
  • RV32I 也不包含乘法和除法,它们包含在可选的RV32M扩展中;

RV32I 的 Load和Store

  • 除了提供32位字(lw,sw)的load和store外,RV32I 支持load有符号和无符号字节和半字(lb,lbu,lh,lhu)和store字节和半字(sb,sh)。有符号字节和半字符号扩展为32位再写入目的寄存器。
  • 即使是自然数据类型更窄,低位宽数据也是被 扩展后再处理,这使得后续的整数计算指令能正确处理所有的32位。在文本和无符号整数 中常用的无符号字节和半字,在写入目标寄存器之前都被无符号扩展到32位。
  • 虽然ARM-32和MIPS-32要求存储在内存中的数据,要按照数据的自然大小进行边界 对齐,但是RISC-V没有这个要求。

RV32I 条件分支

  • RV32I 可以比较两个寄存器并根据比较结果上进行分支跳转。
  • 比较可以是:相等 (beq),不相等 (bne),大于等于(bge),或小于(blt)。最后两种比较有符号比 较,RV32I也提供相应的无符号版本比较的:bgeu和bltu。
  • RISC-V去掉了MIPS-32,Oracle SPARC等指令集中被 广为诟病的延迟分支特性等。
  • 省略了x86-32中的循环指令:loop,loope,loopz,loopne, loopnz。

RV32I 无条件跳转

  • 跳转并链接指令(jal)具有双重功能。
    • 若将下一条指令PC + 4的地址保存 到目标寄存器中,通常是返回地址寄存器ra(见图2.4),便可以用它来实现过程调用。
    • 如果使用零寄存器(x0)替换ra作为目标寄存器,则可以实现无条件跳转,因为x0不能 更改。
  • RV32I避开了错综复杂的程序调用指令,例如x86-32的进入和离开 指令,或Intel Itanium,Oracle SPARC 和 Cadence Tensilica 中的寄存器窗口。

RV32I 杂项 

  • 控制状态寄存器指令 (csrrc、csrrs、csrrw、csrrci、csrrsi、csrrwi), 使我们可以轻松地访问一些程序性能计数器。
  • ecall指令用于向运行时环境发出请求,例如系统调用。调试器 使用ebreak指令将控制转移到调试环境
  • fence 指令对外部可见的访存请求,如设备I / O和内存访问等进行串行化。
  • fence.i指令同步指令和数据 流。在执行fence.i指令之前,对于同一个硬件线程,RISC-V不保证用存储指令写到内存 指令区的数据可以被取指令取到。

对于RV32I总的特点为:

⚫ 32位字节可寻址的地址空间

⚫ 所有指令均为32位长

⚫ 31个寄存器,全部32位宽,寄存器0硬连线为零

⚫ 所有操作都在寄存器之间(没有寄存器到内存的操作)

⚫ 加载/存储字加上有符号和无符号加载/存储字节和半字

⚫ 所有算术,逻辑和移位指令都有立即数版本的指令

⚫ 立即数总是符号扩展

⚫ 仅提供一种数据寻址模式(寄存器+立即数)和PC相对分支

⚫ 无乘法或除法指令

⚫ 一个指令,用于将大立即数加载到寄存器的高位,这样加载32位常量到寄存器只需要两条指令

RV32I与ARM/MIPS/X86所具备的优势:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/546536.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LangChain学习笔记与样程

LangChain 是一个开源的机器学习工具库,专门用于构建和部署基于语言的应用程序。这个库提供了一系列工具和接口,使开发者能够轻松地整合和使用大型语言模型,例如 OpenAI 提供的 GPT。LangChain 的核心特点包括模块化设计、灵活性和易用性&…

linnux文件服务

1.FTP:文件传输协议。 基础:控制端口(身份验证) command 21/tcp 数据端口: data 20/tcp FTP Server默认配置:yum -y install vsftpd (安装vsftpd) touch /var/ftp/abc.txt(创建文件) systemctl start vsftpd(启动文件) systemctl …

osg渲染过程

目录 1、渲染最简单代码 2、详解run方法 3、详细过程 4、回调函数 5、Node Visitor 1、渲染最简单代码 2、详解run方法 3、详细过程 3.1 advance()方法 进行帧计数 3.2 eventTraversal() eventTraversal()响应用户操作,eventTraversal()遍历的是事件队列,而…

java:多线程

多线程 在java程序中同时执行多个线程,每个线程独立执行不同的任务. 可以提高程序的性能和资源利用率,增加程序的并发性. 多线程的作用 1,提高程序性能 可以将一个任务分解成多个子任务并行处理,从而提高程序的运行速度 2,提高资源利用率 可以更好地利用CPU资源,提高CPU…

【每日刷题】Day15

【每日刷题】Day15 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 目录 1. 141. 环形链表 - 力扣(LeetCode) 2. 142. 环形链表 II - 力扣(LeetCode) 3. 143. 重…

基于Python的卷积网络的车牌识别系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

CST电磁仿真的点/线/面设置操作【入门基础】

选择点/线/面 通过Pick功能选择点/线/面的方法 Modeling > Picks > Picks > Pick Points, Edges or Faces Pick是在模型上或任意空间中选择Point、Edge、Face的功能。利用Pick功能可以轻松获取模型的位置、尺寸等信息,也可以在执行Modeling和Result Han…

Xxl-job执行器自动注册不上的问题

今天新建的项目要部署xxl-job,之前部署过好多次,最近没怎么部署,生疏了。部署完之后,服务一直没有注册到执行器管理里面,找了半天也没找到原因,看数据库里的xxl_job_registry表也是一直有数据进来。 后来看…

46.HarmonyOS鸿蒙系统 App(ArkUI)网格布局

Grid(){GridItem(){Button(按钮1).fontSize(28)}.backgroundColor(Color.Blue)GridItem(){Text(数学).fontSize(28)}.backgroundColor(Color.Yellow)GridItem(){Text(语文).fontSize(28)}.backgroundColor(Color.Green)GridItem(){Text(英语).fontSize(28)}.backgroundColor(Co…

数据结构(算法)

总结,建议看EXCEL的《算法》页签,不然感觉有点乱 备注原理/步骤时间复杂度空间复杂度串的应用模式匹配简单/暴力O(mn) KMP  O(mn) 树的应用树哈夫曼树1、带权路径长度WPL 2、外部排序-最佳归并树1、哈夫曼树的度,只有0和m(m叉…

七月审稿之提升模型效果的三大要素:prompt、数据质量、训练策略(含Reviewer2和PeerRead)​

前言 我带队的整个大模型项目团队超过40人了,分六个项目组,每个项目组都是全职带兼职,且都会每周确定任务/目标/计划,然后各项目组各自做任务拆解,有时同组内任务多时 则2-4人一组 方便并行和讨论,每周文档…

Normalizing Flows

需要学的是神经网络 f f f, 用于完成从source distribution (Pz)(latent space,一般为高斯分布)到 target distribution (Px) 的映射。 Normalizing Flows 是一种强大的生成模型,它通过学习一个可逆且易于计算的转换来将复杂的概…

(弟弟14)递归•按顺序打印一个整数的每一位

这里是目录哦 题目代码运行截图递归思路递归停止条件如何实现“按顺序”悟了✨加油&#x1f389; 题目 按顺序打印一个整数的每一位。 代码 #include<stdio.h> void Print(int n) {if (n > 9)//递归停止条件{Print(n / 10);//不断趋近递归停止条件}printf("%d…

代码随想录算法训练营Day56|LC583 两个字符串的删除操作LC72 编辑距离

一句话总结&#xff1a;看起来复杂&#xff0c;动规分析以后就比较简单。 原题链接&#xff1a;583 两个字符串的删除操作 本质就是求两个字符串的最短子序列的长度。已经做过&#xff0c;不再详解。 class Solution {public int minDistance(String word1, String word2) {/…

一文读懂自动化运维工具ansible及其使用

1. ansible简介 ansible是干什么的 ansible是目前最受运维欢迎的自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具&#xff08;SaltStack puppet、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令…

麒麟服务器操作系统安装HTTP服务

往期好文&#xff1a;麒麟服务器操作系统安装TFTP服务 Hello&#xff0c;大家好啊&#xff01;今天我们将探讨如何在麒麟服务器操作系统上安装和配置HTTP服务&#xff0c;这是任何网络服务或应用的基础。无论你是想建立一个简单的网站&#xff0c;还是需要一个全功能的Web服务器…

wangzherongyao 2024.04.15

第一局&#xff1a;百里陪那只重置技能CD的辅助&#xff0c;对面有兰陵王&#xff0c;妲己&#xff0c;然后我补位廉颇被自己人和对面一阵嘲讽&#xff0c;真的不想说啥&#xff0c;对面盾山和妲己估计都没明白&#xff0c;我一只就能破他们队伍&#xff0c;所以看到没先出魔抗…

在Windows上配置VS Code GO语言开发环境

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

代码随想录阅读笔记-回溯【全排列】

题目 给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。 示例 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 思路 以[1,2,3]为例&#xff0c;抽象成树形结构如下&#xff1a; 回溯三部曲 1、递归函数参数 首先排列是有…

C++内存分布

C代码编译过程 预处理 宏定义展开、头文件展开、条件编译&#xff0c;这里并不会检查语法编译检查语法&#xff0c;将预处理后文件编译生成汇编文件汇编将汇编文件生成目标文件(二进制文件)链接将目标文件链接为可执行程序 进程的内存分布 程序运行起来(没有结束前)就是一个…