mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 05:49:12 +02:00
m68k: reworked/cleaned setjmp/longjmp code to use the movem instruction with register lists
git-svn-id: trunk@28177 -
This commit is contained in:
parent
df60309d96
commit
f98cd634fb
@ -21,51 +21,32 @@
|
|||||||
Function fpc_SetJmp (Var S : Jmp_buf) : longint;assembler;nostackframe;[Public, alias : 'FPC_SETJMP'];compilerproc;
|
Function fpc_SetJmp (Var S : Jmp_buf) : longint;assembler;nostackframe;[Public, alias : 'FPC_SETJMP'];compilerproc;
|
||||||
asm
|
asm
|
||||||
// Temporarily store a0 into d0
|
// Temporarily store a0 into d0
|
||||||
move.l a0,d0
|
move.l a0,d0
|
||||||
// load S to a0
|
// load S to a0
|
||||||
move.l 4(sp), a0
|
move.l 4(sp),a0
|
||||||
// save a0 (now in d0) to offset 40
|
|
||||||
move.l d0, 40(a0)
|
// Save data registers d1..d7
|
||||||
// save return address (PC) and pop S off the stack
|
movem.l d1/d2/d3/d4/d5/d6/d7,12(a0)
|
||||||
move.l (sp)+, d0
|
// Save address registers (a0-a5/a6, a0 is in d0 now)
|
||||||
move.l d0,(sp)
|
|
||||||
move.l d0, 8(a0)
|
|
||||||
// save FP
|
|
||||||
{$if defined(amiga)}
|
{$if defined(amiga)}
|
||||||
move.l a5, (a0)
|
movem.l d0/a1/a2/a3/a4/a6,40(a0) { amiga uses a5 as fp }
|
||||||
{$else}
|
{$else}
|
||||||
move.l a6, (a0)
|
movem.l d0/a1/a2/a3/a4/a5,40(a0)
|
||||||
{$endif}
|
{$endif}
|
||||||
|
|
||||||
|
// save return address (PC) and pop S off the stack
|
||||||
|
move.l (sp)+,d0
|
||||||
|
move.l d0,(sp)
|
||||||
|
move.l d0,8(a0)
|
||||||
|
// save FP
|
||||||
|
move.l fp,(a0)
|
||||||
// save SP
|
// save SP
|
||||||
move.l sp, d0
|
move.l sp,d0
|
||||||
// 4 bytes already popped, 4 to go.
|
// 4 bytes already popped, 4 to go.
|
||||||
addq.l #4, d0
|
addq.l #4,d0
|
||||||
move.l d0, 4(a0)
|
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.l d1, 12(a0)
|
|
||||||
move.l d2, 16(a0)
|
|
||||||
move.l d3, 20(a0)
|
|
||||||
move.l d4, 24(a0)
|
|
||||||
move.l d5, 28(a0)
|
|
||||||
move.l d6, 32(a0)
|
|
||||||
move.l d7, 36(a0)
|
|
||||||
// restore a0
|
// restore a0
|
||||||
move.l 40(a0), a0
|
move.l 40(a0),a0
|
||||||
|
|
||||||
// return 0
|
// return 0
|
||||||
clr.l d0
|
clr.l d0
|
||||||
@ -75,53 +56,23 @@ Procedure fpc_longJmp (Var S : Jmp_buf; value : longint); assembler;nostackframe
|
|||||||
asm
|
asm
|
||||||
// load S to a0
|
// load S to a0
|
||||||
move.l 4(sp),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.l 12(a0),d1
|
|
||||||
move.l 16(a0),d2
|
|
||||||
move.l 20(a0),d3
|
|
||||||
move.l 24(a0),d4
|
|
||||||
move.l 28(a0),d5
|
|
||||||
move.l 32(a0),d6
|
|
||||||
move.l 36(a0),d7
|
|
||||||
|
|
||||||
// load value to d0
|
|
||||||
move.l 8(sp),d0
|
|
||||||
// Save temporarily into d1 slot
|
|
||||||
move.l d0,12(a0)
|
|
||||||
// restore FP
|
// restore FP
|
||||||
{$if defined(amiga)}
|
move.l (a0),fp
|
||||||
move.l (a0), a5
|
|
||||||
{$else}
|
|
||||||
move.l (a0), a6
|
|
||||||
{$endif}
|
|
||||||
// restore SP
|
// restore SP
|
||||||
move.l 4(a0), sp
|
move.l 4(a0),sp
|
||||||
// jump to PC
|
// jump to PC
|
||||||
move.l 8(a0),d0
|
move.l 8(a0),-(sp)
|
||||||
move.l d0,-(sp)
|
|
||||||
// restore a0
|
// Restore data registers
|
||||||
move.l 40(a0),d0
|
movem.l 12(a0),d1/d2/d3/d4/d5/d6/d7
|
||||||
move.l d0,-(sp)
|
|
||||||
// restore return value, now at 12(a0)
|
// Restore address registers
|
||||||
move.l 12(a0),d0
|
{$if defined(amiga)}
|
||||||
// restore a0 from stack
|
movem.l 40(a0),a0/a1/a2/a3/a4/a6 { amiga uses a5 as fp }
|
||||||
move.l (sp)+,a0
|
{$else}
|
||||||
// new return pc is at (sp), so we can call rts
|
movem.l 40(a0),a0/a1/a2/a3/a4/a5
|
||||||
rts
|
{$endif}
|
||||||
|
|
||||||
|
// new return pc is at (sp)
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user