AMOCAS.B 如何判断成功?
访问正常完成且 rd 非 x0 时,将执行后 rd 返回值的低 8 位,与执行前另行保留的期望值低 8 位比较;相同才说明交换写入发生。rd 返回的字节值按符号扩展写入。
原子比较并交换字节:若内存旧值等于 rd 低 8 位,则写入 rs2 低 8 位;rd 返回旧值
语法为 rd, rs2, (rs1),没有 offset 或 rs3;rd 在执行前提供比较值,rs2 提供交换值,rs1 提供地址。
32 位编码:funct5=00101,funct3=000,opcode=0101111;aq 在 bit26,rl 在 bit25。
RV32/RV64,需要 Zacas(依赖 Zaamo) 与 Zabha;比较 8 位旧内存,匹配才交换;访问正常完成后返回旧值,不返回布尔标志。
仅比较 rd 和交换 rs2 的低 8 位;旧值符号扩展到 XLEN。x0 源为零、目标写回丢弃。
字节地址总是自然对齐。区域须支持该 AMOCAS;重叠寄存器读取同一执行前值,aq/rl 仅排序被访问的地址域。
AMOCAS.B(Zabha 提供的字节 AMOCAS 形式,语义遵循 Zacas CAS)原子地加载 rs1 地址处的 8 位值,将加载值与 rd 的低 8 位比较;若按位相等,则把 rs2 的低 8 位写回原地址。无论比较是否成功,加载到的旧值都会符号扩展到 XLEN 后写入 rd。支持 aq/rl 内存序位。 这些数据结果以访问正常完成为前提;rd=x0 时丢弃写回。Zacas 依赖 Zaamo。
展示 Zabha + Zacas byte 原子指令的字段解析、aq/rl 排序位、内存读取和 CAS 状态更新。
Zabha + Zacas 扩展 byte 原子指令使用 32-bit 编码;动画先展示字段切分。
本例假定所选 XLEN 下扩展已启用、取指成功,目标区域支持该 AMOCAS 且访问成功;W/D/Q 可用开关选择缺少写权限的异常路径。非自然对齐需满足所示 PMA 条件。寄存器源均在写回前读取,x0 源值为零(寄存器对为整对零);aq/rl 仅排序被访问的地址域。步骤是教学拆解。
AMOCAS.B 原子加载 8 位内存值,与输入 rd 中的比较值按位比较;相等时把 rs2 的交换值写回内存,正常完成后把旧值写回 rd(rd=x0 时丢弃写回)。
RV32/RV64,所需扩展已启用;假设 a1=0x1000、目标区域支持该操作且访问正常完成。旧内存=5、期望值=5、交换值=3:示例返回旧值 5 并将内存写为 3;期望值改为 4 时返回 5,内存数据仍为 5。
访问正常完成且 rd 非 x0 时,将执行后 rd 返回值的低 8 位,与执行前另行保留的期望值低 8 位比较;相同才说明交换写入发生。rd 返回的字节值按符号扩展写入。
不是。比较值来自执行前 rd 的低操作数宽度位;rs2 的低同宽位提供成功时写入的新值。