瀏覽代碼

* fix longjmp/setjmp for sparc64

git-svn-id: trunk@36634 -
florian 8 年之前
父節點
當前提交
26b43e65c9
共有 1 個文件被更改,包括 17 次插入17 次删除
  1. 17 17
      rtl/sparc64/setjump.inc

+ 17 - 17
rtl/sparc64/setjump.inc

@@ -23,28 +23,28 @@ procedure fpc_longjmp(var s : jmp_buf;value:longint);assembler;nostackframe;[Pub
     // Store our arguments in global registers so we can still
     // use them while unwinding frames and their register windows.
 
-    ld [%o0+4], %g3         // Cache target FP in register %g3.
+    ldx [%o0+8], %g3         // Cache target FP in register %g3.
     mov %o0, %g1            // s in %g1
     orcc %o1, %g0, %g2      // value in %g2
-    be,a .L0                // Branch if zero; else skip delay slot.
+    be,a %xcc,.L0           // Branch if zero; else skip delay slot.
     mov 1, %g2              // Delay slot only hit if zero: VAL = 1.
 .L0:
     xor %fp, %g3, %o0
     add %fp, 512, %o1
     andncc %o0, 4095, %o0
-    bne .Lthread
+    bne %xcc,.Lthread
     cmp %o1, %g3
-    bl .Lthread
+    bl %xcc,.Lthread
 
     // Now we will loop, unwinding the register windows up the stack
     // until the restored %fp value matches the target value in %g3.
 
 .Lloop:
     cmp %fp, %g3            // Have we reached the target frame?
-    bl,a .Lloop             // Loop while current fp is below target.
+    bl,a %xcc,.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.
+    be,a %xcc,.Lfound       // Better have hit it exactly.
+    ldx [%g1], %o0          // Delay slot: extract target SP.
 
 .Lthread:
     {
@@ -56,14 +56,14 @@ procedure fpc_longjmp(var s : jmp_buf;value:longint);assembler;nostackframe;[Pub
      * windows.
     }
 
-    ta      3
+    flushw
     mov     %g1,%o1         // use %o1, since %g1 will be destroyed by the call below
 
-    ld      [%o1], %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.
+    ldx     [%o1], %fp      // Set saved SP on restore below.
+    sub     %fp, 128, %sp   // Allocate a register frame.
+    stx     %g3, [%fp+STACK_BIAS+96]   // Set saved FP on restore below.
 
-    ld      [%o1+8], %o7    // Set return PC.
+    ldx      [%o1+16], %o7    // Set return PC.
 
     retl
     restore %g2, 0, %o0     // Restore values from above register frame.
@@ -73,7 +73,7 @@ procedure fpc_longjmp(var s : jmp_buf;value:longint);assembler;nostackframe;[Pub
     mov %o0, %sp            // OK, install new SP.
 
 .Lsp_ok:
-    ld [%g1+8], %o0         // Extract target return PC.
+    ldx [%g1+16], %o0       // Extract target return PC.
     jmp %o0+8               // Return there.
     mov %g2, %o0            // Delay slot: set return value.
   end;
@@ -82,11 +82,11 @@ procedure fpc_longjmp(var s : jmp_buf;value:longint);assembler;nostackframe;[Pub
 function fpc_setjmp(var S:jmp_buf):longint;assembler;nostackframe;[Public,alias:'FPC_SETJMP'];compilerproc;
   asm
     // We don't create a stackframe so we can save PC,SP and FP of the caller
-    st      %o7, [%o0+8]
-    st      %sp, [%o0]
-    st      %fp, [%o0+4]
+    stx     %o7, [%o0+16]
+    stx     %sp, [%o0]
+    stx     %fp, [%o0+8]
 
-    ld      [%o0+8], %o7
+    ldx     [%o0+16], %o7
     mov     %g0, %o0
   end;