Browse Source

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

git-svn-id: trunk@28177 -
Károly Balogh 11 years ago
parent
commit
f98cd634fb
1 changed files with 33 additions and 82 deletions
  1. 33 82
      rtl/m68k/setjump.inc

+ 33 - 82
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
+  move.l (a0),fp
+  // restore SP
+  move.l 4(a0),sp
+  // jump to PC
+  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)}
-  move.l (a0), a5
+  movem.l 40(a0),a0/a1/a2/a3/a4/a6   { amiga uses a5 as fp }
 {$else}
-  move.l (a0), a6
+  movem.l 40(a0),a0/a1/a2/a3/a4/a5
 {$endif}
-  // restore 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
+
+  // new return pc is at (sp)
 end;