PicoRV32 笔记 06 压缩指令集

news2024/11/25 18:27:56

PicoRV32 中实现压缩指令集选项 COMPRESSED_ISA,当设置COMPRESSED_ISA=1开启支持16位指令集。压缩指令有很多优点,当我们在FPGA中实现PicoRV32的时候,使用RISCV的C扩展能有效的增大代码密度,原本32位1条指令变为16位一条指令,用更少的空间存储更多的指令。

RISCV C使用一种简单的压缩方案,以便在下列情形时,提供更短的 16 位版本的 32 位 RISC-V
指令:
        立即数或者地址偏移量较小时
        其中一个寄存器是零寄存器(x0)、ABI 链接寄存器(x1)或者 ABI 栈寄存器(x2)
        目标寄存器和第一个源寄存器相同
         最常见情况下使用了 8 个寄存器

C 扩展与其它所有标准扩展兼容。C 扩展允许 16 位指令可以自由地和 32 位指令混合执行,并运行 32 位指令可以在任何 16 位边界开始。
(注:一般情况下, 32 位指令必须对齐到 32 位存储器地址边界上,否则会导致非对齐存储器访问异常。 )

1.压缩RVC 16指令格式

说明1514131211109876543210
CRfunct4RD/RS1RS2OP
CIfunct3IMMRD/RS1IMM
CSSIMMRS2
CIWIMMRD'
CLIMMRS'IMM
CS
CBoffsetoffset
CJjump target

寄存器编号

000001010011100101110111
x8x9x10x11x12x13x14x15

2.Load和store指令

基于栈指针 ,栈指针为x2

 指令使用 CI 格式

C.LWSP 指令将一个 32 位数值从存储器读入寄存器 rd 中。其有效地址的计算是通过将
零 扩展的偏移量*4,然后加上栈指针 x2 形成的。它被扩展为 lw rd, offset[7:2](x2)指令。

指令使用 CSS 格式

 C.SWSP 指令将寄存器 rs2 中的 32 位值保存到存储器中。其有效地址的计算是通过将 零
扩展的偏移量*4,然后加上栈指针 x2 形成的。它被扩展为 sw rs2, offset[7:2](x2)指令。

基于寄存器

 指令使用 CL 格式。
C.LW 指令将一个 32 位数值从存储器读入寄存器 rd’中。其有效地址的计算是通过将 零
扩展的偏移量*4,然后加上寄存器 rs1’中的基址形成的。它被扩展为 lw rd’, offset[6:2](rs1’)
指令。

 指令使用 CS 格式。
C.SW 指令将寄存器 rs2’中的 32 位值保存到存储器中。其有效地址的计算是通过将 零 扩
展的偏移量*4,然后加上寄存器 rs1’中的基址形成的。它被扩展为 sw rs2’, offset[6:2](rs1’)
指令。

3.控制转移指令

RVC 提供了无条件跳转指令和条件分支指令。如同基本 RVI 指令一样,所有 RVC 控制转
移指令的偏移量都是 2 字节的倍数。

 这些指令使用 CJ 格式。
C.J 指令执行一个无条件控制转移。偏移量被符号扩展后,与 pc 相加形成跳转目标地址。
C.J 指令因此可以在±2KB 范围内进行跳转。C.J 指令被扩展为 jal x0, offset[11:1]。

C.JAL 指令是一条 RV32C 仅有指令,它执行与 C.J 指令相同的操作,但是它还将在跳转
指令后的指令地址(pc+2)写入到链接寄存器 x1 中。 C.JAL 指令被扩展为 jal x1, offset[11:1]。

这些指令使用 CR 格式。
C.JR(jump register)指令执行一个无条件控制转移到寄存器 rs1 的地址。C.JR 指令被扩
展为 jalr x0, rs1, 0。
C.JALR(jump and link register)指令执行与 C.JR 指令相同的操作,但是它还将在跳转指
令后的指令地址(pc+2)写入到链接寄存器 x1 中。C.JALR 指令被扩展为 jalr x1, rs1, 0。

 注意:严格来说, C.JALR 指令并没有被精确地扩展为基本 RVI 指令,因为那个被
加到 pc 上以形成链接地址的值是 2 ,而不是基本 ISA 中的 4 ,但是同时支持偏
移量 2 个字节和 4 个字节,只对微体系结构产生微小的影响。

 这些指令使用 CB 格式。
C.BEQZ 指令执行条件控制转移。偏移量被符号扩展后,与 pc 相加形成跳转目标地址。
C.BEQZ 指令因此可以在±256B 范围内进行跳转。如果寄存器 rs1’的值是 0,则 C.BEQZ 指令产生控制转移(take the branch)。这条指令被扩展为 beq rs1’, x0, offset[8:1]。
C.BNEZ 指令定义相似,只是当寄存器 rs1’的值是非 0 值,则指令产生控制转移(take the branch)
。这条指令被扩展为 bne rs1’, x0, offset[8:1]。

4.整数计算指令

整数常数生成指令

 两条常数-生成指令都使用 CI 格式,并且可以以任何整数寄存器为目标。

C.LI 指令将符号扩展的 6 位立即数 imm,写入寄存器 rd 中。C.LI 指令仅在 rd≠x0 时才是有效的。C.LI 指令被扩展为 addi rd, x0, imm[5:0]。


C.LUI 指令将非零的 6 位立即数写入到目标寄存器的 17-12 位,并将目标寄存器的低 12位清零,然后将第 17 位符号扩展到整个目标寄存器的高位部分。 C.LUI 寄存器仅在 rd≠{x0, x2}且立即数不等于 0 时才是有效的。C.LUI 指令被扩展为 lui rd, nzimm[17:12]。

整数寄存器,立即数指令

 这些整数寄存器-立即数指令都使用 CI 格式,并在认为非 x0 整数寄存器和一个 6 位立即数之间进行操作。立即数不能为 0。

C.ADDI 指令将非零的、符号扩展的 6 位立即数加到寄存器 rd 的值上,将结果写入 rd。
C.ADDI 指令被扩展为 addi rd, rd, nzimm[5:0]。

C.ADDI16SP 指令的操作码与 C.LUI 指令相同,但是使用 x2 作为目标寄存器。 C.ADDI16SP指令将一个非零的、符号扩展的 6 位立即数加到栈指针寄存器(sp=x2)上,此处立即数被放大 16 倍,其范围为(-512,496)。C.ADDI16SP 指令用于在过程的头部和尾部对栈指针进行调整。它被扩展为 addi x2, x2, nzimm[9:4]。

 C.ADDI4SPN 指令是一条 CIW 格式的、RV32C/RV64C 仅有的指令,它将一个零扩展的、非零立即数,乘以 4,然后加到栈指针 x2 上,并将结果写入 rd’。这条指令用于产生指向分配在栈中的变量的指针,它被扩展为 addi rd’, x2, zimm[9:2]。

 C.SLLI 指令是一条 CI 格式的指令,它对寄存器 rd 中的数值进行逻辑左移操作,并将结果写入 rd。移位次数被编码到 shamt 字段,此处对 RV32C,shamt[5]必须为 0。对于RV32C/RV64C,移位次数必须为非零值。对于 RV128C,一个 shamt 为 0,编码为移位 64 次。C.SLLI 指令被扩展为 slli rd, rd, shamt[5:0],除了对于 RV128C 且 shamt=0,则被扩展为 slli rd, rd,64。

 C.SRLI 指令是一条 CB 格式的指令,它对寄存器 rd’中的数值进行逻辑右移操作,并将结果写入 rd’。移位次数被编码到 shamt 字段,此处对 RV32C,shamt[5]必须为 0。对于RV32C/RV64C,移位次数必须为非零值。对于 RV128C,一个 shamt 为 0,编码为移位 64 次。而且对于 RV128C,移位次数是符号扩展的,因此合法的移位次数是 1-31、 64、 96-127。

C.SRLI指令被扩展为 srli rd’, rd’, shamt[5:0],除了对于 RV128C 且 shamt=0,则被扩展为 srli rd’, rd’, 64。

C.SRAI 指令与 C.SRLI 指令相似,不过它执行一个算术右移操作。 C.SRAI 指令被扩展为 srai rd’, rd’, shamt[5:0]。

 C.ANDI 指令是一条 CB 格式的指令,它在寄存器 rd’的值和一个符号扩展的 6 位立即数之间进行按位 AND 运算,并将结果写入到 rd’中。 C.ANDI 指令被扩展为 andi rd’, rd’, imm[5:0]。

5.整数寄存器-寄存器指令

这些指令使用 CB 格式。
C.MV 指令将寄存器 rs2 的值复制到寄存器 rd 中。C.MV 指令被扩展为 add rd, x0, rs2
C.ADD 指令将寄存器 rd 的值与寄存器 rs2 的值相加,并将结果写入到寄存器 rd 中。C.ADD指令被扩展为 add rd, rd, rs2。

 

 这些指令使用 CS 格式。
C.AND 指令在寄存器 rd’和 rs2’之间执行按位 AND 操作,并将结果写入寄存器 rd’。 C.AND指令被扩展为 and rd’, rd’ rs2’。


C.OR 指令在寄存器 rd’和 rs2’之间执行按位 OR 操作,并将结果写入寄存器 rd’。C.OR 指令被扩展为 or rd’, rd’ rs2’。


C.XOR 指令在寄存器 rd’和 rs2’之间执行按位 XOR 操作,并将结果写入寄存器 rd’。C.XOR指令被扩展为 xor rd’, rd’ rs2’。


C.SUB 指令将寄存器 rd’的值减去 rs2’的值,并将结果写入寄存器 rd’。C.SUB 指令被扩展为 sub rd’, rd’ rs2’。

6.非法指令

 一条所有位都是 0 的 16 位指令,被永久的保留为一条非法指令。

7.NOP指令

C.NOP 指令是一条 CI 格式指令,它不改变任何用户可见状态,除了推进 pc 之外。 C.NOP指令被编码为 c.addi x0, 0 并且被扩展为 addi x0, x0, 0。

 8.断点指令

调试器可以使用 C.EBREAK 指令,它将被扩展为 ebreak 指令,并导致控制被转移回到调试环境。C.EBREAK 指令的操作码与 C.ADD 指令的操作码相同,但是其 rd 和 rs2 都是 0,因此也可以使用 CR 格式

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

synchronized 和 ReentrantLock 的区别

🎈专栏链接:多线程相关知识详解 synchronized和ReentrantLock的 区别 缺点 优势 synchronized和ReentrantLock两者都是可重入锁 ReentrantLock的三个核心方法: Ⅰ.lock(加锁) Ⅱ.unlock(解锁) Ⅲ.tryLock(尝试加锁) import java.util.concurrent.locks.Reentrant…

Android并发编程里的线程原理

1.进程和线程的概念 抛开那些官方的概念,我们可以大致理解为:进程就是手机里运行的一个个应用,他们都是一个个的进程(当然,有些App是多进程的,这个先不谈)。线程则是进程中对应的一个任务的执行控制流。如果…

广播机制-案例

广播机制-案例 1.静态注册案例-接收开机广播 1.案例:接收开机的广播 创建自定义的BroadcastReceiver用于处理监听到的系统广播。//接收系统开机的广播事件 public class BootCompleteReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context co…

2023跨境出海指南:马来西亚网红营销白皮书

当前的东南亚市场可谓是是企业出海的大热门,马来西亚作为东南亚地区的第三大经济体,其发展形势也是一片大好。疫情出现后,马来西亚的娱乐和消费转移到线上,对社媒的依赖也催发了网红经济的发展。本文Nox聚星就和大家探讨一下&…

海康威视人脸识别设备对接(一)环境搭建

需要对接海康威视人脸识别设备,这里选择明眸门禁,还有其他的没研究过 打开海康威视开放平台 https://open.hikvision.com/ 选择开放体系,一直选择到设备集成SDK 这里我选择设备网络SDK 点击查看详情 选择对应的版本,我用笔记…

AD入门学习—原理图的绘制3

目录 2.4 CAN&24C02及DS18B20温度传感单元的绘制 2.5 USB单元的绘制 2.6 SD卡及TFT单元的绘制 2.7 NRF24L01单元的绘制 2.8 COM口及PS/2接口的绘制 2.9 DCDC电源输入单元的绘制 2.10 原理图的统一编号及编译检查 学习目录 2.4 CAN&24C02及DS18B20温度传感单元的绘制…

Vue基本指令

1、前端技术的发展(html、CSS、JavaScript) ​ (1)jQuery:是对JavaScript进行了封装,使得操作DOM、事件处理、动画处理、ajax交互变得非常简洁、方便。是JavaScript的 库。 ​ (2&#xff09…

Moonbeam与Wormhole的Relayer Engine之间的跨链互连合约

如果您不了解Moonbeam,用一句话简单概括来说Moonbeam是跨链通信的中心枢纽。像Axelar、LayerZero和Hyperlane等的协议允许不同EVM上的智能合约互相通信,为Web3 dApp解锁功能方面前所未见的规模。但就目前来说,上述的几个协议的智能合约通信仅…

计算机网络——数据报与虚电路

简介 本篇接上一篇数据交换的内容继续 分组交换其实包含数据报交换和虚电路交换 数据报方式:为网咯层提供外连接服务 虚电报:为网络层提供连接服务 无连接服务:不事先为分组传输确定传输的路径,每个分组独立确定传输路径&#x…

如何实现带动画的动态面包屑,来看看?

大家好,我是派大星,最近在自己手动搭建一个后台管理平台,将其命名为 “雷达行动 Radar-Solution” ,在开发的过程中对比了一下其他已经成型的后台解决方案,发现都存在一个共性,就是在Layout的头部都有一个面…

分布式理论之分布式事务

写在前面 我们知道,像MySQL的InnoDB存储引擎提供了事务的能力,严格遵守AICD的事务要求,但是在分布式环境中,一个请求会在多个服务实例存在多个事务,如购物,会有订单系统,支付系统,物…

springboot够用就好系列-1.自定义LengthJudge注解校验字段长度

类似NonNull注解标注在参数之上,表示对应的值不可以为空,利用java的元注解及注解处理器实现检查属性长度的功能。 目录 程序效果 实现过程 样例代码 参考资料 程序效果 截图1.用户名超长提示 检查登录时“用户名”、“密码”字段的长度,此…

安全智能分析 环境迁移

环境迁移 Platfor m Ops for AI 作为整合了 DataOps、MLOps、ModelOps 的复杂技术平台,在项目开发时仅使用一套系统无法支撑平台的稳定搭建,往往需要开发系统、集成测试系统、正式 环境系统在项目生命周期 中协作配合。将表、索引、并发程序、配置内容等…

新手想做短视频可以选择什么领域,这三个可以无脑尝试

大家好,我是蝶衣王的小编 对于小白来说,如果你想通过短视频来赚钱,你不能在流行的领域去做。因为坑不是你能接受的,而且有太多的同行,你的竞争优势没法显现出来。下面分享一下新手适合做的短视频领域​。 一、盘点类型…

海思嵌入式开发-001-基于Ubuntu20.04搭建开发环境

海思嵌入式开发-001-基于Ubuntu20.04搭建开发环境一、虚拟机安装ubuntu20.041、安装虚拟机VMware2、基于虚拟机安装ubuntu20.04二、开发环境配置1、参考资料2、问题汇总一、虚拟机安装ubuntu20.04 1、安装虚拟机VMware 主机配置为Windows 10系统,CPU为i7-8550U 4核…

虹科新闻|ATTO 宣布支持 Apple 最新操作系统 macOS® 13 Ventura

一、即时发布 近期,虹科的合作伙伴ATTO公司宣布支持Apple最新操作系统macOS13 Ventura,所有HK-ATTO适配器、软件和实用程序都已经过新操作系统的测试和验证。 ATTO 34年来为数据密集型计算环境提供网络、存储连接和基础架构解决方案的全球领导者&#…

一文读懂什么是低代码开发?

世界在应用程序上运行,商业世界也不例外。面对变化,企业过去依赖的传统应用程序开发流程可能不再有效。从头开始构建软件解决方案需要花费数月甚至数年的时间来规划、设计、测试和部署。当您的组织需要快速解决方案时,等待负担过重的开发人员…

真实世界的人工智能应用落地——OpenAI篇 ⛵

💡 作者:韩信子ShowMeAI 📘 深度学习实战系列:https://www.showmeai.tech/tutorials/42 📘 本文地址:https://www.showmeai.tech/article-detail/414 📢 声明:版权所有,转…

CVE-2018-1273漏洞复现

今天继续给大家介绍渗透测试相关知识,本文主要内容是CVE-2018-1273漏洞复现。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁对未授…

Web3中文|未来的工作模式:VR头显、元宇宙和供应商协作

根据Meta最近发布的一份关于未来工作模式的报告,大约三分之一的美英劳动力在进行远程办公,因此企业必须重新定义工作方式和管理机制,并探索元宇宙和虚拟现实等创新领域。 报告称:“这将推动企业寻求更具创造性和创新性的方法来凝…