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