mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-02 23:58:26 +02:00
Add implementations for read/write barrier code for ARM
git-svn-id: trunk@22864 -
This commit is contained in:
parent
6d13176d9a
commit
312e8b8ecc
@ -1067,6 +1067,7 @@ Const
|
|||||||
CPUARM_HAS_EDSP, { CPU supports the PLD,STRD,LDRD,MCRR and MRRC instructions }
|
CPUARM_HAS_EDSP, { CPU supports the PLD,STRD,LDRD,MCRR and MRRC instructions }
|
||||||
CPUARM_HAS_REV, { CPU supports the REV instruction }
|
CPUARM_HAS_REV, { CPU supports the REV instruction }
|
||||||
CPUARM_HAS_RBIT, { CPU supports the RBIT instruction }
|
CPUARM_HAS_RBIT, { CPU supports the RBIT instruction }
|
||||||
|
CPUARM_HAS_DMB, { CPU has memory barrier instructions (DMB, DSB, ISB) }
|
||||||
CPUARM_HAS_LDREX,
|
CPUARM_HAS_LDREX,
|
||||||
CPUARM_HAS_IDIV
|
CPUARM_HAS_IDIV
|
||||||
);
|
);
|
||||||
@ -1086,11 +1087,11 @@ Const
|
|||||||
{ cpu_armv6t2 } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_BLX_LABEL,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_RBIT,CPUARM_HAS_LDREX],
|
{ cpu_armv6t2 } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_BLX_LABEL,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_RBIT,CPUARM_HAS_LDREX],
|
||||||
{ cpu_armv6z } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_BLX_LABEL,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_LDREX],
|
{ cpu_armv6z } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_BLX_LABEL,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_LDREX],
|
||||||
{ the identifier armv7 is should not be used, it is considered being equal to armv7a }
|
{ the identifier armv7 is should not be used, it is considered being equal to armv7a }
|
||||||
{ cpu_armv7 } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_BLX_LABEL,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_RBIT,CPUARM_HAS_LDREX],
|
{ cpu_armv7 } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_BLX_LABEL,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_RBIT,CPUARM_HAS_LDREX,CPUARM_HAS_DMB],
|
||||||
{ cpu_armv7a } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_BLX_LABEL,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_RBIT,CPUARM_HAS_LDREX],
|
{ cpu_armv7a } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_BLX_LABEL,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_RBIT,CPUARM_HAS_LDREX,CPUARM_HAS_DMB],
|
||||||
{ cpu_armv7r } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_BLX_LABEL,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_RBIT,CPUARM_HAS_LDREX],
|
{ cpu_armv7r } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_BLX_LABEL,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_RBIT,CPUARM_HAS_LDREX,CPUARM_HAS_DMB],
|
||||||
{ cpu_armv7m } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_RBIT,CPUARM_HAS_LDREX,CPUARM_HAS_IDIV],
|
{ cpu_armv7m } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_RBIT,CPUARM_HAS_LDREX,CPUARM_HAS_IDIV,CPUARM_HAS_DMB],
|
||||||
{ cpu_armv7em } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_RBIT,CPUARM_HAS_LDREX,CPUARM_HAS_IDIV]
|
{ cpu_armv7em } [CPUARM_HAS_BX,CPUARM_HAS_BLX,CPUARM_HAS_CLZ,CPUARM_HAS_EDSP,CPUARM_HAS_REV,CPUARM_HAS_RBIT,CPUARM_HAS_LDREX,CPUARM_HAS_IDIV,CPUARM_HAS_DMB]
|
||||||
);
|
);
|
||||||
|
|
||||||
Implementation
|
Implementation
|
||||||
|
@ -1012,6 +1012,41 @@ begin
|
|||||||
Result:=QWord(SwapEndian(Int64(AValue)));
|
Result:=QWord(SwapEndian(Int64(AValue)));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{$ifndef FPC_SYSTEM_HAS_MEM_BARRIER}
|
||||||
|
{$define FPC_SYSTEM_HAS_MEM_BARRIER}
|
||||||
|
|
||||||
|
procedure barrier; assembler; nostackframe;
|
||||||
|
asm
|
||||||
|
{$ifdef CPUARM_HAS_DMB}
|
||||||
|
.long 0xf57ff05f // dmb sy
|
||||||
|
{$else}
|
||||||
|
.long 0xee070f9a // mcr 15, 0, r0, cr7, cr10, {4}
|
||||||
|
{$endif}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure ReadBarrier;{$ifdef SYSTEMINLINE}inline;{$endif}
|
||||||
|
begin
|
||||||
|
barrier;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure ReadDependencyBarrier;{$ifdef SYSTEMINLINE}inline;{$endif}
|
||||||
|
begin
|
||||||
|
{ reads imply barrier on earlier reads depended on }
|
||||||
|
barrier;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure ReadWriteBarrier;{$ifdef SYSTEMINLINE}inline;{$endif}
|
||||||
|
begin
|
||||||
|
barrier;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure WriteBarrier;{$ifdef SYSTEMINLINE}inline;{$endif}
|
||||||
|
begin
|
||||||
|
barrier;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{$endif}
|
||||||
|
|
||||||
{include hand-optimized assembler division code}
|
{include hand-optimized assembler division code}
|
||||||
{ $i divide.inc}
|
{ $i divide.inc}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user