SC.W

RISC-V SC.W 指令详解

指令手册R-type

RV32/RV64 条件存储 32 位值:成功写内存、rd=0;失败不执行数据存储、rd 为非零。

指令语法

sc.w rd, rs2, (rs1)
操作数说明
rd:接收成功 0 或失败非零状态;rd=x0 只丢弃状态写回。
rs1:直接提供 4 字节自然对齐地址,没有 offset;rs2:提供执行前的低 32 位存储数据。
需要 Zalrsc 或 A;SC.D 仅 RV64。预留有效不保证成功,成功与失败都使本 hart 的预留失效。
AZalrsc原子操作

扩展条件:RV32/RV64,需要 Zalrsc 或包含 Zalrsc 的 A 扩展。

指令行为说明

SC.W 以 rs1 为地址、rs2 的低 32 位为候选数据;成功时写入数据并向 rd 写 0,失败时不执行数据存储并向 rd 写非零码。成功要求最近 LR 的预留仍有效且覆盖写入字节,但预留有效不保证成功;其他 hart 的相关写入、设备对 LR 访问字节的写入或中间 SC 会强制失败。成功和失败均使本 hart 的预留失效。SC 在退出前必须通过内存权限检查;失败时隐式地址转换/保护访问的副作用未指定。RV64 上 SC.W 写入 rd 的状态值按 32 位符号扩展到 XLEN。

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

展示 A / Zalrsc word 原子指令的字段解析、aq/rl 排序位、预留与权限检查和 条件存储 状态更新。

rd
rs2
rs1
sc.w
,
,(
)
执行环境

该教学开关只选择 SC 的成功或失败结果;成功仍取决于最近 LR 的预留及其他架构条件,失败码只保证为非零。

31..27
26
25
24..20
19..15
14..12
11..7
6..0
00011
funct5
0
aq
1
rl
01011
rs2
01010
rs1
010
funct3
00110
rd
0101111
opcode
原子数据路径
instruction
0x1AB5232F
opcode
0101111 -> AMO
funct3
010 -> word width
funct5
00011 -> SC.W
aq / rl
0/1 -> release
rd / rs2 / rs1
t1(x6) / a1(x11)=0x00000009 / a0(x10)=0x00001000
reservation / permissions
check the most recent LR reservation and store permissions for 0x00001000; no old-memory value is architecturally exposed
condition
尚未计算
rd / memory / reservation
t1(x6) = 未指定初值; SC 尚未提交;预留尚未被本条 SC 失效
当前步骤

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

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

encoding: 0x1AB5232F
syntax : sc.w.rl t1(x6), a1(x11), (a0(x10))
待提交结果 : 尚未计算
当前架构状态
t1(x6) = 未指定初值; SC 尚未提交;预留尚未被本条 SC 失效

本例假定取指成功,目标自然对齐且区域支持 LR/SC,并通过内存权限检查。开关选择一个允许的 SC 成功/失败结果,不完整模拟 LR、预留集和其他 hart/设备干扰。失败不执行数据存储,但隐式地址转换/保护访问的副作用未指定。aq/rl 只涉及被访问的 memory/I/O 域;步骤是教学拆解。

快速理解与检索要点

SC.W 是 LR/SC 序列的判定点:它不是无条件 store。成功时写内存并把 0 写入 rd;失败时不执行数据存储,并把非零失败码写入 rd。

funct5=00011、funct3=010、opcode=0101111 识别 SC.W;rd 是状态结果寄存器,不是被存入内存的数据。
rs2 提供写入内存的 32 位候选数据;rd 接收 0 或非零的成功/失败状态。
SC.W 失败时不执行数据存储;成功和失败都会使当前 hart 的预留失效。
官方语义只要求失败码非零;可移植软件不应依赖具体非零数值。
aq 在 bit 26、rl 在 bit 25;SC.aq(未设置 rl)不保证比两位清零提供更强排序。SC.rl 为 LR/SC 序列提供 release 语义,排序仅限被访问地址域。
rd=x0 只丢弃状态写回,不取消条件存储或预留失效。

常见使用场景

LR/SC 条件更新

SC.W 用于 LR/SC 条件更新;软件检查 rd 的 0/非零状态,预留有效不保证成功。

使用前检查清单

语法检查
  • 使用 rd, rs2, (rs1),没有 offset;funct5=00011,aq/rl 是独立排序位。
语义检查
  • 确认支持 Zalrsc 或 A、区域可预留且可写、地址自然对齐;SC.D 仅 RV64。
  • 成功写数据、rd=0;失败不执行数据存储、rd 非零,均使预留失效。预留有效不保证成功;失败的隐式转换/保护访问副作用未指定。

容易混淆 / 常见误区

地址须 4 字节自然对齐;未对齐 SC 引发地址未对齐或访问错误异常。
预留有效是成功的必要条件,不保证 SC 成功;软件应检查 rd。
失败码 1 表示未指定失败;可移植软件只假定失败码非零。
最终前进保证只适用于满足代码、地址/宽度和区域 eventuality 条件的受限 LR/SC 循环。

常见问题

SC.W 成功时 rd 为什么是 0?

SC.W 的 rd 是状态结果寄存器。官方语义定义成功写 0,失败写非零值,软件据此决定是否退出或重试 LR/SC 循环。

SC.W 失败时会改内存吗?

失败的 SC 不执行数据存储,并写入非零状态(rd=x0 时丢弃)及使预留失效;隐式地址转换或保护访问的副作用未指定。