* ported OpenBSD's x86_64 cprt0.as to inline asm in si_c.inc

git-svn-id: trunk@41705 -
This commit is contained in:
nickysn 2019-03-14 21:13:17 +00:00
parent 52c53f0d18
commit c856879c96

View File

@ -14,4 +14,157 @@
**********************************************************************}
{$asmmode gas}
procedure _mcleanup; external name '_mcleanup';
procedure _etext; external name '_etext';
procedure _eprol; external name '_eprol';
procedure atexit; external name 'atexit';
procedure monstartup; external name 'monstartup';
procedure _init; external name '_init';
procedure _FPC_proc___start; forward;
procedure _FPC_proc_start; assembler; nostackframe; public name '_start'; public name '__start';
asm
movq %rbx,%r9
movq %rcx,%r8
movq %rdx,%rcx
movq (%rsp),%rdi
leaq 16(%rsp,%rdi,8),%rdx
leaq 8(%rsp),%rsi
subq $8,%rsp
andq $0xFFFFFFFFFFFFFFF0,%rsp
addq $8,%rsp
jmp _FPC_proc___start
end;
procedure _FPC_proc_haltproc; forward;
function _strrchr(str: PChar; character: LongInt): PChar; forward;
procedure _FPC_proc___start; assembler; nostackframe; public name '___start';
asm
pushq %rbp
movq %rsp, %rbp
subq $64, %rsp
movl %edi, -20(%rbp)
movq %rsi, -32(%rbp)
movq %rdx, -40(%rbp)
movq %rcx, -48(%rbp)
movq %r8, -56(%rbp)
movq %r9, -64(%rbp)
movq -40(%rbp), %rax
movq %rax, environ(%rip)
movq %rax,operatingsystem_parameter_envp(%rip)
movq -32(%rbp), %rax
movq (%rax), %rax
movq %rax, -8(%rbp)
cmpq $0, -8(%rbp)
je .L2
movq -8(%rbp), %rdi
movl $47, %esi
call _strrchr
movq %rax, __progname(%rip)
movq __progname(%rip), %rax
testq %rax, %rax
jne .L4
movq -8(%rbp), %rax
movq %rax, __progname(%rip)
jmp .L6
.L4:
movq __progname(%rip), %rax
addq $1, %rax
movq %rax, __progname(%rip)
.L6:
leaq __progname_storage(%rip), %rax
movq %rax, -16(%rbp)
jmp .L7
.L8:
movq __progname(%rip), %rcx
movzbl (%rcx), %edx
movq -16(%rbp), %rax
movb %dl, (%rax)
addq $1, -16(%rbp)
leaq 1(%rcx), %rax
movq %rax, __progname(%rip)
.L7:
movq __progname(%rip), %rax
movzbl (%rax), %eax
testb %al, %al
je .L9
leaq __progname_storage+255(%rip), %rax
cmpq %rax, -16(%rbp)
jb .L8
.L9:
leaq __progname_storage(%rip), %rax
movq %rax, __progname(%rip)
movq -16(%rbp), %rax
movb $0, (%rax)
.L2:
movq _mcleanup@GOTPCREL(%rip), %rdi
call atexit
movq _etext@GOTPCREL(%rip), %rsi
leaq _eprol(%rip), %rdi
call monstartup@plt
movl $0, %eax
call _init
movq environ(%rip), %rdx
movq -32(%rbp), %rsi
movl -20(%rbp), %edi
movq %rdi,operatingsystem_parameter_argc(%rip)
movq %rsi,operatingsystem_parameter_argv(%rip)
movl $0, %eax
call PASCALMAIN
// movl %eax, %edi
// call exit
jmp _FPC_proc_haltproc
end;
procedure _FPC_proc_haltproc; assembler; nostackframe; public name '_haltproc';
asm
movq $1,%rax
movl operatingsystem_result(%rip),%ebx
pushq %rbx
call .Lactualsyscall
addq $8,%rsp
jmp _FPC_proc_haltproc
.Lactualsyscall:
int $0x80
jb .LErrorcode
xor %rbx,%rbx
ret
.LErrorcode:
movq %rax,%rbx
movq $-1,%rax
end;
function _strrchr(str: PChar; character: LongInt): PChar; assembler; nostackframe; public name '_strrchr';
asm
pushq %rbp
movq %rsp, %rbp
movq %rdi, -24(%rbp)
movb %sil, -25(%rbp)
movq $0, -8(%rbp)
.L13:
movq -24(%rbp), %rdx
movzbl (%rdx), %eax
cmpb -25(%rbp), %al
jne .L14
movq -24(%rbp), %rax
movq %rax, -8(%rbp)
.L14:
movq -24(%rbp), %rdx
movzbl (%rdx), %eax
testb %al, %al
jne .L16
movq -8(%rbp), %rax
movq %rax, -16(%rbp)
jmp .L12
.L16:
addq $1, -24(%rbp)
jmp .L13
.L12:
movq -16(%rbp), %rax
leave
end;