Browse Source

m68k: utilize cg.a_loadaddr_ref_cgpara in hlcgcpu, as m68k has an instruction for loading addresses directly to the stack (PEA), and the default implementation of hlcg.a_loadaddr_ref_cgpara doesn't use that code path

Karoly Balogh 3 years ago
parent
commit
ed520548be
2 changed files with 18 additions and 3 deletions
  1. 0 2
      compiler/m68k/cgcpu.pas
  2. 18 1
      compiler/m68k/hlcgcpu.pas

+ 0 - 2
compiler/m68k/cgcpu.pas

@@ -413,11 +413,9 @@ unit cgcpu;
       var
       var
         tmpref : treference;
         tmpref : treference;
       begin
       begin
-        { 68k always passes arguments on the stack }
         if use_push(cgpara) then
         if use_push(cgpara) then
           begin
           begin
             //list.concat(tai_comment.create(strpnew('a_loadaddr_ref_cgpara: PEA')));
             //list.concat(tai_comment.create(strpnew('a_loadaddr_ref_cgpara: PEA')));
-            cgpara.check_simple_location;
             tmpref:=r;
             tmpref:=r;
             fixref(list,tmpref,false);
             fixref(list,tmpref,false);
             list.concat(taicpu.op_ref(A_PEA,S_NO,tmpref));
             list.concat(taicpu.op_ref(A_PEA,S_NO,tmpref));

+ 18 - 1
compiler/m68k/hlcgcpu.pas

@@ -34,6 +34,7 @@ interface
     aasmbase, aasmdata,
     aasmbase, aasmdata,
     cgbase, cgutils,
     cgbase, cgutils,
     symconst,symtype,symdef,
     symconst,symtype,symdef,
+    parabase,
     hlcg2ll;
     hlcg2ll;
 
 
   type
   type
@@ -44,6 +45,8 @@ interface
       procedure a_bit_set_const_ref(list: TAsmList; doset: boolean; destsize: tdef; bitnumber: tcgint; const ref: treference); override;
       procedure a_bit_set_const_ref(list: TAsmList; doset: boolean; destsize: tdef; bitnumber: tcgint; const ref: treference); override;
       procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
       procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
 
 
+      procedure a_loadaddr_ref_cgpara(list: TAsmList; fromsize: tdef; const r: treference; const cgpara: TCGPara);override;
+
       procedure gen_load_loc_function_result(list: TAsmList; vardef: tdef; const l: tlocation);override;
       procedure gen_load_loc_function_result(list: TAsmList; vardef: tdef; const l: tlocation);override;
     end;
     end;
 
 
@@ -56,7 +59,7 @@ implementation
     defutil,
     defutil,
     hlcgobj,
     hlcgobj,
     cpuinfo, cgobj, cpubase, cgcpu,
     cpuinfo, cgobj, cpubase, cgcpu,
-    parabase, procinfo;
+    paramgr, procinfo;
 
 
 
 
 
 
@@ -241,6 +244,20 @@ implementation
       List.concat(Tai_symbol_end.Createname(labelname));
       List.concat(Tai_symbol_end.Createname(labelname));
     end;
     end;
 
 
+  procedure thlcgcpu.a_loadaddr_ref_cgpara(list: TAsmList; fromsize: tdef; const r: treference; const cgpara: TCGPara);
+    begin
+       cgpara.check_simple_location;
+       if cgpara.location^.loc in [LOC_CREGISTER,LOC_REGISTER] then
+         begin
+           paramanager.allocparaloc(list,cgpara.location);
+           a_loadaddr_ref_reg(list,fromsize,cgpara.location^.def,r,cgpara.location^.register)
+         end
+       else
+         begin
+           paramanager.alloccgpara(list,cgpara);
+           cg.a_loadaddr_ref_cgpara(list,r,cgpara);
+         end;
+    end;
 
 
   procedure thlcgcpu.gen_load_loc_function_result(list: TAsmList; vardef: tdef; const l: tlocation);
   procedure thlcgcpu.gen_load_loc_function_result(list: TAsmList; vardef: tdef; const l: tlocation);
     var
     var