summaryrefslogtreecommitdiffstats
path: root/private/crt32/misc/ppc/miscasm.s
blob: 8fab2f64ee626387d95315d210d219687b45e85d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
//
// Miscellaneous assembly-language routines and data for
// PowerPC RTL
//
#include "ksppc.h"
//
// Copyright 1993  IBM Corporation
//
// By Rick Simpson,  17 August 1993
//
//-----------------------------------------------------------------------------
//
//   These routines save and restore only the GPRs and FPRs.
//
//   Saving and restoring of other non-volatile registers (LR, certain
//   fields of CR) is the responsibility of in-line prologue and epilogue
//   code.
//
//-----------------------------------------------------------------------------
//
//   _savegpr_<n>
//       Inputs:
//          r12 = pointer to END of GPR save area
//          LR   = return address to invoking prologue
//      Saves GPR<n> through GPR31 in area preceeding where r12 points
//
//   _savefpr_<n>
//       Inputs:
//          r1 = pointer to stack frame header
//          LR  = return address to invoking prologue
//       Saves FPR<m> through FPR31 in area preceeding stack frame header
//
//-----------------------------------------------------------------------------
//
//   _restgpr_<n>
//      Inputs:
//         r12 = pointer to END of GPR save area
//         LR   = return address to invoking prologue
//      Restores GPR<n> through GPR31 from area preceeding where r12 points
//
//   _restfpr_<m>
//      Inputs:
//         r1 = pointer to stack frame header
//         LR   = return address to invoking prologue
//      Restores FPR<m> through FPR31 from area preceeding stack frame header
//
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//
//  _savegpr_<n> -- Save GPRs when FPRs are also saved
//
//  On entry:
//      r12 = address of END of GPR save area
//      LR   = return address to prologue
//
//  Saves GPR<n> through GPR31 in area preceeding where r12 points
//
//-----------------------------------------------------------------------------

        FN_TABLE(_savegpr_13,0,1)
        DUMMY_ENTRY(_savegpr_13)
        .set _savegpr_13.body,.._savegpr_13-1
                stw     r13, -4*(32-13)(r12)
        DUMMY_ENTRY(_savegpr_14)
                stw     r14, -4*(32-14)(r12)
        DUMMY_ENTRY(_savegpr_15)
                stw     r15, -4*(32-15)(r12)
        DUMMY_ENTRY(_savegpr_16)
                stw     r16, -4*(32-16)(r12)
        DUMMY_ENTRY(_savegpr_17)
                stw     r17, -4*(32-17)(r12)
        DUMMY_ENTRY(_savegpr_18)
                stw     r18, -4*(32-18)(r12)
        DUMMY_ENTRY(_savegpr_19)
                stw     r19, -4*(32-19)(r12)
        DUMMY_ENTRY(_savegpr_20)
                stw     r20, -4*(32-20)(r12)
        DUMMY_ENTRY(_savegpr_21)
                stw     r21, -4*(32-21)(r12)
        DUMMY_ENTRY(_savegpr_22)
                stw     r22, -4*(32-22)(r12)
        DUMMY_ENTRY(_savegpr_23)
                stw     r23, -4*(32-23)(r12)
        DUMMY_ENTRY(_savegpr_24)
                stw     r24, -4*(32-24)(r12)
        DUMMY_ENTRY(_savegpr_25)
                stw     r25, -4*(32-25)(r12)
        DUMMY_ENTRY(_savegpr_26)
                stw     r26, -4*(32-26)(r12)
        DUMMY_ENTRY(_savegpr_27)
                stw     r27, -4*(32-27)(r12)
        DUMMY_ENTRY(_savegpr_28)
                stw     r28, -4*(32-28)(r12)
        DUMMY_ENTRY(_savegpr_29)
                stw     r29, -4*(32-29)(r12)
        DUMMY_ENTRY(_savegpr_30)
                stw     r30, -4*(32-30)(r12)
        DUMMY_ENTRY(_savegpr_31)
                stw     r31, -4*(32-31)(r12)
        SPECIAL_EXIT(_savegpr_13)

//-----------------------------------------------------------------------------
//
//  _savefpr_<n> -- Saves FPRs
//
//  On entry:
//      r1 = pointer to stack frame header
//      LR  = return address to prologue
//
//  Saves FPR<n> through FPR31 in area preceeding stack frame header
//
//-----------------------------------------------------------------------------

        FN_TABLE(_savefpr_14,0,1)
        DUMMY_ENTRY(_savefpr_14)
        .set _savefpr_14.body,.._savefpr_14-1
                stfd    f14, -8*(32-14)(r1)
        DUMMY_ENTRY(_savefpr_15)
                stfd    f15, -8*(32-15)(r1)
        DUMMY_ENTRY(_savefpr_16)
                stfd    f16, -8*(32-16)(r1)
        DUMMY_ENTRY(_savefpr_17)
                stfd    f17, -8*(32-17)(r1)
        DUMMY_ENTRY(_savefpr_18)
                stfd    f18, -8*(32-18)(r1)
        DUMMY_ENTRY(_savefpr_19)
                stfd    f19, -8*(32-19)(r1)
        DUMMY_ENTRY(_savefpr_20)
                stfd    f20, -8*(32-20)(r1)
        DUMMY_ENTRY(_savefpr_21)
                stfd    f21, -8*(32-21)(r1)
        DUMMY_ENTRY(_savefpr_22)
                stfd    f22, -8*(32-22)(r1)
        DUMMY_ENTRY(_savefpr_23)
                stfd    f23, -8*(32-23)(r1)
        DUMMY_ENTRY(_savefpr_24)
                stfd    f24, -8*(32-24)(r1)
        DUMMY_ENTRY(_savefpr_25)
                stfd    f25, -8*(32-25)(r1)
        DUMMY_ENTRY(_savefpr_26)
                stfd    f26, -8*(32-26)(r1)
        DUMMY_ENTRY(_savefpr_27)
                stfd    f27, -8*(32-27)(r1)
        DUMMY_ENTRY(_savefpr_28)
                stfd    f28, -8*(32-28)(r1)
        DUMMY_ENTRY(_savefpr_29)
                stfd    f29, -8*(32-29)(r1)
        DUMMY_ENTRY(_savefpr_30)
                stfd    f30, -8*(32-30)(r1)
        DUMMY_ENTRY(_savefpr_31)
                stfd    f31, -8*(32-31)(r1)
        SPECIAL_EXIT(_savefpr_14)

//-----------------------------------------------------------------------------
//
//  _restgpr_<n> -- Restore GPRs when FPRs are also restored
//
//  On entry:
//      r12 = address of END of GPR save area
//      LR   = return address
//
//  Restores GPR<n> through GPR31 from area preceeding where r12 points
//
//-----------------------------------------------------------------------------

        FN_TABLE(_restgpr_13,0,2)
        DUMMY_ENTRY(_restgpr_13)
        .set _restgpr_13.body,.._restgpr_13-2
                lwz     r13, -4*(32-13)(r12)
        DUMMY_ENTRY(_restgpr_14)
                lwz     r14, -4*(32-14)(r12)
        DUMMY_ENTRY(_restgpr_15)
                lwz     r15, -4*(32-15)(r12)
        DUMMY_ENTRY(_restgpr_16)
                lwz     r16, -4*(32-16)(r12)
        DUMMY_ENTRY(_restgpr_17)
                lwz     r17, -4*(32-17)(r12)
        DUMMY_ENTRY(_restgpr_18)
                lwz     r18, -4*(32-18)(r12)
        DUMMY_ENTRY(_restgpr_19)
                lwz     r19, -4*(32-19)(r12)
        DUMMY_ENTRY(_restgpr_20)
                lwz     r20, -4*(32-20)(r12)
        DUMMY_ENTRY(_restgpr_21)
                lwz     r21, -4*(32-21)(r12)
        DUMMY_ENTRY(_restgpr_22)
                lwz     r22, -4*(32-22)(r12)
        DUMMY_ENTRY(_restgpr_23)
                lwz     r23, -4*(32-23)(r12)
        DUMMY_ENTRY(_restgpr_24)
                lwz     r24, -4*(32-24)(r12)
        DUMMY_ENTRY(_restgpr_25)
                lwz     r25, -4*(32-25)(r12)
        DUMMY_ENTRY(_restgpr_26)
                lwz     r26, -4*(32-26)(r12)
        DUMMY_ENTRY(_restgpr_27)
                lwz     r27, -4*(32-27)(r12)
        DUMMY_ENTRY(_restgpr_28)
                lwz     r28, -4*(32-28)(r12)
        DUMMY_ENTRY(_restgpr_29)
                lwz     r29, -4*(32-29)(r12)
        DUMMY_ENTRY(_restgpr_30)
                lwz     r30, -4*(32-30)(r12)
        DUMMY_ENTRY(_restgpr_31)
                lwz     r31, -4*(32-31)(r12)
        SPECIAL_EXIT(_restgpr_13)

//-----------------------------------------------------------------------------
//
//  _restfpr_<n> -- Restores FPRs
//
//  On entry:
//      r1 = pointer to stack frame header
//      LR  = return address
//
//  Restores FPR<n> through FPR31 from area preceeding stack frame header
//
//-----------------------------------------------------------------------------

        FN_TABLE(_restfpr_14,0,2)
        DUMMY_ENTRY(_restfpr_14)
        .set _restfpr_14.body,.._restfpr_14-2
                lfd     f14, -8*(32-14)(r1)
        DUMMY_ENTRY(_restfpr_15)
                lfd     f15, -8*(32-15)(r1)
        DUMMY_ENTRY(_restfpr_16)
                lfd     f16, -8*(32-16)(r1)
        DUMMY_ENTRY(_restfpr_17)
                lfd     f17, -8*(32-17)(r1)
        DUMMY_ENTRY(_restfpr_18)
                lfd     f18, -8*(32-18)(r1)
        DUMMY_ENTRY(_restfpr_19)
                lfd     f19, -8*(32-19)(r1)
        DUMMY_ENTRY(_restfpr_20)
                lfd     f20, -8*(32-20)(r1)
        DUMMY_ENTRY(_restfpr_21)
                lfd     f21, -8*(32-21)(r1)
        DUMMY_ENTRY(_restfpr_22)
                lfd     f22, -8*(32-22)(r1)
        DUMMY_ENTRY(_restfpr_23)
                lfd     f23, -8*(32-23)(r1)
        DUMMY_ENTRY(_restfpr_24)
                lfd     f24, -8*(32-24)(r1)
        DUMMY_ENTRY(_restfpr_25)
                lfd     f25, -8*(32-25)(r1)
        DUMMY_ENTRY(_restfpr_26)
                lfd     f26, -8*(32-26)(r1)
        DUMMY_ENTRY(_restfpr_27)
                lfd     f27, -8*(32-27)(r1)
        DUMMY_ENTRY(_restfpr_28)
                lfd     f28, -8*(32-28)(r1)
        DUMMY_ENTRY(_restfpr_29)
                lfd     f29, -8*(32-29)(r1)
        DUMMY_ENTRY(_restfpr_30)
                lfd     f30, -8*(32-30)(r1)
        DUMMY_ENTRY(_restfpr_31)
                lfd     f31, -8*(32-31)(r1)
        SPECIAL_EXIT(_restfpr_14)

//
// This is a copy of the function table entries for the millicode.  It's
// used with the PPCKD_SYMBOL_SEARCH mechanism in vunwind.c to allow
// for older versions of miscasm.obj.
//

        .reldata
        .globl _millicode_table
_millicode_table:
        .long .._savegpr_13, _savegpr_13.end, 0, 1, .._savegpr_13
        .long .._savefpr_14, _savefpr_14.end, 0, 1, .._savefpr_14
        .long .._restgpr_13, _restgpr_13.end, 0, 2, .._restgpr_13
        .long .._restfpr_14, _restfpr_14.end, 0, 2, .._restfpr_14