From 13e7f947ea8e1a03774318542f30a626b2795856 Mon Sep 17 00:00:00 2001 From: florian <florian@freepascal.org> Date: Fri, 29 Mar 2024 20:30:57 +0100 Subject: [PATCH] * all CPUs use now internal abs(<int64>) so overflow checking is possible + added overflow checking to generic abs(<longint>) --- compiler/ncginl.pas | 9 ++++++++- compiler/options.pas | 3 +-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/compiler/ncginl.pas b/compiler/ncginl.pas index 14a8fb5de4..f13f6026bf 100644 --- a/compiler/ncginl.pas +++ b/compiler/ncginl.pas @@ -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; diff --git a/compiler/options.pas b/compiler/options.pas index cfd6ce7444..b8f731b0e0 100644 --- a/compiler/options.pas +++ b/compiler/options.pas @@ -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');