LR.D 会写内存吗?
不会。LR.D 读取 64 位旧值到 rd,并建立 reservation set;内存写入由后续 SC.D 尝试完成。
在 RV64 上原子读取 64 位 doubleword 到 rd,并建立供后续 SC.D 使用的 reservation set
LR.D 从 rs1 指向的自然对齐地址原子读取 64 位 doubleword,将旧值写入 rd,并建立覆盖该访问字节的 reservation set。它是 RV64 的 A/Zalrsc 指令,本身不写内存;后续 SC.D 使用该预留判断条件存储是否成功。aq 位可为 LR/SC 序列提供 acquire 语义;对 LR 单独设置 rl 而不同时设置 aq 不保证提供更强排序,且不会改变读取值。 排序约束只作用于所访问的 memory 或 I/O 地址域;不会自动排序另一地址域。
展示 A / Zalrsc doubleword 原子指令的字段解析、aq/rl 排序位、内存读取和 reservation 状态更新。
A / Zalrsc 扩展 doubleword 原子指令使用 32-bit 编码;动画先展示字段切分。
本例假定自然对齐的地址区域支持 LR/SC 且可读,取指及访问成功。预留覆盖全部访问字节,但不展示实现定义的完整大小、其他 hart/设备写入或 SC 成功条件;aq/rl 只排序所访问的 memory/I/O 地址域。步骤是教学拆解。
LR.D 是 RV64 LR/SC 序列的 64 位第一步:读取旧 doubleword 到 rd,并建立 reservation set。它不写内存,也不等同于普通 ld,因为后续 SC.D 会消费这个预留。
结合 «lr.d.aq t0, (a0) # load 64-bit doubleword from *a0 and create a reservation» 等实际代码理解该场景。
结合 «lr.d.aq t0, (a0) # load 64-bit doubleword from *a0 and create a reservation» 等实际代码理解该场景。
不会。LR.D 读取 64 位旧值到 rd,并建立 reservation set;内存写入由后续 SC.D 尝试完成。
LR.D 仅用于 RV64,访问 64 位 doubleword,地址需 8 字节对齐;LR.W 访问 32 位 word。