diff --git a/rtl/m68k/setjump.inc b/rtl/m68k/setjump.inc index 2e21623e85..7dc34b69ed 100644 --- a/rtl/m68k/setjump.inc +++ b/rtl/m68k/setjump.inc @@ -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;