Fix POSIX argument passing.

POSIX AMD64 argument passing may be weird, but it's understandable.
Arguments are divided per class. The first 6 integer or pointer
arguments are passed in general-purpose registers, the first 8
floating point arguments are passed in SSE registers, and any
further arguments are passed on the stack in right-to-left order.

Win64 on the other hand specifies that the first four arguments
are always passed in registers - either GPR or SSE - and all others
on stack, so far as I can tell in left-to-right order. Thus, if it
happens that the second argument of any function is a floating-point
argument, on POSIX it is passed in %xmm0, and on Win64 it is passed
in %xmm1. Not respecting this difference led a very mysterious bug,
as it often happens that the argument we pass used to live in either
of these registers before.