Browse Source

m68k/n68kmat.pas, tm68kmoddivnode:
+ add routine "call_rtl_moddiv_reg_reg" which handles the calling of "fpc_div_longint", "fpc_div_dword", "fpc_mod_longint" and "fpc_mod_dword"
* emit_mod_reg_reg & emit_div_reg_reg: use the new method instead of doing the call oneself

=> "Str(SomeInt, SomeStr)" and "Writeln(SomeInt)" now works

git-svn-id: trunk@22893 -

svenbarth 12 years ago
parent
commit
772072d8c9
1 changed files with 28 additions and 27 deletions
  1. 28 27
      compiler/m68k/n68kmat.pas

+ 28 - 27
compiler/m68k/n68kmat.pas

@@ -36,6 +36,9 @@ interface
       end;
       end;
 
 
       tm68kmoddivnode = class(tcgmoddivnode)
       tm68kmoddivnode = class(tcgmoddivnode)
+      private
+        procedure call_rtl_divmod_reg_reg(denum,num:tregister;const name:string);
+      public
          procedure emit_div_reg_reg(signed: boolean;denum,num : tregister);override;
          procedure emit_div_reg_reg(signed: boolean;denum,num : tregister);override;
          procedure emit_mod_reg_reg(signed: boolean;denum,num : tregister);override;
          procedure emit_mod_reg_reg(signed: boolean;denum,num : tregister);override;
       end;
       end;
@@ -140,6 +143,26 @@ implementation
           end;
           end;
       end;
       end;
 
 
+  procedure tm68kmoddivnode.call_rtl_divmod_reg_reg(denum,num:tregister;const name:string);
+    var
+      paraloc1,paraloc2 : tcgpara;
+    begin
+      paraloc1.init;
+      paraloc2.init;
+      paramanager.getintparaloc(pocall_default,1,u32inttype,paraloc1);
+      paramanager.getintparaloc(pocall_default,2,u32inttype,paraloc2);
+      cg.a_load_reg_cgpara(current_asmdata.CurrAsmList,OS_32,num,paraloc2);
+      cg.a_load_reg_cgpara(current_asmdata.CurrAsmList,OS_32,denum,paraloc1);
+      paramanager.freecgpara(current_asmdata.CurrAsmList,paraloc2);
+      paramanager.freecgpara(current_asmdata.CurrAsmList,paraloc1);
+      cg.alloccpuregisters(current_asmdata.CurrAsmList,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+      cg.a_call_name(current_asmdata.CurrAsmList,name,false);
+      cg.dealloccpuregisters(current_asmdata.CurrAsmList,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
+      cg.a_reg_alloc(current_asmdata.CurrAsmList,NR_FUNCTION_RESULT_REG);
+      cg.a_load_reg_reg(current_asmdata.CurrAsmList,OS_32,OS_32,NR_FUNCTION_RESULT_REG,num);
+      paraloc2.done;
+      paraloc1.done;
+    end;
 
 
 {*****************************************************************************
 {*****************************************************************************
                                TM68KMODDIVNODE
                                TM68KMODDIVNODE
@@ -148,7 +171,7 @@ implementation
    var
    var
      continuelabel : tasmlabel;
      continuelabel : tasmlabel;
      reg_d0,reg_d1 : tregister;
      reg_d0,reg_d1 : tregister;
-     paraloc1 : tcgpara;
+     paraloc1,paraloc2 : tcgpara;
    begin
    begin
      { no RTL call, so inline a zero denominator verification }
      { no RTL call, so inline a zero denominator verification }
      if current_settings.cputype=cpu_MC68020 then
      if current_settings.cputype=cpu_MC68020 then
@@ -172,21 +195,10 @@ implementation
      else
      else
        begin
        begin
          { On MC68000/68010/Coldfire we must pass through RTL routines }
          { On MC68000/68010/Coldfire we must pass through RTL routines }
-         reg_d0:=NR_D0;
-         cg.getcpuregister(current_asmdata.CurrAsmList,NR_D0);
-         reg_d1:=NR_D1;
-         cg.getcpuregister(current_asmdata.CurrAsmList,NR_D1);
-         { put numerator in d0 }
-         cg.a_load_reg_reg(current_asmdata.CurrAsmList,OS_INT,OS_INT,num,reg_d0);
-         { put denum in D1 }
-         cg.a_load_reg_reg(current_asmdata.CurrAsmList,OS_INT,OS_INT,denum,reg_d1);
          if signed then
          if signed then
-             cg.a_call_name(current_asmdata.CurrAsmList,'FPC_DIV_LONGINT',false)
+           call_rtl_divmod_reg_reg(denum,num,'FPC_DIV_LONGINT')
          else
          else
-             cg.a_call_name(current_asmdata.CurrAsmList,'FPC_DIV_DWORD',false);
-        cg.a_load_reg_reg(current_asmdata.CurrAsmList,OS_INT,OS_INT,reg_d0,denum);
-        cg.ungetcpuregister(current_asmdata.CurrAsmList,reg_d0);
-        cg.ungetcpuregister(current_asmdata.CurrAsmList,reg_d1);
+           call_rtl_divmod_reg_reg(denum,num,'FPC_DIV_DWORD');
        end;
        end;
    end;
    end;
 
 
@@ -235,21 +247,10 @@ implementation
      else
      else
        begin
        begin
          { On MC68000/68010/coldfire we must pass through RTL routines }
          { On MC68000/68010/coldfire we must pass through RTL routines }
-         Reg_d0:=NR_D0;
-         cg.getcpuregister(current_asmdata.CurrAsmList,NR_D0);
-         Reg_d1:=NR_D1;
-         cg.getcpuregister(current_asmdata.CurrAsmList,NR_D1);
-         { put numerator in d0 }
-         cg.a_load_reg_reg(current_asmdata.CurrAsmList,OS_INT,OS_INT,num,Reg_D0);
-         { put denum in D1 }
-         cg.a_load_reg_reg(current_asmdata.CurrAsmList,OS_INT,OS_INT,denum,Reg_D1);
          if signed then
          if signed then
-             cg.a_call_name(current_asmdata.CurrAsmList,'FPC_MOD_LONGINT',false)
+           call_rtl_divmod_reg_reg(denum,num,'FPC_MOD_LONGINT')
          else
          else
-             cg.a_call_name(current_asmdata.CurrAsmList,'FPC_MOD_DWORD',false);
-        cg.a_load_reg_reg(current_asmdata.CurrAsmList,OS_INT,OS_INT,Reg_D0,denum);
-        cg.ungetcpuregister(current_asmdata.CurrAsmList,Reg_D0);
-        cg.ungetcpuregister(current_asmdata.CurrAsmList,Reg_D1);
+           call_rtl_divmod_reg_reg(denum,num,'FPC_MOD_DWORD');
        end;
        end;
 //      writeln('exits');
 //      writeln('exits');
     end;
     end;