首页/指令库/AMOCAS.D
AMOCAS.D

RISC-V AMOCAS.D 指令详解

指令手册AMO-type

原子比较并交换双字:RV64 使用 rd/rs2,RV32 使用偶数寄存器对;匹配时交换并返回旧值

指令语法

amocas.d rd, rs2, (rs1)

语法为 rd, rs2, (rs1),没有 offset 或 rs3;rd 在执行前提供比较值,rs2 提供交换值,rs1 提供地址。

32 位编码:funct5=00101,funct3=011,opcode=0101111;aq 在 bit26,rl 在 bit25。

RV32/RV64,需要 Zacas(依赖 Zaamo);比较 64 位旧内存,匹配才交换;访问正常完成后返回旧值,不返回布尔标志。

RV32 使用偶数 rd/rd+1 与 rs2/rs2+1 对,低半在前;奇数起点编码保留,x0 起点源为整对零、目标丢弃整对写回。RV64 使用单个 rd/rs2。

地址须 8 字节对齐,或存在 PMA 且全部访问字节位于同一 misaligned atomicity granule;否则产生地址未对齐或访问错误异常。区域须支持该 AMOCAS;重叠寄存器读取同一执行前值,aq/rl 仅排序被访问的地址域。

Zacas原子操作

指令行为说明

AMOCAS.D(Zacas 扩展)原子地加载 rs1 地址处的 64 位双字并与比较操作数比较;匹配时写入交换操作数。RV64 中比较值来自 rd、交换值来自 rs2,旧值写回 rd。RV32 中,偶数 rd 为比较对的低 32 位、rd+1 为高 32 位;偶数 rs2 为交换对的低 32 位、rs2+1 为高 32 位,旧值按相同顺序写回 rd/rd+1;奇数 rd 或 rs2 编码保留。寄存器对起点为 x0 时,源对两半均读作零;rd 对为 x0 时,整个结果被丢弃。支持 aq/rl 内存序位。 这些数据结果以访问正常完成为前提;rd=x0 时丢弃写回。Zacas 依赖 Zaamo。

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

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

rd/rd+1
rs2/rs2+1
rs1
amocas.d
,
,(
)
执行环境
31..27
26
25
24..20
19..15
14..12
11..7
6..0
00101
funct5
1
aq
0
rl
01100
rs2
01110
rs1
011
funct3
01010
rd
0101111
opcode
原子数据路径
instruction
0x2CC7352F
opcode
0101111 -> AMO
funct3
011 -> doubleword width
funct5
00101 -> AMOCAS.D
aq / rl
1/0 -> acquire
写权限
已允许:可进入 CAS
rd / rs2 / rs1
a0(x10) (low)/a1(x11) (high) compare=0x8000000000000002 / a2(x12) (low)/a3(x13) (high) swap=0x000000000000007F / a4(x14)=0x00001000
memory read
mem[0x00001000] -> old doubleword 0x8000000000000002
RMW
尚未计算
rd / memory
a0(x10) (low)/a1(x11) (high) = 0x8000000000000002; mem[0x00001000] = 0x8000000000000002
当前步骤

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

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

encoding: 0x2CC7352F
syntax : amocas.d.aq a0(x10), a2(x12), (a4(x14))
待提交结果 : 尚未计算
当前架构状态
a0(x10) (low)/a1(x11) (high) = 0x8000000000000002; mem[0x00001000] = 0x8000000000000002

本例假定所选 XLEN 下扩展已启用、取指成功,目标区域支持该 AMOCAS 且访问成功;W/D/Q 可用开关选择缺少写权限的异常路径。非自然对齐需满足所示 PMA 条件。寄存器源均在写回前读取,x0 源值为零(寄存器对为整对零);aq/rl 仅排序被访问的地址域。步骤是教学拆解。

快速理解与检索要点

AMOCAS.D 原子加载 64 位内存值,与比较操作数按位比较;相等时把交换操作数写回内存。RV64 使用 rd/rs2,RV32 使用 rd/rd+1 与 rs2/rs2+1 寄存器对,正常完成后返回旧内存值(rd=x0 时丢弃写回)。

访问正常完成且 rd 非 x0 时,旧内存值覆盖比较操作数 rd(寄存器对形式为 rd/rd+1);它不是布尔成功标志。
RV32 上 AMOCAS.D 使用偶数寄存器对;RV64 上使用单个 64 位寄存器。
AMOCAS.W/D/Q 比较失败也需要写权限;aq=1 在成功或失败时提供 acquire,rl=1 只在成功时提供 release。失败可不写或写回旧值;该写入无 release 语义。

常见使用场景

原子与同步

RV32/RV64,所需扩展已启用;假设 a4=0x1000、目标区域支持该操作且访问正常完成。旧内存=5、期望值=5、交换值=3:示例返回旧值 5 并将内存写为 3;期望值改为 4 时返回 5,内存数据仍为 5。寄存器对形式需将 a0/a1、a2/a3 作为完整值;本例用 a4 保存地址以免重叠冲突。

使用前检查清单

语法检查
  • 语法为 rd, rs2, (rs1),没有 offset 或 rs3;rd 在执行前提供比较值,rs2 提供交换值,rs1 提供地址。
  • 32 位编码:funct5=00101,funct3=011,opcode=0101111;aq 在 bit26,rl 在 bit25。
语义检查
  • RV32/RV64,需要 Zacas(依赖 Zaamo);比较 64 位旧内存,匹配才交换;访问正常完成后返回旧值,不返回布尔标志。
  • RV32 使用偶数 rd/rd+1 与 rs2/rs2+1 对,低半在前;奇数起点编码保留,x0 起点源为整对零、目标丢弃整对写回。RV64 使用单个 rd/rs2。
  • 地址须 8 字节对齐,或存在 PMA 且全部访问字节位于同一 misaligned atomicity granule;否则产生地址未对齐或访问错误异常。区域须支持该 AMOCAS;重叠寄存器读取同一执行前值,aq/rl 仅排序被访问的地址域。

容易混淆 / 常见误区

AMOCAS.D 不是 RV64-only;RV32 使用偶/奇寄存器对。
比较值来自 rd(或 RV32 的 rd/rd+1),不是 rs2;rs2 是成功时写入的新值。
旧内存值返回到 RV64 的 rd 或 RV32 的 rd/rd+1,而非成功标志;地址须 8 字节自然对齐,或满足完整 PMA 条件。

常见问题

AMOCAS.D 如何判断成功?

访问正常完成且 rd 非 x0 时,将执行后返回的旧内存值与执行前另行保留的期望值比较:RV64 使用 rd,RV32 使用 rd/rd+1 的完整 64 位值;相同才说明交换写入发生。

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

不是。RV64 的比较值来自 rd、交换值来自 rs2;RV32 的比较值来自偶数 rd/rd+1、交换值来自偶数 rs2/rs2+1。