RISC-V基础之浮点指令(包含实例)

RISC-V体系结构定义了可选的浮点扩展,分别称为RVF、RVD和RVQ,用于操作单精度、双精度和四倍精度的浮点数。RVF/D/Q定义了32个浮点寄存器,f0到f31,它们的宽度分别为32位、64位或128位。当一个处理器实现了多个浮点扩展时,它使用浮点寄存器的低位部分来执行低精度的指令。f0到f31与程序(也称为整数)寄存器x0到x31是分开的。与程序寄存器一样,浮点寄存器也按照约定用于某些特定的目的

 

RISC-V的浮点指令分为以下几类:
- 浮点加载和存储指令:用来在内存和浮点寄存器之间传输浮点数。例如,FLW指令从内存加载一个单精度浮点数到浮点寄存器,FSW指令将一个单精度浮点数从浮点寄存器存储到内存。
- 浮点计算指令:用来在浮点寄存器之间进行浮点数的加、减、乘、除、平方根等运算。例如,FADD.S指令将两个单精度浮点数相加,FDIV.D指令将两个双精度浮点数相除。
- 浮点转换指令:用来在不同的浮点数格式或整数格式之间转换浮点数。例如,FCVT.S.D指令将一个双精度浮点数转换为一个单精度浮点数,FCVT.W.S指令将一个单精度浮点数转换为一个32位整数。
- 浮点比较指令:用来在浮点寄存器之间进行浮点数的相等、小于、小于等于等比较,并将布尔结果记录在整数寄存器中。例如,FEQ.S指令判断两个单精度浮点数是否相等,FLT.D指令判断两个双精度浮点数是否小于。
- 浮点移动指令:用来在整数寄存器和浮点寄存器之间传输数据,不改变数据的位模式。例如,FMV.X.W指令将一个单精度浮点数从浮点寄存器移动到整数寄存器,FMV.W.X指令将一个32位整数从整数寄存器移动到浮点寄存器。
- 浮点类别化指令:用来判断一个浮点数是否属于某个特定的类别,如正无穷、负无穷、非数字(NaN)等,并将布尔结果记录在整数寄存器中。例如,FCLASS.S指令将一个单精度浮点数的类别编码为一个12位的位向量,并放入整数寄存器。

```riscv
# RISC-V floating-point program to calculate pi
# using the Gregory-Leibniz series
# pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...
# f0: the result (pi)
# f1: the current term
# f2: the denominator
# f3: the sign (-1 or 1)
# f4: the constant 4.0
# f5: the constant 1.0
# f6: the constant -1.0
# t0: the loop counter.datan: .word 1000000 # number of terms to compute.text# initialize registersflw f4, =4.0 # f4 = 4.0flw f5, =1.0 # f5 = 1.0flw f6, =-1.0 # f6 = -1.0fmv.s f0, f5 # f0 = 1.0 (result)fmv.s f1, f5 # f1 = 1.0 (term)fmv.s f2, f5 # f2 = 1.0 (denominator)fmv.s f3, f5 # f3 = 1.0 (sign)lw t0, n # t0 = n (loop counter)loop:# update the resultfsub.s f0, f0, f1 # f0 = f0 - f1# update the termfadd.s f2, f2, f4 # f2 = f2 + 4.0fdiv.s f1, f3, f2 # f1 = f3 / f2# update the signfneg.s f3, f3 # f3 = -f3# update the loop counteraddi t0, t0, -1 # t0 = t0 - 1# check the loop conditionbnez t0, loop # if t0 != 0, go to loop# multiply the result by 4fmul.s f0, f0, f4 # f0 = f0 * 4.0# return the result in a0fcvt.w.s a0, f0 # a0 = (int)f0

这个程序示例是用RISC-V的单精度和双精度浮点指令来计算圆周率近似值的。它使用了Gregory-Leibniz级数,这一般项是(-1)^n / (2n+1),它的和等于pi/4。也就是说,pi/4 = 1 - 1/3 + 1/5 - 1/7 + …。这个程序使用了递归函数来计算这个级数的前n项的和,其中n是一个全局变量,可以在程序中修改。

 

它的功能是将数组中的每个元素加上10,并将结果存回数组中。它的主要步骤如下:

  • 首先,代码在s0寄存器中存放了数组scores的基地址,这个数组有200个元素,每个元素占4个字节。代码还在s1寄存器中初始化了一个循环计数器i为0,在t2寄存器中存放了一个循环终止条件200,在t3寄存器中存放了一个常数10,在ft0浮点寄存器中存放了一个单精度浮点数10.0。
  • 然后,代码进入一个for循环,每次循环都对数组中的一个元素进行操作。循环的条件是i < 200,如果不满足就跳转到done标签处结束程序。
  • 在循环体中,代码首先计算数组中第i个元素的地址,方法是将i左移2位(相当于乘以4),然后加上s0(基地址)。这个地址被保存在t3寄存器中。
  • 然后,代码使用flw指令从t3寄存器指向的内存地址加载一个单精度浮点数到ft1浮点寄存器中,这个浮点数就是scores[i]。
  • 接着,代码使用fadd.s指令将ft1和ft0两个浮点寄存器中的值相加,并将结果保存在ft1中。这相当于执行了scores[i] = scores[i] + 10.0。
  • 然后,代码使用fsw指令将ft1寄存器中的值存储到t3寄存器指向的内存地址中,这相当于将修改后的scores[i]写回数组中。
  • 最后,代码使用addi指令将s1寄存器(循环计数器i)加上1,并跳转到for标签处继续下一次循环。

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

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

相关文章

边写代码边学习之RNN

1. 什么是 RNN 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种以序列数据为输入来进行建模的深度学习模型&#xff0c;它是 NLP 中最常用的模型。其结构如下图&#xff1a; x是输入&#xff0c;h是隐层单元&#xff0c;o为输出&#xff…

Spring Cloud Eureka 和 zookeeper 的区别

CAP理论 在了解eureka和zookeeper区别之前&#xff0c;我们先来了解一下这个知识&#xff0c;cap理论。 1998年的加州大学的计算机科学家 Eric Brewer 提出&#xff0c;分布式有三个指标。Consistency&#xff0c;Availability&#xff0c;Partition tolerance。简称即为CAP。…

Istio 安全 mTLS认证 PeerAuthentication

这里定义了访问www.ck8s.com可以使用http也可以使用https访问&#xff0c;两种方式都可以访问。 那么是否可以强制使用mtls方式去访问&#xff1f; mTLS认证 PeerAuthentication PeerAuthentication的主要作用是别人在和网格里的pod进行通信的时候&#xff0c;是否要求mTLS mTL…

完全背包问题

题目链接 题意&#xff1a;在01背包的基础上多了每个物品都可以无限取的条件 思路&#xff1a;首先考虑在01背包的基础上的暴力枚举&#xff0c;我们可以在枚举前i件物品最多拿j的容量时再遍历当前物品拿的数量 贴一个暴力tle代码&#xff1a; #include<bits/stdc.h> #d…

分布式电网动态电压恢复器模拟装置电子设计大赛

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;85电网 获取完整论文报告结构框图工程源文件 摘要&#xff1a;本装置采用DC-AC及AC-DC-AC双重结构&#xff0c;前级采用功率因数校正&#xff08;PFC&#xff09;电路完成AC-DC变换&#xff0c;改善输入端电网电能质量。后…

靶形数独

题目描述 小城和小华都是热爱数学的好学生&#xff0c;最近&#xff0c;他们不约而同地迷上了数独游戏&#xff0c;好胜的他们想用数独来一比高低。但普通的数独对他们来说都过于简单了&#xff0c;于是他们向 Z 博士请教&#xff0c;Z 博士拿出了他最近发明的“靶形数独”&am…

YOLOv5入门

模型检测 关键参数 weights:训练好的模型文件 source: 检测的目标&#xff0c;可以是单张图片、文件夹、屏幕或者摄像头等 conf-thres: 置信度闯值&#xff0c;越低框越多&#xff0c;越高框越少 iou-thres: IOU闻值&#xff0c;越低框越少&#xff0c;越少框越多 torch.hu…

opencv-32 图像平滑处理-高斯滤波cv2.GaussianBlur()

在进行均值滤波和方框滤波时&#xff0c;其邻域内每个像素的权重是相等的。在高斯滤波中&#xff0c;会将中心点的权重值加大&#xff0c;远离中心点的权重值减小&#xff0c;在此基础上计算邻域内各个像素值不同权重 的和。 基本原理 在高斯滤波中&#xff0c;卷积核中的值不…

阶段总结(linux基础)

目录 一、初始linux系统 二、基本操作命令 三、目录结构 四、文件及目录管理命令 查看文件内容 创建文件 五、用户与组管理 六、文件权限与压缩管理 七、磁盘管理 八、系统程序与进程管理 管理机制 文件系统损坏 grub引导故障 磁盘资源耗尽 程序与进程的区别 查…

layui之layer弹出层的icon数字及效果展示

layer的icon样式 icon如果在信息提示弹出层值(type为0)可以传入0-6&#xff0c;icon与图标对应关系如下&#xff1a; 如果是加载层&#xff08;type为3&#xff09;可以传入0-2&#xff0c;icon与图标对应关系如下&#xff1a;

【Java】批量生成条码

批量生成PDF条码 效果图&#xff1a; //调用下方接口注意编码格式if(CollectionUtil.isNotEmpty(productExList)){String exportFileName URLEncoder.encode("商品条码", "UTF-8") DateUtil.format(new Date(), "yyyyMMddHHmmss");response.…

“科创中国”青百会轮值主席吴甜:以大语言模型为代表的AI将引发产业变革

8月1日&#xff0c;“科创中国”青年百人会&#xff08;后文简称青百会&#xff09;联合百度举办“青创汇”高端对话&#xff0c;围绕人工智能技术创新与产业发展交流研讨&#xff0c;同时正式成立“科创中国”青年百人会女性工作委员会。该委员会将鼓励更多女性投身科技创新事…