RISC-V架构的压缩指令集介绍

1、压缩指令集介绍

  • RISC-V的压缩指令集(C扩展)‌是一种设计用于减少代码大小和提高性能的技术。标准的RISC-V指令是32位,压缩指令集可以将部分32位的指令用16位的指令替代,从未减小程序占用存储空间的大小,提高指令密度,也可以提高指令缓存的命中率本
  • 优势:
    • 高指令密度: 相同的存储空间可以存储更多的指令,从而提高代码的紧凑性和执行效率
    • 低功耗:由于指令的紧凑性,处理器在执行这些指令时需要更少的能量,这对于嵌入式设置来说是一个显著的优势
  • 劣势:
    • 性能可能受限:在某些高性能场景中,性能不如传统的非压缩指令集。这是因为压缩指令集可能牺牲了一些执行速度和灵活性来换取更高的密度和效率
    • 兼容性问题:由于RISC-V架构是相对较新的架构,其压缩指令集在现有的软件和工具链中的支持可能不如传统的非压缩指令集完善。

2、识别压缩指令集和非压缩指令集

2.1、源文件

#include <stdio.h>int main(void)
{int temp = 1;printf("temp=%d\n", temp);return 0;
}

2.2、使用压缩指令集

在这里插入图片描述

  • 编译命令:
    • riscv64-unknown-elf-gcc test.c -mabi=lp64d -march=rv64imadc
  • 反汇编命令:
    • 反汇编命令:riscv64-unknown-elf-objdump -dS ./a.out > test_c.dis
  • 压缩指令集的指令长度是2Byte,非压缩指令集的指令长度是4Byte
  • 不是所有的指令都可以用压缩指令集替代,编译器在编译时会判断哪些指令能用压缩指令集哪些不能用,所以使用压缩指令集并不是所有的指令都会变成压缩指令集

2.3、不使用压缩指令集

00000000000101a4 <main>:101a4:	fe010113          	addi	sp,sp,-32101a8:	00113c23          	sd	ra,24(sp)101ac:	00813823          	sd	s0,16(sp)101b0:	02010413          	addi	s0,sp,32101b4:	00100793          	li	a5,1101b8:	fef42623          	sw	a5,-20(s0)101bc:	fec42783          	lw	a5,-20(s0)101c0:	00078593          	mv	a1,a5101c4:	0001c7b7          	lui	a5,0x1c101c8:	67078513          	addi	a0,a5,1648 # 1c670 <__clzdi2+0x3a>101cc:	152000ef          	jal	ra,1031e <printf>101d0:	00000793          	li	a5,0101d4:	00078513          	mv	a0,a5101d8:	01813083          	ld	ra,24(sp)101dc:	01013403          	ld	s0,16(sp)101e0:	02010113          	addi	sp,sp,32101e4:	00008067          	ret
  • 编译命令:
    • riscv64-unknown-elf-gcc test.c -mabi=lp64d -march=rv64imad
  • 反汇编命令:
    • riscv64-unknown-elf-objdump -dS ./a.out > test.dis
  • 所有的指令都是非压缩指令,指令长度都是4Byte

2.4、压缩指令集和非压缩指令集的区别

  • 压缩指令集的指令长度是2Byte,非压缩指令集的指令长度是4Byte
  • 压缩指令集的指令长度比较短,但是功能受限,不是所有的非压缩指令都可以用压缩指令替代,具体哪些可以替代编译器会判断
  • 压缩指令集只有16bit来表示信息,非压缩指令有32bit来表示信息,所以压缩指令集的功能是受限的,压缩指令集可以理解成裁剪版的非压缩指令集 (比如跳转指令,非压缩的跳转指令的跳转范围就要比压缩的跳转指令范围更大)

3、使用压缩指令集

  • 在编译时指定要使用压缩指令集:-march=rv64imadc
    • march:是在编译时指定架构和支持的指令集
    • rv64:表示RISC-V架构的64位CPU
    • imadc:是表示CPU支持的指令集,每个字母代表一种指令集,其中c就是压缩指令集
    • 选择压缩指令集后,在编译时,编译器会自动判断,将能用压缩指令替换非压缩指令的地方都替换成压缩指令,这个过程,程序员不需要感知
  • 在内嵌汇编中使用压缩指令(编译参数-march必须添加c指令集):
    • 内嵌汇编可以参考博客:《RISC-V架构学习——C语言内嵌汇编总结》
    • 每个指令都有压缩版本和非压缩版本,比如add指令
      • add:非压缩版本
      • c.add:添加前缀c表示使用压缩版本
  • 内嵌汇编里直接使用压缩指令,在编译时可能会报错,因为压缩版本的指令是有很多限制的,不是所有的地方都可以使用压缩指令,不如果不是对指令集细节特别清楚,不建议在内嵌汇编里使用压缩指令

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

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

相关文章

Day13 苍穹外卖项目 工作台功能实现、Apache POI、导出数据到Excel表格

目录 1.工作台 1.1 需求分析和设计 1.1.1 产品原型 1.1.2 接口设计 1.2 代码导入 1.2.1 Controller层 1.2.2 Service层接口 1.2.3 Service层实现类 1.2.4 Mapper层 1.3 功能测试 1.4 代码提交 2.Apache POI 2.1 介绍 2.2 入门案例 2.2.1 将数据写入Excel文件 2.2.2 读取Excel文…

集星獭 | 高性能编排:为实时数据集成而生!

概要介绍 服务编排作为集星獭驱动业务流、数据流中不可或缺的重要环节&#xff0c;其基于分布式架构打造&#xff0c;提供了高可用、易扩展的可视化流程任务调度功能。 原服务编排的设计初衷是专注于任务调度&#xff0c;提供高性能任务调度&#xff0c;但是在实时调用方面的…

达梦8-达梦数据的示例用户和表

1、示例库说明&#xff1a; 创建达梦数据的示例用户和表&#xff0c;导入测试数据。 在完成达梦数据库的安装之后&#xff0c;在/opt/dmdbms/samples/instance_script目录下有用于创建示例用户的SQL文件。samples目录前的路径根据实际安装情况进行修改&#xff0c;本文将达梦…

windwos defender实现白名单效果(除了指定应用或端口其它一律禁止)禁止服务器上网

一、应用场景说明 当我们的一台windows服务器中毒&#xff0c;变成别人肉鸡&#xff0c;不断向外请示非法网站或攻击其它服务器。 要彻底清除相关木马或病毒往往需要的时间比较长&#xff0c;比较有效的方法是禁止服务器主动向外发包除了网站端口和远程程序除外。 其实这就是一…

1 JVM JDK JRE之间的区别以及使用字节码的好处

JDK jdk是编译java源文件成class文件的&#xff0c;我们使用javac命令把java源文件编译成class文件。 我们在java安装的目录下找到bin文件夹&#xff0c;如下图所示: 遵循着编译原理&#xff0c;把java源文件编译成JVM可识别的机器码。 其中还包括jar打包工具等。主要是针对…

【机器人】机械臂轨迹和转矩控制对比

动力学控制和轨迹跟踪控制是机器人控制中的两个概念&#xff0c;它们在目标、方法和应用上有所不同&#xff0c;但也有一定关联。以下是它们的区别和联系&#xff1a; 1. 动力学控制 动力学控制是基于机器人动力学模型的控制方法&#xff0c;目标是控制机器人关节力矩或力&…

Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类

Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类 CIFAR10数据集ParNet架构特点优势应用 ParNet结构代码详解结构代码代码详解SSEParNetBlock 类DownsamplingBlock 类FusionBlock 类ParNet 类 训练过程和测试结果代码汇总parnet.pytrain.pytest.py 前面文章我们构…

Go1.21.0 到 Go1.23.0 的改动,向前兼容性和toolchain规则,Go1.21.0,必须升级你的Go啦

Go各版本Release Note Go1.21.0 2023-08-08 https://go.dev/doc/go1.21 内置方法 min & max&#xff1a;返回一个序列中的最大值最小值。 https://go.dev/ref/spec#Min_and_max clear&#xff1a;清空map和slice。 https://go.dev/ref/spec#Clear 标准库 log/slo…

Unity中的委托和事件(UnityAction、UnityEvent)

委托和事件 &#x1f392;什么是委托&#xff0c;委托的关键字是Delegate&#xff0c;委托是一种函数的容器&#xff0c;运行将函数做为变量来进行传递 通过Delegate关键字我们声明了一个无参无返回的委托&#xff0c;通过这个委托我们可以存储无参无返回的函数 public deleg…

uniapp v-tabs修改了几项功能,根据自己需求自己改

根据自己的需求都可以改 这里写自定义目录标题 1.数组中的名字过长&#xff0c;导致滑动异常2.change 事件拿不到当前点击的数据&#xff0c;通过index在原数组中查找得到所需要的id 各种字段麻烦3.添加指定下标下新加红点显示样式 1.数组中的名字过长&#xff0c;导致滑动异常…

CAD xy坐标标注(跟随鼠标位置实时移动)——C#插件实现

效果如下&#xff1a; &#xff08;使用方法&#xff1a;命令行输入 “netload” 加载此dll插件&#xff0c;然后输入“zbbz”运行&#xff0c;选择文件夹即可。支持字体大小变化&#xff0c;输入“zbbd”可设置坐标字体变大或缩小的倍数&#xff09; 部分代码如下&#xff1a;…

【C#】实现Json转Lua (Json2Lua)

关键词: C#、JsonToLua、Json2Lua、对象序列化Lua 前提需引入NewtonsofJson&#xff0c;引入方法可先在Visual Studio 2019 将Newtonsoft.Json.dll文件导入Unity的Plugins下。 Json格式字符串转Lua格式字符串&#xff0c;效果如下&#xff1a; json字符串 {"1": &q…

Redis 7.x如何安装与配置?保姆级教程

大家好&#xff0c;我是袁庭新。最新写了一套最新版的Redis 7.x企业级开发教程&#xff0c;今天先给大家介绍下Redis 7.x如何在Linux系统上安装和配置。 1 Redis下载与安装 使用非关系型数据库Redis必须先进行安装配置并开启Redis服务&#xff0c;然后使用对应客户端连接使用…

Redis篇--常见问题篇6--缓存一致性1(Mysql和Redis缓存一致,更新数据库删除缓存策略)

1、概述 在使用Redis作为MySQL的缓存层时&#xff0c;缓存一致性问题是指Redis中的缓存数据与MySQL数据库中的实际数据不一致的情况。这可能会导致读取到过期或错误的数据&#xff0c;从而影响系统的正确性和用户体验。 为了减轻数据库的压力&#xff0c;通常读操作都是先读缓…

git remote -v(--verbose)显示你的 Git 仓库配置的远程仓库的详细信息

git remote -v 是一个 Git 命令&#xff0c;用于显示你的 Git 仓库配置的远程仓库的详细信息。 当你执行 git remote -v 命令时&#xff0c;你会看到类似以下的输出&#xff1a; origin https://github.com/your-username/your-repo.git (fetch) origin https://github.com…

[计算机网络]唐僧的”通关文牒“NAT地址转换

1.NAT&#xff1a;唐僧的通关文牒 在古老的西游记中&#xff0c;唐僧师徒四人历经九九八十一难&#xff0c;终于取得了真经。然而&#xff0c;他们并不是一开始就获得了通关文牒&#xff0c;而是经过了重重考验&#xff0c;最终得到了国王的认可&#xff0c;才顺利通过了各个关…

WPF实现曲线数据展示【案例:震动数据分析】

wpf实现曲线数据展示&#xff0c;函数曲线展示&#xff0c;实例&#xff1a;震动数据分析为例。 如上图所示&#xff0c;如果你想实现上图中的效果&#xff0c;请详细参考我的内容&#xff0c;创作不易&#xff0c;给个赞吧。 一共有两种方式来实现&#xff0c;一种是使用第三…

7 家使用量子计算的公司

劳斯莱斯、Deloitte、BASF、Roche、富士通、JPMorgan和宝马是率先开展量子计算实验的部分公司。 商用量子计算的实现仍需数年时间&#xff0c;但这并未阻止世界上一些知名企业对其进行试验。在许多情况下&#xff0c;利用当下有噪声的中等规模量子&#xff08;NISQ&#xff09…

jvm字节码中方法的结构

“-Xss”这一名称并没有一个特定的“为什么”来解释其命名&#xff0c;它更多是JVM&#xff08;Java虚拟机&#xff09;配置参数中的一个约定俗成的标识。在JVM中&#xff0c;有多个配置参数用于调整和优化Java应用程序的性能&#xff0c;这些参数通常以一个短横线“-”开头&am…

【服务器】MyBatis是如何在java中使用并进行分页的?

MyBatis 是一个支持普通 SQL 查询、存储过程和高级映射的持久层框架。它消除了几乎所有的 JDBC 代码和参数的手动设置以及结果集的检索。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java 的 POJO&#xff08;Plain Old Java Objects&#xff0c;普通老式 …