|
@@ -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;
|