From 8a36e63a56821d703a543085ddd8b5de42cdca68 Mon Sep 17 00:00:00 2001 From: florian Date: Fri, 21 Aug 2020 21:15:36 +0000 Subject: [PATCH] + initial implementation of setjmp/longjmp git-svn-id: trunk@46537 - --- rtl/xtensa/setjump.inc | 35 +++++++++++++++++++++++++++++++++-- rtl/xtensa/setjumph.inc | 9 ++++++++- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/rtl/xtensa/setjump.inc b/rtl/xtensa/setjump.inc index aff9a3cfce..72af33fe35 100644 --- a/rtl/xtensa/setjump.inc +++ b/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} + diff --git a/rtl/xtensa/setjumph.inc b/rtl/xtensa/setjumph.inc index 3f289800de..e55a5da5c5 100644 --- a/rtl/xtensa/setjumph.inc +++ b/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'];