Browse Source

* 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 -

sergei 11 years ago
parent
commit
1be7ec1dcd
2 changed files with 60 additions and 30 deletions
  1. 58 29
      rtl/mips/setjump.inc
  2. 2 1
      rtl/mips/setjumph.inc

+ 58 - 29
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;

+ 2 - 1
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;