combine: Punt on out of range rotate counts [PR93505]
[gcc.git] / libsanitizer / tsan / tsan_rtl_ppc64.S
1 #include "tsan_ppc_regs.h"
2
3 .machine altivec
4 .section .text
5 .hidden __tsan_setjmp
6 .globl _setjmp
7 .type _setjmp, @function
8 .align 4
9 #if _CALL_ELF == 2
10 _setjmp:
11 #else
12 .section ".opd","aw"
13 .align 3
14 _setjmp:
15 .quad .L._setjmp,.TOC.@tocbase,0
16 .previous
17 #endif
18 .L._setjmp:
19 mflr r0
20 stdu r1,-48(r1)
21 std r2,24(r1)
22 std r3,32(r1)
23 std r0,40(r1)
24 // r3 is the original stack pointer.
25 addi r3,r1,48
26 // r4 is the mangled stack pointer (see glibc)
27 ld r4,-28696(r13)
28 xor r4,r3,r4
29 // Materialize a TOC in case we were called from libc.
30 // For big-endian, we load the TOC from the OPD. For little-
31 // endian, we use the .TOC. symbol to find it.
32 nop
33 bcl 20,31,0f
34 0:
35 mflr r2
36 #if _CALL_ELF == 2
37 addis r2,r2,.TOC.-0b@ha
38 addi r2,r2,.TOC.-0b@l
39 #else
40 addis r2,r2,_setjmp-0b@ha
41 addi r2,r2,_setjmp-0b@l
42 ld r2,8(r2)
43 #endif
44 // Call the interceptor.
45 bl __tsan_setjmp
46 nop
47 // Restore regs needed for setjmp.
48 ld r3,32(r1)
49 ld r0,40(r1)
50 // Emulate the real setjmp function. We do this because we can't
51 // perform a sibcall: The real setjmp function trashes the TOC
52 // pointer, and with a sibcall we have no way to restore it.
53 // This way we can make sure our caller's stack pointer and
54 // link register are saved correctly in the jmpbuf.
55 ld r6,-28696(r13)
56 addi r5,r1,48 // original stack ptr of caller
57 xor r5,r6,r5
58 std r5,0(r3) // mangled stack ptr of caller
59 ld r5,24(r1)
60 std r5,8(r3) // caller's saved TOC pointer
61 xor r0,r6,r0
62 std r0,16(r3) // caller's mangled return address
63 mfcr r0
64 // Nonvolatiles.
65 std r14,24(r3)
66 stfd f14,176(r3)
67 stw r0,172(r3) // CR
68 std r15,32(r3)
69 stfd f15,184(r3)
70 std r16,40(r3)
71 stfd f16,192(r3)
72 std r17,48(r3)
73 stfd f17,200(r3)
74 std r18,56(r3)
75 stfd f18,208(r3)
76 std r19,64(r3)
77 stfd f19,216(r3)
78 std r20,72(r3)
79 stfd f20,224(r3)
80 std r21,80(r3)
81 stfd f21,232(r3)
82 std r22,88(r3)
83 stfd f22,240(r3)
84 std r23,96(r3)
85 stfd f23,248(r3)
86 std r24,104(r3)
87 stfd f24,256(r3)
88 std r25,112(r3)
89 stfd f25,264(r3)
90 std r26,120(r3)
91 stfd f26,272(r3)
92 std r27,128(r3)
93 stfd f27,280(r3)
94 std r28,136(r3)
95 stfd f28,288(r3)
96 std r29,144(r3)
97 stfd f29,296(r3)
98 std r30,152(r3)
99 stfd f30,304(r3)
100 std r31,160(r3)
101 stfd f31,312(r3)
102 addi r5,r3,320
103 mfspr r0,256
104 stw r0,168(r3) // VRSAVE
105 addi r6,r5,16
106 stvx v20,0,r5
107 addi r5,r5,32
108 stvx v21,0,r6
109 addi r6,r6,32
110 stvx v22,0,r5
111 addi r5,r5,32
112 stvx v23,0,r6
113 addi r6,r6,32
114 stvx v24,0,r5
115 addi r5,r5,32
116 stvx v25,0,r6
117 addi r6,r6,32
118 stvx v26,0,r5
119 addi r5,r5,32
120 stvx v27,0,r6
121 addi r6,r6,32
122 stvx v28,0,r5
123 addi r5,r5,32
124 stvx v29,0,r6
125 addi r6,r6,32
126 stvx v30,0,r5
127 stvx v31,0,r6
128 // Clear the "mask-saved" slot.
129 li r4,0
130 stw r4,512(r3)
131 // Restore TOC, LR, and stack and return to caller.
132 ld r2,24(r1)
133 ld r0,40(r1)
134 addi r1,r1,48
135 li r3,0 // This is the setjmp return path
136 mtlr r0
137 blr
138 .size _setjmp, .-.L._setjmp
139
140 .globl setjmp
141 .type setjmp, @function
142 .align 4
143 setjmp:
144 b _setjmp
145 .size setjmp, .-setjmp
146
147 // sigsetjmp is like setjmp, except that the mask in r4 needs
148 // to be saved at offset 512 of the jump buffer.
149 .globl __sigsetjmp
150 .type __sigsetjmp, @function
151 .align 4
152 #if _CALL_ELF == 2
153 __sigsetjmp:
154 #else
155 .section ".opd","aw"
156 .align 3
157 __sigsetjmp:
158 .quad .L.__sigsetjmp,.TOC.@tocbase,0
159 .previous
160 #endif
161 .L.__sigsetjmp:
162 mflr r0
163 stdu r1,-64(r1)
164 std r2,24(r1)
165 std r3,32(r1)
166 std r4,40(r1)
167 std r0,48(r1)
168 // r3 is the original stack pointer.
169 addi r3,r1,64
170 // r4 is the mangled stack pointer (see glibc)
171 ld r4,-28696(r13)
172 xor r4,r3,r4
173 // Materialize a TOC in case we were called from libc.
174 // For big-endian, we load the TOC from the OPD. For little-
175 // endian, we use the .TOC. symbol to find it.
176 nop
177 bcl 20,31,1f
178 1:
179 mflr r2
180 #if _CALL_ELF == 2
181 addis r2,r2,.TOC.-1b@ha
182 addi r2,r2,.TOC.-1b@l
183 #else
184 addis r2,r2,_setjmp-1b@ha
185 addi r2,r2,_setjmp-1b@l
186 ld r2,8(r2)
187 #endif
188 // Call the interceptor.
189 bl __tsan_setjmp
190 nop
191 // Restore regs needed for __sigsetjmp.
192 ld r3,32(r1)
193 ld r4,40(r1)
194 ld r0,48(r1)
195 // Emulate the real sigsetjmp function. We do this because we can't
196 // perform a sibcall: The real sigsetjmp function trashes the TOC
197 // pointer, and with a sibcall we have no way to restore it.
198 // This way we can make sure our caller's stack pointer and
199 // link register are saved correctly in the jmpbuf.
200 ld r6,-28696(r13)
201 addi r5,r1,64 // original stack ptr of caller
202 xor r5,r6,r5
203 std r5,0(r3) // mangled stack ptr of caller
204 ld r5,24(r1)
205 std r5,8(r3) // caller's saved TOC pointer
206 xor r0,r6,r0
207 std r0,16(r3) // caller's mangled return address
208 mfcr r0
209 // Nonvolatiles.
210 std r14,24(r3)
211 stfd f14,176(r3)
212 stw r0,172(r3) // CR
213 std r15,32(r3)
214 stfd f15,184(r3)
215 std r16,40(r3)
216 stfd f16,192(r3)
217 std r17,48(r3)
218 stfd f17,200(r3)
219 std r18,56(r3)
220 stfd f18,208(r3)
221 std r19,64(r3)
222 stfd f19,216(r3)
223 std r20,72(r3)
224 stfd f20,224(r3)
225 std r21,80(r3)
226 stfd f21,232(r3)
227 std r22,88(r3)
228 stfd f22,240(r3)
229 std r23,96(r3)
230 stfd f23,248(r3)
231 std r24,104(r3)
232 stfd f24,256(r3)
233 std r25,112(r3)
234 stfd f25,264(r3)
235 std r26,120(r3)
236 stfd f26,272(r3)
237 std r27,128(r3)
238 stfd f27,280(r3)
239 std r28,136(r3)
240 stfd f28,288(r3)
241 std r29,144(r3)
242 stfd f29,296(r3)
243 std r30,152(r3)
244 stfd f30,304(r3)
245 std r31,160(r3)
246 stfd f31,312(r3)
247 addi r5,r3,320
248 mfspr r0,256
249 stw r0,168(r3) // VRSAVE
250 addi r6,r5,16
251 stvx v20,0,r5
252 addi r5,r5,32
253 stvx v21,0,r6
254 addi r6,r6,32
255 stvx v22,0,r5
256 addi r5,r5,32
257 stvx v23,0,r6
258 addi r6,r6,32
259 stvx v24,0,r5
260 addi r5,r5,32
261 stvx v25,0,r6
262 addi r6,r6,32
263 stvx v26,0,r5
264 addi r5,r5,32
265 stvx v27,0,r6
266 addi r6,r6,32
267 stvx v28,0,r5
268 addi r5,r5,32
269 stvx v29,0,r6
270 addi r6,r6,32
271 stvx v30,0,r5
272 stvx v31,0,r6
273 // Save into the "mask-saved" slot.
274 stw r4,512(r3)
275 // Restore TOC, LR, and stack and return to caller.
276 ld r2,24(r1)
277 ld r0,48(r1)
278 addi r1,r1,64
279 li r3,0 // This is the sigsetjmp return path
280 mtlr r0
281 blr
282 .size __sigsetjmp, .-.L.__sigsetjmp
283
284 .globl sigsetjmp
285 .type sigsetjmp, @function
286 .align 4
287 sigsetjmp:
288 b __sigsetjmp
289 .size sigsetjmp, .-sigsetjmp