* all CPUs use now internal abs(<int64>) so overflow checking is possible

+ added overflow checking to generic abs(<longint>)
This commit is contained in:
florian 2024-03-29 20:30:57 +01:00
parent c87213085f
commit 13e7f947ea
2 changed files with 9 additions and 3 deletions

View File

@ -794,7 +794,14 @@ implementation
hlcg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SAR,left.resultdef,left.resultdef.size*8-1,left.location.register,tempreg1);
hlcg.a_op_reg_reg_reg(current_asmdata.CurrAsmList,OP_XOR,left.resultdef,left.location.register,tempreg1,tempreg2);
hlcg.a_op_reg_reg_reg(current_asmdata.CurrAsmlist,OP_SUB,left.resultdef,tempreg1,tempreg2,location.register);
if cs_check_overflow in current_settings.localswitches then
begin
hlcg.a_op_reg_reg_reg_checkoverflow(current_asmdata.CurrAsmlist,OP_SUB,resultdef,tempreg1,tempreg2,location.register,true,ovloc);
hlcg.g_overflowcheck_loc(current_asmdata.CurrAsmList,Location,resultdef,ovloc);
end
else
hlcg.a_op_reg_reg_reg(current_asmdata.CurrAsmlist,OP_SUB,resultdef,tempreg1,tempreg2,location.register);
end;
end;

View File

@ -4758,9 +4758,8 @@ procedure read_arguments(cmd:TCmdStr);
{$endif i8086 or avr}
{ abs(long) is handled internally on all CPUs }
def_system_macro('FPC_HAS_INTERNAL_ABS_LONG');
{$if defined(i8086) or defined(i386) or defined(x86_64) or defined(powerpc64) or defined(aarch64) or defined(arm)}
{ abs(int64) is handled internally on all CPUs }
def_system_macro('FPC_HAS_INTERNAL_ABS_INT64');
{$endif i8086 or i386 or x86_64 or powerpc64 or aarch64 or arm}
def_system_macro('FPC_HAS_UNICODESTRING');
def_system_macro('FPC_RTTI_PACKSET1');