Unwinders may only preserve the lower 64bits of Neon and SVE registers,
as only the registers in the base ABI are guaranteed to be preserved
over the exception edge. The caller will need to preserve additional
registers for when the call throws an exception and the unwinder has
tried to recover state.
For e.g.
svint32_t bar(svint32_t); svint32_t foo(svint32_t x, bool *err) { try { bar(x); } catch (...) { *err = true; } return x; }
z0 needs to be spilled before the call to bar(x) and reloaded before
returning from foo, as the exception handler may have clobbered z0.
This seems like a really weird location for this call; it's modifying function-global state in the middle of register allocation.
I'd prefer to do one of the following: