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

RISC-V AMOSWAP.D 指令详解

指令手册R-type

RV64 原子交换 64 位 doubleword:rd 返回旧内存值,内存写入 rs2 的 64 位值

指令语法

amoswap.d rd, rs2, (rs1)
操作数说明
rd:接收原子读取的旧内存值;对 AMOCAS,执行前的 rd 同时提供比较值。
rs1:直接提供原子内存访问地址;AMO 汇编语法没有 offset 立即数字段。
rs2:提供 AMO 的源数据;对 AMOCAS,它是在比较相等时写入的交换值。
AMO-type 是本站对 AMO 专用 R-type 字段布局的展示标签:funct5、aq、rl、rs2、rs1、funct3、rd 和 AMO opcode 共同编码该操作。
AZaamo原子操作

指令行为说明

以下语义以目标区域支持该 AMO 的宽度与操作、且访问成功为前提。AMOSWAP.D 对 rs1 指向的 64 位 doubleword 执行原子 read-modify-write:先读取旧内存 doubleword 并写入 rd,再把 rs2 的 64 位值写回同一地址。它是 RV64 的 A/Zaamo 指令,不使用 LR/SC 预留;aq/rl 只在被访问的 memory 或 I/O 地址域中增加排序约束,跨两个地址域排序仍需 FENCE。 rs2 使用执行前的值;rd=x0 时仅丢弃旧值的寄存器写回,内存操作仍执行。

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

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

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

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

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

encoding: 0x0CB532AF
syntax : amoswap.d.aq t0(x5), a1(x11), (a0(x10))
result : t0(x5) = 0x8000000000000002; mem[0x0000000000001000] = 0x000000000000007F
64-bit doubleword 结果视图
63
62
61
60
59
58
57
56
55
54
53
52
51
50
49
48
47
46
45
44
43
42
41
40
39
38
37
36
35
34
33
32
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
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
0
0
0
0
0
0
1
1
1
1
1
1
1
write doubleword
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

假设地址所在区域支持该 AMO 且访问成功;动画展示运算、旧值返回、内存写回和 aq/rl 在被访问地址域中的排序。步骤是教学拆解,不模拟访问异常、CPU 缓存一致性、流水线或时序。

快速理解与检索要点

AMOSWAP.D 是 64 位原子交换:访问成功且 rd≠x0 时,rd 得到交换前的旧内存 doubleword,内存得到 rs2 的 64 位值。它不是 LR/SC 序列,也不会把新值写到 rd。

funct5=00001、funct3=011、opcode=0101111 识别 AMOSWAP.D。
rd 接收交换前的旧 64 位内存值;内存接收 rs2 的 64 位值。
AMOSWAP.D 是 RV64-only doubleword AMO;通常要求地址按 8 字节自然对齐。若 PMA 存在且所有访问字节位于同一 misaligned atomicity granule,则不会因地址对齐而异常。
aq/rl 位用于排序约束,不改变旧值返回或内存写回数据。

常见使用场景

原子与同步

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

RV64 专用操作

64 位访问成功的示例:a2=0x1000,旧内存值=5,a1=3;amoswap.d 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 位。

容易混淆 / 常见误区

rd 返回交换前的旧 64 位内存值
内存写入的是 rs2 的 64 位值,不是 rd
通常要求地址按 8 字节自然对齐;若 PMA 存在且所有访问字节位于同一 misaligned atomicity granule,则可免于因地址对齐而异常
仅 RV64 可用
aq/rl 不改变交换的数据结果

常见问题

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

rd 是旧值。AMOSWAP.D 先读取旧 64 位内存值到 rd,再把 rs2 的 64 位值写回内存。

AMOSWAP.D 需要 LR.D 预留吗?

不需要。AMOSWAP.D 是单条 AMO read-modify-write 指令,不依赖 LR/SC 预留状态。