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

Last change on this file since 14261 was 13337, checked in by plkrueger, 10 years ago

Don't change the m4 quoting characters from their defaults (`').
(On the ARM, square brackets are used to denote memory operands, curly
braces surround register lists, and multicharacter quoting delimeters
look funny ...)

Some versions (at least) of m4 are confused by quoting characters in
comments, so try to refrain from using contractions ...

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.3 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/* Some versions of Linux don't implement madvise().  That's */
444/* not catastrophic, but some versions of glibc will make a */
445/* big deal out of that at link time.  This is here to try */
446/* to fool those versions of glibc. */
447
448        __ifdef(`LINUX')
449        .globl set_errno
450_exportfn(C(madvise))
451        __(li r0,205)   /* _NR_madvise; see /usr/include/asm/unistd.h */
452        __(sc)
453        __(bnslr)
454        __(b set_errno)
455_endfn
456        __endif
457
458        _endfile
Note: See TracBrowser for help on using the repository browser.