1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 2003 by Florian Klaempfl and other members of the
- Free Pascal development team
- SetJmp and LongJmp implementation for exception handling
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- function fpc_setjmp(var S : jmp_buf) : longint;assembler;[Public, alias : 'FPC_SETJMP'];nostackframe;compilerproc;
- asm
- {$ifdef win64}
- // Save registers.
- movq %rbx,(%rcx)
- movq %rbp,8(%rcx)
- movq %r12,16(%rcx)
- movq %r13,24(%rcx)
- movq %r14,32(%rcx)
- movq %r15,40(%rcx)
- movq %rsi,64(%rcx)
- movq %rdi,72(%rcx)
- leaq 8(%rsp),%rdx // Save SP as it will be after we return.
- movq %rdx,48(%rcx)
- movq 0(%rsp),%r8 // Save PC we are returning to now.
- movq %r8,56(%rcx)
- xorq %rax,%rax
- {$else win64}
- // Save registers.
- movq %rbx,(%rdi)
- movq %rbp,8(%rdi)
- movq %r12,16(%rdi)
- movq %r13,24(%rdi)
- movq %r14,32(%rdi)
- movq %r15,40(%rdi)
- leaq 8(%rsp),%rdx // Save SP as it will be after we return.
- movq %rdx,48(%rdi)
- movq 0(%rsp),%rsi // Save PC we are returning to now.
- movq %rsi,56(%rdi)
- xorq %rax,%rax
- {$endif win64}
- end;
- procedure fpc_longjmp(var S : jmp_buf;value : longint);assembler;[Public, alias : 'FPC_LONGJMP'];compilerproc;
- asm
- {$ifdef win64}
- // Restore registers.
- movq (%rcx),%rbx
- movq 8(%rcx),%rbp
- movq 16(%rcx),%r12
- movq 24(%rcx),%r13
- movq 32(%rcx),%r14
- movq 40(%rcx),%r15
- // Set return value for setjmp.
- test %edx,%edx
- mov $01,%eax
- cmove %eax,%edx
- mov %edx,%eax
- movq 48(%rcx),%rsp
- movq 56(%rcx),%rdx
- movq 64(%rcx),%rsi
- movq 72(%rcx),%rdi
- jmpq *%rdx
- {$else win64}
- // Restore registers.
- movq (%rdi),%rbx
- movq 8(%rdi),%rbp
- movq 16(%rdi),%r12
- movq 24(%rdi),%r13
- movq 32(%rdi),%r14
- movq 40(%rdi),%r15
- // Set return value for setjmp.
- test %esi,%esi
- mov $01,%eax
- cmove %eax,%esi
- mov %esi,%eax
- movq 56(%rdi),%rdx
- movq 48(%rdi),%rsp
- jmpq *%rdx
- {$endif win64}
- end;
|