
<<<

Operation::

The first section of pseudo-code may be executed multiple times before the instruction successfully completes.

[source,sail]
--
//This is not SAIL, it's pseudo-code. The SAIL hasn't been written yet.

if (XLEN==32) bytes=4; else bytes=8;

addr=sp-bytes;
for(i in 27,26,25,24,23,22,21,20,19,18,9,8,1)  {
  //if register i is in xreg_list
  if (xreg_list[i]) {
    switch(bytes) {
      4:  asm("sw x[i], 0(addr)");
      8:  asm("sd x[i], 0(addr)");
    }
    addr-=bytes;
  }
}
--

The final section of pseudo-code executes atomically, and only executes if the section above completes without any exceptions or interrupts.
