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

RISC-V AMOCAS.W 指令详解

指令手册R-type

原子比较并交换字:若内存旧值等于 rd 低 32 位,则写入 rs2 低 32 位;rd 返回旧值

指令语法

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

指令行为说明

AMOCAS.W(Zacas 扩展)原子地加载 rs1 地址处的 32 位值,将加载值与 rd 的低 32 位比较;若按位相等,则把 rs2 的低 32 位写回原地址。无论比较是否成功,加载到的旧值都会符号扩展到 XLEN 后写入 rd。支持 aq/rl 内存序位。

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

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

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

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

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

encoding: 0x2CB522AF
syntax : amocas.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
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
1
0
old word
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
1
0
rd compare
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
rs2 swap
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
CAS match
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

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

快速理解与检索要点

AMOCAS.W 原子加载 32 位内存值,与输入 rd 中的比较值按位比较;相等时把 rs2 的交换值写回内存,并始终把旧内存值写回 rd。

rd 在执行前是比较值来源,执行后被旧内存值覆盖;它不是布尔成功标志。
RV64 上 AMOCAS.W 把加载的 32 位旧值符号扩展写入 rd。
地址必须按操作数大小自然对齐;aq/rl 的成功和失败排序语义按 Zacas 规则处理。

常见使用场景

原子与同步

结合 «amocas.w a0, a2, (a1)» 等实际代码理解该场景。

循环与迭代

结合 «amocas.w a0, a2, (a1)» 等实际代码理解该场景。

使用前检查清单

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

容易混淆 / 常见误区

比较值来自 rd 的旧输入值;rd 同时也是旧内存值的返回寄存器,不是布尔成功标志。
交换写入值来自 rs2 的低位,宽度由 .b/.h/.w/.d/.q 后缀决定。
目标地址必须按操作数宽度自然对齐,除非平台的 misaligned atomicity granule PMA 放宽该要求。

常见问题

AMOCAS.W 如何判断成功?

比较执行后的 rd 旧值与期望值;如果相同,说明交换写入发生。

AMOCAS.W 的比较值来自 rs2 吗?

不是。rs2 提供成功时要写入的新值;比较值来自执行前的 rd(或寄存器对)。