x86-64 uses FPU instructions to prepare stack arguments.
On `x86-64/win64`, this code:
```pascal
{$mode objfpc} {$longstrings on}
var
dummyString: string;
procedure DoSomething1(p0, p1, p2, p3, p4: uint32; p5: double);
begin
WriteStr(dummyString, p0, p1, p2, p3, p4, p5);
end;
procedure DoSomething2(p5: double; p0, p1, p2, p3, p4: uint32);
begin
WriteStr(dummyString, p0, p1, p2, p3, p4, p5);
end;
begin
DoSomething1(1, 2, 3, 4, 5, 123.45);
DoSomething2(123.45, 1, 2, 3, 4, 5);
end.
```
compiles (`-O3`) into:
```nasm
; [16] DoSomething1(1, 2, 3, 4, 5, 123.45);
movl $5,32(%rsp)
fldl _$PROGRAM$_Ld1(%rip)
fstpl 40(%rsp)
movl $3,%r8d
movl $2,%edx
movl $1,%ecx
movl $4,%r9d
call P$PROGRAM_$$_DOSOMETHING1$LONGWORD$LONGWORD$LONGWORD$LONGWORD$LONGWORD$DOUBLE
; [17] DoSomething2(123.45, 1, 2, 3, 4, 5);
movl $5,40(%rsp)
movl $4,32(%rsp)
movsd _$PROGRAM$_Ld1(%rip),%xmm0
movl $3,%r9d
movl $2,%r8d
movl $1,%edx
call P$PROGRAM_$$_DOSOMETHING2$DOUBLE$LONGWORD$LONGWORD$LONGWORD$LONGWORD$LONGWORD
```
Are these `FLD` and `FSTP` intended? I mean, `FLD RIP-relative + FSTP to address with 1-byte offset` occupy 10 bytes which is 2 bytes shorter than their alternative `MOV RIP-relative to 64-bit reg + MOV 64-bit reg to address with 1-byte offset` that occupy 12, but isn’t FPU deprecated?
issue