|
@@ -52,7 +52,17 @@ Function Sptr : pointer;assembler;nostackframe;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifndef VER3_2}
|
|
|
|
+{$define FPC_SYSTEM_INTERLOCKED_USE_INTRIN}
|
|
|
|
+{$endif VER3_2}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterLockedDecrement (var Target: longint) : longint; assembler; nostackframe;
|
|
function InterLockedDecrement (var Target: longint) : longint; assembler; nostackframe;
|
|
|
|
+{$else VER3_2}
|
|
|
|
+{$define FPC_SYSTEM_HAS_ATOMIC_DEC_32}
|
|
|
|
+function fpc_atomic_dec_32 (var Target: longint) : longint; assembler; nostackframe;
|
|
|
|
+{$endif VER3_2}
|
|
asm
|
|
asm
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
addi a1, x0, -1
|
|
addi a1, x0, -1
|
|
@@ -67,7 +77,12 @@ function InterLockedDecrement (var Target: longint) : longint; assembler; nostac
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterLockedIncrement (var Target: longint) : longint; assembler; nostackframe;
|
|
function InterLockedIncrement (var Target: longint) : longint; assembler; nostackframe;
|
|
|
|
+{$else VER3_2}
|
|
|
|
+{$define FPC_SYSTEM_HAS_ATOMIC_INC_32}
|
|
|
|
+function fpc_atomic_inc_32 (var Target: longint) : longint; assembler; nostackframe;
|
|
|
|
+{$endif VER3_2}
|
|
asm
|
|
asm
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
addi a1, x0, 1
|
|
addi a1, x0, 1
|
|
@@ -82,7 +97,12 @@ function InterLockedIncrement (var Target: longint) : longint; assembler; nostac
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterLockedExchange (var Target: longint;Source : longint) : longint; assembler; nostackframe;
|
|
function InterLockedExchange (var Target: longint;Source : longint) : longint; assembler; nostackframe;
|
|
|
|
+{$else VER3_2}
|
|
|
|
+{$define FPC_SYSTEM_HAS_ATOMIC_XCHG_32}
|
|
|
|
+function fpc_atomic_xchg_32 (var Target: longint;Source : longint) : longint; assembler; nostackframe;
|
|
|
|
+{$endif VER3_2}
|
|
asm
|
|
asm
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
amoswap.w a0, a1, (a0)
|
|
amoswap.w a0, a1, (a0)
|
|
@@ -94,7 +114,12 @@ function InterLockedExchange (var Target: longint;Source : longint) : longint; a
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; assembler; nostackframe;
|
|
function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; assembler; nostackframe;
|
|
|
|
+{$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; assembler; nostackframe;
|
|
|
|
+{$endif VER3_2}
|
|
asm
|
|
asm
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
.LLoop:
|
|
.LLoop:
|
|
@@ -114,7 +139,12 @@ function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comp
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; assembler; nostackframe;
|
|
function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; assembler; nostackframe;
|
|
|
|
+{$else VER3_2}
|
|
|
|
+{$define FPC_SYSTEM_HAS_ATOMIC_ADD_32}
|
|
|
|
+function fpc_atomic_add_32 (var Target: longint;Value: longint) : longint; assembler; nostackframe;
|
|
|
|
+{$endif VER3_2}
|
|
asm
|
|
asm
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
amoadd.w a0, a1, (a0)
|
|
amoadd.w a0, a1, (a0)
|
|
@@ -127,8 +157,12 @@ function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterLockedDecrement64 (var Target: int64) : int64; assembler; nostackframe;
|
|
function InterLockedDecrement64 (var Target: int64) : int64; assembler; nostackframe;
|
|
|
|
+{$else VER3_2}
|
|
|
|
+{$define FPC_SYSTEM_HAS_ATOMIC_DEC_64}
|
|
|
|
+function fpc_atomic_dec_64 (var Target: int64) : int64; assembler; nostackframe;
|
|
|
|
+{$endif VER3_2}
|
|
asm
|
|
asm
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
addi a1, x0, -1
|
|
addi a1, x0, -1
|
|
@@ -143,7 +177,12 @@ function InterLockedDecrement64 (var Target: int64) : int64; assembler; nostackf
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterLockedIncrement64 (var Target: int64) : int64; assembler; nostackframe;
|
|
function InterLockedIncrement64 (var Target: int64) : int64; assembler; nostackframe;
|
|
|
|
+{$else VER3_2}
|
|
|
|
+{$define FPC_SYSTEM_HAS_ATOMIC_INC_64}
|
|
|
|
+function fpc_atomic_inc_64 (var Target: int64) : int64; assembler; nostackframe;
|
|
|
|
+{$endif VER3_2}
|
|
asm
|
|
asm
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
addi a1, x0, 1
|
|
addi a1, x0, 1
|
|
@@ -158,7 +197,12 @@ function InterLockedIncrement64 (var Target: int64) : int64; assembler; nostackf
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterLockedExchange64 (var Target: int64;Source : int64) : int64; assembler; nostackframe;
|
|
function InterLockedExchange64 (var Target: int64;Source : int64) : int64; assembler; nostackframe;
|
|
|
|
+{$else VER3_2}
|
|
|
|
+{$define FPC_SYSTEM_HAS_ATOMIC_XCHG_64}
|
|
|
|
+function fpc_atomic_xchg_64 (var Target: int64;Source : int64) : int64; assembler; nostackframe;
|
|
|
|
+{$endif VER3_2}
|
|
asm
|
|
asm
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
amoswap.d a0, a1, (a0)
|
|
amoswap.d a0, a1, (a0)
|
|
@@ -170,7 +214,12 @@ function InterLockedExchange64 (var Target: int64;Source : int64) : int64; assem
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comperand: int64): int64; assembler; nostackframe;
|
|
function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comperand: int64): int64; assembler; nostackframe;
|
|
|
|
+{$else VER3_2}
|
|
|
|
+{$define FPC_SYSTEM_HAS_ATOMIC_CMP_XCHG_64}
|
|
|
|
+function fpc_atomic_cmp_xchg_64 (var Target: int64; NewValue: int64; Comparand: int64) : int64; [public,alias:'FPC_ATOMIC_CMP_XCHG_64']; assembler; nostackframe;
|
|
|
|
+{$endif VER3_2}
|
|
asm
|
|
asm
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
.LLoop:
|
|
.LLoop:
|
|
@@ -190,7 +239,12 @@ function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comper
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+{$ifdef VER3_2}
|
|
function InterLockedExchangeAdd64 (var Target: int64;Source : int64) : int64; assembler; nostackframe;
|
|
function InterLockedExchangeAdd64 (var Target: int64;Source : int64) : int64; assembler; nostackframe;
|
|
|
|
+{$else VER3_2}
|
|
|
|
+{$define FPC_SYSTEM_HAS_ATOMIC_ADD_64}
|
|
|
|
+function fpc_atomic_add_64 (var Target: int64;Value : int64) : int64; assembler; nostackframe;
|
|
|
|
+{$endif VER3_2}
|
|
asm
|
|
asm
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
{$ifdef CPURV_HAS_ATOMIC}
|
|
amoadd.d a0, a1, (a0)
|
|
amoadd.d a0, a1, (a0)
|