Can stack_adj be any multiple of 16?
No. The register list and XLEN determine base; only base, base+16, base+32, and base+48 are encodable.
Save the ra and 0 to 12 s-registers selected by reg_list, then adjust sp
CM.PUSH (Zcmp) pushes registers in {reg_list} (ra and up to 12 s-registers) to stack and decrements sp by stack_adj. stack_adj = stack_adj_base + spimm×16. Reuses c.fsdsp encoding, incompatible with Zcd. Stores may execute multiple times (fault recovery); sp adjustment commits atomically. Part of Zcmp, depends on Zca.
Shows only Zcmp architectural sequences and conditions; access order, grouping, or replay does not imply implementation detail.
Zcmp depends on Zca and is incompatible with Zcd. Correct execution requires idempotent memory at sp; RV32E permits rlist=4-6 only. Values are pre-store registers or successfully loaded memory values; complete assumes the EEI permits all accesses, not that every address succeeds.
Store the listed registers below old sp, then subtract stack_adj from sp.
RV32I Zcmp, accesses complete: {ra,s0-s2} occupies 16 bytes; stack_adj=64 encodes rlist=7, spimm=3. PUSH saves below old sp then sp-=64; POP forms restore from old sp+48 through old sp+60 then sp+=64. Return forms use restored ra; POPRETZ also zeros a0.
No. The register list and XLEN determine base; only base, base+16, base+32, and base+48 are encodable.
No. Stores may already be visible. Waiting for imprecise bus-fault responses before commit or handling them after completion is platform-defined.