소스 검색

* add memory barrier prototypes + implementation for i386 and sparc + use lwsync for powerpc64

git-svn-id: trunk@8240 -
micha 18 년 전
부모
커밋
d95b9082bb
10개의 변경된 파일125개의 추가작업 그리고 4개의 파일을 삭제
  1. 4 0
      compiler/sparc/cpugas.pas
  2. 4 2
      compiler/sparc/opcode.inc
  3. 4 1
      compiler/sparc/strinst.inc
  4. 29 0
      rtl/i386/i386.inc
  5. 4 0
      rtl/inc/generic.inc
  6. 4 0
      rtl/inc/systemh.inc
  7. 5 0
      rtl/powerpc/powerpc.inc
  8. 6 1
      rtl/powerpc64/powerpc64.inc
  9. 40 0
      rtl/sparc/sparc.inc
  10. 25 0
      rtl/x86_64/x86_64.inc

+ 4 - 0
compiler/sparc/cpugas.pas

@@ -208,7 +208,11 @@ implementation
            id     : as_gas;
            idtxt  : 'AS';
            asmbin : 'as';
+{$ifdef FPC_SPARC_V8_ONLY}
            asmcmd : '-o $OBJ $ASM';
+{$else}
+           asmcmd : '-Av9 -o $OBJ $ASM';
+{$endif}
            supported_target : system_any;
            flags : [af_allowdirect,af_needar,af_smartlink_sections];
            labelprefix : '.L';

+ 4 - 2
compiler/sparc/opcode.inc

@@ -69,5 +69,7 @@ A_tst,
 { Internal instructions }
 A_FMOVd,
 A_FABSd,
-A_FABSq
-
+A_FABSq,
+{ Memory barrier instructions }
+A_STBAR,
+A_MEMBAR

+ 4 - 1
compiler/sparc/strinst.inc

@@ -66,4 +66,7 @@
           'tst',
           { internal instructions }
           'fmovd',
-          'fabsd','fabsq'
+          'fabsd','fabsq',
+          { memory barrier instructions }
+          'stbar',
+          'membar'

+ 29 - 0
rtl/i386/i386.inc

@@ -1334,3 +1334,32 @@ asm
 end;
 
 {$endif darwin}
+
+{$ifndef FPC_SYSTEM_HAS_MEM_BARRIER}
+{$define FPC_SYSTEM_HAS_MEM_BARRIER}
+
+procedure ReadBarrier;assembler;nostackframe;{$ifdef SYSTEMINLINE}inline;{$endif}
+asm
+  lock
+  addl $0,0(%esp)
+  { alternative: lfence on SSE capable CPUs }
+end;
+
+procedure ReadDependencyBarrier;{$ifdef SYSTEMINLINE}inline;{$endif}
+begin
+  { reads imply barrier on earlier reads depended on }
+end;
+
+procedure ReadWriteBarrier;assembler;nostackframe;{$ifdef SYSTEMINLINE}inline;{$endif}
+asm
+  lock
+  addl $0,0(%esp)
+  { alternative: mfence on SSE capable CPUs }
+end;
+
+procedure WriteBarrier;assembler;nostackframe;{$ifdef SYSTEMINLINE}inline;{$endif}
+asm
+  { no write reordering on intel CPUs (yet) }
+end;
+
+{$endif}

+ 4 - 0
rtl/inc/generic.inc

@@ -1580,6 +1580,10 @@ procedure ReadBarrier;{$ifdef SYSTEMINLINE}inline;{$endif}
 begin
 end;
 
+procedure ReadDependencyBarrier;{$ifdef SYSTEMINLINE}inline;{$endif}
+begin
+end;
+
 procedure ReadWriteBarrier;{$ifdef SYSTEMINLINE}inline;{$endif}
 begin
 end;

+ 4 - 0
rtl/inc/systemh.inc

@@ -432,6 +432,10 @@ procedure MoveChar0(const buf1;var buf2;len:SizeInt);
 function  IndexChar0(const buf;len:SizeInt;b:char):SizeInt;
 function  CompareChar0(const buf1,buf2;len:SizeInt):SizeInt;{$ifdef INLINEGENERICS}inline;{$endif}
 procedure prefetch(const mem);[internproc:fpc_in_prefetch_var];
+procedure ReadBarrier;{$ifdef INLINEGENERICS}inline;{$endif}
+procedure ReadDependencyBarrier;{$ifdef INLINEGENERICS}inline;{$endif}
+procedure ReadWriteBarrier;{$ifdef INLINEGENERICS}inline;{$endif}
+procedure WriteBarrier;{$ifdef INLINEGENERICS}inline;{$endif}
 
 {$ifdef INTERNALMOVEFILLCHAR}
 var

+ 5 - 0
rtl/powerpc/powerpc.inc

@@ -1262,6 +1262,11 @@ asm
   sync
 end;
 
+procedure ReadDependencyBarrier;{$ifdef SYSTEMINLINE}inline;{$endif}
+begin
+  { reads imply barrier on earlier reads depended on }
+end;
+
 procedure ReadWriteBarrier;assembler;nostackframe;{$ifdef SYSTEMINLINE}inline;{$endif}
 asm
   sync

+ 6 - 1
rtl/powerpc64/powerpc64.inc

@@ -842,7 +842,12 @@ end;
 
 procedure ReadBarrier;assembler;nostackframe;{$ifdef SYSTEMINLINE}inline;{$endif}
 asm
-  sync
+  lwsync
+end;
+
+procedure ReadDependencyBarrier;{$ifdef SYSTEMINLINE}inline;{$endif}
+asm
+  { reads imply barrier on earlier reads depended on }
 end;
 
 procedure ReadWriteBarrier;assembler;nostackframe;{$ifdef SYSTEMINLINE}inline;{$endif}

+ 40 - 0
rtl/sparc/sparc.inc

@@ -507,3 +507,43 @@ asm
   or %g1,%lo(fpc_system_lock), %g1
   stb %g0,[%g1]
 end;
+
+{$ifndef FPC_SYSTEM_HAS_MEM_BARRIER}
+{$define FPC_SYSTEM_HAS_MEM_BARRIER}
+
+const
+  LoadLoad   = $01;
+  StoreLoad  = $02;
+  LoadStore  = $04;
+  StoreStore = $08;
+  LookAside  = $10;
+  MemIssue   = $20;
+  Sync       = $40;
+
+procedure ReadBarrier;assembler;nostackframe;{$ifdef SYSTEMINLINE}inline;{$endif}
+asm
+  ba,pt .L1
+  membar LoadLoad
+.L1:
+end;
+
+procedure ReadDependencyBarrier;{$ifdef SYSTEMINLINE}inline;{$endif}
+begin
+  { reads imply barrier on earlier reads depended on }
+end;
+
+procedure ReadWriteBarrier;assembler;nostackframe;{$ifdef SYSTEMINLINE}inline;{$endif}
+asm
+  ba,pt .L1
+  membar LoadLoad + LoadStore + StoreLoad + StoreStore
+.L1:
+end;
+
+procedure WriteBarrier;assembler;nostackframe;{$ifdef SYSTEMINLINE}inline;{$endif}
+asm
+  ba,pt .L1
+  stbar
+.L1:
+end;
+
+{$endif}

+ 25 - 0
rtl/x86_64/x86_64.inc

@@ -617,3 +617,28 @@ begin
   softfloat_exception_flags:=0;
   softfloat_exception_mask:=float_flag_underflow or float_flag_inexact or float_flag_denormal;
 end;
+
+{$ifndef FPC_SYSTEM_HAS_MEM_BARRIER}
+{$define FPC_SYSTEM_HAS_MEM_BARRIER}
+
+procedure ReadBarrier;assembler;nostackframe;{$ifdef SYSTEMINLINE}inline;{$endif}
+asm
+  lfence
+end;
+
+procedure ReadDependencyBarrier;{$ifdef SYSTEMINLINE}inline;{$endif}
+asm
+  { reads imply barrier on earlier reads depended on }
+end;
+
+procedure ReadWriteBarrier;assembler;nostackframe;{$ifdef SYSTEMINLINE}inline;{$endif}
+asm
+  mfence
+end;
+
+procedure WriteBarrier;assembler;nostackframe;{$ifdef SYSTEMINLINE}inline;{$endif}
+asm
+  { no write reordering on intel CPUs (yet) }
+end;
+
+{$endif}