mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-13 12:26:58 +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_REV, { CPU supports the REV 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_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_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 }
|
||||
{ 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_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_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_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_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_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,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,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,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,CPUARM_HAS_DMB]
|
||||
);
|
||||
|
||||
Implementation
|
||||
|
@ -1012,6 +1012,41 @@ begin
|
||||
Result:=QWord(SwapEndian(Int64(AValue)));
|
||||
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}
|
||||
{ $i divide.inc}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user