Originally Posted by
CornedBee
Stack push order is just that, stack push order. While it may be desireable for the compiler to evaluate the arguments in push order (evaluate, push, evaluate, push, ...), that's not always the case. Especially since a compiler can easily allocate space for all arguments at once, and then just write to the correct location, so it is really free to do the evaluation in whatever order it wants.
When there's a register-passing convention, the difference will be even greater. Reason being, every argument already completed increases the register pressure, unless it gets spilled, in which case the point of passing it in a register is lost. So the compiler will order operations by the number of registers they need. Simple variable loads will be last.