source: trunk/source/lisp-kernel/ppc-asmutils.s @ 14865

Last change on this file since 14865 was 14865, checked in by gb, 8 years ago

A long time ago (2001), some PPC Linux distribution's C libraries
didn't define madvise(). It's probably time to stop doing it for
them.

(A bug that affected the LinuxPPC64 port went away after this change,
but it's not clear why; then again, that may have to do with the
PowerOpen? calling sequence and the TOC.)

If anyone's still running YDL 2.0 ... upgrade.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.9 KB
Line 
1/*   Copyright (C) 2009 Clozure Associates */
2/*   Copyright (C) 1994-2001 Digitool, Inc */
3/*   This file is part of Clozure CL. */
4
5/*   Clozure CL is licensed under the terms of the Lisp Lesser GNU Public */
6/*   License , known as the LLGPL and distributed with Clozure CL as the */
7/*   file "LICENSE".  The LLGPL consists of a preamble and the LGPL, */
8/*   which is distributed with Clozure CL as the file "LGPL".  Where these */
9/*   conflict, the preamble takes precedence. */
10
11/*   Clozure CL is referenced in the preamble as the "LIBRARY." */
12
13/*   The LLGPL is also available online at */
14/*   http://opensource.franz.com/preamble.html */
15
16
17       
18
19        include(lisp.s)
20
21        _beginfile
22/*  Zero R4 cache lines, starting at address in R3.  Each line is assumed to be */
23/* R5 bytes wide. */
24_exportfn(C(zero_cache_lines))
25        __(cmpri(cr0,r4,0))
26        __(mtctr r4)
27        __(beqlr)
281:
29        __(DCBZL(0,r3))
30        __(add r3,r3,r5)
31        __(bdnz 1b)
32        __(blr)
33_endfn
34
35/*  Flush R4 cache lines, starting at address in R3.  Each line is */
36/* assumed to be R5 bytes wide. */
37_exportfn(C(flush_cache_lines))
38        __(cmpri(cr0,r4,0))
39        __(mtctr r4)
40        __(mr r6,r3)
41        __(beqlr)
421:
43        __(dcbst 0,r3)
44        __(add r3,r3,r5)
45        __(bdnz 1b)
46        __(sync)                /* wait until dcbst's get to memory */
47        __(mr r3,r6)
48        __(mtctr r4)
492:     
50        __(icbi 0,r3)
51        __(add r3,r3,r5)
52        __(bdnz 2b)
53        __(sync)
54        __(isync)
55        __(blr)
56/* The strange reference to "exp" is supposed to force the kernel to */
57/* load libm, so lisp code can use it.   Under Darwin, the functionality */
58/* of libm is contained in libsystem, along with libc & everything else. */
59
60        __ifndef(`DARWIN')
61        .data
62        __ifdef(`PPC64')
63        .quad exp
64        __else
65        .long exp
66        __endif
67        .text       
68        __endif
69_endfn
70
71_exportfn(C(touch_page))
72        __(str(r3,0(r3)))
73        __(li r4,0)
74        __(str(r4,0(r3)))
75        __(li r3,1) /* can't assume that low 32 bits of r3 are non-zero */
76        .globl C(touch_page_end)
77C(touch_page_end):
78        __(blr)
79_endfn
80                               
81_exportfn(C(current_stack_pointer))
82        __(mr r3,sp)
83        __(blr)
84_endfn
85       
86_exportfn(C(count_leading_zeros))
87        __ifdef(`PPC64')
88        __(cntlzd r3,r3)
89        __else
90        __(cntlzw r3,r3)
91        __endif
92        __(blr)
93_endfn
94
95_exportfn(C(noop))
96        __(blr)
97_endfn
98
99_exportfn(C(set_fpscr))
100        __(stru(sp,-32(sp)))
101        __(stw r3,12(sp))
102        __(lfd f0,8(sp))
103        __(mtfsf 0xff,f0)
104        __(la sp,32(sp))
105        __(blr)
106_endfn
107
108
109_exportfn(C(get_fpscr))
110        __(stru(sp,-32(sp)))
111        __(mffs f0)
112        __(stfd f0,8(sp))
113        __(lwz r3,12(sp))
114        __(la sp,32(sp))
115        __(blr)
116_endfn
117               
118
119/* The Linux kernel is constantly enabling and disabling the FPU and enabling */
120/* FPU exceptions.  We can't touch the FPU without turning off the FPSCR`FEX' */
121/* bit and we can't turn off the FPSCR`FEX' bit without touching the FPU. */
122/* Force a distinguished exception, and let the handler for that exception */
123/* zero the fpscr in its exception context. */
124
125_exportfn(C(zero_fpscr))
126        __(uuo_zero_fpscr())
127        __(blr)
128_endfn
129       
130       
131_exportfn(C(save_fp_context))
132        __(subi r4,r3,8)
133        __(stfdu f0,8(r4))
134        __(stfdu f1,8(r4))
135        __(stfdu f2,8(r4))
136        __(stfdu f3,8(r4))
137        __(stfdu f4,8(r4))
138        __(stfdu f5,8(r4))
139        __(stfdu f6,8(r4))
140        __(stfdu f7,8(r4))
141        __(stfdu f8,8(r4))
142        __(stfdu f9,8(r4))
143        __(stfdu f10,8(r4))
144        __(stfdu f11,8(r4))
145        __(stfdu f12,8(r4))
146        __(stfdu f13,8(r4))
147        __(stfdu f14,8(r4))
148        __(stfdu f15,8(r4))
149        __(stfdu f16,8(r4))
150        __(stfdu f17,8(r4))
151        __(stfdu f18,8(r4))
152        __(stfdu f19,8(r4))
153        __(stfdu f20,8(r4))
154        __(stfdu f21,8(r4))
155        __(stfdu f22,8(r4))
156        __(stfdu f23,8(r4))
157        __(stfdu f24,8(r4))
158        __(stfdu f25,8(r4))
159        __(stfdu f26,8(r4))
160        __(stfdu f27,8(r4))
161        __(stfdu f28,8(r4))
162        __(stfdu f29,8(r4))
163        __(stfdu f30,8(r4))
164        __(stfdu f31,8(r4))
165        __(mffs f0)
166        __(stfd f0,8(r4))
167        __(lfd f0,0(r3))
168        __(blr)
169_endfn
170
171_exportfn(C(restore_fp_context))
172        __(mr r4,r3)
173        __(lfdu f1,8(r4))
174        __(lfdu f2,8(r4))
175        __(lfdu f3,8(r4))
176        __(lfdu f4,8(r4))
177        __(lfdu f5,8(r4))
178        __(lfdu f6,8(r4))
179        __(lfdu f7,8(r4))
180        __(lfdu f8,8(r4))
181        __(lfdu f9,8(r4))
182        __(lfdu f10,8(r4))
183        __(lfdu f11,8(r4))
184        __(lfdu f12,8(r4))
185        __(lfdu f13,8(r4))
186        __(lfdu f14,8(r4))
187        __(lfdu f15,8(r4))
188        __(lfdu f16,8(r4))
189        __(lfdu f17,8(r4))
190        __(lfdu f18,8(r4))
191        __(lfdu f19,8(r4))
192        __(lfdu f20,8(r4))
193        __(lfdu f21,8(r4))
194        __(lfdu f22,8(r4))
195        __(lfdu f23,8(r4))
196        __(lfdu f24,8(r4))
197        __(lfdu f25,8(r4))
198        __(lfdu f26,8(r4))
199        __(lfdu f27,8(r4))
200        __(lfdu f28,8(r4))
201        __(lfdu f29,8(r4))
202        __(lfdu f30,8(r4))
203        __(lfdu f31,8(r4))
204        __(lfd f0,8(r4))
205        __(mtfsf 0xff,f0)
206        __(lfd f0,0(r3))
207        __(blr)
208_endfn
209
210
211
212/* Atomically store new value (r5) in *r3, if old value == expected. */
213/* Return actual old value. */
214
215_exportfn(C(store_conditional))
216        __(mr r6,r3)
2171:      __(lrarx(r3,0,r6))
218        __(cmpw r3,r4)
219        __(bne- 2f)
220        __(strcx(r5,0,r6))
221        __(bne- 1b)
222        __(isync)
223        __(blr)
2242:      __(li r0,RESERVATION_DISCHARGE)
225        __(strcx(r0,0,r0))
226        __(blr)
227_endfn
228
229/* Atomically store new_value(r4) in *r3 ;  return previous contents */
230/* of *r3. */
231
232_exportfn(C(atomic_swap))
233        __(sync)
2341:      __(lrarx(r5,0,r3))
235        __(strcx(r4,0,r3))
236        __(bne- 1b)
237        __(isync)
238        __(mr r3,r5)
239        __(blr)
240_endfn
241
242/* Logior the value in *r3 with the value in r4 (presumably a bitmask with exactly 1 */
243/* bit set.)  Return non-zero if any of the bits in that bitmask were already set. */
244       
245_exportfn(C(atomic_ior))
246        __(sync)
2471:      __(lrarx(r5,0,r3))
248        __(or r6,r4,r5)
249        __(strcx(r6,0,r3))
250        __(bne- 1b)
251        __(isync)
252        __(and r3,r4,r5)
253        __(blr)
254_endfn
255
256
257/* Logand the value in *r3 with the value in r4 (presumably a bitmask with exactly 1 */
258/* bit set.)  Return the value now in *r3 (for some value of "now" */
259
260_exportfn(C(atomic_and))
261        __(sync)
2621:      __(lrarx(r5,0,r3))
263        __(and r6,r4,r5)
264        __(strcx(r6,0,r3))
265        __(bne- 1b)
266        __(isync)
267        __(mr r3,r6)
268        __(blr)
269_endfn
270               
271       
272        __ifdef(`DARWIN')
273_exportfn(C(enable_fp_exceptions))
274        __(.long 0)
275        __(blr)
276_endfn
277       
278_exportfn(C(disable_fp_exceptions))
279        __(.long 0)
280        __(blr)
281_endfn
282
283_exportfn(C(pseudo_sigreturn))
284        __(.long 0)
285        __(b C(pseudo_sigreturn))
286_endfn
287        __endif
288       
289/* Copy all 32 Altivec registers (+ VSCR & VRSAVE) to the buffer */
290/* in r3.  If the buffer's non-NULL, it's aligned and big enough, */
291/* and Altivec is present. */
292
293_exportfn(C(put_vector_registers))
294        __(cmpri(r3,0))
295        __(li r4,0)
296        __(beqlr)
297        __(stvx v0,r3,r4)
298        __(la r4,16(r4))
299        __(stvx v1,r3,r4)
300        __(la r4,16(r4))
301        __(stvx v2,r3,r4)
302        __(la r4,16(r4))
303        __(stvx v3,r3,r4)
304        __(la r4,16(r4))
305        __(stvx v4,r3,r4)
306        __(la r4,16(r4))
307        __(stvx v5,r3,r4)
308        __(la r4,16(r4))
309        __(stvx v6,r3,r4)
310        __(la r4,16(r4))
311        __(stvx v7,r3,r4)
312        __(la r4,16(r4))
313        __(stvx v8,r3,r4)
314        __(la r4,16(r4))
315        __(stvx v9,r3,r4)
316        __(la r4,16(r4))
317        __(stvx v10,r3,r4)
318        __(la r4,16(r4))
319        __(stvx v11,r3,r4)
320        __(la r4,16(r4))
321        __(stvx v12,r3,r4)
322        __(la r4,16(r4))
323        __(stvx v13,r3,r4)
324        __(la r4,16(r4))
325        __(stvx v14,r3,r4)
326        __(la r4,16(r4))
327        __(stvx v15,r3,r4)
328        __(la r4,16(r4))
329        __(stvx v16,r3,r4)
330        __(la r4,16(r4))
331        __(stvx v17,r3,r4)
332        __(la r4,16(r4))
333        __(stvx v18,r3,r4)
334        __(la r4,16(r4))
335        __(stvx v19,r3,r4)
336        __(la r4,16(r4))
337        __(stvx v20,r3,r4)
338        __(la r4,16(r4))
339        __(stvx v21,r3,r4)
340        __(la r4,16(r4))
341        __(stvx v22,r3,r4)
342        __(la r4,16(r4))
343        __(stvx v23,r3,r4)
344        __(la r4,16(r4))
345        __(stvx v24,r3,r4)
346        __(la r4,16(r4))
347        __(stvx v25,r3,r4)
348        __(la r4,16(r4))
349        __(stvx v26,r3,r4)
350        __(la r4,16(r4))
351        __(stvx v27,r3,r4)
352        __(la r4,16(r4))
353        __(stvx v28,r3,r4)
354        __(la r4,16(r4))
355        __(stvx v29,r3,r4)
356        __(la r4,16(r4))
357        __(stvx v30,r3,r4)
358        __(la r4,16(r4))
359        __(stvx v31,r3,r4)
360        __(la r4,16(r4))
361        __(mfvscr v0)
362        __(stvx v0,r3,r4)
363        __(mfspr r5,256)
364        __(stw r5,8(r4))
365        __(blr)
366_endfn
367
368_exportfn(C(get_vector_registers))
369        __(cmpri(r3,0))
370        __(li r4,32*16)
371        __(beqlr)
372        __(lvx v0,r3,r4)
373        __(mtvscr v0)
374        __(lwz r5,8(r4))
375        __(mtspr 256,r5)
376        __(la r4,-16(r4))
377        __(lvx v31,r3,r4)
378        __(la r4,-16(r4))
379        __(lvx v30,r3,r4)
380        __(la r4,-16(r4))
381        __(lvx v29,r3,r4)
382        __(la r4,-16(r4))
383        __(lvx v28,r3,r4)
384        __(la r4,-16(r4))
385        __(lvx v27,r3,r4)
386        __(la r4,-16(r4))
387        __(lvx v26,r3,r4)
388        __(la r4,-16(r4))
389        __(lvx v25,r3,r4)
390        __(la r4,-16(r4))
391        __(lvx v24,r3,r4)
392        __(la r4,-16(r4))
393        __(lvx v23,r3,r4)
394        __(la r4,-16(r4))
395        __(lvx v22,r3,r4)
396        __(la r4,-16(r4))
397        __(lvx v21,r3,r4)
398        __(la r4,-16(r4))
399        __(lvx v20,r3,r4)
400        __(la r4,-16(r4))
401        __(lvx v19,r3,r4)
402        __(la r4,-16(r4))
403        __(lvx v18,r3,r4)
404        __(la r4,-16(r4))
405        __(lvx v17,r3,r4)
406        __(la r4,-16(r4))
407        __(lvx v16,r3,r4)
408        __(la r4,-16(r4))
409        __(lvx v15,r3,r4)
410        __(la r4,-16(r4))
411        __(lvx v14,r3,r4)
412        __(la r4,-16(r4))
413        __(lvx v13,r3,r4)
414        __(la r4,-16(r4))
415        __(lvx v12,r3,r4)
416        __(la r4,-16(r4))
417        __(lvx v11,r3,r4)
418        __(la r4,-16(r4))
419        __(lvx v10,r3,r4)
420        __(la r4,-16(r4))
421        __(lvx v9,r3,r4)
422        __(la r4,-16(r4))
423        __(lvx v8,r3,r4)
424        __(la r4,-16(r4))
425        __(lvx v7,r3,r4)
426        __(la r4,-16(r4))
427        __(lvx v6,r3,r4)
428        __(la r4,-16(r4))
429        __(lvx v5,r3,r4)
430        __(la r4,-16(r4))
431        __(lvx v4,r3,r4)
432        __(la r4,-16(r4))
433        __(lvx v3,r3,r4)
434        __(la r4,-16(r4))
435        __(lvx v2,r3,r4)
436        __(la r4,-16(r4))
437        __(lvx v1,r3,r4)
438        __(la r4,-16(r4))
439        __(lvx v0,r3,r4)
440        __(blr)
441_endfn
442
443
444        _endfile
Note: See TracBrowser for help on using the repository browser.