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.mzph.cn/news/27414.shtml

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

相关文章

逻辑卷扩容

背景 服务器有3个逻辑卷&#xff0c;1个是1T&#xff0c;另外两个是500G&#xff0c;需要将500G的合并扩容为1T 操作 df -Th lsblk -f 查看磁盘大小卸载 /approot umount /approot vim /etc/fstab #注释掉/approot mount -a检查是否卸载完成 vgdisplay -v 找到approot所在…

开窗积累之学习更新版

1. 开窗使用1之 count range between current row and current row 将相同排序字段的值进行函数计算 selectsku_id,substr(create_date,1,7) date_month,order_id,create_date,sku_num*price,sum(sku_num*price) over (partition by sku_id order by substr(create_date,1,7)…

Spring Boot多级缓存实现方案

1.背景 缓存&#xff0c;就是让数据更接近使用者&#xff0c;让访问速度加快&#xff0c;从而提升系统性能。工作机制大概是先从缓存中加载数据&#xff0c;如果没有&#xff0c;再从慢速设备(eg:数据库)中加载数据并同步到缓存中。 所谓多级缓存&#xff0c;是指在整个系统架…

Kotlin重点理解安全性

目录 一 Kotlin安全性1.1 可空类型1.2 安全调用运算符1.3 Elvis 运算符1.4 非空断言运算符1.5 安全类型转换1.6 延迟初始化 一 Kotlin安全性 Kotlin 在设计时采用了一系列策略&#xff0c;旨在尽可能地减少空指针异常&#xff08;NullPointerException&#xff09;的出现。空指…

通用视觉大模型

ViT: Google Swin-Transformer: Microsoft V-MOE: Google SAM&#xff1a; Meta 盘古CV&#xff1a; 华为 文心UFO&#xff1a; 百度 … 预训练大模型 # 导入必要的库和模块 import argparse import json import pathlib# 定义 Stanford Alpaca 使用的 prompt 格式 PROMPT_D…

纯函数 和 函数柯里化 05 (待补充)

加油&#xff0c;今天周二啦&#xff01;&#x1f60d; 文章目录 前言一、js 的纯函数二、副作用三、纯函数的优势四、JavaScript 柯里化五、柯里化作用 - 让函数的职责单一六、柯里化作用 - 逻辑的复用七、自动柯里化函数&#xff08;我没理解&#xff0c;等我理解了再更&…

如何在洛谷自己出的题中出数据

首先&#xff0c;假如你要加1个数据&#xff1a; 打开Dev-c&#xff08;其他也行&#xff09; 填入输入数据&#xff1a; &#xff08;这个数据只是我编的&#xff09; 将这个东东保存为in文件&#xff08;第一个数据就名为001&#xff0c;第二个002&#xff09;&#xff1a…

2022 robocom 世界机器人开发者大赛-本科组(国赛)

RC-u1 智能红绿灯 题目描述&#xff1a; RC-u1 智能红绿灯 为了最大化通行效率同时照顾老年人穿行马路&#xff0c;在某养老社区前&#xff0c;某科技公司设置了一个智能红绿灯。 这个红绿灯是这样设计的&#xff1a; 路的两旁设置了一个按钮&#xff0c;老年人希望通行马路时会…

没有进度管理的项目,都是在做无用功

在项目管理过程中&#xff0c;最大的挑战之一是确保项目实施与计划保持一致。 项目实施过程是一个相对漫长的过程&#xff0c;其中受到许多因素的影响。如果项目实施没有按照原始项目计划进行&#xff0c;很容易导致项目偏离计划&#xff0c;最终可能导致项目停滞或失败。 当…

Maven出现报错 ; Unable to import maven project: See logs for details错误的多种解决方法

问题现象; IDEA版本&#xff1a; Maven 版本 &#xff1a; 3.3.9 0.检查 maven 的设置 &#xff1a;F:\softeware\maven\apache-maven-3.9.3\conf 检查setting.xml 配置 本地仓库<localRepository>F:\softeware\maven\local\repository</localRepository>镜像…

使用 Python 和 Flask 构建简单的 Restful API 第 1 部分

一、说明 我将把这个系列分成 3 或 4 篇文章。在本系列的最后&#xff0c;您将了解使用flask构建 restful API 是多么容易。在本文中&#xff0c;我们将设置环境并创建将显示“Hello World”的终结点。 我假设你的电脑上安装了python 2.7和pip。我已经在python 2.7上测试了本文…

Netty的只读ByteBuf

说明 通过io.netty.buffer.ByteBuf的asReadOnly()函数&#xff0c;可以返回一个只读的ByteBuf&#xff1b;通过isReadOnly()函数&#xff0c;可以判断该ByteBuf是否是只读的。 示例 package com.thb;import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled;publi…

基于java+Apriori算法的网络书城设计与实现

摘要 网络技术的发展市场的销售模式发生了巨大的改变&#xff0c;现在销售网站引用电子商务网站网站设计的基本流程&#xff0c;引用网站网站的开发生命周期法和结构化方法&#xff0c;使用JSP语言来设计并实现了书籍网上销售网站。本书籍销售网站分为前台、后台两个模块。前台…

汽车基础软件新「战争」:群雄混战,谁在抢跑?

中国车用基础软件迎来了发展的黄金窗口期。 当前&#xff0c;汽车电子电气架构正在加速向“跨域融合”的时代演进&#xff0c;汽车软件架构也在加速向SOA架构升级&#xff0c;软硬件分层解耦成为了实现“软件定义汽车”新开发模式的前提。 过去&#xff0c;汽车的所有功能开发…

Activiti7

文章目录 概述入门案例1.创建springboot项目pom.xml 2.获取ProcessEngine2.1 默认的方式2.2 编程方式获取2.3 表结构介绍 3.在线流程设计器 概述 官网地址&#xff1a;https://www.activiti.org/ Activiti由Alfresco软件开发&#xff0c;目前最高版本Activiti 7。是BPMN的一个…

Flutter iOS 集成使用 flutter boost

在 Flutter项目中集成完 flutter boost&#xff0c;并且已经使用了 flutter boost进行了路由管理&#xff0c;这时如果需要和iOS混合开发&#xff0c;这时就要到 原生端进行集成。 注意&#xff1a;之前建的项目必须是 Flutter module项目&#xff0c;并且原生项目和flutter m…

【Spring】Spring之事务底层源码解析

目的 能使用spring事务解决开发需求了解spring事务是如何被spring管理的了解spring事务底层原理实现&#xff0c;比如代理、事务传播机制等 Spring事务简单使用 配置数据源及事务管理器&#xff1a; Component ComponentScan("com.firechou.aop") EnableTransact…

bigemap如何添加高清在线地图?

说明&#xff1a;批量添加可以同时添加多个在线地图&#xff0c;一次性添加完成&#xff08;批量添加无法验证地址是否可以访问&#xff09; 添加后如下图&#xff1a; 第一步 &#xff1a; 制作地图配置文件&#xff1a;选择添加在线地图&#xff08;查看帮助&#xff09;。 …

Chatgpt AI newbing作画,文字生成图 BingImageCreator 二次开发,对接wxbot

开源项目 https://github.com/acheong08/BingImageCreator 获取cookie信息 cookieStore.get("_U").then(result > console.log(result.value)) pip3 install --upgrade BingImageCreator import os import BingImageCreatoros.environ["http_proxy"]…

基于 yolov8 的人体姿态评估

写在前面 工作中遇到&#xff0c;简单整理博文内容为使用预训练模型的一个预测 Demo测试图片来源与网络,如有侵权请告知理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停…