RV32A指令集
RV32A指令包括两类:AMO(atomic memory operation)指令,Load-Reserved/Store-Conditional指令
| Category | Fmt | RV32I base | machine code(bin) | comment | |
| AMO(atomic memory-operation指令 |
从地址rs1指定的存储器中读出一个数据,存放到rd寄存器中,并且将读出的数据和rs2寄存器中的值进行计算,再将结果写回rs1指定的存储器中。 | R | amoswap.w rd, rs2,(rs1) | 00001[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd]0101111 | 将读出的数据与rs2寄存器的值进行互换。 |
| R | amoadd.w rd, rs2,(rs1) | 00000[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd]0101111 | 将读出的数据与rs2寄存器的值进行加法操作。 | ||
| R | amoand.w rd, rs2,(rs1) | 01100[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd]0101111 | 将读出的数据与rs2寄存器的值进行与运算。 | ||
| R | amoor.w rd, rs2,(rs1) | 01000[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd]0101111 | 将读出的数据与rs2寄存器的值进行或操作。 | ||
| R | amoxor.w, rd, rs2,(rs1) | 00100[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd]0101111 | 将读出的数据与rs2寄存器的值进行异或操作。 | ||
| R | amomax.w, rd, rs2,(rs1) | 10100[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd]0101111 | 将读出的数据与rs2寄存器的值进行(当作有符号数)取最大值操作。 | ||
| R | amomaxu.w rd, rs2,(rs1) | 11100[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd]0101111 | 将读出的数据与rs2寄存器的值进行(当作无符号数)取最大值操作。 | ||
| R | amomin.w rd, rs2,(rs1) | 10000[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd]0101111 | 将读出的数据与rs2寄存器的值进行(当作有符号数)取最小值操作。 | ||
| R | amominu.w rd, rs2,(rs1) | 11000[26,aq][25,rl]00000[19-15,rs1]010[11-7,rd]0101111 | 将读出的数据与rs2寄存器的值进行(当作无符号数)取最小值操作。 | ||
| Load_Reserved/store-conditional指令 | R | lr.w rd, (rs1) | 00001[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd]0101111 | 从rs1指定的存储器地址中读出一个32位数据,结果放入rd中。 | |
| R | lsc.w rd, rs2,(rs1) | 00010[26,aq][25,rl][20-24,rs2][19-15,rs1]010[11-7,rd]0101111 | 向rs1指定存储器地址中写入一个32位数据,数据来自于rs2寄存器。Sc指令不一定能够执行成功,只有满足一下条件,才能执行成功。 1.LR和SC指定成对的访问相同的地址。 2.LR和SC指令之间没有任何其他的写操作(来自任何一个hart)访问过相同的地址。 3.LR和SC指令之间没有任何中断与异常发生。 4.LR和SC指令之间没有任何的MRET指令。 如果执行成功,则向rd寄存器中写回数值0,如果失败,则向rd寄存器中写回一个非0值。如果执行失败,意味着没有真正写入存储器。 |
||

计算机体系结构中的存储器模型(或者说存储器一致性模型)主要分为三类:按序一致性模型,松散一致性模型,释放一致性模型。
更详细存储器一致性介绍请看:https://blog.csdn.net/jfengamarsoft/article/details/70923658?utm_source=blogxgwz2
按序一致性模型就是严格按序模型,如果处理器指令集架构符合按序一致性模型,那么多个处理器核上执行的程序就好像一个单核处理器上顺序执行一样。例如两个处理器核core0,core1,core0上执行了A,B,C,D四条存储器访问指令,core1 上执行了a,b,c,d四条访存指令。按序一致性模型系统上执行这8条指令的效果就好像在一个core上顺序执行了A a B b C c D d的指令流,或者A B a b C c D d,或者其他顺序,总之,只要符合core0和core1程序顺序,即从core0看,是A,B,C,D,从core1看是a,b,c,d的任意顺序都是合法的。
按序一致性模型的两条规则:
1.各个处理器核安装其程序顺序来执行,执行完一条厚启动执行下一条指令,不能改变存储器访问指令的顺序(即便访问的是不同的存储器地址)。
2.从全局看,每一个存储器写指令的操作都需要能够被系统中的所有处理器核同时观测到。就好像处理器系统(包括所有的处理器核)和存储系统之间有一个开关,一次只会连接一个处理器核和存储系统,因此对存储器的访问都是原子的,串行化的。
松散一致性模型:对于不同存储器访问指令,就单核而言,理论上是可以改变其执行顺序的。松散一致性模型允许多核系统中,每个单核改变其存储器访问指令(比如是访问不同的地址)的执行顺序。
松散一致性模型可以通过fence指令,来同步多核之间的存储器访问。在fence之前的所有存储器访问指令,必须比该fence指令之后的所有存储器访问指令先执行。
释放一致性模型进一步支持获取(acquire)释放(release)机制:
定义一种获取acquire指令,它仅屏障其之前的所有存储器访问操作。
定义一种释放release指令,它仅屏障其之后的所有存储器访问。
AMO指令要求整个读出,计算,写回必须为原子性质,就是读出和写回之间,该存储器地址不能被其它进程访问,通常总线会锁定。

AMO指令也可以支持释放一致性模型,可以通过指令中的aq/rl位,来设置获取或释放属性。
amoswap.w rd, rs2,(rs1) 指令不具有获取和释放属性,不具备屏障功能。
amoswap.w.aq rd, rs2,(rs1) 指令具有获取属性,能够屏蔽其之后的所有存储器访问操作。
amoswap.w.rl rd, rs2,(rs1)指令具有释放属性,能够屏蔽其之前的所有存储器访问操作。
amoswap.w.aqrl rd, rs2,(rs1)指令具有获取释放属性,能够屏蔽其之前之后的所有存储器访问操作。
AMO指令实现上锁操作例子:
li t0, 1 #t0寄存器初始值为1
again:
amoswap.w.aq t0, t0, (a0)
bnez t0, again #如果锁中的值非0,意味着当前的锁仍然被其它进程占用,因此从新读取该锁的值。
…
critical section
…
amoswap.w.rl x0, x0,(a0) #写操作完成,向锁中写0
对于RV32A,LR/SC指令访问的地址,必须32位对齐,否则会产生异常,LR/SC指令也支持释放一致性模型,和AMO指令类似。
LR/SC 能够实现lock-free 数据结构.
下面是一个inline的比较交换函数,仅需要3条指令。
# a0 holds address of memory location
# a1 holds expected value
# a2 holds desired value
# a0 holds return value, 0 if successful, !0 otherwise
cas:
lr.w t0, (a0) # Load original value.
bne t0, a1, fail # Doesn’t match, so fail.
sc.w a0, a2, (a0) # Try to update.
jr ra # Return.
fail:
li a0, 1 # Set return to failure.
jr ra # Return.
RV32A指令集的更多相关文章
- Risc-V指令集
https://riscv.org/specifications/ Risc-V文档包括:用户层指令集文档和特权架构文档,下面这两个文件的官网链接. User-Level ISA Specificat ...
- SSE指令集学习:Compiler Intrinsic
大多数的函数是在库中,Intrinsic Function却内嵌在编译器中(built in to the compiler). 1. Intrinsic Function Intrinsic Fun ...
- ARM-汇编指令集(总结)
ARM汇编指令集 指令.伪指令 (汇编)指令: 是机器码的助记符,经过汇编器编译后,由CPU执行. (汇编)伪指令:用来指导指令执行,是汇编器的产物,最终不会生成机器码. 有两种不同风格的ARM指 ...
- iOS------苹果设备处理器指令集(iPhone初代到iPhone5s)
(via 雅香小筑) Arm处理器,因为其低功耗和小尺寸而闻名,几乎所有的手机处理器都基于arm,其在嵌入式系统中的应用非常广泛,它的性能在同等功耗产品中也很出色. Armv6.armv7.armv7 ...
- SSE指令集优化学习:双线性插值
对SSE的学习总算迈出了第一步,用2天时间对双线性插值的代码进行了优化,现将实现的过程梳理以下,算是对这段学习的一个总结. 1. 什么是SSE 说到SSE,首先要弄清楚的一个概念是SIMD(单指令多数 ...
- RISC指令集的五个周期
RISC指令集的五个周期 RISC(reduced instruction set computer,精简指令集计算机)简称为精简指令集.RISC把执行指令的精力主要放在了经常使用的指令上面.本文主要 ...
- x86指令集同频性能提升
x86近5000条指令,迄今为止最复杂的指令集.这里不研究CISC & RISC,也不考虑process制程变化,主要是看最近几代IA架构对于同频率下性能的提升. x86指令集nasm文档 h ...
- CPU指令集
cpu作为一台电脑中的核心,它的作用是无法替代的.而cpu本身只是在块硅晶片上所集成的超大规模的集成电路,集成的晶体管数量可达到上亿个,是由非常先进复杂的制造工艺制造出来的,拥有相当高的科技含量. C ...
- 在UWP应用中加入Cortana语音指令集
本文介绍小娜语音指令集的使用场景,如何将UWP应用接入小娜的语音指令集,使用户直接通过小娜启动应用并使用应用中 一些轻量级的功能.文中以必应词典作为实例讲解必应词典UWP版本是如何接入小娜语音功能的. ...
随机推荐
- Vue父子组件之间通信
1.父 -> 子.通过props //father.vue <template> <div id="father"> <div><l ...
- Java 内部类.md
Java 内部类 学习自 <Java编程思想> Overview 什么是内部类? Thinking In Java 中如此定义: 将一个类的定义放在里另一个类的定义的内部,这就是内部类. ...
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) B. Verse Pattern 水题
B. Verse Pattern 题目连接: http://codeforces.com/contest/722/problem/B Description You are given a text ...
- POP3_关于 multipart/related;boundary=
http协议对mime类型有详细描述,multipart/....是单个消息头包含多个消息体的解决方案.multipart媒体类型对发送非文本的各媒体类型是有用的.目前常用的有这些subtype: M ...
- FireDAC 下的 Sqlite [3] - 获取数据库的基本信息
在空白窗体上添加: TFDConnection, TFDPhysSQLiteDriverLink, TFDGUIxWaitCursor, TMemo procedure TForm1.FormCrea ...
- 设计模式之七:模板方法模式(Template Method)
模板方法模式: 定义了一个算法的基本操作骨架,并将算法的一些步骤延迟到子类中来实现. 模板方法模式让子类在不更改算法结构的前提下能够又一次定义算法的一些步骤. Define the skeleton ...
- POJ 2546 & ZOJ 1597 Circular Area(求两圆相交的面积 模板)
题目链接: POJ:http://poj.org/problem? id=2546 ZOJ:problemId=597" target="_blank">http: ...
- SuperPro 3000U 编程器电源部分
- RabbitMQ高级指南:从配置、使用到高可用集群搭建
本文大纲: 1. RabbitMQ简介 2. RabbitMQ安装与配置 3. C# 如何使用RabbitMQ 4. 几种Exchange模式 5. RPC 远程过程调用 6. RabbitMQ高可用 ...
- 初探C++类模版学习笔记
类模板 实现:在定义类的时候给它一个或多个參数,这个些參数表示不同的数据类型. -->抽象的类. 在调用类模板时, 指定參数, 由编译系 ...