]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libc/mips/atom.s
merge
[plan9front.git] / sys / src / libc / mips / atom.s
1 /*
2  *      R4000 user-level atomic operations
3  */
4
5 #define LL(base, rt)    WORD    $((060<<26)|((base)<<21)|((rt)<<16))
6 #define SC(base, rt)    WORD    $((070<<26)|((base)<<21)|((rt)<<16))
7 #define NOOP            WORD    $0x27
8
9 TEXT ainc(SB), 1, $-4                   /* long ainc(long *); */
10 TEXT _xinc(SB), 1, $-4                  /* void _xinc(long *); */
11         MOVW    R1, R2                  /* address of counter */
12 loop:   MOVW    $1, R3
13         LL(2, 1)
14         NOOP
15         ADD     R1,R3,R3
16         SC(2, 3)
17         NOOP
18         BEQ     R3,loop
19         RET
20
21 TEXT adec(SB), 1, $-4                   /* long adec(long*); */
22 TEXT _xdec(SB), 1, $-4                  /* long _xdec(long *); */
23         MOVW    R1, R2                  /* address of counter */
24 loop1:  MOVW    $-1, R3
25         LL(2, 1)
26         NOOP
27         ADD     R1,R3,R3
28         MOVW    R3, R1
29         SC(2, 3)
30         NOOP
31         BEQ     R3,loop1
32         RET
33
34 /*
35  * int cas(uint* p, int ov, int nv);
36  */
37 TEXT cas(SB), 1, $-4
38         MOVW    ov+4(FP), R2
39         MOVW    nv+8(FP), R3
40 spincas:
41         LL(1, 4)                        /* R4 = *R1 */
42         NOOP
43         BNE     R2, R4, fail
44         SC(1, 3)                        /* *R1 = R3 */
45         NOOP
46         BEQ     R3, spincas             /* R3 == 0 means store failed */
47         MOVW    $1, R1
48         RET
49 fail:
50         MOVW    $0, R1
51         RET
52
53 /* general-purpose abort */
54 _trap:
55         MOVD    $0, R0
56         MOVD    0(R0), R0
57         RET