Are CSR instructions memory atomics?
No. Atomic here means the CSR read-modify-write is one instruction, not an AMO to memory.
Read CSR into rd, then atomically clear bits in the CSR where rs1 has 1s; supports read-only mode
CSRRC uses opcode 1110011 (0x73), funct3 011. The rs1 field selects the source register, the 12-bit immediate provides the second operand, and rd selects the destination.
CSRRC performs an atomic read-modify-write on a CSR: reads the current CSR value (zero-extended to XLEN bits) into rd, then uses rs1 as a bit mask to clear (deassert to 0) the corresponding bits in the CSR where rs1 holds 1s (provided those bits are writable). If rs1=x0, the instruction writes nothing to the CSR, causing no write side effects and no illegal-instruction exceptions on read-only CSRs. Symmetric to CSRRS, the pseudo-instruction CSRC(csr, rs1) is encoded as CSRRC x0, csr, rs1 (clear only, discard old value). Typical use: atomically clearing pending interrupt bits in mip to avoid read-modify-write races.
CSRRC is a Zicsr atomic CSR read-modify-write instruction. CSR addresses are 12 bits, and whether read/write side effects occur depends on rd and on rs1 or uimm being x0/0.
Understand this scenario with real code like «csrrc x5, mip, x6 # x5 = old mip; clear bits in mip per x6».
Understand this scenario with real code like «csrrc x5, mip, x6 # x5 = old mip; clear bits in mip per x6».
No. Atomic here means the CSR read-modify-write is one instruction, not an AMO to memory.
For CSRRW it suppresses the CSR read and read side effects; CSRRS/CSRRC still read the CSR.