CSR 指令里的 atomic 是内存原子吗?
不是。Zicsr 里的 atomic 指 CSR 读和写在同一条 CSR 指令中完成,不是对内存地址执行 AMO。
读取 CSR 旧值到 rd,并把零扩展的 5-bit uimm 写入 CSR;rd=x0 时抑制 CSR 读取
CSRRWI 是 CSRRW 的立即数形式:读取 CSR 旧值并零扩展到 XLEN 写入 rd,再把 5-bit 无符号 uimm 零扩展后写入目标 CSR。若 rd=x0,指令不读取 CSR,也不产生 CSR 读副作用;但无论 uimm 是否为 0,写操作仍按 CSRRWI 语义执行。
展示 Zicsr CSR 读-改-写的 ISA 可见流程:解析 SYSTEM 编码、读取 CSR、按写/置位/清位语义计算,再更新 rd 与 CSR。
CSR 名称/地址属于指令语法;旧 CSR 值和 rs1 示例值属于执行上下文。动画不赋予示例 CSR 任何具体平台字段含义。
CSRRWI 是 Zicsr 定义的 I-type SYSTEM 指令,CSR 地址位于 bits 31..20。
位级视图显示当前 XLEN 的 CSR 值计算。
该动画只展示 Zicsr 定义的 ISA 可见 CSR 读写、副作用抑制和位掩码语义;不模拟具体 CSR 字段含义、异常处理器、流水线或时序。
CSRRWI 使用 5-bit uimm 作为写入 CSR 的源值。rd=x0 时不读 CSR;uimm=0 仍表示写入零。
结合 «csrrwi x5, fflags, 3 # x5 = old fflags; fflags = 3» 等实际代码理解该场景。
结合 «csrrwi x5, fflags, 3 # x5 = old fflags; fflags = 3» 等实际代码理解该场景。
不是。Zicsr 里的 atomic 指 CSR 读和写在同一条 CSR 指令中完成,不是对内存地址执行 AMO。
不一样。rd=x0 只在 CSRRW/CSRRWI 中抑制 CSR 读取;rs1=x0 或 uimm=0 只在 CSRRS/CSRRC 及其立即数形式中抑制 CSR 写入。