* rtl/m68k/setjumph.inc:

data registers stored are 1 to 7, not 0 to 7
* rtl/m68k/setjump.inc:
    don't use "S" or "value" to reference the parameters as the code generator does not use "sp" instead of "fp" in case of "nostackframe"
    restore a0 at the end of setjmp

git-svn-id: trunk@23240 -
This commit is contained in:
svenbarth 2012-12-28 13:00:28 +00:00
parent 2f25717e67
commit e240856e43
2 changed files with 9 additions and 5 deletions

View File

@ -16,12 +16,14 @@
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 S, a0
move.l 4(sp), a0
// save a0 (now in d0) to offset 40
move.l d0, 40(a0)
// save return address (PC)
@ -32,7 +34,7 @@ asm
// save SP
move.l sp, d0
addq.l #8, d0
move.l d0, (a0)
move.l d0, 4(a0)
// save a1
move.l a1,d0
move.l d0,44(a0)
@ -56,6 +58,8 @@ asm
move d5, 28(a0)
move d6, 32(a0)
move d7, 36(a0)
// restore a0
move.l 40(a0), a0
// return 0
clr.l d0
@ -64,7 +68,7 @@ end;
Procedure fpc_longJmp (Var S : Jmp_buf; value : longint); assembler;nostackframe;[Public, alias : 'FPC_LONGJMP'];compilerproc;
asm
// load S to a0
move.l S,a0
move.l 4(sp),a0
// Restore address registers
// restore a1
move.l 44(a0),d0
@ -91,7 +95,7 @@ asm
move 36(a0),d7
// load value to d0
move.l value,d0
move.l 8(sp),d0
// Save temporarily into d1 slot
move.l d0,12(a0)
// restore FP

View File

@ -26,7 +26,7 @@ Type
if called from SetJmp or value if called from LongJmp }
{ data registers (d1, d2, d3, d4, d5, d6, d7) }
{ offsets: 12, 16, 20, 24, 28, 32, 36 }
dregs : array[0..7] of dword;
dregs : array[1..7] of dword;
{ address registers (a0, a1, a2, a3, a4, a5), a6 and a7 are fp and sp respectively }
{ offsets: 40, 44, 48, 52, 56, 60 }
aregs : array[0..5] of dword;