Pārlūkot izejas kodu

+ initial implementation of setjmp/longjmp

git-svn-id: trunk@46537 -
florian 5 gadi atpakaļ
vecāks
revīzija
8a36e63a56
2 mainītis faili ar 41 papildinājumiem un 3 dzēšanām
  1. 33 2
      rtl/xtensa/setjump.inc
  2. 8 1
      rtl/xtensa/setjumph.inc

+ 33 - 2
rtl/xtensa/setjump.inc

@@ -14,12 +14,43 @@
 
  **********************************************************************}
 
-function fpc_setjmp(var S : jmp_buf) : longint;assembler;[Public, alias : 'FPC_SETJMP']; compilerproc;
+
+function fpc_setjmp(var S : jmp_buf) : longint;assembler;[Public, alias : 'FPC_SETJMP']; compilerproc; nostackframe;
+{$ifdef fpc_abi_call0}
+  asm
+    s32i.n a0,S.a0
+    s32i.n a1,S.a1
+    s32i.n a8,S.a8
+    s32i.n a12,S.a12
+    s32i.n a13,S.a13
+    s32i.n a14,S.a14
+    s32i.n a15,S.a15
+    movi.n a2,0
+  end;
+{$endif fpc_abi_call0}
+{$ifdef fpc_abi_windowed}
   asm
     movi a2,0
   end;
+{$endif fpc_abi_windowed}
 
 
-procedure fpc_longjmp(var S : jmp_buf;value : longint);assembler;[Public, alias : 'FPC_LONGJMP']; compilerproc;
+procedure fpc_longjmp(var S : jmp_buf;value : longint);assembler;[Public, alias : 'FPC_LONGJMP']; compilerproc; nostackframe;
+{$ifdef fpc_abi_call0}
   asm
+    l32i.n a0,S.a0
+    l32i.n a1,S.a1
+    l32i.n a8,S.a8
+    l32i.n a12,S.a12
+    l32i.n a13,S.a13
+    l32i.n a14,S.a14
+    l32i.n a15,S.a15
+    movi.n a2,1
+    movnez a2,value,value
   end;
+{$endif fpc_abi_call0}
+{$ifdef fpc_abi_windowed}
+  asm
+  end;
+{$endif fpc_abi_windowed}
+

+ 8 - 1
rtl/xtensa/setjumph.inc

@@ -15,8 +15,15 @@
  **********************************************************************}
 
 type
-   jmp_buf = packed record
+{$ifdef fpc_abi_call0}
+   jmp_buf = record
+     a0,a1,a8,a12,a13,a14,a15 : DWord;
    end;
+{$endif fpc_abi_call0}
+{$ifdef fpc_abi_windowed}
+   jmp_buf = record
+   end;
+{$endif fpc_abi_windowed}
    pjmp_buf = ^jmp_buf;
 
 function setjmp(var S : jmp_buf) : longint;[external name 'FPC_SETJMP'];