Browse Source

* register saving on win64 fixed

git-svn-id: trunk@5785 -
florian 18 years ago
parent
commit
98d6014c73
2 changed files with 31 additions and 16 deletions
  1. 28 0
      compiler/x86_64/cgcpu.pas
  2. 3 16
      compiler/x86_64/cpubase.inc

+ 28 - 0
compiler/x86_64/cgcpu.pas

@@ -51,8 +51,36 @@ unit cgcpu;
 
 
 
 
     procedure Tcgx86_64.init_register_allocators;
     procedure Tcgx86_64.init_register_allocators;
+      const
+        win64_saved_std_regs : array[0..6] of tsuperregister = (RS_RBX,RS_RDI,RS_RSI,RS_R12,RS_R13,RS_R14,RS_R15);
+        others_saved_std_regs : array[0..4] of tsuperregister = (RS_RBX,RS_R12,RS_R13,RS_R14,RS_R15);
+
+        win64_saved_xmm_regs : array[0..9] of tsuperregister = (RS_XMM6,RS_XMM7,
+          RS_XMM8,RS_XMM9,RS_XMM10,RS_XMM11,RS_XMM12,RS_XMM13,RS_XMM14,RS_XMM15);
+      var
+        i : longint;
       begin
       begin
         inherited init_register_allocators;
         inherited init_register_allocators;
+        if target_info.system=system_x86_64_win64 then
+          begin
+            SetLength(saved_standard_registers,Length(win64_saved_std_regs));
+            SetLength(saved_xmm_registers,Length(win64_saved_xmm_regs));
+
+            for i:=low(win64_saved_std_regs) to high(win64_saved_std_regs) do
+              saved_standard_registers[i]:=win64_saved_std_regs[i];
+
+            for i:=low(win64_saved_xmm_regs) to high(win64_saved_xmm_regs) do
+              saved_xmm_registers[i]:=win64_saved_xmm_regs[i];
+          end
+        else
+          begin
+            SetLength(saved_standard_registers,Length(others_saved_std_regs));
+            SetLength(saved_xmm_registers,0);
+
+            for i:=low(others_saved_std_regs) to high(others_saved_std_regs) do
+              saved_standard_registers[i]:=others_saved_std_regs[i];
+          end;
+
         rg[R_INTREGISTER]:=trgcpu.create(R_INTREGISTER,R_SUBWHOLE,[RS_RAX,RS_RDX,RS_RCX,RS_RBX,RS_RSI,RS_RDI,
         rg[R_INTREGISTER]:=trgcpu.create(R_INTREGISTER,R_SUBWHOLE,[RS_RAX,RS_RDX,RS_RCX,RS_RBX,RS_RSI,RS_RDI,
           RS_R8,RS_R9,RS_R10,RS_R11,RS_R12,RS_R13,RS_R14,RS_R15],first_int_imreg,[RS_RBP]);
           RS_R8,RS_R9,RS_R10,RS_R11,RS_R12,RS_R13,RS_R14,RS_R15],first_int_imreg,[RS_RBP]);
         rg[R_MMREGISTER]:=trgcpu.create(R_MMREGISTER,R_SUBWHOLE,[RS_XMM0,RS_XMM1,RS_XMM2,RS_XMM3,RS_XMM4,RS_XMM5,RS_XMM6,RS_XMM7,
         rg[R_MMREGISTER]:=trgcpu.create(R_MMREGISTER,R_SUBWHOLE,[RS_XMM0,RS_XMM1,RS_XMM2,RS_XMM3,RS_XMM4,RS_XMM5,RS_XMM6,RS_XMM7,

+ 3 - 16
compiler/x86_64/cpubase.inc

@@ -121,22 +121,9 @@ const
 *****************************************************************************}
 *****************************************************************************}
 
 
     const
     const
-      { Registers which must be saved when calling a routine declared as
-        cppdecl, cdecl, stdcall, safecall, palmossyscall. The registers
-        saved should be the ones as defined in the target ABI and / or GCC.
-
-        This value can be deduced from the CALLED_USED_REGISTERS array in the
-        GCC source.
-      }
-      saved_standard_registers : array[0..4] of tsuperregister = (RS_EBX,RS_R12,RS_R13,RS_R14,RS_R15);
-      { Registers which must be saved when calling a routine declared as
-        cppdecl, cdecl, stdcall, safecall, palmossyscall. The registers
-        saved should be the ones as defined in the target ABI and / or GCC.
-
-        This value can be deduced from the CALLED_USED_REGISTERS array in the
-        GCC source.
-      }
-      saved_xmm_registers : array[0..4] of tsuperregister = (RS_EBX,RS_R12,RS_R13,RS_R14,RS_R15);
+      { these arrays differ between unix and win64 }
+      saved_standard_registers : array of tsuperregister = nil;
+      saved_xmm_registers : array of tsuperregister = nil;
       { Required parameter alignment when calling a routine declared as
       { Required parameter alignment when calling a routine declared as
         stdcall and cdecl. The alignment value should be the one defined
         stdcall and cdecl. The alignment value should be the one defined
         by GCC or the target ABI.
         by GCC or the target ABI.