Browse Source

Switch from functions for the Atomic*-family to intrinsics

Sven/Sarah Barth 2 years ago
parent
commit
7f4b2f63b3
3 changed files with 4 additions and 368 deletions
  1. 4 0
      compiler/psystem.pas
  2. 0 327
      rtl/inc/system.inc
  3. 0 41
      rtl/inc/systemh.inc

+ 4 - 0
compiler/psystem.pas

@@ -115,6 +115,10 @@ implementation
         systemunit.insertsym(csyssym.create('IsManagedType',in_ismanagedtype_x));
         systemunit.insertsym(csyssym.create('IsConstValue',in_isconstvalue_x));
         systemunit.insertsym(csyssym.create('fpc_eh_return_data_regno', in_const_eh_return_data_regno));
+        systemunit.insertsym(csyssym.create('AtomicIncrement',in_atomic_inc));
+        systemunit.insertsym(csyssym.create('AtomicDecrement',in_atomic_dec));
+        systemunit.insertsym(csyssym.create('AtomicExchange',in_atomic_xchg));
+        systemunit.insertsym(csyssym.create('AtomicCmpExchange',in_atomic_cmp_xchg));
         systemunit.insertsym(cconstsym.create_ord('False',constord,0,pasbool1type));
         systemunit.insertsym(cconstsym.create_ord('True',constord,1,pasbool1type));
       end;

+ 0 - 327
rtl/inc/system.inc

@@ -2227,330 +2227,3 @@ begin
 end;
 {$ENDIF FPC_HAS_SETCTRLBREAKHANDLER}
 
-{$ifdef cpu16}
-function AtomicIncrement (var Target: smallint) : smallint; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=InterlockedIncrement(Target);
-end;
-
-
-function AtomicDecrement (var Target: smallint) : smallint; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=InterlockedDecrement(Target);
-end;
-
-function AtomicIncrement (var Target: smallint; Value: smallint) : smallint; {$ifdef SYSTEMINLINE}inline;{$endif}
-var
-  tmp: smallint;
-begin
-  repeat
-    tmp:=Target;
-  until AtomicCmpExchange(Target,tmp+Value,tmp)=tmp;
-end;
-
-
-function AtomicDecrement (var Target: smallint; Value: smallint) : smallint; {$ifdef SYSTEMINLINE}inline;{$endif}
-var
-  tmp: smallint;
-begin
-  repeat
-    tmp:=Target;
-  until AtomicCmpExchange(Target,tmp-Value,tmp)=tmp;
-end;
-
-
-function AtomicCmpExchange(var Target: smallint; NewValue, Comperand: smallint): smallint; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=InterlockedCompareExchange(Target,NewValue,Comperand);
-end;
-
-
-function AtomicExchange (var Target: smallint;Source : smallint) : smallint; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=InterlockedExchange(Target,Source);
-end;
-
-function AtomicIncrement (var Target: word) : word; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=InterlockedIncrement(Target);
-end;
-
-
-function AtomicDecrement (var Target: word) : word; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=InterlockedDecrement(Target);
-end;
-
-
-function AtomicIncrement (var Target: word; Value: word) : word; {$ifdef SYSTEMINLINE}inline;{$endif}
-var
-  tmp: word;
-begin
-  repeat
-    tmp:=Target;
-  until AtomicCmpExchange(Target,tmp+Value,tmp)=tmp;
-end;
-
-
-function AtomicDecrement (var Target: word; Value: word) : word; {$ifdef SYSTEMINLINE}inline;{$endif}
-var
-  tmp: word;
-begin
-  repeat
-    tmp:=Target;
-  until AtomicCmpExchange(Target,tmp-Value,tmp)=tmp;
-end;
-
-
-function AtomicCmpExchange(var Target: word; NewValue, Comperand: word): word; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=InterlockedCompareExchange(Target, NewValue, Comperand);
-end;
-
-
-function AtomicExchange (var Target: word;Source : word) : word; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=InterlockedExchange(Target,Source);
-end;
-{$endif cpu16}
-
-
-function AtomicIncrement (var Target: longint) : longint; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=InterlockedIncrement(Target);
-end;
-
-
-function AtomicDecrement (var Target: longint) : longint; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=InterlockedDecrement(Target);
-end;
-
-
-function AtomicIncrement (var Target: longint; Value: longint) : longint; {$ifdef SYSTEMINLINE}inline;{$endif}
-var
-  tmp: longint;
-begin
-  repeat
-    tmp:=Target;
-  until AtomicCmpExchange(Target,tmp+Value,tmp)=tmp;
-end;
-
-
-function AtomicDecrement (var Target: longint; Value: longint) : longint; {$ifdef SYSTEMINLINE}inline;{$endif}
-var
-  tmp: longint;
-begin
-  repeat
-    tmp:=Target;
-  until AtomicCmpExchange(Target,tmp-Value,tmp)=tmp;
-end;
-
-
-function AtomicCmpExchange(var Target: longint; NewValue, Comperand: longint): longint; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=InterlockedCompareExchange(Target,NewValue, Comperand);
-end;
-
-
-function AtomicExchange (var Target: longint;Source : longint) : longint; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=InterlockedExchange(Target,Source);
-end;
-
-
-{$ifdef cpu64}
-function AtomicIncrement (var Target: int64) : int64; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=InterlockedIncrement64(Target);
-end;
-
-
-function AtomicDecrement (var Target: int64) : int64; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=InterlockedDecrement64(Target);
-end;
-
-
-function AtomicIncrement (var Target: int64; Value: int64) : int64; {$ifdef SYSTEMINLINE}inline;{$endif}
-var
-  tmp: int64;
-begin
-  repeat
-    tmp:=Target;
-  until AtomicCmpExchange(Target,tmp+Value,tmp)=tmp;
-end;
-
-
-function AtomicDecrement (var Target: int64; Value: int64) : int64; {$ifdef SYSTEMINLINE}inline;{$endif}
-var
-  tmp: int64;
-begin
-  repeat
-    tmp:=Target;
-  until AtomicCmpExchange(Target,tmp-Value,tmp)=tmp;
-end;
-
-
-function AtomicCmpExchange(var Target: int64; NewValue, Comperand: int64): int64; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=InterlockedCompareExchange64(Target,NewValue, Comperand);
-end;
-
-
-function AtomicExchange (var Target: int64;Source : int64) : int64; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=InterlockedExchange64(Target,Source);
-end;
-{$endif cpu64}
-
-
-{ Pointer overloads }
-
-{$ifndef FPC_SYSTEM_DISABLE_INTERLOCK_POINTER_OVERLOAD}
-
-function AtomicIncrement (var Target: pointer) : pointer; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-{$IFDEF CPU64}
-  Result:=Pointer(InterlockedIncrement64(int64(Target)));
-{$ELSE}
-{$IFDEF CPU16}
-  Result:=Pointer(InterlockedIncrement(smallint(Target)));
-{$ELSE}
-  Result:=Pointer(InterlockedIncrement(Longint(Target)));
-{$ENDIF}
-{$ENDIF}
-end;
-
-
-function AtomicDecrement (var Target: pointer) : pointer; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-{$IFDEF CPU64}
-  Result:=Pointer(InterlockedDecrement64(Int64(Target)));
-{$ELSE}
-{$IFDEF CPU16}
-  Result:=Pointer(InterlockedDecrement(smallint(Target)));
-{$ELSE}
-   Result:=Pointer(InterlockedDecrement(Longint(Target)));
-{$ENDIF}
-{$ENDIF}
-end;
-
-
-function AtomicCmpExchange(var Target: pointer; NewValue, Comperand: pointer): pointer; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-{$IFDEF CPU64}
-  Result:=Pointer(InterlockedCompareExchange64(Int64(Target),Int64(NewValue), Int64(Comperand)));
-{$ELSE}
-{$IFDEF CPU16}
-  Result:=Pointer(InterlockedCompareExchange(smallint(Target),smallint(NewValue),smallint(Comperand)));
-{$ELSE}
-  Result:=Pointer(InterlockedCompareExchange(LongInt(Target),LongInt(NewValue), LongInt(Comperand)));
-{$ENDIF}
-{$ENDIF}
-end;
-
-
-function AtomicExchange(var Target: pointer;Source : pointer) : pointer; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-{$IFDEF CPU64}
-  Result:=Pointer(InterlockedExchange64(Int64(Target),Int64(Source)));
-{$ELSE}
-{$IFDEF CPU16}
-  Result:=Pointer(InterlockedExchange(smallint(Target),smallint(Source)));
-{$ELSE}
-  Result:=Pointer(InterlockedExchange(LongInt(Target),LongInt(Source)));
-{$ENDIF}
-{$ENDIF}
-end;
-
-{$endif FPC_SYSTEM_DISABLE_INTERLOCK_POINTER_OVERLOAD}
-
-function AtomicIncrement (var Target: Cardinal) : Cardinal; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=Cardinal(InterlockedIncrement(Longint(Target)));
-end;
-
-
-function AtomicDecrement (var Target: Cardinal) : Cardinal; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=Cardinal(InterlockedDecrement(Longint(Target)));
-end;
-
-
-function AtomicIncrement (var Target: Cardinal; Value: Cardinal) : Cardinal; {$ifdef SYSTEMINLINE}inline;{$endif}
-var
-  tmp: Cardinal;
-begin
-  repeat
-    tmp:=Target;
-  until AtomicCmpExchange(Target,tmp+Value,tmp)=tmp;
-end;
-
-
-function AtomicDecrement (var Target: Cardinal; Value: Cardinal) : Cardinal; {$ifdef SYSTEMINLINE}inline;{$endif}
-var
-  tmp: Cardinal;
-begin
-  repeat
-    tmp:=Target;
-  until AtomicCmpExchange(Target,tmp-Value,tmp)=tmp;
-end;
-
-
-function AtomicCmpExchange(var Target: Cardinal; NewValue, Comperand: Cardinal): Cardinal; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=Cardinal(InterlockedCompareExchange(Longint(Target),Longint(NewValue), Longint(Comperand)));
-end;
-
-
-function AtomicExchange (var Target: Cardinal;Source : Cardinal) : Cardinal; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=Cardinal(InterlockedExchange(Longint(Target),Longint(Source)));
-end;
-
-
-{$ifdef cpu64}
-function AtomicIncrement (var Target: qword) : qword; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=QWord(InterlockedIncrement64(Int64(Target)));
-end;
-
-
-function AtomicDecrement (var Target: qword) : qword; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=QWord(InterlockedDecrement64(int64(Target)));
-end;
-
-
-function AtomicIncrement (var Target: qword; Value: qword) : qword; {$ifdef SYSTEMINLINE}inline;{$endif}
-var
-  tmp: qword;
-begin
-  repeat
-    tmp:=Target;
-  until AtomicCmpExchange(Target,tmp+Value,tmp)=tmp;
-end;
-
-
-function AtomicDecrement (var Target: qword; Value: qword) : qword; {$ifdef SYSTEMINLINE}inline;{$endif}
-var
-  tmp: qword;
-begin
-  repeat
-    tmp:=Target;
-  until AtomicCmpExchange(Target,tmp-Value,tmp)=tmp;
-end;
-
-
-function AtomicCmpExchange(var Target: qword; NewValue, Comperand: qword): qword; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=QWord(InterlockedCompareExchange64(Int64(Target),Int64(NewValue), Int64(Comperand)));
-end;
-
-
-function AtomicExchange (var Target: qword;Source : qword) : qword; {$ifdef SYSTEMINLINE}inline;{$endif}
-begin
-  Result:=QWord(InterlockedExchange64(Int64(Target),Int64(Source)));
-end;
-{$endif}

+ 0 - 41
rtl/inc/systemh.inc

@@ -1568,36 +1568,18 @@ Function GetThreadID:TThreadID;{$ifdef SYSTEMINLINE}inline;{$endif}
 {$endif CPUI806}
 
 {$ifdef cpu16}
-function AtomicIncrement (var Target: smallint) : smallint; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicDecrement (var Target: smallint) : smallint; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicIncrement (var Target: smallint; Value: smallint) : smallint; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicDecrement (var Target: smallint; Value: smallint) : smallint; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicCmpExchange(var Target: smallint; NewValue, Comperand: smallint): smallint; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicExchange (var Target: smallint;Source : smallint) : smallint; {$ifdef SYSTEMINLINE}inline;{$endif}
 function InterlockedIncrement (var Target: smallint) : smallint; public name 'FPC_INTERLOCKEDINCREMENT16';
 function InterlockedDecrement (var Target: smallint) : smallint; public name 'FPC_INTERLOCKEDDECREMENT16';
 function InterlockedExchange (var Target: smallint;Source : smallint) : smallint; public name 'FPC_INTERLOCKEDEXCHANGE16';
 function InterlockedExchangeAdd (var Target: smallint;Source : smallint) : smallint; public name 'FPC_INTERLOCKEDEXCHANGEADD16';
 function InterlockedCompareExchange(var Target: smallint; NewValue: smallint; Comperand: smallint): smallint; public name 'FPC_INTERLOCKEDCOMPAREEXCHANGE16';
 {$endif cpu16}
-function AtomicIncrement (var Target: longint) : longint; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicDecrement (var Target: longint) : longint; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicIncrement (var Target: longint; Value: longint) : longint; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicDecrement (var Target: longint; Value: longint) : longint; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicCmpExchange(var Target: longint; NewValue, Comperand: longint): longint; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicExchange (var Target: longint;Source : longint) : longint; {$ifdef SYSTEMINLINE}inline;{$endif}
 function InterlockedIncrement (var Target: longint) : longint; public name 'FPC_INTERLOCKEDINCREMENT';
 function InterlockedDecrement (var Target: longint) : longint; public name 'FPC_INTERLOCKEDDECREMENT';
 function InterlockedExchange (var Target: longint;Source : longint) : longint; public name 'FPC_INTERLOCKEDEXCHANGE';
 function InterlockedExchangeAdd (var Target: longint;Source : longint) : longint; public name 'FPC_INTERLOCKEDEXCHANGEADD';
 function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; public name 'FPC_INTERLOCKEDCOMPAREEXCHANGE';
 {$ifdef cpu64}
-function AtomicIncrement (var Target: int64) : int64; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicDecrement (var Target: int64) : int64; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicIncrement (var Target: int64; Value: int64) : int64; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicDecrement (var Target: int64; Value: int64) : int64; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicCmpExchange(var Target: int64; NewValue, Comperand: int64): int64; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicExchange (var Target: int64;Source : int64) : int64; {$ifdef SYSTEMINLINE}inline;{$endif}
 function InterlockedIncrement64 (var Target: int64) : int64; public name 'FPC_INTERLOCKEDINCREMENT64';
 function InterlockedDecrement64 (var Target: int64) : int64; public name 'FPC_INTERLOCKEDDECREMENT64';
 function InterlockedExchange64 (var Target: int64;Source : int64) : int64; public name 'FPC_INTERLOCKEDEXCHANGE64';
@@ -1609,10 +1591,6 @@ function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comper
 
 {$ifndef FPC_SYSTEM_DISABLE_INTERLOCK_POINTER_OVERLOAD}
 
-function AtomicIncrement (var Target: pointer) : pointer; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicDecrement (var Target: pointer) : pointer; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicCmpExchange(var Target: pointer; NewValue, Comperand: pointer): pointer; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicExchange (var Target: pointer;Source : pointer) : pointer; {$ifdef SYSTEMINLINE}inline;{$endif}
 {$if defined(FPC_HAS_EXPLICIT_INTERLOCKED_POINTER)}
 { Note: define FPC_SYSTEM_HAS_EXPLICIT_INTERLOCKED_POINTER if the target platform defines
         these pointer overloads itself instead of using platform independant inline functions }
@@ -1624,7 +1602,6 @@ function InterlockedCompareExchange(var Target: Pointer; NewValue: Pointer; Comp
 { Note: in case of FPC_SYSTEM_HAS_EXPLICIT_INTERLOCKED_POINTER this is an alias for
         InterlockedCompareExchange (this doesn't work with inline however) }
 function InterlockedCompareExchangePointer(var Target: Pointer; NewValue: Pointer; Comperand: Pointer): Pointer; {$ifndef FPC_INTERLOCKED_POINTER_INLINE}inline;{$else}external name 'FPC_INTERLOCKEDEXCHANGEPOINTER';{$endif}
-
 {$elseif defined(cpu64)}
 function InterlockedIncrement (var Target: Pointer) : Pointer; external name 'FPC_INTERLOCKEDINCREMENT64';
 function InterlockedDecrement (var Target: Pointer) : Pointer; external name 'FPC_INTERLOCKEDDECREMENT64';
@@ -1645,36 +1622,18 @@ function InterlockedCompareExchangePointer(var Target: Pointer; NewValue: Pointe
 
 { unsigned overloads }
 {$ifdef cpu16}
-function AtomicIncrement (var Target: word) : word; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicDecrement (var Target: word) : word; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicIncrement (var Target: word; Value: word) : word; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicDecrement (var Target: word; Value: word) : word; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicCmpExchange(var Target: word; NewValue, Comperand: word): word; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicExchange (var Target: word;Source : word) : word; {$ifdef SYSTEMINLINE}inline;{$endif}
 function InterlockedIncrement (var Target: word) : word; external name 'FPC_INTERLOCKEDINCREMENT16';
 function InterlockedDecrement (var Target: word) : word; external name 'FPC_INTERLOCKEDDECREMENT16';
 function InterlockedExchange (var Target: word;Source : word) : word; external name 'FPC_INTERLOCKEDEXCHANGE16';
 function InterlockedExchangeAdd (var Target: word;Source : word) : word; external name 'FPC_INTERLOCKEDEXCHANGEADD16';
 function InterlockedCompareExchange(var Target: word; NewValue: word; Comperand: word): word; external name 'FPC_INTERLOCKEDCOMPAREEXCHANGE16';
 {$endif cpu16}
-function AtomicIncrement (var Target: Cardinal) : Cardinal; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicDecrement (var Target: Cardinal) : Cardinal; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicIncrement (var Target: Cardinal; Value: Cardinal) : Cardinal; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicDecrement (var Target: Cardinal; Value: Cardinal) : Cardinal; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicCmpExchange(var Target: Cardinal; NewValue, Comperand: Cardinal): Cardinal; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicExchange (var Target: Cardinal;Source : Cardinal) : Cardinal; {$ifdef SYSTEMINLINE}inline;{$endif}
 function InterlockedIncrement (var Target: cardinal) : cardinal; external name 'FPC_INTERLOCKEDINCREMENT';
 function InterlockedDecrement (var Target: cardinal) : cardinal; external name 'FPC_INTERLOCKEDDECREMENT';
 function InterlockedExchange (var Target: cardinal;Source : cardinal) : cardinal; external name 'FPC_INTERLOCKEDEXCHANGE';
 function InterlockedExchangeAdd (var Target: cardinal;Source : cardinal) : cardinal; external name 'FPC_INTERLOCKEDEXCHANGEADD';
 function InterlockedCompareExchange(var Target: cardinal; NewValue: cardinal; Comperand: cardinal): cardinal; external name 'FPC_INTERLOCKEDCOMPAREEXCHANGE';
 {$ifdef cpu64}
-function AtomicIncrement (var Target: qword) : qword; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicDecrement (var Target: qword) : qword; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicIncrement (var Target: qword; Value: qword) : qword; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicDecrement (var Target: qword; Value: qword) : qword; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicCmpExchange(var Target: qword; NewValue, Comperand: qword): qword; {$ifdef SYSTEMINLINE}inline;{$endif}
-function AtomicExchange (var Target: qword;Source : qword) : qword; {$ifdef SYSTEMINLINE}inline;{$endif}
 function InterlockedIncrement64 (var Target: qword) : qword; external name 'FPC_INTERLOCKEDINCREMENT64';
 function InterlockedDecrement64 (var Target: qword) : qword; external name 'FPC_INTERLOCKEDDECREMENT64';
 function InterlockedExchange64 (var Target: qword;Source : qword) : qword; external name 'FPC_INTERLOCKEDEXCHANGE64';