ソースを参照

m68k: on setjmp/longjmp also save/restore the FPCR register when FPU support is enabled

git-svn-id: trunk@38522 -
Károly Balogh 7 年 前
コミット
3a78ff1ee4
2 ファイル変更16 行追加6 行削除
  1. 12 4
      rtl/m68k/setjump.inc
  2. 4 2
      rtl/m68k/setjumph.inc

+ 12 - 4
rtl/m68k/setjump.inc

@@ -40,10 +40,14 @@ asm
 {$endif}
 {$endif}
 
+{$if defined(fpu68881) or defined(fpucoldfire)}
+  fmove.l   fpcr,d0
+  move.l    d0,52(a0)
+{$endif}
 {$if defined(fpu68881)}
-  fmovem.x  fp2-fp7,52(a0)
+  fmovem.x  fp2-fp7,56(a0)
 {$elseif defined(fpucoldfire)}
-  fmovem.d  fp2-fp7,52(a0)
+  fmovem.d  fp2-fp7,56(a0)
 {$endif}
 
   // save FP
@@ -104,10 +108,14 @@ asm
 {$endif}
 {$endif}
 
+{$if defined(fpu68881) or defined(fpucoldfire)}
+  move.l 52(a0),d1
+  fmove.l d1,fpcr
+{$endif}
 {$if defined(fpu68881)}
-  fmovem.x  52(a0),fp2-fp7
+  fmovem.x  56(a0),fp2-fp7
 {$elseif defined(fpucoldfire)}
-  fmovem.d  52(a0),fp2-fp7
+  fmovem.d  56(a0),fp2-fp7
 {$endif}
   // new return pc is at (sp)
 end;

+ 4 - 2
rtl/m68k/setjumph.inc

@@ -36,10 +36,12 @@ Type
     { offsets:           36, 40, 44, 48}
     aregs : array[2..5] of dword;
 {$if defined(fpu68881) or defined(fpucoldfire)}
-    { offset: 52, size: 48 or 72 bytes, depending on FPU register size }
+    { offset: 52 }
+    fpcr  : dword;
+    { offset: 56, size: 48 or 72 bytes, depending on FPU register size }
     fregs : array[2..7] of tsizefpureg;
 {$endif}
-    { total size: 52, 100 or 124 bytes }
+    { total size: 52, 104 or 128 bytes }
   end;
 
   PJmp_buf = ^jmp_buf;