From 573b82c67f58bda7f6cfb5cea54c49bbc4c962ed Mon Sep 17 00:00:00 2001 From: Sven/Sarah Barth Date: Sat, 7 Dec 2024 22:25:40 +0100 Subject: [PATCH] * switch WebAssembly RTL to provide atomic intrinsic helpers instead of Interlocked* functions --- rtl/wasm32/wasm32.inc | 71 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 63 insertions(+), 8 deletions(-) diff --git a/rtl/wasm32/wasm32.inc b/rtl/wasm32/wasm32.inc index 8308d29f06..7ef2757deb 100644 --- a/rtl/wasm32/wasm32.inc +++ b/rtl/wasm32/wasm32.inc @@ -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;