LD.AQ

RISC-V LD.AQ 指令详解

指令手册R-type

Zalasr 原子加载 8 字节,带 acquire-RCsc 排序标注(RV64-only)。

指令语法

ld.aq rd, (rs1)
操作数说明
目标寄存器 rd:接收符号扩展后的加载结果;若 rd=x0,写回被丢弃。
地址寄存器 rs1:直接提供内存地址;Zalasr 语法没有 offset 立即数字段。
编码字段 rs2 固定为 00000;aq 位必须为 1,aq/rl 只影响排序标注。
Zalasr缓存与同步

指令行为说明

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

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

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

rd
rs1
ld.aq
,(
)
排序标注
aq=1, rl=0 (acquire)
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
011
funct3
00101
rd
0101111
opcode
Zalasr 数据路径
instruction
0x340532AF
opcode
0101111 -> AMO major opcode
funct5
00110 -> LD.AQ
aq / rl
1/0 -> acquire
operands
rd=t0(x5), rs1=a0(x10)
address
a0(x10) -> 0x0000000000001000 (no offset)
memory read
mem[0x0000000000001000] -> 0x8000000000000002
execute
sign_extend(0x8000000000000002, 64) -> 0x8000000000000002
writeback
t0(x5) = 0x8000000000000002
64-bit 传输视图
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
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
0
0
0
0
0
1
0
memory 64
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

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

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

快速理解与检索要点

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

语法是 ld.aq rd, (rs1),没有 offset 字段,地址来自 x[rs1]。
funct5=00110 选择 Zalasr load-acquire 类,funct3=011 选择 LD.AQ 的访问宽度;AMO major opcode 为 0101111,Zalasr load 的 aq 位必须为 1。
加载 64 位后按源宽度符号扩展到 XLEN;该 D 宽度形式仅 RV64 定义。
aq/rl 只描述内存排序,不改变加载、符号扩展或 rd=x0 的架构语义。

常见使用场景

原子与同步

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

并发与多核

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

使用前检查清单

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

容易混淆 / 常见误区

语法没有 offset 立即数字段;地址直接取自 rs1。
加载结果按 64 位源宽度符号扩展到 XLEN;Zalasr 没有无符号加载形式。
未设置 aq 的 Zalasr load 编码是 RESERVED。
Zalasr 是单条有序原子 load/store,不是 LR/SC 预留协议,也不是 AMO read-modify-write 旧值返回。

常见问题

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

不可以。官方语法是 ld.aq rd, (rs1),没有 offset 立即数字段;地址直接来自 rs1。

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

不是。Zalasr 这些指令是单条有序原子 load/store;动画不展示预留状态或旧值返回。

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

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