|
@@ -38,6 +38,7 @@ interface
|
|
|
function first_cos_real: tnode; override;
|
|
|
function first_sin_real: tnode; override;
|
|
|
function first_int_real: tnode; override;
|
|
|
+ function first_frac_real: tnode; override;
|
|
|
|
|
|
procedure second_abs_real; override;
|
|
|
procedure second_sqr_real; override;
|
|
@@ -47,6 +48,7 @@ interface
|
|
|
procedure second_cos_real; override;
|
|
|
procedure second_sin_real; override;
|
|
|
procedure second_int_real; override;
|
|
|
+ procedure second_frac_real; override;
|
|
|
{procedure second_prefetch; override;
|
|
|
procedure second_abs_long; override;}
|
|
|
private
|
|
@@ -172,6 +174,21 @@ implementation
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
+ function t68kinlinenode.first_frac_real : tnode;
|
|
|
+ begin
|
|
|
+ if (cs_fp_emulation in current_settings.moduleswitches) then
|
|
|
+ result:=inherited first_frac_real
|
|
|
+ else
|
|
|
+ begin
|
|
|
+ case current_settings.fputype of
|
|
|
+ fpu_68881,fpu_coldfire:
|
|
|
+ expectloc:=LOC_FPUREGISTER;
|
|
|
+ else
|
|
|
+ internalerror(2017052103);
|
|
|
+ end;
|
|
|
+ first_frac_real:=nil;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
|
|
|
procedure t68kinlinenode.second_abs_real;
|
|
|
begin
|
|
@@ -263,6 +280,45 @@ implementation
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
+ procedure t68kinlinenode.second_frac_real;
|
|
|
+ var
|
|
|
+ href: TReference;
|
|
|
+ hreg: TRegister;
|
|
|
+ begin
|
|
|
+ secondpass(left);
|
|
|
+ case current_settings.fputype of
|
|
|
+ fpu_68881,fpu_coldfire:
|
|
|
+ begin
|
|
|
+ location_reset(location,LOC_FPUREGISTER,left.location.size);
|
|
|
+
|
|
|
+ case left.location.loc of
|
|
|
+ LOC_FPUREGISTER,LOC_CFPUREGISTER:
|
|
|
+ begin
|
|
|
+ hreg:=cg.getfpuregister(current_asmdata.CurrAsmList,location.size);
|
|
|
+ location.register:=cg.getfpuregister(current_asmdata.CurrAsmList,location.size);
|
|
|
+ cg.a_loadfpu_reg_reg(current_asmdata.CurrAsmlist,OS_NO,OS_NO,left.location.register,location.register);
|
|
|
+ current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(A_FINTRZ,fpuregopsize,left.location.register,hreg));
|
|
|
+ current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(A_FSUB,fpuregopsize,hreg,location.register));
|
|
|
+ end;
|
|
|
+ LOC_REFERENCE,LOC_CREFERENCE:
|
|
|
+ begin
|
|
|
+ hreg:=cg.getfpuregister(current_asmdata.CurrAsmList,location.size);
|
|
|
+ location.register:=cg.getfpuregister(current_asmdata.CurrAsmList,location.size);
|
|
|
+ href:=left.location.reference;
|
|
|
+ tcg68k(cg).fixref(current_asmdata.CurrAsmList,href,current_settings.fputype = fpu_coldfire);
|
|
|
+ cg.a_loadfpu_ref_reg(current_asmdata.CurrAsmlist,left.location.size,OS_NO,href,location.register);
|
|
|
+ current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(A_FINTRZ,fpuregopsize,location.register,hreg));
|
|
|
+ current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(A_FSUB,fpuregopsize,hreg,location.register));
|
|
|
+ end;
|
|
|
+ else
|
|
|
+ internalerror(2017052101);
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ else
|
|
|
+ internalerror(2017052102);
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+
|
|
|
{ ideas for second_abs_long (KB) }
|
|
|
|
|
|
{ This is probably faster on 68000 than the generic implementation,
|