소스 검색

+ arm thumb: tarmloadparentfpnode moves the stack pointer to a different register to avoid illegal instruction encodings

git-svn-id: trunk@24201 -
florian 12 년 전
부모
커밋
36a32e153d
1개의 변경된 파일28개의 추가작업 그리고 1개의 파일을 삭제
  1. 28 1
      compiler/arm/narmmem.pas

+ 28 - 1
compiler/arm/narmmem.pas

@@ -30,6 +30,11 @@ interface
       cgbase,cpubase,nmem,ncgmem;
       cgbase,cpubase,nmem,ncgmem;
 
 
     type
     type
+      tarmloadparentfpnode = class(tcgloadparentfpnode)
+        procedure pass_generate_code; override;
+      end;
+
+
       tarmvecnode = class(tcgvecnode)
       tarmvecnode = class(tcgvecnode)
         procedure update_reference_reg_mul(maybe_const_reg: tregister; l: aint);override;
         procedure update_reference_reg_mul(maybe_const_reg: tregister; l: aint);override;
       end;
       end;
@@ -38,7 +43,28 @@ implementation
 
 
     uses
     uses
       cutils,verbose,globals,aasmdata,aasmcpu,cgobj,
       cutils,verbose,globals,aasmdata,aasmcpu,cgobj,
-      cpuinfo;
+      cpuinfo,
+      cgutils,
+      procinfo;
+
+{*****************************************************************************
+                        TARMLOADPARENTFPNODE
+*****************************************************************************}
+
+    procedure tarmloadparentfpnode.pass_generate_code;
+      begin
+        { normally, we cannot use the stack pointer as normal register on arm thumb }
+        if (current_settings.cputype in cpu_thumb) and
+          (getsupreg(current_procinfo.framepointer) in [RS_R8..RS_R15]) and
+          (current_procinfo.procdef.parast.symtablelevel=parentpd.parast.symtablelevel) then
+          begin
+            location_reset(location,LOC_REGISTER,OS_ADDR);
+            location.register:=cg.getaddressregister(current_asmdata.CurrAsmList);
+            cg.a_load_reg_reg(current_asmdata.CurrAsmList,OS_ADDR,OS_ADDR,current_procinfo.framepointer,location.register);
+          end
+        else
+          inherited pass_generate_code;
+      end;
 
 
 {*****************************************************************************
 {*****************************************************************************
                              TARMVECNODE
                              TARMVECNODE
@@ -84,4 +110,5 @@ implementation
 
 
 begin
 begin
   cvecnode:=tarmvecnode;
   cvecnode:=tarmvecnode;
+  cloadparentfpnode:=tarmloadparentfpnode;
 end.
 end.