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
|
; Subroutines for out of line prologues and epilogues on for the HPPA
; Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
; This file is part of GNU CC.
; GNU CC is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2, or (at your option)
; any later version.
; GNU CC is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
; You should have received a copy of the GNU General Public License
; along with GNU CC; see the file COPYING. If not, write to
; the Free Software Foundation, 59 Temple Place - Suite 330,
; Boston, MA 02111-1307, USA.
.SPACE $PRIVATE$
.SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=31
.SUBSPA $BSS$,QUAD=1,ALIGN=8,ACCESS=31,ZERO,SORT=82
.SPACE $TEXT$
.SUBSPA $LIT$,QUAD=0,ALIGN=8,ACCESS=44
.SUBSPA $CODE$,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY
.SUBSPA $MILLICODE$,QUAD=0,ALIGN=8,ACCESS=44,SORT=8
; This is an out-of-line prologue.
;
; It performs the following operations:
;
; * Saves the return pointer at sp - 20
;
; * Creates a new stack frame (sp'), size of the frame is passed in %r21
;
; * The old stack pointer is saved at sp (frame pointer version only).
;
; * Saves grs (passed in low 16 bits of %r22 into the stack frame
; at sp' + local_fsize (passed in %r19).
;
; * Saves frs (passed in high 16 bits of %r22) into the stack
; frame at sp' + local_fsize (passed in %r19).
;
; * Sets up a frame pointer (in %r3) (frame pointer version only).
;
; * Returns to the instruction _immediately_ after the call to
; this function.
.SPACE $TEXT$
.SUBSPA $MILLICODE$
.EXPORT __outline_prologue,MILLICODE
.align 32
__outline_prologue
.PROC
.CALLINFO FRAME=0,NO_CALLS
.ENTRY
copy %r30,%r20
; Subtract 4 from our return pointer so that we return to
; the right location.
ldo -4(%r31),%r31
; Save off %r2
stw %r2,-20(%r30)
; Make our new frame.
add %r21,%r30,%r30
; Add in local_fsize to our frame pointer so we do register
; saves into the right place
add %r20,%r19,%r20
; %r22 tells us what registers we need to save. The upper half
; is for fp registers, the lower half for integer registers.
; We put the lower half in %r1 and the upper half into %r22
; for later use.
extru %r22,31,16,%r1
extrs %r22,15,16,%r22
; %r1 now olds a value 0-18 which corresponds to the number
; of grs we need to save. We need to reverse that value so
; we can just into the table and straight-line execute to the
; end of the gr saves.
comb,= %r0,%r1,L$0000
subi 18,%r1,%r1
blr,n %r1,%r0
b,n L$0000
stws,ma %r18,4(%r20)
nop
stws,ma %r17,4(%r20)
nop
stws,ma %r16,4(%r20)
nop
stws,ma %r15,4(%r20)
nop
stws,ma %r14,4(%r20)
nop
stws,ma %r13,4(%r20)
nop
stws,ma %r12,4(%r20)
nop
stws,ma %r11,4(%r20)
nop
stws,ma %r10,4(%r20)
nop
stws,ma %r9,4(%r20)
nop
stws,ma %r8,4(%r20)
nop
stws,ma %r7,4(%r20)
nop
stws,ma %r6,4(%r20)
nop
stws,ma %r5,4(%r20)
nop
stws,ma %r4,4(%r20)
nop
stws,ma %r3,4(%r20)
nop
L$0000
; All gr saves are done. Align the temporary frame pointer and
; do the fr saves.
ldo 7(%r20),%r20
depi 0,31,3,%r20
comb,= %r0,%r22,L$0001
subi 21,%r22,%r22
blr,n %r22,%r0
b,n L$0001
fstws,ma %fr21,8(%r20)
nop
fstws,ma %fr20,8(%r20)
nop
fstws,ma %fr19,8(%r20)
nop
fstws,ma %fr18,8(%r20)
nop
fstws,ma %fr17,8(%r20)
nop
fstws,ma %fr16,8(%r20)
nop
fstws,ma %fr15,8(%r20)
nop
fstws,ma %fr14,8(%r20)
nop
fstws,ma %fr13,8(%r20)
nop
fstws,ma %fr12,8(%r20)
nop
L$0001
; Return
bv,n %r0(%r31)
.EXIT
.PROCEND
.EXPORT __outline_epilogue,MILLICODE
.align 32
__outline_epilogue
.PROC
.CALLINFO FRAME=0,NO_CALLS
.ENTRY
; Get our original stack pointer and put it in %r20
sub %r30,%r21,%r20
; Subtract 4 from our return pointer so that we return to
; the right location.
ldo -4(%r31),%r31
; Reload %r2
ldw -20(%r20),%r2
; Add in local_fsize (%r19) to the frame pointer to find
; the saved registers.
add %r20,%r19,%r20
; %r22 tells us what registers we need to restore. The upper half
; is for fp registers, the lower half for integer registers.
; We put the lower half in %r1 and the upper half into %r22
; for later use.
extru %r22,31,16,%r1
extrs %r22,15,16,%r22
; %r1 now olds a value 0-18 which corresponds to the number
; of grs we need to restore. We need to reverse that value so
; we can just into the table and straight-line execute to the
; end of the gr restore.
comb,= %r0,%r1,L$0004
subi 18,%r1,%r1
blr,n %r1,%r0
b,n L$0004
ldws,ma 4(%r20),%r18
nop
ldws,ma 4(%r20),%r17
nop
ldws,ma 4(%r20),%r16
nop
ldws,ma 4(%r20),%r15
nop
ldws,ma 4(%r20),%r14
nop
ldws,ma 4(%r20),%r13
nop
ldws,ma 4(%r20),%r12
nop
ldws,ma 4(%r20),%r11
nop
ldws,ma 4(%r20),%r10
nop
ldws,ma 4(%r20),%r9
nop
ldws,ma 4(%r20),%r8
nop
ldws,ma 4(%r20),%r7
nop
ldws,ma 4(%r20),%r6
nop
ldws,ma 4(%r20),%r5
nop
ldws,ma 4(%r20),%r4
nop
ldws,ma 4(%r20),%r3
nop
L$0004
; All gr restore are done. Align the temporary frame pointer and
; do the fr restore.
ldo 7(%r20),%r20
depi 0,31,3,%r20
comb,= %r0,%r22,L$0005
subi 21,%r22,%r22
blr,n %r22,%r0
b,n L$0005
fldws,ma 8(%r20),%fr21
nop
fldws,ma 8(%r20),%fr20
nop
fldws,ma 8(%r20),%fr19
nop
fldws,ma 8(%r20),%fr18
nop
fldws,ma 8(%r20),%fr17
nop
fldws,ma 8(%r20),%fr16
nop
fldws,ma 8(%r20),%fr15
nop
fldws,ma 8(%r20),%fr14
nop
fldws,ma 8(%r20),%fr13
nop
fldws,ma 8(%r20),%fr12
nop
L$0005
; Return and deallocate our frame.
bv %r0(%r31)
sub %r30,%r21,%r30
.EXIT
.PROCEND
|