123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 2002 by Jonas Maebe 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.
- **********************************************************************}
- {
- jmp_buf = packed record
- r1, r2, lr,r14,r15,
- r16,r17,r18,r19,r20,
- r21,r22,r23,r24,r25,
- r26,r27,r28,r29,r30,
- r31,cr : int64;
- // 176
- f14,f15,f16,
- // 200
- f17,f18,f19,f20,f21,
- f22,f23,f24,f25,f26,
- f27,f28,f29,f30,f31 : double;
- end;
- pjmp_buf = ^jmp_buf;}
- function fpc_setjmp(var S : jmp_buf) : longint;assembler;[Public, alias : 'FPC_SETJMP']; nostackframe; compilerproc;
- asm
- std r1,0(r3) // store r1
- mflr r0
- std r2,8(r3) // store r2
- std r14,24(r3) // store r14
- stfd f14,176(r3) // store f14
- std r0,16(r3) // store lr
- std r15,32(r3) // store r15
- stfd f15,184(r3) // store f15
- mfcr r0
- std r16,40(r3) // store r16
- stfd f16,192(r3) // store f16
- stw r0,168(r3) // store cr
- std r17,48(r3) // store r17
- stfd f17,200(r3) // store f17
- std r18,56(r3) // ...
- stfd f18,208(r3)
- std r19,64(r3)
- stfd f19,216(r3)
- std r20,72(r3)
- stfd f20,224(r3)
- std r21,80(r3)
- stfd f21,232(r3)
- std r22,88(r3)
- stfd f22,240(r3)
- std r23,96(r3)
- stfd f23,248(r3)
- std r24,104(r3)
- stfd f24,256(r3)
- std r25,112(r3)
- stfd f25,264(r3)
- std r26,120(r3)
- stfd f26,272(r3)
- std r27,128(r3)
- stfd f27,280(r3)
- std r28,136(r3)
- stfd f28,288(r3)
- std r29,144(r3)
- stfd f29,296(r3)
- std r30,152(r3)
- stfd f30,304(r3)
- std r31,160(r3)
- stfd f31,312(r3)
- li r3,0
- end;
- procedure fpc_longjmp(var S : jmp_buf;value : longint);assembler;[Public, alias : 'FPC_LONGJMP']; nostackframe; compilerproc;
- asm
- ld r1,0(r3) // load r1
- ld r2,8(r3) // load r2
- ld r0,16(r3) // load lr
- ld r14,24(r3) // load r14
- lfd f14,176(r3)
- ld r15,32(r3) // load r15
- lfd f15,184(r3)
- ld r16,40(r3)
- lfd f16,192(r3)
- ld r17,48(r3)
- lfd f17,200(r3)
- ld r18,56(r3)
- lfd f18,208(r3)
- ld r19,64(r3)
- lfd f19,216(r3)
- ld r20,72(r3)
- lfd f20,224(r3)
- mtlr r0
- ld r21,80(r3)
- lfd f21,232(r3)
- ld r22,88(r3)
- lfd f22,240(r3)
- lwz r0,168(r3)
- ld r23,96(r3)
- lfd f23,248(r3)
- ld r24,104(r3)
- lfd f24,256(r3)
- ld r25,112(r3)
- lfd f25,264(r3)
- mtcrf 0xff,r0
- ld r26,120(r3)
- lfd f26,272(r3)
- ld r27,128(r3)
- lfd f27,280(r3)
- ld r28,136(r3)
- lfd f28,288(r3)
- ld r29,144(r3)
- lfd f29,296(r3)
- ld r30,152(r3)
- lfd f30,304(r3)
- ld r31,160(r3)
- lfd f31,312(r3)
- mr r3,r4
- end;
|