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');