m68k: reworked/cleaned setjmp/longjmp code to use the movem instruction with register lists

git-svn-id: trunk@28177 -
This commit is contained in:
Károly Balogh 2014-07-06 13:18:56 +00:00
parent df60309d96
commit f98cd634fb

View File

@ -21,51 +21,32 @@
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
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) and pop S off the stack
move.l (sp)+, d0
move.l d0,(sp)
move.l d0, 8(a0)
// save FP
move.l 4(sp),a0
// Save data registers d1..d7
movem.l d1/d2/d3/d4/d5/d6/d7,12(a0)
// Save address registers (a0-a5/a6, a0 is in d0 now)
{$if defined(amiga)}
move.l a5, (a0)
movem.l d0/a1/a2/a3/a4/a6,40(a0) { amiga uses a5 as fp }
{$else}
move.l a6, (a0)
movem.l d0/a1/a2/a3/a4/a5,40(a0)
{$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
move.l sp, d0
move.l sp,d0
// 4 bytes already popped, 4 to go.
addq.l #4, 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.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)
addq.l #4,d0
move.l d0,4(a0)
// restore a0
move.l 40(a0), a0
move.l 40(a0),a0
// return 0
clr.l d0
@ -75,53 +56,23 @@ Procedure fpc_longJmp (Var S : Jmp_buf; value : longint); assembler;nostackframe
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.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
{$if defined(amiga)}
move.l (a0), a5
{$else}
move.l (a0), a6
{$endif}
move.l (a0),fp
// restore SP
move.l 4(a0), 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
move.l 8(a0),-(sp)
// Restore data registers
movem.l 12(a0),d1/d2/d3/d4/d5/d6/d7
// Restore address registers
{$if defined(amiga)}
movem.l 40(a0),a0/a1/a2/a3/a4/a6 { amiga uses a5 as fp }
{$else}
movem.l 40(a0),a0/a1/a2/a3/a4/a5
{$endif}
// new return pc is at (sp)
end;