csrrs
Atomic Read and Set Bits in CSR
This instruction is defined by:
Synopsis
Atomically read and set bits in a CSR.
Reads the value of the CSR, zero-extends the value to XLEN
bits,
and writes it to integer register xd
. The initial value in integer
register xs1
is treated as a bit mask that specifies bit positions
to be set in the CSR. Any bit that is high in xs1
will cause the
corresponding bit to be set in the CSR, if that CSR bit is writable.
Other bits in the CSR are not explicitly written.
Decode Variables
Bits<12> csr = $encoding[31:20];
Bits<5> xs1 = $encoding[19:15];
Bits<5> xd = $encoding[11:7];
Execution
-
Pruned, XLEN == 64
-
Original
Boolean will_write = xs1 != 0;
Csr csr_handle = direct_csr_lookup(csr);
if (csr_handle.valid == false) {
unimplemented_csr($encoding);
} else if (!compatible_mode?(csr_handle.mode, mode())) {
raise(ExceptionCode::IllegalInstruction, mode(), $encoding);
} else if (will_write && csr_handle.writable == false) {
raise(ExceptionCode::IllegalInstruction, mode(), $encoding);
}
XReg initial_csr_value = csr_sw_read(csr_handle);
if (will_write) {
XReg mask = X[xs1];
csr_sw_write(csr_handle, initial_csr_value | mask);
}
X[xd] = initial_csr_value;
Boolean will_write = xs1 != 0;
Csr csr_handle = direct_csr_lookup(csr);
if (csr_handle.valid == false) {
unimplemented_csr($encoding);
} else if (!compatible_mode?(csr_handle.mode, mode())) {
raise(ExceptionCode::IllegalInstruction, mode(), $encoding);
} else if (will_write && csr_handle.writable == false) {
raise(ExceptionCode::IllegalInstruction, mode(), $encoding);
}
XReg initial_csr_value = csr_sw_read(csr_handle);
if (will_write) {
XReg mask = X[xs1];
csr_sw_write(csr_handle, initial_csr_value | mask);
}
X[xd] = initial_csr_value;