summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2021-03-06 22:19:30 +0000
committerflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2021-03-06 22:19:30 +0000
commit53cb42d1aa54de1e34e6ac6c8352bfa69ae6aecf (patch)
tree72f5be456e19af65fc83f4eedb2a110ed83b54a9
parent2dbbc1b4fcbab6c121fc4fe885002ca471b31a26 (diff)
downloadfpc-53cb42d1aa54de1e34e6ac6c8352bfa69ae6aecf.tar.gz
+ RiscV32: setjmp/longjmp implementation, based on the RiscV64 one
git-svn-id: https://svn.freepascal.org/svn/fpc/trunk@48893 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--rtl/riscv32/setjump.inc115
-rw-r--r--rtl/riscv32/setjumph.inc15
2 files changed, 126 insertions, 4 deletions
diff --git a/rtl/riscv32/setjump.inc b/rtl/riscv32/setjump.inc
index be2a0c181c..4be0dc8055 100644
--- a/rtl/riscv32/setjump.inc
+++ b/rtl/riscv32/setjump.inc
@@ -16,11 +16,124 @@
function fpc_setjmp(var S : jmp_buf) : longint;assembler;[Public, alias : 'FPC_SETJMP'];nostackframe;compilerproc;
asm
- end;
+ sw ra, jmp_buf.ra(a0)
+ sw s0, jmp_buf.s0(a0)
+ sw s1, jmp_buf.s1(a0)
+ sw s2, jmp_buf.s2(a0)
+ sw s3, jmp_buf.s3(a0)
+ sw s4, jmp_buf.s4(a0)
+ sw s5, jmp_buf.s5(a0)
+ sw s6, jmp_buf.s6(a0)
+ sw s7, jmp_buf.s7(a0)
+ sw s8, jmp_buf.s8(a0)
+ sw s9, jmp_buf.s9(a0)
+ sw s10, jmp_buf.s10(a0)
+ sw s11, jmp_buf.s11(a0)
+ sw sp, jmp_buf.sp(a0)
+
+{$if defined(FPUFD) or defined(FPUD)}
+ frcsr t0
+
+ sw t0, jmp_buf.fcsr(a0)
+
+ fsd f8, jmp_buf.f8(a0)
+ fsd f9, jmp_buf.f9(a0)
+ fsd f18, jmp_buf.f18(a0)
+ fsd f19, jmp_buf.f19(a0)
+ fsd f20, jmp_buf.f20(a0)
+ fsd f21, jmp_buf.f21(a0)
+ fsd f22, jmp_buf.f22(a0)
+ fsd f23, jmp_buf.f23(a0)
+ fsd f24, jmp_buf.f24(a0)
+ fsd f25, jmp_buf.f25(a0)
+ fsd f26, jmp_buf.f26(a0)
+ fsd f27, jmp_buf.f27(a0)
+{$endif FPUFD or FPUD}
+{$if defined(FPUF)}
+ frcsr t0
+
+ sw t0, jmp_buf.fcsr(a0)
+
+ fsw f8, jmp_buf.f8(a0)
+ fsw f9, jmp_buf.f9(a0)
+ fsw f18, jmp_buf.f18(a0)
+ fsw f19, jmp_buf.f19(a0)
+ fsw f20, jmp_buf.f20(a0)
+ fsw f21, jmp_buf.f21(a0)
+ fsw f22, jmp_buf.f22(a0)
+ fsw f23, jmp_buf.f23(a0)
+ fsw f24, jmp_buf.f24(a0)
+ fsw f25, jmp_buf.f25(a0)
+ fsw f26, jmp_buf.f26(a0)
+ fsw f27, jmp_buf.f27(a0)
+{$endif FPUF}
+
+ addi x10, x0, 0
+end;
procedure fpc_longjmp(var S : jmp_buf;value : longint);assembler;[Public, alias : 'FPC_LONGJMP'];compilerproc;
asm
+ lw ra, jmp_buf.ra(a0)
+ lw s0, jmp_buf.s0(a0)
+ lw s1, jmp_buf.s1(a0)
+ lw s2, jmp_buf.s2(a0)
+ lw s3, jmp_buf.s3(a0)
+ lw s4, jmp_buf.s4(a0)
+ lw s5, jmp_buf.s5(a0)
+ lw s6, jmp_buf.s6(a0)
+ lw s7, jmp_buf.s7(a0)
+ lw s8, jmp_buf.s8(a0)
+ lw s9, jmp_buf.s9(a0)
+ lw s10, jmp_buf.s10(a0)
+ lw s11, jmp_buf.s11(a0)
+
+{$if defined(FPUFD) or defined(FPUD)}
+ lw sp, jmp_buf.fcsr(a0)
+
+ fld f8, jmp_buf.f8(a0)
+ fld f9, jmp_buf.f9(a0)
+ fld f18, jmp_buf.f18(a0)
+ fld f19, jmp_buf.f19(a0)
+ fld f20, jmp_buf.f20(a0)
+ fld f21, jmp_buf.f21(a0)
+ fld f22, jmp_buf.f22(a0)
+ fld f23, jmp_buf.f23(a0)
+ fld f24, jmp_buf.f24(a0)
+ fld f25, jmp_buf.f25(a0)
+ fld f26, jmp_buf.f26(a0)
+ fld f27, jmp_buf.f27(a0)
+
+ fscsr sp
+{$endif FPUFD or FPUD}
+{$if defined(FPUF)}
+ lw sp, jmp_buf.fcsr(a0)
+
+ flw f8, jmp_buf.f8(a0)
+ flw f9, jmp_buf.f9(a0)
+ flw f18, jmp_buf.f18(a0)
+ flw f19, jmp_buf.f19(a0)
+ flw f20, jmp_buf.f20(a0)
+ flw f21, jmp_buf.f21(a0)
+ flw f22, jmp_buf.f22(a0)
+ flw f23, jmp_buf.f23(a0)
+ flw f24, jmp_buf.f24(a0)
+ flw f25, jmp_buf.f25(a0)
+ flw f26, jmp_buf.f26(a0)
+ flw f27, jmp_buf.f27(a0)
+
+ fscsr sp
+{$endif FPUF}
+ lw sp, jmp_buf.sp(a0)
+
+ beq a1, x0, .Lone
+ jal x0, .Lzero
+ .Lone:
+ addi a0, x0, 1
+ jal x0, .Lexit
+ .Lzero:
+ addi a0, a1, 0
+ .Lexit:
end;
diff --git a/rtl/riscv32/setjumph.inc b/rtl/riscv32/setjumph.inc
index f27b3c9cbc..d6bafe0623 100644
--- a/rtl/riscv32/setjumph.inc
+++ b/rtl/riscv32/setjumph.inc
@@ -15,11 +15,20 @@
**********************************************************************}
type
- jmp_buf = packed record
+ jmp_buf = record
+ ra,s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,sp: dword;
+{$if defined(FPUFD) or defined(FPUD)}
+ fcsr,dummy : dword;
+ f8,f9,f18,f19,f20,f21,
+ f22,f23,f24,f25,f26,f27: qword;
+{$endif FPUFD or FPUD}
+{$if defined(FPUF)}
+ fcsr : dword;
+ f8,f9,f18,f19,f20,f21,
+ f22,f23,f24,f25,f26,f27: longword;
+{$endif FPUF}
end;
pjmp_buf = ^jmp_buf;
function setjmp(var S : jmp_buf) : longint;[external name 'FPC_SETJMP'];
procedure longjmp(var S : jmp_buf;value : longint);[external name 'FPC_LONGJMP'];
-
-