mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 16:31:36 +01:00 
			
		
		
		
	* On 64-bit targets, handle abs(int64) internally, using the same code as for abs(longint), i.e. without branching. Both generic and x86-specific pass 2 code is already suitable for different operand sizes, only type checking needs removal of excessive conversions to 32 bits.
git-svn-id: trunk@27989 -
This commit is contained in:
		
							parent
							
								
									5e7a4c4819
								
							
						
					
					
						commit
						04d8e8a5dc
					
				| @ -2412,9 +2412,9 @@ implementation | |||||||
|                   if left.nodetype=ordconstn then |                   if left.nodetype=ordconstn then | ||||||
|                     begin |                     begin | ||||||
|                       if tordconstnode(left).value<0 then |                       if tordconstnode(left).value<0 then | ||||||
|                         result:=cordconstnode.create((-tordconstnode(left).value),s32inttype,false) |                         result:=cordconstnode.create((-tordconstnode(left).value),resultdef,false) | ||||||
|                       else |                       else | ||||||
|                         result:=cordconstnode.create((tordconstnode(left).value),s32inttype,false); |                         result:=cordconstnode.create((tordconstnode(left).value),resultdef,false); | ||||||
|                     end |                     end | ||||||
|                 end; |                 end; | ||||||
|               in_sqr_real : |               in_sqr_real : | ||||||
| @ -3139,8 +3139,7 @@ implementation | |||||||
|               in_abs_long: |               in_abs_long: | ||||||
|                 begin |                 begin | ||||||
|                   set_varstate(left,vs_read,[vsf_must_be_valid]); |                   set_varstate(left,vs_read,[vsf_must_be_valid]); | ||||||
|                   inserttypeconv(left,s32inttype); |                   resultdef:=left.resultdef; | ||||||
|                   resultdef:=s32inttype; |  | ||||||
|                 end; |                 end; | ||||||
| 
 | 
 | ||||||
|               in_abs_real, |               in_abs_real, | ||||||
|  | |||||||
| @ -2939,6 +2939,9 @@ begin | |||||||
| 
 | 
 | ||||||
| { abs(long) is handled internally on all CPUs } | { abs(long) is handled internally on all CPUs } | ||||||
|   def_system_macro('FPC_HAS_INTERNAL_ABS_LONG'); |   def_system_macro('FPC_HAS_INTERNAL_ABS_LONG'); | ||||||
|  | {$if defined(x86_64) or defined(powerpc64)} | ||||||
|  |   def_system_macro('FPC_HAS_INTERNAL_ABS_INT64'); | ||||||
|  | {$endif x86_64 or powerpc64} | ||||||
| 
 | 
 | ||||||
|   def_system_macro('FPC_HAS_UNICODESTRING'); |   def_system_macro('FPC_HAS_UNICODESTRING'); | ||||||
|   def_system_macro('FPC_RTTI_PACKSET1'); |   def_system_macro('FPC_RTTI_PACKSET1'); | ||||||
|  | |||||||
| @ -797,7 +797,12 @@ Function abs(l:longint):longint;[internproc:fpc_in_abs_long]; | |||||||
| {$else FPC_HAS_INTERNAL_ABS_LONG} | {$else FPC_HAS_INTERNAL_ABS_LONG} | ||||||
| Function abs(l:Longint):Longint;[internconst:fpc_in_const_abs];{$ifdef SYSTEMINLINE}inline;{$endif} | Function abs(l:Longint):Longint;[internconst:fpc_in_const_abs];{$ifdef SYSTEMINLINE}inline;{$endif} | ||||||
| {$endif FPC_HAS_INTERNAL_ABS_LONG} | {$endif FPC_HAS_INTERNAL_ABS_LONG} | ||||||
|  | {$ifdef FPC_HAS_INTERNAL_ABS_INT64} | ||||||
|  | {$define FPC_SYSTEM_HAS_ABS_INT64} | ||||||
|  | Function abs(l:Int64):Int64;[internproc:fpc_in_abs_long]; | ||||||
|  | {$else FPC_HAS_INTERNAL_ABS_INT64} | ||||||
| Function abs(l:Int64):Int64;[internconst:fpc_in_const_abs];{$ifdef SYSTEMINLINE}inline;{$endif} | Function abs(l:Int64):Int64;[internconst:fpc_in_const_abs];{$ifdef SYSTEMINLINE}inline;{$endif} | ||||||
|  | {$endif FPC_HAS_INTERNAL_ABS_INT64} | ||||||
| Function sqr(l:Longint):Longint;[internconst:fpc_in_const_sqr];{$ifdef SYSTEMINLINE}inline;{$endif} | Function sqr(l:Longint):Longint;[internconst:fpc_in_const_sqr];{$ifdef SYSTEMINLINE}inline;{$endif} | ||||||
| Function sqr(l:Int64):Int64;[internconst:fpc_in_const_sqr];{$ifdef SYSTEMINLINE}inline;{$endif} | Function sqr(l:Int64):Int64;[internconst:fpc_in_const_sqr];{$ifdef SYSTEMINLINE}inline;{$endif} | ||||||
| Function sqr(l:QWord):QWord;[internconst:fpc_in_const_sqr];{$ifdef SYSTEMINLINE}inline;{$endif} | Function sqr(l:QWord):QWord;[internconst:fpc_in_const_sqr];{$ifdef SYSTEMINLINE}inline;{$endif} | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 sergei
						sergei