Browse Source

* setjmp on sparc improved

florian 21 years ago
parent
commit
d748857500
1 changed files with 48 additions and 48 deletions
  1. 48 48
      rtl/sparc/setjump.inc

+ 48 - 48
rtl/sparc/setjump.inc

@@ -20,67 +20,64 @@
 }
 }
 procedure longjmp(var s : jmp_buf;value:longint);assembler;[Public,alias:'FPC_LONGJMP'];
 procedure longjmp(var s : jmp_buf;value:longint);assembler;[Public,alias:'FPC_LONGJMP'];
   asm
   asm
-         // Store our arguments in global registers so we can still
-         // use them while unwinding frames and their register windows.
-
-         ld [%i0+4], %g3         // Cache target FP in register %g3.
-         mov %i0, %g1            // s in %g1
-         orcc %i1, %g0, %g2      // value in %g2
-         be,a .L0                // Branch if zero; else skip delay slot.
-         mov 1, %g2              // Delay slot only hit if zero: VAL = 1.
+    // Store our arguments in global registers so we can still
+    // use them while unwinding frames and their register windows.
+
+    ld [%i0+4], %g3         // Cache target FP in register %g3.
+    mov %i0, %g1            // s in %g1
+    orcc %i1, %g0, %g2      // value in %g2
+    be,a .L0                // Branch if zero; else skip delay slot.
+    mov 1, %g2              // Delay slot only hit if zero: VAL = 1.
 .L0:
 .L0:
-         xor %fp, %g3, %o0
-         add %fp, 512, %o1
-         andncc %o0, 4095, %o0
-         bne .Lthread
-         cmp %o1, %g3
-         bl .Lthread
+    xor %fp, %g3, %o0
+    add %fp, 512, %o1
+    andncc %o0, 4095, %o0
+    bne .Lthread
+    cmp %o1, %g3
+    bl .Lthread
 
 
-         // Now we will loop, unwinding the register windows up the stack
-         // until the restored %fp value matches the target value in %g3.
+    // Now we will loop, unwinding the register windows up the stack
+    // until the restored %fp value matches the target value in %g3.
 
 
 .Lloop:
 .Lloop:
-         cmp %fp, %g3            // Have we reached the target frame?
-         bl,a .Lloop             // Loop while current fp is below target.
-         restore                 // Unwind register window in delay slot.
-         be,a .Lfound            // Better have hit it exactly.
-         ld [%g1], %o0           // Delay slot: extract target SP.
+    cmp %fp, %g3            // Have we reached the target frame?
+    bl,a .Lloop             // Loop while current fp is below target.
+    restore                 // Unwind register window in delay slot.
+    be,a .Lfound            // Better have hit it exactly.
+    ld [%g1], %o0           // Delay slot: extract target SP.
 
 
 .Lthread:
 .Lthread:
-         {
-          * Do a "flush register windows trap".  The trap handler in the
-          * kernel writes all the register windows to their stack slots, and
-          * marks them all as invalid (needing to be sucked up from the
-          * stack when used).  This ensures that all information needed to
-          * unwind to these callers is in memory, not in the register
-          * windows.
-         }
-
-         ta      3
-         ld      [%g1+8], %o7    // Set return PC.
-         ld      [%g1], %fp      // Set saved SP on restore below.
-         sub     %fp, 64, %sp    // Allocate a register frame.
-         st      %g3, [%fp+48]  // Set saved FP on restore below.
-         ret
-         restore %g2, 0, %o0     // Restore values from above register frame.
+    {
+     * Do a "flush register windows trap".  The trap handler in the
+     * kernel writes all the register windows to their stack slots, and
+     * marks them all as invalid (needing to be sucked up from the
+     * stack when used).  This ensures that all information needed to
+     * unwind to these callers is in memory, not in the register
+     * windows.
+    }
+
+    ta      3
+    ld      [%g1+8], %o7    // Set return PC.
+    ld      [%g1], %fp      // Set saved SP on restore below.
+    sub     %fp, 64, %sp    // Allocate a register frame.
+    st      %g3, [%fp+48]   // Set saved FP on restore below.
+    ret
+    restore %g2, 0, %o0     // Restore values from above register frame.
 
 
 .Lfound:
 .Lfound:
-         // We have unwound register windows so %fp matches the target.
-         mov %o0, %sp            // OK, install new SP.
+    // We have unwound register windows so %fp matches the target.
+    mov %o0, %sp            // OK, install new SP.
 
 
 .Lsp_ok:
 .Lsp_ok:
-         ld [%g1+8], %o0         // Extract target return PC.
-         jmp %o0+8               // Return there.
-         mov %g2, %o0            // Delay slot: set return value.
-end;
+    ld [%g1+8], %o0         // Extract target return PC.
+    jmp %o0+8               // Return there.
+    mov %g2, %o0            // Delay slot: set return value.
+  end;
 
 
 
 
 function setjmp(var S:jmp_buf):longint;assembler;[Public,alias:'FPC_SETJMP'];
 function setjmp(var S:jmp_buf):longint;assembler;[Public,alias:'FPC_SETJMP'];
   asm
   asm
-    // Save our PC, SP and FP.  Save the signal mask if requested with
-    //  a tail-call for simplicity; it always returns zero.
-    ta      3
-
+    // Save our PC, SP and FP.
     st      %i7, [%i0+8]
     st      %i7, [%i0+8]
     st      %sp, [%i0]
     st      %sp, [%i0]
     st      %fp, [%i0+4]
     st      %fp, [%i0+4]
@@ -89,7 +86,10 @@ function setjmp(var S:jmp_buf):longint;assembler;[Public,alias:'FPC_SETJMP'];
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.6  2004-05-25 21:38:11  peter
+  Revision 1.7  2004-05-30 12:08:32  florian
+    * setjmp on sparc improved
+
+  Revision 1.6  2004/05/25 21:38:11  peter
     * fixed input registers
     * fixed input registers
 
 
   Revision 1.5  2004/05/18 19:36:37  florian
   Revision 1.5  2004/05/18 19:36:37  florian