diff --git a/rtl/mips/setjump.inc b/rtl/mips/setjump.inc index 8ae96e7518..43074f3bfa 100644 --- a/rtl/mips/setjump.inc +++ b/rtl/mips/setjump.inc @@ -15,40 +15,69 @@ procedure fpc_longjmp(var s : jmp_buf;value:longint);assembler;nostackframe;[Public,alias:'FPC_LONGJMP'];compilerproc; asm - lw $31,0($4) // PC - lw $sp,4($4) // SP - lw $16,8($4) // S0,$16 - lw $17,12($4) // S1,$16 - lw $18,16($4) // S2,$16 - lw $19,20($4) // S3,$16 - lw $20,24($4) // S4,$16 - lw $21,28($4) // S5,$16 - lw $22,32($4) // S6,$16 - lw $23,36($4) // S7,$16 - lw $fp,40($4) // FP - lw $gp,44($4) // GP + lw $31,jmp_buf.ra($a0) + lw $sp,jmp_buf.sp($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 $fp,jmp_buf.fp($a0) + lw $gp,jmp_buf.gp($a0) + lw $v0,jmp_buf._fcsr($a0) + ctc1 $v0,$31 + lwc1 $f20,jmp_buf.f20($a0) + lwc1 $f21,jmp_buf.f21($a0) + lwc1 $f22,jmp_buf.f22($a0) + lwc1 $f23,jmp_buf.f23($a0) + lwc1 $f24,jmp_buf.f24($a0) + lwc1 $f25,jmp_buf.f25($a0) + lwc1 $f26,jmp_buf.f26($a0) + lwc1 $f27,jmp_buf.f27($a0) + lwc1 $f28,jmp_buf.f28($a0) + lwc1 $f29,jmp_buf.f29($a0) + lwc1 $f30,jmp_buf.f30($a0) + lwc1 $f31,jmp_buf.f31($a0) + // Put value into register $2 as in setjmp - move $2, $5 - - j $31 + move $v0,$a1 + bne $a1,$zero,.L1 nop + addiu $v0,$zero,1 +.L1: end; function fpc_setjmp(var S:jmp_buf):longint;assembler;nostackframe;[Public,alias:'FPC_SETJMP'];compilerproc; asm - sw $31,0($4) // PC - sw $sp,4($4) // SP - sw $16,8($4) // S0,$16 - sw $17,12($4) // S1,$16 - sw $18,16($4) // S2,$16 - sw $19,20($4) // S3,$16 - sw $20,24($4) // S4,$16 - sw $21,28($4) // S5,$16 - sw $22,32($4) // S6,$16 - sw $23,36($4) // S7,$16 - sw $fp,40($4) // FP - sw $gp,44($4) // GP - - move $2,$0 + sw $31,jmp_buf.ra($a0) + sw $sp,jmp_buf.sp($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 $fp,jmp_buf.fp($a0) + sw $gp,jmp_buf.gp($a0) + cfc1 $v0,$31 + sw $v0,jmp_buf._fcsr($a0) + swc1 $f20,jmp_buf.f20($a0) + swc1 $f21,jmp_buf.f21($a0) + swc1 $f22,jmp_buf.f22($a0) + swc1 $f23,jmp_buf.f23($a0) + swc1 $f24,jmp_buf.f24($a0) + swc1 $f25,jmp_buf.f25($a0) + swc1 $f26,jmp_buf.f26($a0) + swc1 $f27,jmp_buf.f27($a0) + swc1 $f28,jmp_buf.f28($a0) + swc1 $f29,jmp_buf.f29($a0) + swc1 $f30,jmp_buf.f30($a0) + swc1 $f31,jmp_buf.f31($a0) + move $v0,$zero end; diff --git a/rtl/mips/setjumph.inc b/rtl/mips/setjumph.inc index 8c747f7d85..f1d29ec8e8 100644 --- a/rtl/mips/setjumph.inc +++ b/rtl/mips/setjumph.inc @@ -16,7 +16,8 @@ type jmp_buf=packed record - reg:array[1..12] of longint; + ra,sp,s0,s1,s2,s3,s4,s5,s6,s7,fp,gp: longint; + _fcsr,f20,f21,f22,f23,f24,f25,f26,f27,f28,f29,f30,f31: longint; end; Pjmp_buf=^jmp_buf;