首页/指令库/原子或双字
AMOOR.D

RISC-V AMOOR.D 指令详解

指令手册R-type

RV64 原子按位或 64 位 doubleword:rd 返回旧内存值,内存写回 oldDoubleword | rs2Doubleword 的结果

指令语法

amoor.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 的宽度与操作、且访问成功为前提。AMOOR.D 对 rs1 指向的 64 位 doubleword 执行原子 read-modify-write:先读取旧内存 doubleword 并写入 rd,然后按按位或语义计算 oldDoubleword | rs2Doubleword,把 64 位结果写回同一地址。该运算逐 bit 使用旧 doubleword 与 rs2 doubleword 的同一 bit 位置。aq/rl 只在被访问的 memory 或 I/O 地址域中增加排序约束,不改变数据结果;跨两个地址域排序仍需 FENCE。 rs2 使用执行前的值;rd=x0 时仅丢弃旧值的寄存器写回,内存操作仍执行。

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

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

rd
rs2
rs1
amoor.d
,
,(
)
执行环境
31..27
26
25
24..20
19..15
14..12
11..7
6..0
01000
funct5
0
aq
0
rl
01011
rs2
01010
rs1
011
funct3
00101
rd
0101111
opcode
原子数据路径
instruction
0x40B532AF
opcode
0101111 -> AMO
funct3
011 -> doubleword width
funct5
01000 -> AMOOR.D
aq / rl
0/0 -> unordered
rd / rs2 / rs1
t0(x5) / a1(x11)=0x000000000000FFF0 / a0(x10)=0x0000000000001000
memory read
mem[0x0000000000001000] -> old doubleword 0xF00000000000000F
RMW
0xF00000000000000F | 0x000000000000FFF0 -> 0xF00000000000FFFF
rd / memory
t0(x5) = 0xF00000000000000F; mem[0x0000000000001000] = 0xF00000000000FFFF
当前步骤

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

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

encoding: 0x40B532AF
syntax : amoor.d t0(x5), a1(x11), (a0(x10))
result : t0(x5) = 0xF00000000000000F; mem[0x0000000000001000] = 0xF00000000000FFFF
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
1
1
1
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
1
1
1
1
old doubleword
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
1
1
1
1
1
0
0
0
0
rs2 doubleword
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

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

快速理解与检索要点

AMOOR.D 是 RV64 的 64 位 AMO.D 读改写指令。访问成功且 rd≠x0 时,rd 返回操作前的旧 doubleword;oldDoubleword | rs2Doubleword 的结果只写回内存,所以学习时要把“返回旧值”和“更新内存”分开看。

funct5=01000、funct3=011、opcode=0101111 识别 AMOOR.D;aq/rl 位不改变数据计算。
rd 接收操作前的旧 64 位内存 doubleword;内存接收本条 AMO.D 计算出的 64 位结果。
AMOOR.D 是 RV64-only doubleword AMO;通常要求地址按 8 字节自然对齐。若 PMA 存在且所有访问字节位于同一 misaligned atomicity granule,则不会因地址对齐而异常。
AMOOR.D 是 64 位按位逻辑 AMO;每个结果 bit 来自 old doubleword 与 rs2 doubleword 的同一 bit 位置。

常见使用场景

位操作与掩码

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

原子与同步

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

RV64 专用操作

64 位访问成功的示例:a2=0x1000,旧内存值=5,a1=3;amoor.d a0, a1, (a2) 返回 a0=5,内存更新为 7。地址自然对齐,内存区域支持该 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 位内存值,不保存 按位或运算后的新内存结果。
AMOOR.D 是 RV64-only doubleword AMO;通常要求地址按 8 字节自然对齐。若 PMA 存在且所有访问字节位于同一 misaligned atomicity granule,则可免于因地址对齐而异常。
内存写回 oldDoubleword | rs2Doubleword 的 64 位结果;不要把它误解为 32 位 AMO.W 符号扩展规则。
aq/rl 只约束内存排序,不改变本条 AMO.D 的数据计算结果。

常见问题

AMOOR.D 的 rd 保存新内存结果吗?

不。AMOOR.D 的 rd 保存操作前的旧 64 位内存值;oldDoubleword | rs2Doubleword 的结果写回内存。

AMOOR.D 的 aq/rl 会改变 按位或 结果吗?

不会。aq/rl 只影响内存排序约束,不改变本条 AMO.D 的 64 位数据计算结果。