mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-09 18:26:16 +02:00
* switch WebAssembly RTL to provide atomic intrinsic helpers instead of Interlocked* functions
This commit is contained in:
parent
546c3093f7
commit
573b82c67f
@ -77,7 +77,17 @@ function Sptr : pointer; assembler; nostackframe;
|
||||
end;
|
||||
|
||||
|
||||
{$ifndef VER3_2}
|
||||
{$define FPC_SYSTEM_INTERLOCKED_USE_INTRIN}
|
||||
{$endif VER3_2}
|
||||
|
||||
|
||||
{$ifdef VER3_2}
|
||||
function InterLockedDecrement (var Target: longint) : longint;
|
||||
{$else VER3_2}
|
||||
{$define FPC_SYSTEM_HAS_ATOMIC_DEC_32}
|
||||
function fpc_atomic_dec_32 (var Target: longint) : longint;
|
||||
{$endif VER3_2}
|
||||
begin
|
||||
{$ifdef FPC_WASM_THREADS}
|
||||
{$push}{$R-,Q-}
|
||||
@ -90,7 +100,12 @@ function InterLockedDecrement (var Target: longint) : longint;
|
||||
end;
|
||||
|
||||
|
||||
{$ifdef VER3_2}
|
||||
function InterLockedIncrement (var Target: longint) : longint;
|
||||
{$else VER3_2}
|
||||
{$define FPC_SYSTEM_HAS_ATOMIC_INC_32}
|
||||
function fpc_atomic_inc_32 (var Target: longint) : longint;
|
||||
{$endif VER3_2}
|
||||
begin
|
||||
{$ifdef FPC_WASM_THREADS}
|
||||
{$push}{$R-,Q-}
|
||||
@ -103,7 +118,12 @@ function InterLockedIncrement (var Target: longint) : longint;
|
||||
end;
|
||||
|
||||
|
||||
{$ifdef VER3_2}
|
||||
function InterLockedExchange (var Target: longint;Source : longint) : longint;
|
||||
{$else VER3_2}
|
||||
{$define FPC_SYSTEM_HAS_ATOMIC_XCHG_32}
|
||||
function fpc_atomic_xchg_32 (var Target: longint;Source : longint) : longint;
|
||||
{$endif VER3_2}
|
||||
begin
|
||||
{$ifdef FPC_WASM_THREADS}
|
||||
Result:=LongInt(fpc_wasm32_i32_atomic_rmw_xchg(@Target,LongWord(Source)));
|
||||
@ -114,30 +134,45 @@ function InterLockedExchange (var Target: longint;Source : longint) : longint;
|
||||
end;
|
||||
|
||||
|
||||
{$ifdef VER3_2}
|
||||
function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint;
|
||||
{$else VER3_2}
|
||||
{$define FPC_SYSTEM_HAS_ATOMIC_CMP_XCHG_32}
|
||||
function fpc_atomic_cmp_xchg_32 (var Target: longint; NewValue: longint; Comparand: longint) : longint; [public,alias:'FPC_ATOMIC_CMP_XCHG_32'];
|
||||
{$endif VER3_2}
|
||||
begin
|
||||
{$ifdef FPC_WASM_THREADS}
|
||||
Result:=LongInt(fpc_wasm32_i32_atomic_rmw_cmpxchg_u(@Target,LongWord(Comperand),LongWord(NewValue)));
|
||||
Result:=LongInt(fpc_wasm32_i32_atomic_rmw_cmpxchg_u(@Target,LongWord({$ifdef VER3_2}Comperand{$else}Comparand{$endif}),LongWord(NewValue)));
|
||||
{$else FPC_WASM_THREADS}
|
||||
Result:=Target;
|
||||
if Target=Comperand then
|
||||
if Target={$ifdef VER3_2}Comperand{$else}Comparand{$endif} then
|
||||
Target:=NewValue;
|
||||
{$endif FPC_WASM_THREADS}
|
||||
end;
|
||||
|
||||
|
||||
{$ifdef VER3_2}
|
||||
function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
|
||||
{$else VER3_2}
|
||||
{$define FPC_SYSTEM_HAS_ATOMIC_ADD_32}
|
||||
function fpc_atomic_add_32 (var Target: longint;Value : longint) : longint;
|
||||
{$endif VER3_2}
|
||||
begin
|
||||
{$ifdef FPC_WASM_THREADS}
|
||||
Result:=LongInt(fpc_wasm32_i32_atomic_rmw_add(@Target,LongWord(Source)));
|
||||
Result:=LongInt(fpc_wasm32_i32_atomic_rmw_add(@Target,LongWord({$ifdef VER3_2}Source{$else}Value{$endif})));
|
||||
{$else FPC_WASM_THREADS}
|
||||
Result:=Target;
|
||||
inc(Target,Source);
|
||||
inc(Target,{$ifdef VER3_2}Source{$else}Value{$endif});
|
||||
{$endif FPC_WASM_THREADS}
|
||||
end;
|
||||
|
||||
|
||||
{$ifdef VER3_2}
|
||||
function InterLockedDecrement (var Target: smallint) : smallint;
|
||||
{$else VER3_2}
|
||||
{$define FPC_SYSTEM_HAS_ATOMIC_DEC_16}
|
||||
function fpc_atomic_dec_16 (var Target: smallint) : smallint;
|
||||
{$endif VER3_2}
|
||||
begin
|
||||
{$ifdef FPC_WASM_THREADS}
|
||||
{$push}{$R-,Q-}
|
||||
@ -150,7 +185,12 @@ function InterLockedDecrement (var Target: smallint) : smallint;
|
||||
end;
|
||||
|
||||
|
||||
{$ifdef VER3_2}
|
||||
function InterLockedIncrement (var Target: smallint) : smallint;
|
||||
{$else VER3_2}
|
||||
{$define FPC_SYSTEM_HAS_ATOMIC_INC_16}
|
||||
function fpc_atomic_inc_16 (var Target: smallint) : smallint;
|
||||
{$endif VER3_2}
|
||||
begin
|
||||
{$ifdef FPC_WASM_THREADS}
|
||||
{$push}{$R-,Q-}
|
||||
@ -163,7 +203,12 @@ function InterLockedIncrement (var Target: smallint) : smallint;
|
||||
end;
|
||||
|
||||
|
||||
{$ifdef VER3_2}
|
||||
function InterLockedExchange (var Target: smallint;Source : smallint) : smallint;
|
||||
{$else VER3_2}
|
||||
{$define FPC_SYSTEM_HAS_ATOMIC_XCHG_16}
|
||||
function fpc_atomic_xchg_16 (var Target: smallint;Source : smallint) : smallint;
|
||||
{$endif VER3_2}
|
||||
begin
|
||||
{$ifdef FPC_WASM_THREADS}
|
||||
Result:=SmallInt(fpc_wasm32_i32_atomic_rmw16_xchg_u(@Target,Word(Source)));
|
||||
@ -174,24 +219,34 @@ function InterLockedExchange (var Target: smallint;Source : smallint) : smallint
|
||||
end;
|
||||
|
||||
|
||||
{$ifdef VER3_2}
|
||||
function InterlockedCompareExchange(var Target: smallint; NewValue: smallint; Comperand: smallint): smallint;
|
||||
{$else VER3_2}
|
||||
{$define FPC_SYSTEM_HAS_ATOMIC_CMP_XCHG_16}
|
||||
function fpc_atomic_cmp_xchg_16 (var Target: smallint; NewValue: smallint; Comparand: smallint) : smallint;
|
||||
{$endif VER3_2}
|
||||
begin
|
||||
{$ifdef FPC_WASM_THREADS}
|
||||
Result:=SmallInt(fpc_wasm32_i32_atomic_rmw16_cmpxchg_u(@Target,Word(Comperand),Word(NewValue)));
|
||||
Result:=SmallInt(fpc_wasm32_i32_atomic_rmw16_cmpxchg_u(@Target,Word({$ifdef VER3_2}Comperand{$else}Comparand{$endif}),Word(NewValue)));
|
||||
{$else FPC_WASM_THREADS}
|
||||
Result:=Target;
|
||||
if Target=Comperand then
|
||||
if Target={$ifdef VER3_2}Comperand{$else}Comparand{$endif} then
|
||||
Target:=NewValue;
|
||||
{$endif FPC_WASM_THREADS}
|
||||
end;
|
||||
|
||||
|
||||
{$ifdef VER3_2}
|
||||
function InterLockedExchangeAdd (var Target: smallint;Source : smallint) : smallint;
|
||||
{$else VER3_2}
|
||||
{$define FPC_SYSTEM_HAS_ATOMIC_ADD_16}
|
||||
function fpc_atomic_add_16 (var Target: smallint;Value : smallint) : smallint;
|
||||
{$endif VER3_2}
|
||||
begin
|
||||
{$ifdef FPC_WASM_THREADS}
|
||||
Result:=SmallInt(fpc_wasm32_i32_atomic_rmw16_add_u(@Target,Word(Source)));
|
||||
Result:=SmallInt(fpc_wasm32_i32_atomic_rmw16_add_u(@Target,Word({$ifdef VER3_2}Source{$else}Value{$endif})));
|
||||
{$else FPC_WASM_THREADS}
|
||||
Result:=Target;
|
||||
inc(Target,Source);
|
||||
inc(Target,{$ifdef VER3_2}Source{$else}Value{$endif});
|
||||
{$endif FPC_WASM_THREADS}
|
||||
end;
|
||||
|
Loading…
Reference in New Issue
Block a user