Note that there are some explanatory texts on larger screens.

plurals
  1. POWhy does the Mac ABI require 16-byte stack alignment for x86-32?
    text
    copied!<p>I can understand this requirement for the old PPC RISC systems and even for x86-64, but for the old tried-and-true x86? In this case, the stack needs to be aligned on 4 byte boundaries only. Yes, some of the MMX/SSE instructions require 16byte alignments, but if that is a requirement of the callee, then it should ensure the alignments are correct. Why burden <strong>every</strong> caller with this extra requirement? This can actually cause some drops in performance because every call-site must manage this requirement. Am I missing something?</p> <p><strong>Update:</strong> After some more investigation into this and some consultation with some internal colleagues, I have some theories about this:</p> <ol> <li>Consistency between the PPC, x86, and x64 version of the OS</li> <li>It seems that the GCC codegen now consistently does a sub esp,xxx and then "mov"s the data onto the stack rather than simply doing a "push" instruction. This could actually be faster on some hardware.</li> <li>While this does complicate the call sites a little, there is very little extra overhead when using the default "cdecl" convention where the caller cleans up the stack.</li> </ol> <p>The issue I have with the last item, is that for calling conventions that rely on the callee cleaning the stack, the above requirements <strong>really</strong> "uglifies" the codegen. For instance, what some compiler decided to implement a faster register-based calling style for its own internal use (ie any code that isn't intended to be called from other languages or sources)? This stack-alignment thing could negate some of the performance gains achieved by passing some parameters in registers.</p> <p><strong>Update:</strong> So far the only real answers have been consistency, but to me that's a bit too easy of an answer. I have well over 20 years experience with the x86 architecture and if consistency, not performance, or something else concrete, is really the reason then I respectfully suggest that is a bit naive for the developers to require it. They're ignoring nearly three decades of tools and support. Especially if they're expecting tools vendors to quickly and easily adapt their tools for their platform (maybe not... it <strong>is</strong> Apple...) without having to jump through several seemingly unnecessary hoops.</p> <p>I'll give this topic another day or so then close it...</p> <h3>Related</h3> <ul> <li><a href="http://blog.therealoracleatdelphi.com/2010/01/its-my-stack-frame-i-dont-care-about_14.html" rel="nofollow noreferrer">It’s my stack frame, I don’t care about your stack frame!</a></li> </ul>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload