]> git.ipfire.org Git - thirdparty/gcc.git/blob - libgcc/config/rs6000/darwin-vecsave.S
Update copyright years.
[thirdparty/gcc.git] / libgcc / config / rs6000 / darwin-vecsave.S
1 /* This file contains the vector save and restore routines.
2 *
3 * Copyright (C) 2004-2023 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 /* With some assemblers, we need the correct machine directive to get the
35 right CPU type / subtype in the file header. */
36 #if __ppc64__
37 .machine ppc64
38 #else
39 .machine ppc7400
40 #endif
41 .text
42 .align 2
43
44 .private_extern saveVEC
45 saveVEC:
46 li r11,-192
47 stvx v20,r11,r0
48 li r11,-176
49 stvx v21,r11,r0
50 li r11,-160
51 stvx v22,r11,r0
52 li r11,-144
53 stvx v23,r11,r0
54 li r11,-128
55 stvx v24,r11,r0
56 li r11,-112
57 stvx v25,r11,r0
58 li r11,-96
59 stvx v26,r11,r0
60 li r11,-80
61 stvx v27,r11,r0
62 li r11,-64
63 stvx v28,r11,r0
64 li r11,-48
65 stvx v29,r11,r0
66 li r11,-32
67 stvx v30,r11,r0
68 li r11,-16
69 stvx v31,r11,r0
70 blr
71
72 .private_extern restVEC
73 restVEC:
74 li r11,-192
75 lvx v20,r11,r0
76 li r11,-176
77 lvx v21,r11,r0
78 li r11,-160
79 lvx v22,r11,r0
80 li r11,-144
81 lvx v23,r11,r0
82 li r11,-128
83 lvx v24,r11,r0
84 li r11,-112
85 lvx v25,r11,r0
86 li r11,-96
87 lvx v26,r11,r0
88 li r11,-80
89 lvx v27,r11,r0
90 li r11,-64
91 lvx v28,r11,r0
92 li r11,-48
93 lvx v29,r11,r0
94 li r11,-32
95 lvx v30,r11,r0
96 li r11,-16
97 lvx v31,r11,r0
98 blr
99
100 /* saveVEC_vr11 -- as saveVEC but VRsave is returned in R11. */
101
102 .private_extern saveVEC_vr11
103 saveVEC_vr11:
104 li r11,-192
105 stvx v20,r11,r0
106 li r11,-176
107 stvx v21,r11,r0
108 li r11,-160
109 stvx v22,r11,r0
110 li r11,-144
111 stvx v23,r11,r0
112 li r11,-128
113 stvx v24,r11,r0
114 li r11,-112
115 stvx v25,r11,r0
116 li r11,-96
117 stvx v26,r11,r0
118 li r11,-80
119 stvx v27,r11,r0
120 li r11,-64
121 stvx v28,r11,r0
122 li r11,-48
123 stvx v29,r11,r0
124 li r11,-32
125 stvx v30,r11,r0
126 li r11,-16
127 stvx v31,r11,r0
128 mfspr r11,VRsave
129 blr
130
131 /* As restVec, but the original VRsave value passed in R10. */
132
133 .private_extern restVEC_vr10
134 restVEC_vr10:
135 li r11,-192
136 lvx v20,r11,r0
137 li r11,-176
138 lvx v21,r11,r0
139 li r11,-160
140 lvx v22,r11,r0
141 li r11,-144
142 lvx v23,r11,r0
143 li r11,-128
144 lvx v24,r11,r0
145 li r11,-112
146 lvx v25,r11,r0
147 li r11,-96
148 lvx v26,r11,r0
149 li r11,-80
150 lvx v27,r11,r0
151 li r11,-64
152 lvx v28,r11,r0
153 li r11,-48
154 lvx v29,r11,r0
155 li r11,-32
156 lvx v30,r11,r0
157 li r11,-16
158 lvx v31,r11,r0
159 /* restore VRsave from R10. */
160 mtspr VRsave,r10
161 blr