rebased to master after sw 3rd party completed
[dyninst.git] / dyninstAPI_RT / src / RTthread-powerpc-asm.S
1    .file    "RTthread-powerpc-asm.S"
2    .machine "push"      
3 #if defined(arch_64bit)
4    .machine "ppc64"       
5 #else
6    .machine "ppc"       
7 #endif
8
9
10    .section ".text"
11    .align   2
12 # /* ---------------------------------- */
13 # /* unsigned DYNINSTthreadIndexFAST(); */
14 # /* ---------------------------------- */
15 #if defined(arch_64bit)
16    .globl   DYNINSTthreadIndexFAST
17    .section ".opd", "aw"
18    .align   3
19 DYNINSTthreadIndexFAST:
20    .quad    .DYNINSTthreadIndexFAST, .TOC.@tocbase, 0
21    .size    DYNINSTthreadIndexFAST, 24
22
23    .previous
24    .globl   .DYNINSTthreadIndexFAST
25    .type    .DYNINSTthreadIndexFAST, @function
26 .DYNINSTthreadIndexFAST:
27 #else
28    .globl   DYNINSTthreadIndexFAST
29    .type    DYNINSTthreadIndexFAST, @function
30 DYNINSTthreadIndexFAST:
31 #endif
32
33    mr       3,12    # function return value = r3 = r12
34    blr              # branch via link register (function return)
35
36 #if defined(arch_64bit)
37    .size    .DYNINSTthreadIndexFAST, . - .DYNINSTthreadIndexFAST
38 #else
39    .size    DYNINSTthreadIndexFAST, . - DYNINSTthreadIndexFAST
40 #endif
41
42
43    .section ".text"
44    .align   2
45 # /* ------------------------------------------- */
46 # /* int atomic_set(volatile int *int_ptr);      */
47 # /*                                             */
48 # /* The only possible values at the given       */
49 # /* memory location are 0 and 1.  Attempt to    */
50 # /* atomically update the value from 0 to 1.    */
51 # /* Return 1 if such an atomic update occurred; */
52 # /* return 0 otherwise.                         */
53 # /* ------------------------------------------- */
54 #if defined(arch_64bit)
55    .globl   atomic_set
56    .section ".opd", "aw"
57    .align   3
58 atomic_set:
59    .quad    .atomic_set, .TOC.@tocbase, 0
60    .size    atomic_set, 24
61
62    .previous
63    .globl   .atomic_set
64    .type    .atomic_set, @function
65 .atomic_set:
66 #else
67    .globl   atomic_set
68    .type    atomic_set, @function
69 atomic_set:
70 #endif
71    addi     4,0,1               # r4 = 1
72                                 # Attempt atomic memory swap
73    lwarx    5,0,3               #   r5 = *int_ptr (load reserve indexed)
74    stwcx.   4,0,3               #   *int_ptr = 1  (store conditional indexed)
75    bne-     atomic_set_return_0 # if atomic swap failed, return 0
76
77    cmpw     5,4                 # if original value was already 1,
78    beq-     atomic_set_return_0 #   return 0 because no value update occurred
79
80    addi     3,0,1               # function return value = r3 = 1
81    blr                          # branch via link register (function return)
82
83 atomic_set_return_0:
84    addi     3,0,0               # function return value = r3 = 0
85    blr                          # branch via link register (function return)
86
87 #if defined(arch_64bit)
88    .size    .atomic_set, . - .atomic_set
89 #else
90    .size    atomic_set, . - atomic_set
91 #endif
92
93    .machine "pop"
94
95 .section .note.GNU-stack,"",@progbits