https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110899
--- Comment #10 from Florian Weimer <fw at gcc dot gnu.org> --- (In reply to Michael Matz from comment #9) > > > I don't see how that helps. Imagine a preserve_all function foo that > > > calls > > > printf. How do you propose that 'foo' saves all parts of the SSE > > > registers, > > > even those that aren't invented yet, or those that can't be touched by the > > > current ISA? (printf might clobber all of these) > > > > Vector registers are out of scope for this. > > Why do you say that? From clang: "Furthermore it also preserves all > floating-point registers (XMMs/YMMs)." (for preserve_all, but this > bugreport does include that variant of the attribute). Ugh, I preferred not to look at it because it's likely that the Clang implementation is broken (not future-proof). > > But lets look at APX. If printf is recompiled to use APX, then it will > > clobber the extended register file. If we define __preserve_most__ the way > > we do in my psABI proposal (i.e., *not* as everything but %r11), the > > extended APX registers are still caller-saved. > > Right, for preserve_most _with your wording_ it works out. preserve_all > or preserve_most with clang wording doesn't. In glibc, we already use a full context switch with XSAVE for the dynamic loader trampoline. As far as I understand it, it's not future-proof. The kernel could provide an interface that is guaranteed to work because it only enables those parts of the register file that it can context-switch. I can probably get the userspace-only implementation into glibc, but the kernel interface seems unlikely. We'd also have to work out the interaction of preserve_all and unwinding, setjmp etc.; not sure if there is a proper solution for that.