123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 1999-2000 by xxxx
- member of the Free Pascal development team
- 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.
- **********************************************************************}
- {**********************************************************************
- Set_Jmp/Long_jmp
- **********************************************************************}
- {$warning Fix register handling in case of nostackframe }
- Function fpc_SetJmp (Var S : Jmp_buf) : longint;assembler;nostackframe;[Public, alias : 'FPC_SETJMP'];compilerproc;
- asm
- // Temporarily store a0 into d0
- move.l a0,d0
- // load S to a0
- move.l 4(sp), a0
- // save a0 (now in d0) to offset 40
- move.l d0, 40(a0)
- // save return address (PC)
- move.l (sp), d0
- move.l d0, 8(a0)
- // save FP
- {$if defined(amiga)}
- move.l a5, (a0)
- {$else}
- move.l a6, (a0)
- {$endif}
- // save SP
- move.l sp, d0
- addq.l #8, d0
- move.l d0, 4(a0)
- // save a1
- move.l a1,d0
- move.l d0,44(a0)
- // save a2
- move.l a2,d0
- move.l d0,48(a0)
- // save a3
- move.l a3,d0
- move.l d0,52(a0)
- // save a4
- move.l a4,d0
- move.l d0,56(a0)
- // save a5
- move.l a5,d0
- move.l d0,60(a0)
- // save d1..d7
- move d1, 12(a0)
- move d2, 16(a0)
- move d3, 20(a0)
- move d4, 24(a0)
- move d5, 28(a0)
- move d6, 32(a0)
- move d7, 36(a0)
- // restore a0
- move.l 40(a0), a0
- // return 0
- clr.l d0
- end;
- Procedure fpc_longJmp (Var S : Jmp_buf; value : longint); assembler;nostackframe;[Public, alias : 'FPC_LONGJMP'];compilerproc;
- asm
- // load S to a0
- move.l 4(sp),a0
- // Restore address registers
- // restore a1
- move.l 44(a0),d0
- move.l d0,a1
- // restore a2
- move.l 48(a0),d0
- move.l d0,a2
- // restore a3
- move.l 52(a0),d0
- move.l d0,a3
- // restore a4
- move.l 56(a0),d0
- move.l d0,a4
- // restore a5
- move.l 60(a0),d0
- move.l d0,a5
- // restore d1..d7
- move 12(a0),d1
- move 16(a0),d2
- move 20(a0),d3
- move 24(a0),d4
- move 28(a0),d5
- move 32(a0),d6
- move 36(a0),d7
- // load value to d0
- move.l 8(sp),d0
- // Save temporarily into d1 slot
- move.l d0,12(a0)
- // restore FP
- {$if defined(amiga)}
- move.l (a0), a5
- {$else}
- move.l (a0), a6
- {$endif}
- // restore SP
- move.l 4(a0), sp
- // jump to PC
- move.l 8(a0),d0
- move.l d0,-(sp)
- // restore a0
- move.l 40(a0),d0
- move.l d0,-(sp)
- // restore return value, now at 12(a0)
- move.l 12(a0),d0
- // restore a0 from stack
- move.l (sp)+,a0
- // new return pc is at (sp), so we can call rts
- rts
- end;
|