Reorganized both the Paradyn and Dyninst runtime libraries. Some big chunks
[dyninst.git] / dyninstAPI_RT / src / RTthread-power-asm.s
1 #include "RTconst.h"
2 #include "../../dyninstAPI/src/inst-power.h"
3    .machine "push"      
4    .machine "ppc"       
5    .globl   DYNINSTthreadIndexFAST
6    .globl   .DYNINSTthreadIndexFAST
7 DYNINSTthreadIndexFAST:
8 .DYNINSTthreadIndexFAST:
9    mr       3,12
10    br
11    .globl   DYNINSTthreadContext
12    .globl   .DYNINSTthreadContext
13 DYNINSTthreadContext:
14 .DYNINSTthreadContext:
15    liu      3,0
16    oril     3,3,49152
17    l        4,0(3)
18    l        3,4(3)
19    cmpi     0,4,0
20    beq      DYNINSTthreadContext_NOT_SPR
21    mfspr    3,275
22 DYNINSTthreadContext_NOT_SPR:
23    br
24    .globl   DYNINSTthreadSelf
25    .globl   .DYNINSTthreadSelf
26 DYNINSTthreadSelf:
27 .DYNINSTthreadSelf:
28    liu      3,0
29    oril     3,3,49152
30    l        4,0(3)
31    l        3,4(3)
32    cmpi     0,4,0
33    beq      DYNINSTthreadSelf_NOT_SPR
34    mfspr    3,275
35 DYNINSTthreadSelf_NOT_SPR:
36    l        3,200(3)
37    br
38    .globl tc_lock_lock
39    .globl .tc_lock_lock
40 tc_lock_lock:
41 .tc_lock_lock:
42    mflr     0
43    stw      0,8(1)
44    mr       10,3      # &t in R10
45    bl       .DYNINSTthreadSelf
46    cror     31,31,31
47    lil      6,1       # r6 == 1
48 tc_lock_lock_loop:
49    lwarx    4,0,10    # r4 == old value of mutex
50    stwcx.   6,0,10    # t->mutex = 1
51    bne-     tc_lock_lock_loop
52    cmpwi    4,1
53    bne-     tc_lock_lock_done
54 tc_lock_lock_failed:  # Someone else has the lock
55    l        5,4(10)   # r5 == old tid value
56         cmpw     5,3
57         bne     tc_lock_lock_loop       # Don't have lock, try again
58         lil     3,-2            # Already have lock, return error, -2 == DYNINST_DEAD_LOCK
59         b       tc_lock_lock_ret
60 tc_lock_lock_done:              # Need to record new tid, return
61         st      3,4(10)         # t->tid = pid
62         lil     3,0             # Return 0
63 tc_lock_lock_ret:
64    lwz 0,8(1)
65    mtlr 0
66    blr
67
68    .globl tc_lock_trylock
69    .globl .tc_lock_trylock
70 tc_lock_trylock:
71 .tc_lock_trylock:
72    mflr 0
73    stw  0,8(1)
74    mr   10,3            # &t in R10
75    bl   .DYNINSTthreadSelf
76    cror 31,31,31
77         lil     6,1             # r6 == 1
78 tc_lock_trylock_loop:
79         lwarx   4,0,10          # r4 == old value of mutex
80         stwcx.  6,0,10          # t->mutex = 1
81         bne-    tc_lock_trylock_loop
82         cmpwi   4,1
83         bne-    tc_lock_trylock_done
84 tc_lock_trylock_failed:         # Someone else has the lock
85         l       5,4(10)         # r5 == old tid value
86         cmpw    5,3
87         bne     tc_lock_trylock_live    # Don't have lock, try again
88         lil     3,-2                    # Already have lock, return error
89         b       tc_lock_trylock_ret
90 tc_lock_trylock_live:
91         lil     3,-1                    # Someone else has lock, LIVE_LOCK == -1
92         b       tc_lock_trylock_ret
93 tc_lock_trylock_done:           # Need to record new tid, return
94         st      3,4(10)         # t->tid = pid
95         lil     3,0             # Return 0
96 tc_lock_trylock_ret:
97    lwz 0,8(1)
98    mtlr 0
99    blr
100    .machine "pop"