mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-05 17:27:26 +01:00
* MIPS setjmp/longjmp: save/restore nonvolatile FPU registers and FPU control word.
* Fixed longjmp return value, it should never be zero. git-svn-id: trunk@25769 -
This commit is contained in:
parent
142d20ca30
commit
1be7ec1dcd
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user