瀏覽代碼

+ added and implemented functions for locked operations

florian 21 年之前
父節點
當前提交
a641af80de
共有 2 個文件被更改,包括 153 次插入61 次删除
  1. 59 1
      rtl/sparc/sparc.inc
  2. 94 60
      rtl/sparc/sysutilp.inc

+ 59 - 1
rtl/sparc/sparc.inc

@@ -293,11 +293,69 @@ asm
   xor %o0,%g1,%o0
 end;
 
+var
+  fpc_system_lock : byte;export name 'fpc_system_lock';
+
+
+{$define FPC_SYSTEM_HAS_DECLOCKED_LONGINT}
+function declocked(var l : longint) : boolean;assembler;nostackframe;
+asm
+  { usually, we shouldn't lock here so saving the stack frame for these extra intructions is
+    worse the effort, especially while waiting :)
+  }
+.Ldeclocked1:
+  sethi %hi(fpc_system_lock), %g1
+  or %g1,%lo(fpc_system_lock), %g1
+  ldstub [%g1],%g1
+  cmp %g1,0
+  bne .Ldeclocked1
+  nop
+
+  ld [%o0],%g1
+  sub %g1,1,%g1
+  st %g1,[%o0]
+
+  subcc %g1,1,%g0
+  addx %g0,%g0,%o0
+
+  { unlock }
+  sethi %hi(fpc_system_lock), %g1
+  or %g1,%lo(fpc_system_lock), %g1
+  stb %g0,[%g1]
+end;
+
+
+{$define FPC_SYSTEM_HAS_INCLOCKED_LONGINT}
+procedure inclocked(var l : longint);assembler;nostackframe;
+asm
+  { usually, we shouldn't lock here so saving the stack frame for these extra intructions is
+    worse the effort, especially while waiting :)
+  }
+.Linclocked1:
+  sethi %hi(fpc_system_lock), %g1
+  or %g1,%lo(fpc_system_lock), %g1
+  ldstub [%g1],%g1
+  cmp %g1,0
+  bne .Linclocked1
+  nop
+
+  ld [%o0],%g1
+  add %g1,1,%g1
+  st %g1,[%o0]
+
+  { unlock }
+  sethi %hi(fpc_system_lock), %g1
+  or %g1,%lo(fpc_system_lock), %g1
+  stb %g0,[%g1]
+end;
 
 
 {
   $Log$
-  Revision 1.12  2004-10-03 12:41:30  florian
+  Revision 1.13  2004-10-14 19:45:39  florian
+    + added and implemented functions for locked operations
+
+  Revision 1.12  2004/10/03 12:41:30  florian
     * made sqrt, sqr and abs internal for the sparc
 
   Revision 1.11  2004/10/02 20:46:20  florian

+ 94 - 60
rtl/sparc/sysutilp.inc

@@ -18,85 +18,119 @@
   This include contains cpu-specific routines
   ---------------------------------------------------------------------}
 
+var
+  fpc_system_lock : byte;external name 'fpc_system_lock';
+
 function InterLockedDecrement (var Target: longint) : longint; assembler;
 asm
-{$warning FIXME}
-end;
-(*
-{ input:  address of target in r3 }
-{ output: target-1 in r3          }
-{ side-effect: target := target-1 }
-asm
-InterLockedDecLoop:
-        lwarx   r0,r0,r3
-        subi    r0,r0,1
-        stwcx.  r0,r0,r3
-        bne     InterLockedDecLoop
-        mr      r3,r0
-end;
-*)
+  { usually, we shouldn't lock here so saving the stack frame for these extra intructions is
+    worse the effort, especially while waiting :)
+  }
+.LInterLockedDecrement1:
+  sethi %hi(fpc_system_lock), %g1
+  or %g1,%lo(fpc_system_lock), %g1
+  ldstub [%g1],%g1
+  cmp %g1,0
+  bne .LInterLockedDecrement1
+  nop
 
+  ld [%o0],%g1
+  sub %g1,1,%g1
+  st %g1,[%o0]
 
-function InterLockedIncrement (var Target: longint) : longint; assembler;
-asm
-{$warning FIXME}
-end;
-(*
-{ input:  address of target in r3 }
-{ output: target+1 in r3          }
-{ side-effect: target := target+1 }
-asm
-InterLockedIncLoop:
-        lwarx   r0,r0,r3
-        addi    r0,r0,1
-        stwcx.  r0,r0,r3
-        bne     InterLockedIncLoop
-        mr      r3,r0
-end;
-*)
+  mov %g1,%o0
 
-function InterLockedExchange (var Target: longint;Source : longint) : longint; assembler;
-asm
-{$warning FIXME}
+  { unlock }
+  sethi %hi(fpc_system_lock), %g1
+  or %g1,%lo(fpc_system_lock), %g1
+  stb %g0,[%g1]
 end;
-(*
-{ input:  address of target in r3, source in r4 }
-{ output: target in r3                          }
-{ side-effect: target := source                 }
+
+function InterLockedIncrement (var Target: longint) : longint; assembler; nostackframe;
 asm
-InterLockedXchgLoop:
-        lwarx   r0,r0,r3
-        stwcx.  r4,r0,r3
-        bne     InterLockedXchgLoop
-        mr      r3,r0
+  { usually, we shouldn't lock here so saving the stack frame for these extra intructions is
+    worse the effort, especially while waiting :)
+  }
+.LInterLockedIncrement1:
+  sethi %hi(fpc_system_lock), %g1
+  or %g1,%lo(fpc_system_lock), %g1
+  ldstub [%g1],%g1
+  cmp %g1,0
+  bne .LInterLockedIncrement1
+  nop
+
+  ld [%o0],%g1
+  add %g1,1,%g1
+  st %g1,[%o0]
+
+  mov %g1,%o0
+
+  { unlock }
+  sethi %hi(fpc_system_lock), %g1
+  or %g1,%lo(fpc_system_lock), %g1
+  stb %g0,[%g1]
 end;
-*)
 
 
-function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; assembler;
+function InterLockedExchange (var Target: longint;Source : longint) : longint; assembler; nostackframe;
 asm
-{$warning FIXME}
+  { usually, we shouldn't lock here so saving the stack frame for these extra intructions is
+    worse the effort, especially while waiting :)
+  }
+.LInterLockedExchange1:
+  sethi %hi(fpc_system_lock), %g1
+  or %g1,%lo(fpc_system_lock), %g1
+  ldstub [%g1],%g1
+  cmp %g1,0
+  bne .LInterLockedExchange1
+  nop
+
+  ld [%o0],%g1
+  st %o1,[%o0]
+
+  mov %g1,%o0
+
+  { unlock }
+  sethi %hi(fpc_system_lock), %g1
+  or %g1,%lo(fpc_system_lock), %g1
+  stb %g0,[%g1]
 end;
-(*
-{ input:  address of target in r3, source in r4 }
-{ output: target in r3                          }
-{ side-effect: target := target+source          }
+
+
+function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; assembler; nostackframe;
 asm
-InterLockedXchgAddLoop:
-        lwarx   r0,r0,r3
-        add     r0,r0,r4
-        stwcx.  r0,r0,r3
-        bne     InterLockedXchgAddLoop
-        sub     r3,r0,r4
+  { usually, we shouldn't lock here so saving the stack frame for these extra intructions is
+    worse the effort, especially while waiting :)
+  }
+.LInterLockedExchangeAdd1:
+  sethi %hi(fpc_system_lock), %g1
+  or %g1,%lo(fpc_system_lock), %g1
+  ldstub [%g1],%g1
+  cmp %g1,0
+  bne .LInterLockedExchangeAdd1
+  nop
+
+  ld [%o0],%g1
+  add %g1,%o1,%o1
+  st %o1,[%o0]
+
+  mov %g1,%o0
+
+  { unlock }
+  sethi %hi(fpc_system_lock), %g1
+  or %g1,%lo(fpc_system_lock), %g1
+  stb %g0,[%g1]
 end;
-*)
+
 
 {
   $Log$
-  Revision 1.2  2004-03-05 12:17:50  marco
+  Revision 1.3  2004-10-14 19:45:39  florian
+    + added and implemented functions for locked operations
+
+  Revision 1.2  2004/03/05 12:17:50  marco
    * interlocked* changed to longints, including winapi. (which was a bug)
 
   Revision 1.1  2003/09/01 20:46:32  peter
     * new dummies
-
 }