123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- {
- 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; nostackframe;
- 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;
|