]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/gcc/config/rs6000/darwin-vecsave.asm
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / gcc / config / rs6000 / darwin-vecsave.asm
1 /*  This file contains the vector save and restore routines.
2  *
3  *   Copyright (C) 2004 Free Software Foundation, Inc.
4  * 
5  * This file is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License as published by the
7  * Free Software Foundation; either version 2, or (at your option) any
8  * later version.
9  * 
10  * In addition to the permissions in the GNU General Public License, the
11  * Free Software Foundation gives you unlimited permission to link the
12  * compiled version of this file with other programs, and to distribute
13  * those programs without any restriction coming from the use of this
14  * file.  (The General Public License restrictions do apply in other
15  * respects; for example, they cover modification of the file, and
16  * distribution when not linked into another program.)
17  * 
18  * This file is distributed in the hope that it will be useful, but
19  * WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21  * General Public License for more details.
22  * 
23  * You should have received a copy of the GNU General Public License
24  * along with this program; see the file COPYING.  If not, write to
25  * the Free Software Foundation, 51 Franklin Street, Fifth Floor,
26  * Boston, MA 02110-1301, USA.
27  * 
28  *  As a special exception, if you link this library with files
29  *  compiled with GCC to produce an executable, this does not cause the
30  *  resulting executable to be covered by the GNU General Public License.
31  *  This exception does not however invalidate any other reasons why the
32  *  executable file might be covered by the GNU General Public License.
33  */ 
34
35 /* Vector save/restore routines for Darwin.  Note that each vector
36    save/restore requires 2 instructions (8 bytes.)
37
38    THE SAVE AND RESTORE ROUTINES CAN HAVE ONLY ONE GLOBALLY VISIBLE
39    ENTRY POINT - callers have to jump to "saveFP+60" to save f29..f31,
40    for example.  For FP reg saves/restores, it takes one instruction
41    (4 bytes) to do the operation; for Vector regs, 2 instructions are
42    required (8 bytes.).   */
43
44         .machine ppc7400
45 .text
46         .align 2
47
48 .private_extern saveVEC
49 saveVEC:
50         li r11,-192
51         stvx v20,r11,r0
52         li r11,-176
53         stvx v21,r11,r0
54         li r11,-160
55         stvx v22,r11,r0
56         li r11,-144
57         stvx v23,r11,r0
58         li r11,-128
59         stvx v24,r11,r0
60         li r11,-112
61         stvx v25,r11,r0
62         li r11,-96
63         stvx v26,r11,r0
64         li r11,-80
65         stvx v27,r11,r0
66         li r11,-64
67         stvx v28,r11,r0
68         li r11,-48
69         stvx v29,r11,r0
70         li r11,-32
71         stvx v30,r11,r0
72         li r11,-16
73         stvx v31,r11,r0
74         blr
75
76 .private_extern restVEC
77 restVEC:
78         li r11,-192
79         lvx v20,r11,r0
80         li r11,-176
81         lvx v21,r11,r0
82         li r11,-160
83         lvx v22,r11,r0
84         li r11,-144
85         lvx v23,r11,r0
86         li r11,-128
87         lvx v24,r11,r0
88         li r11,-112
89         lvx v25,r11,r0
90         li r11,-96
91         lvx v26,r11,r0
92         li r11,-80
93         lvx v27,r11,r0
94         li r11,-64
95         lvx v28,r11,r0
96         li r11,-48
97         lvx v29,r11,r0
98         li r11,-32
99         lvx v30,r11,r0
100         li r11,-16
101         lvx v31,r11,r0
102         blr
103
104 /* saveVEC_vr11 -- as saveVEC but VRsave is returned in R11.  */
105
106 .private_extern saveVEC_vr11
107 saveVEC_vr11:
108         li r11,-192
109         stvx v20,r11,r0
110         li r11,-176
111         stvx v21,r11,r0
112         li r11,-160
113         stvx v22,r11,r0
114         li r11,-144
115         stvx v23,r11,r0
116         li r11,-128
117         stvx v24,r11,r0
118         li r11,-112
119         stvx v25,r11,r0
120         li r11,-96
121         stvx v26,r11,r0
122         li r11,-80
123         stvx v27,r11,r0
124         li r11,-64
125         stvx v28,r11,r0
126         li r11,-48
127         stvx v29,r11,r0
128         li r11,-32
129         stvx v30,r11,r0
130         li r11,-16
131         stvx v31,r11,r0
132         mfspr r11,VRsave
133         blr
134
135 /* As restVec, but the original VRsave value passed in R10.  */
136
137 .private_extern restVEC_vr10
138 restVEC_vr10:
139         li r11,-192
140         lvx v20,r11,r0
141         li r11,-176
142         lvx v21,r11,r0
143         li r11,-160
144         lvx v22,r11,r0
145         li r11,-144
146         lvx v23,r11,r0
147         li r11,-128
148         lvx v24,r11,r0
149         li r11,-112
150         lvx v25,r11,r0
151         li r11,-96
152         lvx v26,r11,r0
153         li r11,-80
154         lvx v27,r11,r0
155         li r11,-64
156         lvx v28,r11,r0
157         li r11,-48
158         lvx v29,r11,r0
159         li r11,-32
160         lvx v30,r11,r0
161         li r11,-16
162         lvx v31,r11,r0
163                                 /* restore VRsave from R10.  */
164         mtspr VRsave,r10
165         blr