<div style="line-height:1.7;color:#000000;font-size:14px;font-family:arial"><div>At 2014-04-19 01:47:16,"Jason Garrett-Glaser" <jason@x264.com> wrote:<br>>> In this case, they pass a align stack to our code, but cglobal push 3<br>>> registers, so broken stack align.<br>><br>>I don't understand what you mean.  x264asm knows what the stack<br>>alignment is, so when it allocates scratch space, it references<br>>aligned locations on the stack.  It doesn't matter how many registers<br>>it pushes; if it pushes 12 bytes of registers, it references locations<br>>that are 12 bytes off from where it would if there were no registers<br>>pushed.<br>><br>>"esp" itself may not be aligned, but that's fine, because no data is<br>>ever accessed directly from esp -- it's accessed from aligned<br>>locations on the stack.  That's how stack alignment works. esp only<br>>needs to be aligned if the function calls another function, but<br>>x264asm is for leaf functions, so that doesn't apply.<br>><br>In the x264asm header, I found the doc "%4 = (optional) stack size to be allocated. If not aligned,  the stack will be manually aligned (to 16 or 32 bytes)"</div>
<div>I guess it means we can alloc some space on stack, and x264asm will let it align to 16 ort 32 bytes bound, am I right?</div>
<div> </div>
<div>In this case, x264asm don't do it because HAVE_ALIGNED_STACK=1</div>
<div>the input stack is aligned, but we need push 3 regs into stack, so we got a stack mistake.</div>
<div> </div></div>