瀏覽代碼

0006 Updated paramgr implementation for x86_64

git-svn-id: branches/interfacertti@30821 -
steve 10 年之前
父節點
當前提交
81099dfad7
共有 1 個文件被更改,包括 59 次插入0 次删除
  1. 59 0
      compiler/x86_64/cpupara.pas

+ 59 - 0
compiler/x86_64/cpupara.pas

@@ -44,6 +44,7 @@ unit cpupara;
           function get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;override;
           function get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;override;
           function get_volatile_registers_mm(calloption : tproccalloption):tcpuregisterset;override;
           function get_volatile_registers_mm(calloption : tproccalloption):tcpuregisterset;override;
           function get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;override;
           function get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;override;
+          procedure get_para_regoff(proccalloption: tproccalloption; paraloc: pcgparalocation; out reg: Byte; out off: LongInt);override;
           function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;override;
           function create_paraloc_info(p : tabstractprocdef; side: tcallercallee):longint;override;
           function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargsparalist):longint;override;
           function create_varargs_paraloc_info(p : tabstractprocdef; varargspara:tvarargsparalist):longint;override;
           function get_funcretloc(p : tabstractprocdef; side: tcallercallee; forcetempdef: tdef): tcgpara;override;
           function get_funcretloc(p : tabstractprocdef; side: tcallercallee; forcetempdef: tdef): tcgpara;override;
@@ -905,6 +906,64 @@ unit cpupara;
           result:=[RS_XMM0..RS_XMM15];
           result:=[RS_XMM0..RS_XMM15];
       end;
       end;
 
 
+    procedure tx86_64paramanager.get_para_regoff(proccalloption: tproccalloption; paraloc: pcgparalocation; out reg: Byte; out off: LongInt);
+    var
+      I : SizeInt;
+    begin
+      with paraloc^ do
+        case loc of
+          LOC_REGISTER:
+            begin
+              reg:=getsupreg(register);
+              { winx64 uses different registers }
+              if target_info.system=system_x86_64_win64 then
+                begin
+                  for I := 0 to high(paraintsupregs_winx64) do
+                    if reg=paraintsupregs_winx64[I] then
+                      begin
+                        reg:=I;
+                        break;
+                      end;
+                end
+              else
+                for I := 0 to high(paraintsupregs) do
+                  if reg=paraintsupregs[I] then
+                    begin
+                      reg:=I;
+                      break;
+                    end;
+              off:=0;
+            end;
+          LOC_MMREGISTER:
+            begin
+              reg:=getsupreg(register);
+              { winx64 uses different registers }
+              if target_info.system=system_x86_64_win64 then
+                begin
+                  for I := 0 to high(parammsupregs_winx64) do
+                    if reg=parammsupregs_winx64[I] then
+                      begin
+                        reg:=I;
+                        break;
+                      end;
+                end
+              else
+                for I := 0 to high(parammsupregs) do
+                  if reg=parammsupregs[I] then
+                    begin
+                      reg:=I;
+                      break;
+                    end;
+              off:=0;
+            end;
+          LOC_REFERENCE:
+            begin
+              reg:=255;
+              off:=reference.offset;
+            end;
+        end;
+    end;
+
 
 
     function tcpuparamanager.get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;
     function tcpuparamanager.get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;
       begin
       begin