aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/pa/ee_fp.asm
blob: ef040cf7dad04e95a1650eae77f96758ed68f998 (plain)
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
274
;  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_fp,MILLICODE
	.align 32
__outline_prologue_fp
	.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(0,%r30)

	; Make our new frame.
	add %r21,%r30,%r30

	; Save our old stack pointer.
	stw %r20,0(0,%r20)

	; 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$0002
	subi 18,%r1,%r1
	blr,n %r1,%r0
	b,n L$0002
	stws,ma %r18,4(0,%r20)
	nop
	stws,ma %r17,4(0,%r20)
	nop
	stws,ma %r16,4(0,%r20)
	nop
	stws,ma %r15,4(0,%r20)
	nop
	stws,ma %r14,4(0,%r20)
	nop
	stws,ma %r13,4(0,%r20)
	nop
	stws,ma %r12,4(0,%r20)
	nop
	stws,ma %r11,4(0,%r20)
	nop
	stws,ma %r10,4(0,%r20)
	nop
	stws,ma %r9,4(0,%r20)
	nop
	stws,ma %r8,4(0,%r20)
	nop
	stws,ma %r7,4(0,%r20)
	nop
	stws,ma %r6,4(0,%r20)
	nop
	stws,ma %r5,4(0,%r20)
	nop
	stws,ma %r4,4(0,%r20)
	nop
	stws,ma %r3,4(0,%r20)
	nop
L$0002
	; 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$0003
	subi 21,%r22,%r22
	blr,n %r22,%r0
	b,n L$0003
	fstws,ma %fr21,8(0,%r20)
	nop
	fstws,ma %fr20,8(0,%r20)
	nop
	fstws,ma %fr19,8(0,%r20)
	nop
	fstws,ma %fr18,8(0,%r20)
	nop
	fstws,ma %fr17,8(0,%r20)
	nop
	fstws,ma %fr16,8(0,%r20)
	nop
	fstws,ma %fr15,8(0,%r20)
	nop
	fstws,ma %fr14,8(0,%r20)
	nop
	fstws,ma %fr13,8(0,%r20)
	nop
	fstws,ma %fr12,8(0,%r20)
	nop
L$0003
	; Return, setting up a frame pointer in the delay slot
	bv 0(%r31)
	sub %r30,%r21,%r3
	.EXIT
	.PROCEND


; This is an out-of-line epilogue.  It's operation is basically the reverse
; of the out-of-line prologue.

	.EXPORT __outline_epilogue_fp,MILLICODE
	.align 32
__outline_epilogue_fp
	.PROC
	.CALLINFO FRAME=0,NO_CALLS
	.ENTRY
	; Make a copy of our frame pointer into %r20
	copy %r3,%r20

	; Subtract 4 from our return pointer so that we return to
	; the right location.
        ldo -4(%r31),%r31

	; Reload %r2
	; First save off %r2
	ldw -20(0,%r20),%r2

	; Load our old stack pointer, save it in %r21.
	ldw 0(0,%r20),%r21

	; 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$0006
	subi 18,%r1,%r1
	blr,n %r1,%r0
	b,n L$0006
	ldws,ma 4(0,%r20),%r18
	nop
	ldws,ma 4(0,%r20),%r17
	nop
	ldws,ma 4(0,%r20),%r16
	nop
	ldws,ma 4(0,%r20),%r15
	nop
	ldws,ma 4(0,%r20),%r14
	nop
	ldws,ma 4(0,%r20),%r13
	nop
	ldws,ma 4(0,%r20),%r12
	nop
	ldws,ma 4(0,%r20),%r11
	nop
	ldws,ma 4(0,%r20),%r10
	nop
	ldws,ma 4(0,%r20),%r9
	nop
	ldws,ma 4(0,%r20),%r8
	nop
	ldws,ma 4(0,%r20),%r7
	nop
	ldws,ma 4(0,%r20),%r6
	nop
	ldws,ma 4(0,%r20),%r5
	nop
	ldws,ma 4(0,%r20),%r4
	nop
	ldws,ma 4(0,%r20),%r3
	nop
L$0006
	; 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$0007
	subi 21,%r22,%r22
	blr,n %r22,%r0
	b,n L$0007
	fldws,ma 8(0,%r20),%fr21
	nop
	fldws,ma 8(0,%r20),%fr20
	nop
	fldws,ma 8(0,%r20),%fr19
	nop
	fldws,ma 8(0,%r20),%fr18
	nop
	fldws,ma 8(0,%r20),%fr17
	nop
	fldws,ma 8(0,%r20),%fr16
	nop
	fldws,ma 8(0,%r20),%fr15
	nop
	fldws,ma 8(0,%r20),%fr14
	nop
	fldws,ma 8(0,%r20),%fr13
	nop
	fldws,ma 8(0,%r20),%fr12
	nop
L$0007
	; Return and deallocate our frame.
	bv 0(%r31)
	copy %r21,%r30
	.EXIT
	.PROCEND