浅谈RISC-V指令集的基本指令格式和立即数操作

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,1000CU*H 3个月
简介: 在以前的文章中,我分享了RISC-V在设计的初衷,除了可以被通用软件开发使用之外,还有一个目的就是,可以支持更多定制化的设计。也就是说,用户可以在基本指令集上面,进行一个或者多个的指令集扩展操作,但是有一个条件,不能再重新定义基本指令集。也就是说,任何一款基于RISC-V指令集的处理器,都要能够支撑整数基本指令集。可以看出基本指令集的重要性。

在以前的文章中,我分享了RISC-V在设计的初衷,除了可以被通用软件开发使用之外,还有一个目的就是,可以支持更多定制化的设计。也就是说,用户可以在基本指令集上面,进行一个或者多个的指令集扩展操作,但是有一个条件,不能再重新定义基本指令集。也就是说,任何一款基于RISC-V指令集的处理器,都要能够支撑整数基本指令集。可以看出基本指令集的重要性。

基本指令格式

那么今天我们就继续来分享一下,在基本指令集体系机构中(ISA),四种核心指令格式(R/I/S/U)。基本指令格式如下图所示:

图一 RISC-V 基本指令格式

从上图中,我们可以看出这四种核心指令格式有以下三个特点:

  1. 所有指令的长度固定,都为32位,以4字节边界对齐;
  2. 源寄存器rs1\rs2,以及目标寄存器rd的位置保持不变;
  3. 将立即数的符号位放置在最左边,方便进行符号扩展。

如果出现了条件分支或者无条件转移情况,并且地址没有按照4字节对齐时,就产生一个地址不对齐的异常。另外,为了指令译码简单,RISC-V   ISA将rs1、rs2和rd寄存器放在相同位置,这导致立即数不同比特被分散开。例如,当需要加载一个32位立即数时,通常由load指令给出高20bits,常规指令给出低12bits,两个共同拼为32bits。

需要说明的是,上面这些扩展都是有符号扩展,如果对无符号数进行扩展,并没有看到很明显的收益,所以对于无符号数而言,没有进行扩展的指令,这也使得整个ISA更加简洁。

立即数编码

立即数处理,除了上面四种之外,还有两种变形(SB/UJ),立即数基本指令格式如下图所示:

图二 立即数基本指令格式

对比图一和图二,我们不难看出,在SB格式中,(imm[10:1])和符号位被放在了固定的位置上面。SB中的最高位(imm[11])被刚在S格式中的最低位(inst[7])。U和UJ格式的区别与S和SB类似,就不再赘述。

在指令集中,立即数的符号扩展操作非常重要,为了立即数操作的高效性,在RISC-V中,将所有立即数的符号位固定在了指令的31位,这使得在指令译码的时候,可以同时进行立即数的符号扩展操作。虽然将立即数放在在指令中的固定位置,对于一些复杂的实现来讲,收益有限(因为会有对应的硬件开销支撑),但是这一做法仍然可以降低硬件电路的开销。

小结

今天我们分享了RISC-V中的基本指令格式,以及立即数编码格式的内容。从上面可以看出,整个RISC-V指令集的设计出发点,都是为了提升指令编译的效率,并且使得整个指令集更加简单。后面,我会继续分享RISC-V的其他指令,包括整数计算指令、控制指令等内容,欢迎大家继续关注。

上述内容由久芯网www.9icnet.com编辑整理发布,请勿转载

目录
相关文章
|
并行计算 安全 开发者
RISC-V生态全景解析(五):Vector向量计算技术与SIMD技术的对比
芯片开放社区(OCC)面向开发者推出RISC-V系列内容,通过多角度、全方位解读RISC-V,系统性梳理总结相关理论知识,构建RISC-V知识图谱,促进开发者对RISC-V生态全貌的了解。
3618 0
RISC-V生态全景解析(五):Vector向量计算技术与SIMD技术的对比
|
网络协议 Linux 网络架构
Linux三种网络模式 | 仅主机、桥接、NAT
Linux三种网络模式 | 仅主机、桥接、NAT
1922 0
|
12月前
|
安全 程序员 编译器
【实战经验】17个C++编程常见错误及其解决方案
想必不少程序员都有类似的经历:辛苦敲完项目代码,内心满是对作品品质的自信,然而当静态扫描工具登场时,却揭示出诸多隐藏的警告问题。为了让自己的编程之路更加顺畅,也为了持续精进技艺,我想借此机会汇总分享那些常被我们无意间忽视却又导致警告的编程小细节,以此作为对未来的自我警示和提升。
1236 105
|
12月前
|
缓存 监控 JavaScript
|
12月前
|
设计模式 Java
Java“不能转换的类型”解决
在Java编程中,“不能转换的类型”错误通常出现在尝试将一个对象强制转换为不兼容的类型时。解决此问题的方法包括确保类型间存在继承关系、使用泛型或适当的设计模式来避免不安全的类型转换。
1336 7
|
机器学习/深度学习 自然语言处理 TensorFlow
使用Python实现深度学习模型:BERT模型教程
使用Python实现深度学习模型:BERT模型教程
1218 0
|
开发工具 git
完美解决 fatal: unable to access ‘https://github.com/.../.git‘: Could not resolve host: github.com
完美解决 fatal: unable to access ‘https://github.com/.../.git‘: Could not resolve host: github.com
35298 1
|
安全 中间件 编译器
【C/C++ 原子操作】深入浅出:从互斥锁到无锁编程的转变 - 理解C++原子操作和内存模型
【C/C++ 原子操作】深入浅出:从互斥锁到无锁编程的转变 - 理解C++原子操作和内存模型
6186 3
|
人工智能 Linux Shell
Linux——vim简介、配置方案(附带超美观的配置方案)、常用模式的基本操作
Linux——vim简介、配置方案(附带超美观的配置方案)、常用模式的基本操作
1230 2
|
SoC 内存技术
深入理解AMBA总线(五)AHB-lite Transfer进阶
深入理解AMBA总线(五)AHB-lite Transfer进阶
1198 0