소스 검색

* register saving on win64 fixed

git-svn-id: trunk@5785 -
florian 18 년 전
부모
커밋
98d6014c73
2개의 변경된 파일31개의 추가작업 그리고 16개의 파일을 삭제
  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;
+      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
         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,
           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,

+ 3 - 16
compiler/x86_64/cpubase.inc

@@ -121,22 +121,9 @@ 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
         stdcall and cdecl. The alignment value should be the one defined
         by GCC or the target ABI.