LW.AQ

RISC-V LW.AQ 指令详解

指令手册AMO

Zalasr 原子加载 4 字节,带 acquire-RCsc 排序标注。

指令语法

lw.aq rd, (rs1)

rd:接收符号扩展到 XLEN 的加载值;rd=x0 只丢弃写回,加载的异常与副作用仍保留。

rs1:直接提供执行前的地址,没有 offset 立即数;rs1=x0 时地址为 0,rd=rs1 时仍用写回前的地址。

rs2 字段固定为 00000,不是汇编操作数;aq=1,rl 由 .aq 或 .aqrl 后缀确定,二者只指定排序标注。

Zalasr缓存与同步

指令行为说明

LW.AQ 是 Zalasr 1.0 独立原子 load-acquire/store-release 家族中的 4 字节有序原子加载。它从 x[rs1] 指向的地址原子读取 32 位,按该宽度符号扩展后写入 x[rd];语法没有 offset 字段。地址默认必须按访问宽度自然对齐,除非 misaligned atomicity granule PMA 放宽该要求。

LW.AQ Zalasr 指令解析与执行动画

展示 Zalasr 独立 load-acquire 的 AMO 编码、无 offset 地址语法、32-bit 数据传输和 aq/rl 排序标注。

rd
rs1
lw.aq
,(
)
执行环境
排序标注
aq=1, rl=0 (acquire)

未自然按 4 字节对齐时,勾选框只断言所有访问字节位于同一 misaligned atomicity granule PMA;未勾选时模型展示 address-misaligned 或 access-fault 的允许异常分支。动画不判断具体平台的 PMA。

假定 Zalasr 已实现,且除所示对齐异常外,取指和数据访问均获准并成功。地址样例限制为非负安全整数(最大 2^53−1),RV32 还需适合 32 位;这是演示输入范围。rd=x0 仍执行加载及其副作用,只丢弃结果;rd=rs1 时使用写回前的地址。

31..27
26
25
24..20
19..15
14..12
11..7
6..0
00110
funct5
1
aq
0
rl
00000
rs2=00000
01010
rs1
010
funct3
00101
rd
0101111
opcode
Zalasr 数据路径
instruction
0x340522AF
opcode
0101111 -> AMO major opcode
funct5
00110 -> LW.AQ
aq / rl
1/0 -> acquire
operands
rd=t0(x5), rs1=a0(x10)
address
a0(x10) -> 0x00001000 (no offset); naturally aligned
memory read
mem[0x00001000] -> 0x80000002
execute
sign_extend(0x80000002, 32) -> 0x80000002
writeback
t0(x5) = 0x80000002
32-bit 传输视图
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
memory 32
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

LW.AQ 从内存取 32 位,并按该宽度的符号位扩展到 XLEN 后写 rd。

该动画展示 Zalasr 的 ISA 可见原子 load/store 与 aq/rl 排序标注;不模拟 LR/SC 预留、AMO read-modify-write 旧值返回、cache、总线或流水线时序。

快速理解与检索要点

LW.AQ 直接使用 rs1 作为地址,原子读取 4 字节并符号扩展到 rd;aq/rl 位提供排序标注,不会改变加载数据。

语法是 lw.aq rd, (rs1),没有 offset 字段,地址来自 x[rs1]。
32 位 AMO 编码:funct5[31:27]=00110,aq[26]=1,rl[25]=0,rs2[24:20]=00000,rs1[19:15],funct3[14:12]=010,rd[11:7],opcode[6:0]=0101111。
加载 32 位后按源宽度符号扩展到 XLEN。
LW.AQ 的 aq=1、rl=0:它有 acquire-RCsc 标注,而不会因 rl 获得 release-RCsc 标注。aq/rl 不改变加载、符号扩展或 rd=x0 的架构语义。
要求实现 Zalasr 1.0;该形式适用于 RV32/RV64。地址需按 4 字节自然对齐,否则产生 address-misaligned 或 access-fault 异常;若全部访问字节位于同一 misaligned atomicity granule PMA 内,则不因地址对齐产生异常,并保持原子性。
rd=x0 只丢弃写回,加载仍须产生相应异常和其他副作用;rs1=x0 时地址为 0。若 rd=rs1,地址取写回前的寄存器值。
示例:假定已实现 Zalasr、取指与数据访问获准且成功,RV32 中 x6=0x1000,内存 32 位值为 0x80000002,执行 lw.aq x5, (x6) 得到 x5=0x80000002,内存不变。RV64 中同一值符号扩展为 0xFFFFFFFF80000002。

常见使用场景

原子与同步

结合 «lw.aq x5, (x6)» 等实际代码理解该场景。

并发与多核

结合 «lw.aq x5, (x6)» 等实际代码理解该场景。

使用前检查清单

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

容易混淆 / 常见误区

语法没有 offset 立即数字段;地址直接取自 rs1。
加载结果按 32 位源宽度符号扩展到 XLEN;Zalasr 没有无符号加载形式。
未设置 aq 的 Zalasr load 编码是 RESERVED。
Zalasr 是独立的有序原子加载,不使用 LR/SC 预留,也不执行 AMO 读改写。

常见问题

LW.AQ 可以写 offset(rs1) 吗?

不可以。语法为 lw.aq rd, (rs1);rs1 直接提供地址,没有 offset 字段。

LW.AQ 是 LR/SC 或 AMO read-modify-write 吗?

不是。它是原子加载,不建立预留,也不执行读改写。

aq/rl 会改变数据结果吗?

不会。aq/rl 是排序标注;加载值仍按源宽度符号扩展到 rd。