added tests for StretchBlt, PatBlt and BitBlt by Damon Chandler
[reactos.git] / posix / lib / psxdll / misc / interlock.c
1 /* $Id: interlock.c,v 1.2 2002/02/20 09:17:57 hyperion Exp $
2 */
3 /*
4 * COPYRIGHT: See COPYING in the top level directory
5 * PROJECT: ReactOS POSIX+ Subsystem
6 * FILE: subsys/psx/lib/psxdll/misc/interlock.c
7 * PURPOSE: inter-locked increments/decrements
8 * PROGRAMMER: KJK::Hyperion <noog@libero.it>
9 * UPDATE HISTORY:
10 * 20/01/2002: Adapted from lib/kernel32/synch/intrlck.c
11 */
12
13 /*
14 * NOTE by KJK::Hyperion: I do not understand what's behind these functions.
15 * Don't ask me how they work, or to fix errors in them.
16 * Please refer to the authors referenced in the original
17 * file, lib/kernel32/synch/intrlck.c
18 */
19
20 /* TODO? move these in some shared library */
21
22 #include <psx/interlock.h>
23
24 int __interlock_inc(int * addend)
25 {
26 int ret = 0;
27
28 __asm__
29 (
30 " lock\n" /* for SMP systems */
31 " incl (%1)\n"
32 " je 2f\n"
33 " jl 1f\n"
34 " incl %0\n"
35 " jmp 2f\n"
36 "1: dec %0\n"
37 "2:\n"
38 :"=r" (ret):"r" (addend), "0" (0): "memory"
39 );
40
41 return (ret);
42 }
43
44 int __interlock_dec(int * addend)
45 {
46 int ret = 0;
47
48 __asm__
49 (
50 " lock\n" /* for SMP systems */
51 " decl (%1)\n"
52 " je 2f\n"
53 " jl 1f\n"
54 " incl %0\n"
55 " jmp 2f\n"
56 "1: dec %0\n"
57 "2:\n"
58 :"=r" (ret):"r" (addend), "0" (0): "memory"
59 );
60
61 return (ret);
62
63 }
64
65 int __interlock_add(int * addend, int increment)
66 {
67 int ret = 0;
68
69 __asm__
70 (
71 " lock\n" /* for SMP systems */
72 " xaddl %0,(%1)"
73 :"=r" (ret)
74 :"r" (addend), "0" (increment)
75 :"memory"
76 );
77
78 return (ret);
79
80 }
81
82 /* EOF */
83