In the early days, I had to do a lot of testing to disambiguate such statements.
The first 4 parameters are passed in xmm registers for floats, and cpu registers for non-floats.
Floats: xmm0 xmm1 xmm2 xmm3
non floats: rcx rdx r8 r9
Supposing you had a mix of floats and non-floats:
foo(int a,float b, int c, float d)
They would be passed to foo something like this:
sub rsp,32 'create spill zone for 4 registers on the stack
mov eax,a
movss xmm1,b
mov r8d,c
movss xmm3,d
call foo
add rsp,32 'restore stack pointer position
Another example:
bah(double a,quad b, double c, quad d)
sub rsp,32 'create spill zone for 4 registers on the stack
movsd xmm0,a
mov rdi,b
movsd xmm2,c
mov r9,d
call bah
add rsp,32 'restore stack pointer position