首页/指令库/AMOSWAP-W
AMOSWAP.W

RISC-V AMOSWAP.W 指令详解

指令手册R-type

原子交换32位字:读取旧内存值到 rd,并把 rs2 的低32位写回同一地址

指令语法

amoswap.w rd, rs2, (rs1)
操作数说明
目标寄存器 rd:存放运算结果的通用寄存器。
源寄存器 rs1:第一个操作数寄存器。
源寄存器 rs2:第二个操作数寄存器。
AZaamo原子操作

指令行为说明

AMOSWAP.W 对 rs1 指向的 32 位字执行原子 read-modify-write:先读取旧内存值并符号扩展写入 rd,再把 rs2 的低 32 位写回同一地址。它不使用 LR/SC reservation;aq/rl 位只影响该原子内存操作相对同一地址域中其他内存操作的排序。

AMOSWAP.W 原子指令解析与执行动画

展示 A-extension word 原子指令的字段解析、aq/rl 排序位、内存读取和 RMW 状态更新。

rd
rs2
rs1
amoswap.w
,
,(
)
执行环境
31..27
26
25
24..20
19..15
14..12
11..7
6..0
00001
funct5
1
aq
0
rl
01011
rs2
01010
rs1
010
funct3
00101
rd
0101111
opcode
原子数据路径
instruction
0x0CB522AF
opcode
0101111 -> AMO
funct3
010 -> word width
funct5
00001 -> AMOSWAP.W
aq / rl
1/0 -> acquire
rd / rs2 / rs1
t0(x5) / a1(x11)=0x0000007F / a0(x10)=0x00001000
memory read
mem[0x00001000] -> old word 0x80000002
RMW
new memory word = rs2 word 0x0000007F
rd / memory
t0(x5) = 0x80000002; mem[0x00001000] = 0x0000007F
当前步骤

概念步骤:拿到 32-bit 原子指令编码

A 扩展 word 原子指令使用 32-bit 编码;动画先展示字段切分。

encoding: 0x0CB522AF
syntax : amoswap.w t0(x5), a1(x11), (a0(x10))
result : t0(x5) = 0x80000002; mem[0x00001000] = 0x0000007F
32-bit word 结果视图
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
write word
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
write
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

该动画展示 ISA 可见的原子读改写、比较并交换、LR/SC 预留状态和内存排序位,不表示任何特定 CPU 的缓存一致性实现、流水线或时序。

快速理解与检索要点

AMOSWAP.W 的结果寄存器 rd 得到的是交换前的旧内存值;内存得到的是 rs2 的低 32 位。这是单条 AMO read-modify-write,不是 LR/SC 循环。

funct5=00001、funct3=010、opcode=0101111 识别 AMOSWAP.W;aq/rl 位位于原子指令高字段中。
rd 接收旧内存值并按 word 结果符号扩展到 XLEN;rs2 的低 32 位成为新的内存 word。
AMO 的 read 与 write 构成同一条原子 read-modify-write 操作,页面动画只展示 ISA 可见状态变化。
在 RV64 上,AMO.W 写回 rd 的旧 word 会符号扩展;内存写入仍是 32 位 word。

常见使用场景

原子与同步

结合 «amoswap.w.aq t0, t1, (a0) # atomic swap *a0 with t1, old value in t0» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认当前指令格式为 R-type。
  • 确认操作数排列顺序与示例一致。
语义检查
  • 确认目标寄存器用途和调用约定兼容。
  • 确认该指令不是伪指令展开后的底层形式。

容易混淆 / 常见误区

地址必须4字节对齐
不可用于字节/半字操作
AMO.W 原子访问 32 位字;在 RV64 中,加载到 rd 的旧值会符号扩展到 XLEN。
AMO.W 存在于 RV32 和 RV64 的 A/Zaamo 环境,不是 RV64-only 指令。

常见问题

AMOSWAP.W 的 rd 是新值还是旧值?

rd 接收内存交换前的旧 32 位值,并符号扩展到 XLEN。rs2 的低 32 位才是写回内存的新值。

AMOSWAP.W 需要先执行 LR.W 吗?

不需要。AMOSWAP.W 是独立的 AMO read-modify-write 指令,不依赖 LR/SC reservation。