Browse Source

0005 Updated paramgr implementation for arm

git-svn-id: branches/interfacertti@30820 -
steve 10 years ago
parent
commit
a5974dc4e2
1 changed files with 39 additions and 0 deletions
  1. 39 0
      compiler/arm/cpupara.pas

+ 39 - 0
compiler/arm/cpupara.pas

@@ -37,6 +37,7 @@ unit cpupara;
           function get_volatile_registers_int(calloption : tproccalloption):tcpuregisterset;override;
           function get_volatile_registers_fpu(calloption : tproccalloption):tcpuregisterset;override;
           function get_volatile_registers_mm(calloption : tproccalloption):tcpuregisterset;override;
+          procedure get_para_regoff(proccalloption: tproccalloption; paraloc: pcgparalocation; out reg: Byte; out off: LongInt);override;
           function push_addr_param(varspez:tvarspez;def : tdef;calloption : tproccalloption) : boolean;override;
           function ret_in_param(def:tdef;pd:tabstractprocdef):boolean;override;
           procedure getintparaloc(list: TAsmList; pd : tabstractprocdef; nr : longint; var cgpara : tcgpara);override;
@@ -74,6 +75,44 @@ unit cpupara;
         result:=VOLATILE_FPUREGISTERS;
       end;
 
+    procedure tarmparamanager.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)-RS_R0;
+              off:=0;
+            end;
+          LOC_FPUREGISTER:
+            begin
+              reg:=getsupreg(register)-RS_F0;
+              off:=0;
+            end;
+          LOC_MMREGISTER:
+            begin
+              reg:=getsupreg(register);
+              if reg < RS_S1 then
+                begin
+                  reg:=reg-RS_D0;
+                  off:=0;
+                end
+              else
+                begin
+                  reg:=reg-RS_S1;
+                  off:=4;
+                end;
+            end;
+          LOC_REFERENCE:
+            begin
+              reg:=255;
+              off:=reference.offset;
+            end;
+        end;
+    end;
+
 
     function tcpuparamanager.get_volatile_registers_mm(calloption: tproccalloption): tcpuregisterset;
       begin