Imported Upstream version 1.51.0
[platform/upstream/boost.git] / libs / context / src / asm / fcontext_ppc64_sysv_elf_gas.S
1 /*
2             Copyright Oliver Kowalke 2009.
3    Distributed under the Boost Software License, Version 1.0.
4       (See accompanying file LICENSE_1_0.txt or copy at
5           http://www.boost.org/LICENSE_1_0.txt)
6 */
7
8 /*******************************************************************
9  *                                                                 *
10  *  -------------------------------------------------------------  *
11  *  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  *
12  *  -------------------------------------------------------------  *
13  *  |  0  |  4  |   8 |  12 |  16 |  20 |  24 |  28 |  32 |  36 |  *
14  *  -------------------------------------------------------------  *
15  *  |    R13    |    R14    |    R15    |    R16    |    R17    |  *
16  *  -------------------------------------------------------------  *
17  *  -------------------------------------------------------------  *
18  *  |  10 |  11 |  12 |  13 |  14 |  15 |  16 |  17 |  18 |  19 |  *
19  *  -------------------------------------------------------------  *
20  *  |  40 |  44 |  48 |  52 |  56 |  60 |  64 |  68 |  72 |  76 |  *
21  *  -------------------------------------------------------------  *
22  *  |    R18    |    R19    |    R20    |    R21    |    R22    |  *
23  *  -------------------------------------------------------------  *
24  *  -------------------------------------------------------------  *
25  *  |  20 |  21 |  22 |  23 |  24 |  25 |  26 |  27 |  28 |  29 |  *
26  *  -------------------------------------------------------------  *
27  *  |  80 |  84 |  88 |  92 |  96 | 100 | 104 | 108 | 112 | 116 |  *
28  *  -------------------------------------------------------------  *
29  *  |    R23    |    R24    |    R25    |    R26    |    R27    |  *
30  *  -------------------------------------------------------------  *
31  *  -------------------------------------------------------------  *
32  *  |  30 |  31 |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  *
33  *  -------------------------------------------------------------  *
34  *  | 120 | 124 | 128 | 132 | 136 | 140 | 144 | 148 | 152 | 156 |  *
35  *  -------------------------------------------------------------  *
36  *  |    R28    |    R29    |    R30    |    R31    |     SP    |  *
37  *  -------------------------------------------------------------  *
38  *  -------------------------------------------------------------  *
39  *  |  40 |  41 |  42 |  43 |  44 |  45 |                       |  *
40  *  -------------------------------------------------------------  *
41  *  | 160 | 164 | 168 | 172 | 176 | 180 |                       |  *
42  *  -------------------------------------------------------------  *
43  *  |    CR     |    LR     |     PC    |                       |  *
44  *  -------------------------------------------------------------  *
45  *  -------------------------------------------------------------  *
46  *  |  46 |  47 |  48 |  49 |                                   |  *
47  *  -------------------------------------------------------------  *
48  *  | 184 | 188 | 192 | 196 |                                   |  *
49  *  -------------------------------------------------------------  *
50  *  |   sbase   |   slimt   |                                   |  *
51  *  -------------------------------------------------------------  *
52  *  -------------------------------------------------------------  *
53  *  |  50 |  51 |  52 |  53 |  54 |  55 |  56 |  57 |  58 |  59 |  *
54  *  -------------------------------------------------------------  *
55  *  | 200 | 204 | 208 | 212 | 216 | 220 | 224 | 228 | 232 | 236 |  *
56  *  -------------------------------------------------------------  *
57  *  |    F14    |    F15    |    F16    |    F17    |    F18    |  *
58  *  -------------------------------------------------------------  *
59  *  -------------------------------------------------------------  *
60  *  |  60 |  61 |  62 |  63 |  64 |  65 |  66 |  67 |  68 |  69 |  *
61  *  -------------------------------------------------------------  *
62  *  | 240 | 244 | 248 | 252 | 256 | 260 | 264 | 268 | 272 | 276 |  *
63  *  -------------------------------------------------------------  *
64  *  |    F19    |    F20    |    F21    |    F22    |    F23    |  *
65  *  -------------------------------------------------------------  *
66  *  -------------------------------------------------------------  *
67  *  |  70 |  71 |  72 |  73 |  74 |  75 |  76 |  77 |  78 |  79 |  *
68  *  -------------------------------------------------------------  *
69  *  | 280 | 284 | 288 | 292 | 296 | 300 | 304 | 308 | 312 | 316 |  *
70  *  -------------------------------------------------------------  *
71  *  |    F24    |    F25    |    F26    |    F27    |    F28    |  *
72  *  -------------------------------------------------------------  *
73  *  -------------------------------------------------------------  *
74  *  |  80 |  81 |  82 |  83 |  84 |  85 |  86 |  87 |           |  *
75  *  -------------------------------------------------------------  *
76  *  | 320 | 324 | 328 | 332 | 336 | 340 | 344 | 348 |           |  *
77  *  -------------------------------------------------------------  *
78  *  |    F29    |    F30    |    F31    |   fpscr   |           |  *
79  *  -------------------------------------------------------------  *
80  *                                                                 *
81  * *****************************************************************/
82
83 .section ".text"
84 .align 2
85 .globl jump_fcontext
86 .section ".opd","aw"
87 .align 3
88 jump_fcontext:
89 .quad .jump_fcontext,.TOC.@tocbase,0
90 .previous
91 .size jump_fcontext,24
92 .type .jump_fcontext,@function
93 .globl .jump_fcontext
94 .jump_fcontext:
95     std     %r13,  0(%r3)       # save R13
96     std     %r14,  8(%r3)       # save R14
97     std     %r15,  16(%r3)      # save R15
98     std     %r16,  24(%r3)      # save R16
99     std     %r17,  32(%r3)      # save R17
100     std     %r18,  40(%r3)      # save R18
101     std     %r19,  48(%r3)      # save R19
102     std     %r20,  56(%r3)      # save R20
103     std     %r21,  64(%r3)      # save R21
104     std     %r22,  72(%r3)      # save R22
105     std     %r23,  80(%r3)      # save R23
106     std     %r24,  88(%r3)      # save R24
107     std     %r25,  96(%r3)      # save R25
108     std     %r26,  104(%r3)     # save R26
109     std     %r27,  112(%r3)     # save R27
110     std     %r28,  120(%r3)     # save R28
111     std     %r29,  128(%r3)     # save R29
112     std     %r30,  136(%r3)     # save R30
113     std     %r31,  144(%r3)     # save R31
114     std     %r1,   152(%r3)     # save SP
115
116     mfcr    %r0                 # load CR
117     std     %r0,   160(%r3)     # save CR
118     mflr    %r0                 # load LR
119     std     %r0,   168(%r3)     # save LR
120     std     %r0,   176(%r3)     # save LR as PC
121
122     cmpwi   cr7,   %r6,  0      # test if fpu env should be preserved
123     beq     cr7,   1f
124
125     stfd    %f14,  200(%r3)     # save F14
126     stfd    %f15,  208(%r3)     # save F15
127     stfd    %f16,  216(%r3)     # save F16
128     stfd    %f17,  224(%r3)     # save F17
129     stfd    %f18,  232(%r3)     # save F18
130     stfd    %f19,  240(%r3)     # save F19
131     stfd    %f20,  248(%r3)     # save F20
132     stfd    %f21,  256(%r3)     # save F21
133     stfd    %f22,  264(%r3)     # save F22
134     stfd    %f23,  272(%r3)     # save F23
135     stfd    %f24,  280(%r3)     # save F24
136     stfd    %f25,  288(%r3)     # save F25
137     stfd    %f26,  296(%r3)     # save F26
138     stfd    %f27,  304(%r3)     # save F27
139     stfd    %f28,  312(%r3)     # save F28
140     stfd    %f29,  320(%r3)     # save F29
141     stfd    %f30,  328(%r3)     # save F30
142     stfd    %f31,  336(%r3)     # save F31
143     mffs    %f0                 # load FPSCR
144     stfd    %f0,   344(%r3)     # save FPSCR
145
146     lfd     %f14,  200(%r4)     # restore F14
147     lfd     %f15,  208(%r4)     # restore F15
148     lfd     %f16,  216(%r4)     # restore F16
149     lfd     %f17,  224(%r4)     # restore F17
150     lfd     %f18,  232(%r4)     # restore F18
151     lfd     %f19,  240(%r4)     # restore F19
152     lfd     %f20,  248(%r4)     # restore F20
153     lfd     %f21,  256(%r4)     # restore F21
154     lfd     %f22,  264(%r4)     # restore F22
155     lfd     %f23,  272(%r4)     # restore F23
156     lfd     %f24,  280(%r4)     # restore F24
157     lfd     %f25,  288(%r4)     # restore F25
158     lfd     %f26,  296(%r4)     # restore F26
159     lfd     %f27,  304(%r4)     # restore F27
160     lfd     %f28,  312(%r4)     # restore F28
161     lfd     %f29,  320(%r4)     # restore F29
162     lfd     %f30,  328(%r4)     # restore F30
163     lfd     %f31,  336(%r4)     # restore F31
164     lfd     %f0,   344(%r4)     # load FPSCR
165     mtfsf   0xff,  %f0          # restore FPSCR
166 1:
167
168     ld      %r13,  0(%r4)       # restore R13
169     ld      %r14,  8(%r4)       # restore R14
170     ld      %r15,  16(%r4)      # restore R15
171     ld      %r16,  24(%r4)      # restore R16
172     ld      %r17,  32(%r4)      # restore R17
173     ld      %r18,  40(%r4)      # restore R18
174     ld      %r19,  48(%r4)      # restore R19
175     ld      %r20,  56(%r4)      # restore R20
176     ld      %r21,  64(%r4)      # restore R21
177     ld      %r22,  72(%r4)      # restore R22
178     ld      %r23,  80(%r4)      # restore R23
179     ld      %r24,  88(%r4)      # restore R24
180     ld      %r25,  96(%r4)      # restore R25
181     ld      %r26,  104(%r4)     # restore R26
182     ld      %r27,  112(%r4)     # restore R27
183     ld      %r28,  120(%r4)     # restore R28
184     ld      %r29,  128(%r4)     # restore R29
185     ld      %r30,  136(%r4)     # restore r30
186     ld      %r31,  144(%r4)     # restore r31
187     ld      %r1,   152(%r4)     # restore SP
188
189     ld      %r0,   160(%r4)     # load CR
190     mtcr    %r0                 # restore CR
191     ld      %r0,   168(%r4)     # load LR
192     mtlr    %r0                 # restore LR
193
194     mr.     %r3,   %r5          # use third arg as return value after jump
195                                 # and as first arg in context function
196
197     ld      %r0,   176(%r4)     # load PC
198     mtctr   %r0                 # restore CTR
199
200     bctr                        # jump to context
201 .size .jump_fcontext, .-.jump_fcontext
202
203 .section ".text"
204 .align 2
205 .globl make_fcontext
206 .section ".opd","aw"
207 .align 3
208 make_fcontext:
209 .quad .make_fcontext,.TOC.@tocbase,0
210 .previous
211 .size make_fcontext,24
212 .type .make_fcontext,@function
213 .globl .make_fcontext
214 .make_fcontext:
215     std     %r3, 0(%r3)         # save the current context
216     std     %r4, 176(%r3)       # save the address of the function supposed to be run
217     ld      %r0, 184(%r3)       # load the stack base
218
219     li      %r4, 56
220     subf    %r1, %r4, %r1       # reserve space on stack
221     stw     %r3, 48(%r1)        # store pointer to fcontext_t on stack
222     mflr    %r4                 # load LR
223     stw     %r4, 40(%r1)        # store LR on stack
224     mr.     %r3, %r0            # context stack as arg to align_stack
225     bl      align_stack@plt     # call align_stack
226     mr.     %r0, %r3            # load result into R0
227     lwz     %r4, 40(%r1)        # pop LR from stack
228     mtlr    %r4                 # restore LR
229     lwz     %r3, 48(%r1)        # pop pointer to fcontext_t from stack
230     addi    %r1, %r1, 56        # release space on stack
231
232     li      %r4, 64
233     subf    %r0, %r4, %r0       # 64 bytes on stack for parameter area (== 8 registers)
234     std     %r0, 152(%r3)       # save the stack base
235
236     mflr    %r0                 # load LR
237     bl      1f                  # jump to label 1
238 1:
239     mflr    %r4                 # load LR
240     addi    %r4, %r4, finish - 1b    # calulate absolute address of finish
241     mtlr    %r0                 # restore LR
242     std     %r4, 168(%r3)       # save address of finish
243
244     li      %r3,  0             # set return value to zero
245     blr
246
247 finish:
248     li      %r3,  0             # set return value to zero
249     bl      _exit@plt           # exit application
250 .size .make_fcontext, .-.make_fcontext