RISC-V指令集架构------RV32A原子操作扩展指令集

0 概述

    RV32A是RISC-V指令集架构中的原子性扩展指令,用于支持原子操作。原子操作是对共享内存中的数据进行操作的一种方式,可以保证多线程并发执行时的数据一致性。

    RV32A指令集扩展提供了一组原子指令,包括原子读、原子写、原子交换、原子比较和交换等指令。其中,原子读指令用于从内存中读取数据,原子写指令用于向内存中写入数据,原子交换指令用于在内存中进行原子交换操作,原子比较和交换指令用于比较内存中的值,并在比较成功时将新值写入内存中。

    另外,RV32A指令集扩展还提供了加载链接指令和加载条件指令,可以在原子操作时保证数据的完整性和正确性。它的寄存器长度为32位,可以支持32位原子操作。需要注意的是,在使用RV32A指令集扩展时,需要使用特定的原子寄存器,而不是通用的整数寄存器。原子寄存器的数量也是有限的,需要根据具体应用场景来确定所需的寄存器数量。

    总的来说,RV32A指令集扩展为RISC-V提供了原子操作的支持,可以保证多线程并发执行时的数据一致性和正确性。它可以满足多线程应用的需求,提高了系统的可靠性和稳定性。

1 RV32A指令集概述

    RV32A有两种类型的原子操作:

  • 内存原子操作(AMO)
  • 加载保留/条件存储(load reserved/store conditional)

具体的RV32A的扩展指令如下:

 与前边的基本整数指令集有所区别,fun7变味了fun5,用于增加了两位的标志位。

2 RV32A指令集详解

2.1 内存原子操作(AMO)

2.1.1 AMOSWAP.W指令(amoswap.w rd,rs2,(rs1))

x[rd] = AMO32(M[x[rs1]] SWAP x[rs2])
  • 原子字交换(Atomic Memory Operation: Swap Word),将内存中地址为x[rs1]的字记为t,把这个字变为x[rs2]的值,把x[rd]设为符号位扩展的t。

2.1.2 AMOADD.W指令(amoadd.w rd,rs2,(rs1))

x[rd] = AMO32(M[x[rs1]] + x[rs2])
  • 原子加字(Atomic Memory Operation: Add Word),将内存中地址为x[rs1]中的字记为t,把这个字变为t+x[rs2],把x[rd]设为符号位扩展的t。

2.1.3 AMOXOR.W指令(amoxor.w rd,rs2,(rs1))

x[rd] = AMO32(M[x[rs1]] ^ x[rs2])
  • 把内存中地址为x[rs1]中的字记为t,把这个字变为t和x[rs2]按位异或的结果,把x[rd]设为符号位扩展的t。

2.1.4 AMOAND.W指令(amoand.w rd,rs2,(rs1))

x[rd] = AMO32(M[x[rs1]] & x[rs2])
  • 原子字与(Atomic Memory Operation: AND Word),将内存中地址为x[rs1]中的字记为t,把这个字变为t和x[rs2]按位与的结果,把x[rd]设为符号位扩展的t。

2.1.5 AMOOR.W指令(amoor.w rd,rs2,(rs1))

x[rd] = AMO32(M[x[rs1]] | x[rs2])
  • 原子字或(Atomic Memory Operation: OR Word),将内存中地址为x[rs1]中的字记为t,把这个字变为t与x[rs2]按位或的结果,把x[rd]设为符号位扩展的t。

2.1.6 AMOMIN.W指令(amomin.w rd,rs2,(rs1))

x[rd] = AMO32(M[x[rs1]] MIN x[rs2])
  • 原子最小字(Atomic Memory Operation: Minimum Word),将内存中地址为x[rs1]中的字记为t,把这个字变为t和x[rs2]中的较小值(二进制补码比较),然后写入x[rd]。

2.1.7 AMOMAX.W指令(amomax.w rd,rs2,(rs1))

x[rd] = AMO32(M[x[rs1]] MAX x[rs2])
  • 原子最大字(Atomic Memory Operation: Maximum Word),将内存中地址为x[rs1]的字记为t,将这个字变为t和x[rs2]中较大的一个(用二进制补码表示),然后写入x[rd]。

2.1.8 AMOMINU.W指令(amominu.w rd,rs2,(rs1))

x[rd] = AMO32(M[x[rs1]] MINU x[rs2])
  • 将内存中地址为x[rs1]中的字记为t,把这个字变为t和x[rs2]中较小值(用无符号数比较),然后写入x[rd]。

2.1.9 AMOMAXU.W指令(amomaxu rd,rs2,(rs1))

x[rd] = AMO32(M[x[rs1]] MAXU x[rs2])
  • 将内存中地址为x[rs1]中的字记为t,把这个字变为t和x[rs2]中的较大值(用无符号数比较),然后写入x[rd]。

2.2 加载保留/条件存储

2.2.1 LR.W指令(lr.w rd,(rs1))

x[rd] = LoadReserved32(M[x[rs1]])
  • 从内存中地址为x[rs1]中加载四个字节,符号位扩展后写入x[rd],并对这个内存字注册保留。

2.2.2 SC.W指令(lw rd,offset(rs1))

x[rd]=StoreConditonal32(M[x[rs1],x[rs2])
  • 内存地址x[rs1]上存在加载保留,将x[rs2]寄存器中的4个字节数存入该地址。如果存入成功,向寄存器x[rd]中存入0,否则存入一个非0的错误码。

猜你喜欢

转载自blog.csdn.net/qq_38798111/article/details/129733492