LDAXR / STLXR 是带 acquire / release 内存顺序语义的独占访问指令;LDXR / STXR 提供相应独占访问,但不附带这一对 acquire / release 语义。这里讨论 AArch64。

勘误:旧文将 LDAXRH / STLXRH 写成“半字节”,应为“半字”,即 16 位;将 LDAXR / STLXR 写成“读写双字节”也不准确,其数据访问宽度取决于 W/X 寄存器形式,为 32 位或 64 位。

指令 内存中的数据宽度 主要含义
LDAXR Wt, [Xn] 32 位(4 字节) 带 acquire 语义的独占读取
LDAXR Xt, [Xn] 64 位(8 字节) 带 acquire 语义的独占读取
LDAXRB Wt, [Xn] 8 位(1 字节) 独占读取一个字节,并零扩展到寄存器
LDAXRH Wt, [Xn] 16 位(2 字节) 独占读取一个半字,并零扩展到寄存器
STLXR Ws, Wt, [Xn] 32 位(4 字节) 带 release 语义的独占写入尝试
STLXR Ws, Xt, [Xn] 64 位(8 字节) 带 release 语义的独占写入尝试
STLXRB Ws, Wt, [Xn] 8 位(1 字节) 独占写入一个字节
STLXRH Ws, Wt, [Xn] 16 位(2 字节) 独占写入一个半字

STLXR 的 Ws 是状态结果寄存器,不是数据宽度的标志:零表示写入成功,非零表示此次独占写入未成功,需要由调用逻辑决定是否重试。使用这组指令构造原子操作时,不能忽略该结果。

acquire/release 讨论内存访问之间的顺序;byte、halfword、32/64-bit 讨论数据宽度。这是两个不同维度,不能用“双字节”“半字节”等说法替代内存顺序语义。

参考:Arm LDAXR、Arm LDAXRH、Arm STLXR。这是指令语义说明,不包含本页新增的硬件实验结果。