mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-12 21:11:45 +02:00

sysv_abi_cdecl calling conventions on x86-64 to force using the SYSV/ Microsoft ABI on platforms that don't use it by default (mainly to ease porting pure assembler routines) git-svn-id: trunk@35425 -
99 lines
1.7 KiB
ObjectPascal
99 lines
1.7 KiB
ObjectPascal
{ %cpu=x86_64 }
|
|
|
|
function proc_msabidefault(para1,para2,para3,para4: qword): boolean; ms_abi_default;
|
|
assembler;
|
|
asm
|
|
cmpq $1, %rcx
|
|
jne .Lerror
|
|
cmpq $2, %rdx
|
|
jne .Lerror
|
|
cmpq $3, %r8
|
|
jne .Lerror
|
|
cmpq $4, %r9
|
|
jne .Lerror
|
|
movq $1,%rax
|
|
jmp .Lok
|
|
.Lerror:
|
|
movq $0,%rax
|
|
.Lok:
|
|
end;
|
|
|
|
function proc_msabicdecl(para1,para2,para3,para4: qword): boolean; ms_abi_cdecl;
|
|
assembler;
|
|
asm
|
|
cmpq $1, %rcx
|
|
jne .Lerror
|
|
cmpq $2, %rdx
|
|
jne .Lerror
|
|
cmpq $3, %r8
|
|
jne .Lerror
|
|
cmpq $4, %r9
|
|
jne .Lerror
|
|
movq $1,%rax
|
|
jmp .Lok
|
|
.Lerror:
|
|
movq $0,%rax
|
|
.Lok:
|
|
end;
|
|
|
|
|
|
function proc_sysvabidefault(para1,para2,para3,para4,para5,para6: qword): boolean; sysv_abi_default;
|
|
assembler;
|
|
asm
|
|
cmpq $1, %rdi
|
|
jne .Lerror
|
|
cmpq $2, %rsi
|
|
jne .Lerror
|
|
cmpq $3, %rdx
|
|
jne .Lerror
|
|
cmpq $4, %rcx
|
|
jne .Lerror
|
|
cmpq $5, %r8
|
|
jne .Lerror
|
|
cmpq $6, %r9
|
|
jne .Lerror
|
|
movq $1,%rax
|
|
jmp .Lok
|
|
.Lerror:
|
|
movq $0,%rax
|
|
.Lok:
|
|
end;
|
|
|
|
|
|
function proc_sysvabicdecl_extern(para1,para2,para3,para4,para5,para6: qword): boolean; sysv_abi_cdecl; varargs; external name '_FPC_PROCC_SYSVABICDECL';
|
|
|
|
function proc_sysvabicdecl(para1,para2,para3,para4,para5,para6: qword): boolean; sysv_abi_cdecl; [public, alias: '_FPC_PROCC_SYSVABICDECL'];
|
|
assembler;
|
|
asm
|
|
cmpb $0, %al
|
|
jne .Lerror
|
|
cmpq $1, %rdi
|
|
jne .Lerror
|
|
cmpq $2, %rsi
|
|
jne .Lerror
|
|
cmpq $3, %rdx
|
|
jne .Lerror
|
|
cmpq $4, %rcx
|
|
jne .Lerror
|
|
cmpq $5, %r8
|
|
jne .Lerror
|
|
cmpq $6, %r9
|
|
jne .Lerror
|
|
movq $1,%rax
|
|
jmp .Lok
|
|
.Lerror:
|
|
movq $0,%rax
|
|
.Lok:
|
|
end;
|
|
|
|
begin
|
|
if not proc_msabidefault(1,2,3,4) then
|
|
halt(1);
|
|
if not proc_msabicdecl(1,2,3,4) then
|
|
halt(2);
|
|
if not proc_sysvabidefault(1,2,3,4,5,6) then
|
|
halt(3);
|
|
if not proc_sysvabicdecl_extern(1,2,3,4,5,6) then
|
|
halt(4);
|
|
end.
|