LD.AQRL

RISC-V LD.AQRL 指令详解

指令手册AMO

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

指令语法

ld.aqrl rd, (rs1)

rd:接收完整 64 位加载值,仅 RV64;rd=x0 只丢弃写回,加载的异常与副作用仍保留。

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

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

Zalasr缓存与同步

指令行为说明

LD.AQRL 是 Zalasr 1.0 的 RV64 专用原子加载。访问成功时,从 x[rs1] 指向的地址原子读取 8 字节,完整 64 位写入 x[rd];源宽度等于 XLEN,无需额外扩展。语法没有 offset 字段。地址需按 8 字节自然对齐;若全部访问字节位于同一 misaligned atomicity granule PMA 内,可放宽对齐要求。

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

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

rd
rs1
ld.aqrl
,(
)
执行环境
排序标注
aq=1, rl=1 (acquire+release)

未自然按 8 字节对齐时,勾选框只断言所有访问字节位于同一 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
1
rl
00000
rs2=00000
01010
rs1
011
funct3
00101
rd
0101111
opcode
Zalasr 数据路径
instruction
0x360532AF
opcode
0101111 -> AMO major opcode
funct5
00110 -> LD.AQRL
aq / rl
1/1 -> acquire+release
operands
rd=t0(x5), rs1=a0(x10)
address
a0(x10) -> 0x0000000000001000 (no offset); naturally aligned
memory read
mem[0x0000000000001000] -> 0x8000000000000002
execute
copy64(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.AQRL 从内存取完整 64 位写入 rd;宽度等于 XLEN,无需增加符号位。

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

快速理解与检索要点

LD.AQRL 使用 x[rs1] 作为地址,原子读取 8 字节并将完整 64 位写入 rd。仅 RV64 定义;aq/rl 指定排序标注。

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

常见使用场景

原子与同步

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

并发与多核

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

使用前检查清单

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

容易混淆 / 常见误区

语法没有 offset 立即数字段;地址直接取自 rs1。
仅 RV64:读取的完整 64 位直接写入 rd;没有独立的无符号形式。
未设置 aq 的 Zalasr load 编码是 RESERVED。
Zalasr 是独立的有序原子加载,不使用 LR/SC 预留,也不执行 AMO 读改写。

常见问题

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

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

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

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

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

不会。aq/rl 是排序标注;LD 的完整 64 位加载值保持不变,rd=x0 时只丢弃写回。