diff options
Diffstat (limited to 'rtl/riscv32/setjump.inc')
-rw-r--r-- | rtl/riscv32/setjump.inc | 115 |
1 files changed, 114 insertions, 1 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; |