123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- {
- $Id$
- This file is part of the Free Pascal run time library.
- Copyright (c) 2003 by Peter Vreman,
- member of the Free Pascal development team
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- { ---------------------------------------------------------------------
- This include contains cpu-specific routines
- ---------------------------------------------------------------------}
- var
- fpc_system_lock : byte;external name 'fpc_system_lock';
- function InterLockedDecrement (var Target: longint) : longint; assembler;
- asm
- { 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]
- mov %g1,%o0
- { unlock }
- sethi %hi(fpc_system_lock), %g1
- or %g1,%lo(fpc_system_lock), %g1
- stb %g0,[%g1]
- end;
- function InterLockedIncrement (var Target: longint) : 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 :)
- }
- .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 InterLockedExchange (var Target: longint;Source : longint) : 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 :)
- }
- .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;
- function InterLockedExchangeAdd (var Target: longint;Source : longint) : 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 :)
- }
- .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.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
- }
|