|
@@ -44,81 +44,209 @@ function get_caller_frame(framebp:pointer;addr:pointer=nil):pointer;assembler;
|
|
|
|
|
|
|
|
|
{$define FPC_SYSTEM_HAS_SPTR}
|
|
|
-Function Sptr : pointer;assembler;
|
|
|
+Function Sptr : pointer;assembler;nostackframe;
|
|
|
asm
|
|
|
addi a0, sp, 0
|
|
|
end;
|
|
|
|
|
|
|
|
|
-function InterLockedDecrement (var Target: longint) : longint;
|
|
|
- begin
|
|
|
- dec(Target);
|
|
|
- Result:=Target;
|
|
|
+function InterLockedDecrement (var Target: longint) : longint; assembler; nostackframe;
|
|
|
+ asm
|
|
|
+{$ifdef CPURV_HAS_ATOMIC}
|
|
|
+ addi a1, x0, -1
|
|
|
+ amoadd.w a0, a1, (a0)
|
|
|
+ addw a0, a0, a1
|
|
|
+{$else CPURV_HAS_ATOMIC}
|
|
|
+ lw a1, 0(a0)
|
|
|
+ addiw a1, a1, -1
|
|
|
+ sw a1, 0(a0)
|
|
|
+ addi a0, a1, 0
|
|
|
+{$endif CPURV_HAS_ATOMIC}
|
|
|
end;
|
|
|
|
|
|
|
|
|
-function InterLockedIncrement (var Target: longint) : longint;
|
|
|
- begin
|
|
|
- inc(Target);
|
|
|
- Result:=Target;
|
|
|
+function InterLockedIncrement (var Target: longint) : longint; assembler; nostackframe;
|
|
|
+ asm
|
|
|
+{$ifdef CPURV_HAS_ATOMIC}
|
|
|
+ addi a1, x0, 1
|
|
|
+ amoadd.w a0, a1, (a0)
|
|
|
+ addw a0, a0, a1
|
|
|
+{$else CPURV_HAS_ATOMIC}
|
|
|
+ lw a1, 0(a0)
|
|
|
+ addiw a1, a1, 1
|
|
|
+ sw a1, 0(a0)
|
|
|
+ addi a0, a1, 0
|
|
|
+{$endif CPURV_HAS_ATOMIC}
|
|
|
end;
|
|
|
|
|
|
|
|
|
-function InterLockedExchange (var Target: longint;Source : longint) : longint;
|
|
|
- begin
|
|
|
- Result:=Target;
|
|
|
- Target:=Source;
|
|
|
+function InterLockedExchange (var Target: longint;Source : longint) : longint; assembler; nostackframe;
|
|
|
+ asm
|
|
|
+{$ifdef CPURV_HAS_ATOMIC}
|
|
|
+ amoswap.w a0, a1, (a0)
|
|
|
+{$else CPURV_HAS_ATOMIC}
|
|
|
+ lw a2, 0(a0)
|
|
|
+ sw a1, 0(a0)
|
|
|
+ addi a0, a2
|
|
|
+{$endif CPURV_HAS_ATOMIC}
|
|
|
end;
|
|
|
|
|
|
|
|
|
-function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint;
|
|
|
- begin
|
|
|
- Result:=Target;
|
|
|
- if Target=Comperand then
|
|
|
- Target:=NewValue;
|
|
|
+function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; assembler; nostackframe;
|
|
|
+ asm
|
|
|
+{$ifdef CPURV_HAS_ATOMIC}
|
|
|
+ .LLoop:
|
|
|
+ lr.w a3, 0(a0)
|
|
|
+ bne a3, a2, .LFail
|
|
|
+ sc.w a4, a1, 0(a0)
|
|
|
+ bne a4, x0, .LLoop
|
|
|
+ .LFail:
|
|
|
+ addi a0, a3, 0
|
|
|
+{$else CPURV_HAS_ATOMIC}
|
|
|
+ lw a3, 0(a0)
|
|
|
+ bne a3, a2, .LFail
|
|
|
+ sw a1, 0(a0)
|
|
|
+ .LFail:
|
|
|
+ addi a0, a3, 0
|
|
|
+{$endif CPURV_HAS_ATOMIC}
|
|
|
end;
|
|
|
|
|
|
|
|
|
-function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
|
|
|
- begin
|
|
|
- Result:=Target;
|
|
|
- inc(Target,Source);
|
|
|
+function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; assembler; nostackframe;
|
|
|
+ asm
|
|
|
+{$ifdef CPURV_HAS_ATOMIC}
|
|
|
+ amoadd.w a0, a1, (a0)
|
|
|
+{$else CPURV_HAS_ATOMIC}
|
|
|
+ lw a2, 0(a0)
|
|
|
+ addiw a2, a2, a1
|
|
|
+ sw a2, 0(a0)
|
|
|
+ addi a0, a2, 0
|
|
|
+{$endif CPURV_HAS_ATOMIC}
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function InterLockedDecrement64 (var Target: int64) : int64; assembler; nostackframe;
|
|
|
+ asm
|
|
|
+{$ifdef CPURV_HAS_ATOMIC}
|
|
|
+ addi a1, x0, -1
|
|
|
+ amoadd.d a0, a1, (a0)
|
|
|
+ add a0, a0, a1
|
|
|
+{$else CPURV_HAS_ATOMIC}
|
|
|
+ ld a1, 0(a0)
|
|
|
+ addi a1, a1, -1
|
|
|
+ sd a1, 0(a0)
|
|
|
+ addi a0, a1, 0
|
|
|
+{$endif CPURV_HAS_ATOMIC}
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+function InterLockedIncrement64 (var Target: int64) : int64; assembler; nostackframe;
|
|
|
+ asm
|
|
|
+{$ifdef CPURV_HAS_ATOMIC}
|
|
|
+ addi a1, x0, 1
|
|
|
+ amoadd.d a0, a1, (a0)
|
|
|
+ add a0, a0, a1
|
|
|
+{$else CPURV_HAS_ATOMIC}
|
|
|
+ ld a1, 0(a0)
|
|
|
+ addi a1, a1, 1
|
|
|
+ sd a1, 0(a0)
|
|
|
+ addi a0, a1, 0
|
|
|
+{$endif CPURV_HAS_ATOMIC}
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+function InterLockedExchange64 (var Target: int64;Source : int64) : int64; assembler; nostackframe;
|
|
|
+ asm
|
|
|
+{$ifdef CPURV_HAS_ATOMIC}
|
|
|
+ amoswap.d a0, a1, (a0)
|
|
|
+{$else CPURV_HAS_ATOMIC}
|
|
|
+ ld a2, 0(a0)
|
|
|
+ sd a1, 0(a0)
|
|
|
+ addi a0, a2
|
|
|
+{$endif CPURV_HAS_ATOMIC}
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comperand: int64): int64; assembler; nostackframe;
|
|
|
+ asm
|
|
|
+{$ifdef CPURV_HAS_ATOMIC}
|
|
|
+ .LLoop:
|
|
|
+ lr.d a3, 0(a0)
|
|
|
+ bne a3, a2, .LFail
|
|
|
+ sc.d a4, a1, 0(a0)
|
|
|
+ bne a4, x0, .LLoop
|
|
|
+ .LFail:
|
|
|
+ addi a0, a3, 0
|
|
|
+{$else CPURV_HAS_ATOMIC}
|
|
|
+ ld a3, 0(a0)
|
|
|
+ bne a3, a2, .LFail
|
|
|
+ sd a1, 0(a0)
|
|
|
+ .LFail:
|
|
|
+ addi a0, a3, 0
|
|
|
+{$endif CPURV_HAS_ATOMIC}
|
|
|
end;
|
|
|
|
|
|
|
|
|
+function InterLockedExchangeAdd64 (var Target: int64;Source : int64) : int64; assembler; nostackframe;
|
|
|
+ asm
|
|
|
+{$ifdef CPURV_HAS_ATOMIC}
|
|
|
+ amoadd.d a0, a1, (a0)
|
|
|
+{$else CPURV_HAS_ATOMIC}
|
|
|
+ ld a2, 0(a0)
|
|
|
+ addi a2, a2, a1
|
|
|
+ sd a2, 0(a0)
|
|
|
+ addi a0, a2, 0
|
|
|
+{$endif CPURV_HAS_ATOMIC}
|
|
|
+ end;
|
|
|
+
|
|
|
|
|
|
-function InterLockedDecrement64 (var Target: int64) : int64;
|
|
|
+{$define FPC_SYSTEM_HAS_DECLOCKED_LONGINT}
|
|
|
+ function declocked(var l: longint) : boolean; inline;
|
|
|
begin
|
|
|
- dec(Target);
|
|
|
- Result:=Target;
|
|
|
+ Result:=InterLockedDecrement(l) = 0;
|
|
|
end;
|
|
|
|
|
|
|
|
|
-function InterLockedIncrement64 (var Target: int64) : int64;
|
|
|
+{$define FPC_SYSTEM_HAS_INCLOCKED_LONGINT}
|
|
|
+ procedure inclocked(var l: longint); inline;
|
|
|
begin
|
|
|
- inc(Target);
|
|
|
- Result:=Target;
|
|
|
+ InterLockedIncrement(l);
|
|
|
end;
|
|
|
|
|
|
|
|
|
-function InterLockedExchange64 (var Target: int64;Source : int64) : int64;
|
|
|
+{$define FPC_SYSTEM_HAS_DECLOCKED_INT64}
|
|
|
+function declocked(var l:int64):boolean;
|
|
|
begin
|
|
|
- Result:=Target;
|
|
|
- Target:=Source;
|
|
|
+ Result:=InterLockedDecrement64(l) = 0;
|
|
|
end;
|
|
|
|
|
|
|
|
|
-function InterlockedCompareExchange64(var Target: int64; NewValue: int64; Comperand: int64): int64;
|
|
|
+{$define FPC_SYSTEM_HAS_INCLOCKED_INT64}
|
|
|
+procedure inclocked(var l:int64);
|
|
|
begin
|
|
|
- Result:=Target;
|
|
|
- if Target=Comperand then
|
|
|
- Target:=NewValue;
|
|
|
+ InterLockedIncrement64(l);
|
|
|
end;
|
|
|
|
|
|
|
|
|
-function InterLockedExchangeAdd64 (var Target: int64;Source : int64) : int64;
|
|
|
+{$define FPC_SYSTEM_HAS_MEM_BARRIER}
|
|
|
+
|
|
|
+procedure ReadBarrier; assembler; nostackframe;
|
|
|
+ asm
|
|
|
+ fence ir, ir
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+procedure ReadDependencyBarrier;{$ifdef SYSTEMINLINE}inline;{$endif}
|
|
|
begin
|
|
|
- Result:=Target;
|
|
|
- inc(Target,Source);
|
|
|
end;
|
|
|
|
|
|
+procedure ReadWriteBarrier; assembler; nostackframe;
|
|
|
+ asm
|
|
|
+ fence iorw, iorw
|
|
|
+ end;
|
|
|
+
|
|
|
+procedure WriteBarrier; assembler; nostackframe;
|
|
|
+ asm
|
|
|
+ fence ow, ow
|
|
|
+ end;
|