首页/指令库/原子交换字
AMOSWAP.W

RISC-V AMOSWAP.W 指令详解

指令手册R-type

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

指令语法

amoswap.w rd, rs2, (rs1)
操作数说明
rd:访问成功时接收旧内存值;AMO.W 在 RV64 上符号扩展到 XLEN,rd=x0 时丢弃寄存器写回。
rs1:提供访问地址,须自然对齐或满足 misaligned atomicity granule PMA 条件;区域须支持该 AMO。
rs2:使用执行前的源值计算内存新值;AMO.W 仅取低 32 位,AMO.D 使用完整 64 位。
funct5 选择操作,funct3 选择宽度;aq/rl 是独立排序位,没有 offset 立即数或 rs3。
AZaamo原子操作

指令行为说明

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

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

展示 A / Zaamo 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)[31:0]=0x0000007F / a0(x10)=0x00001000
memory read
mem[0x00001000] -> old word 0x80000002
RMW
尚未计算
rd / memory
t0(x5) = 未指定初值; mem[0x00001000] = 0x80000002
当前步骤

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

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

encoding: 0x0CB522AF
syntax : amoswap.w.aq t0(x5), a1(x11), (a0(x10))
待提交结果 : 尚未计算
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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

假设地址所在区域支持该 AMO 且访问成功;动画展示运算、旧值返回、内存写回和 aq/rl 在被访问地址域中的排序。步骤是教学拆解,不模拟访问异常、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。
rs2 使用执行前的值;rd=x0 时丢弃寄存器写回,内存更新仍然发生。

常见使用场景

原子与同步

32 位访问成功的示例:a2=0x1000,旧内存值=5,a1=3;amoswap.w a0, a1, (a2) 返回 a0=5,内存更新为 3。地址自然对齐,内存区域支持该 AMO。

使用前检查清单

语法检查
  • rd、rs2、rs1 选择 x0–x31 或其 ABI 名称;语法为 rd, rs2, (rs1),没有 rs3 或 offset 立即数。
  • 确认 funct5 选择操作、funct3 选择访问宽度;aq/rl 是独立排序位,不是固定 funct7 常量。
语义检查
  • 确认地址自然对齐,或满足 misaligned atomicity granule PMA 条件;目标区域须支持该 AMO 的宽度与操作。
  • 访问成功时 rd 返回旧内存值,计算结果写回内存;rd=x0 只丢弃寄存器写回。AMO.W 在 RV64 上符号扩展旧 word,并只使用 rs2 低 32 位。

容易混淆 / 常见误区

通常要求地址按 4 字节自然对齐;只有实现提供 misaligned atomicity granule PMA 且全部访问字节位于同一 granule 内时,才不会因地址对齐而异常。
AMOSWAP.W 访问一个 32 位 word,不是字节或半字访问。
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。