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。这是指令语义说明,不包含本页新增的硬件实验结果。