xref: /netbsd-src/external/gpl3/gcc/dist/libgcc/config/rs6000/darwin-vecsave.S (revision d11b170b9000ada93db553723522a63d5deac310)
1/*  This file contains the vector save and restore routines.
2 *
3 *   Copyright (C) 2004-2013 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 3, or (at your option) any
8 * later version.
9 *
10 * This file is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 * General Public License for more details.
14 *
15 * Under Section 7 of GPL version 3, you are granted additional
16 * permissions described in the GCC Runtime Library Exception, version
17 * 3.1, as published by the Free Software Foundation.
18 *
19 * You should have received a copy of the GNU General Public License and
20 * a copy of the GCC Runtime Library Exception along with this program;
21 * see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
22 * <http://www.gnu.org/licenses/>.
23 */
24
25/* Vector save/restore routines for Darwin.  Note that each vector
26   save/restore requires 2 instructions (8 bytes.)
27
28   THE SAVE AND RESTORE ROUTINES CAN HAVE ONLY ONE GLOBALLY VISIBLE
29   ENTRY POINT - callers have to jump to "saveFP+60" to save f29..f31,
30   for example.  For FP reg saves/restores, it takes one instruction
31   (4 bytes) to do the operation; for Vector regs, 2 instructions are
32   required (8 bytes.).   */
33
34	.machine ppc7400
35.text
36	.align 2
37
38.private_extern saveVEC
39saveVEC:
40	li r11,-192
41	stvx v20,r11,r0
42	li r11,-176
43	stvx v21,r11,r0
44	li r11,-160
45	stvx v22,r11,r0
46	li r11,-144
47	stvx v23,r11,r0
48	li r11,-128
49	stvx v24,r11,r0
50	li r11,-112
51	stvx v25,r11,r0
52	li r11,-96
53	stvx v26,r11,r0
54	li r11,-80
55	stvx v27,r11,r0
56	li r11,-64
57	stvx v28,r11,r0
58	li r11,-48
59	stvx v29,r11,r0
60	li r11,-32
61	stvx v30,r11,r0
62	li r11,-16
63	stvx v31,r11,r0
64	blr
65
66.private_extern restVEC
67restVEC:
68	li r11,-192
69	lvx v20,r11,r0
70	li r11,-176
71	lvx v21,r11,r0
72	li r11,-160
73	lvx v22,r11,r0
74	li r11,-144
75	lvx v23,r11,r0
76	li r11,-128
77	lvx v24,r11,r0
78	li r11,-112
79	lvx v25,r11,r0
80	li r11,-96
81	lvx v26,r11,r0
82	li r11,-80
83	lvx v27,r11,r0
84	li r11,-64
85	lvx v28,r11,r0
86	li r11,-48
87	lvx v29,r11,r0
88	li r11,-32
89	lvx v30,r11,r0
90	li r11,-16
91	lvx v31,r11,r0
92	blr
93
94/* saveVEC_vr11 -- as saveVEC but VRsave is returned in R11.  */
95
96.private_extern saveVEC_vr11
97saveVEC_vr11:
98	li r11,-192
99	stvx v20,r11,r0
100	li r11,-176
101	stvx v21,r11,r0
102	li r11,-160
103	stvx v22,r11,r0
104	li r11,-144
105	stvx v23,r11,r0
106	li r11,-128
107	stvx v24,r11,r0
108	li r11,-112
109	stvx v25,r11,r0
110	li r11,-96
111	stvx v26,r11,r0
112	li r11,-80
113	stvx v27,r11,r0
114	li r11,-64
115	stvx v28,r11,r0
116	li r11,-48
117	stvx v29,r11,r0
118	li r11,-32
119	stvx v30,r11,r0
120	li r11,-16
121	stvx v31,r11,r0
122	mfspr r11,VRsave
123	blr
124
125/* As restVec, but the original VRsave value passed in R10.  */
126
127.private_extern restVEC_vr10
128restVEC_vr10:
129	li r11,-192
130	lvx v20,r11,r0
131	li r11,-176
132	lvx v21,r11,r0
133	li r11,-160
134	lvx v22,r11,r0
135	li r11,-144
136	lvx v23,r11,r0
137	li r11,-128
138	lvx v24,r11,r0
139	li r11,-112
140	lvx v25,r11,r0
141	li r11,-96
142	lvx v26,r11,r0
143	li r11,-80
144	lvx v27,r11,r0
145	li r11,-64
146	lvx v28,r11,r0
147	li r11,-48
148	lvx v29,r11,r0
149	li r11,-32
150	lvx v30,r11,r0
151	li r11,-16
152	lvx v31,r11,r0
153				/* restore VRsave from R10.  */
154	mtspr VRsave,r10
155	blr
156