3 ms·
You could well be right. In my own tests, the ESP swap is what tanked performance. A more limited stackless test did not have nearly the same overhead. And inde
by byuu 7y ago
You could well be right. In my own tests, the ESP swap is what tanked performance. A more limited stackless test did not have nearly the same overhead. And indeed, the largest speedup was from moving to set ESP as soon as possible, get the return address into EAX, and finally jump to it. CALL+RET with late ESP set behaved poorly, leading me to believe it was due to the CPU stalling on the ESP change.
I did also try inlining this, but it was much less portable and actually performed slower in my emulator. I won't claim that will be the case for everyone, of course. YMMV.
- fwsgonzo 7y agoInteresting that you saw that. I guess it could be real, but sounds weird too.
- avdicius 7y agoWow. I used my own stack switch routine for several years now and didn't realize it could be improved until I read this thread. Thank you very much. This is my old naive version: https://github.com/ademakov/MainMemory/blob/master/src/base/arch/x86-64/cstack-switch.S https://github.com/ademakov/MainMemory/blob/master/src/base/... This is what I have now: https://github.com/ademakov/MainMemory/blob/cstack-switch-revamp/src/base/arch/x86-64/cstack.h https://github.com/ademakov/MainMemory/blob/cstack-switch-re...
- gpderetta 7y agoYou are missing x/y/zmm regs in the clobber list.
- avdicius 7y agoYes, that's true. However in my app this has never caused any problems. Apparently even if the compiler auto-vectorizes anything it does this only with scratch regs or in leaf procedures. I don't have any fp or simd code of myself.