source: release/1.9/source/lisp-kernel/ppc-asmutils.s @ 16083

Last change on this file since 16083 was 15231, checked in by gb, 7 years ago

Strangely enough, the PPC doesn't have a "subi." instruction.
Who knew ?

  • 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_endfn
57
58_exportfn(C(touch_page))
59        __(str(r3,0(r3)))
60        __(li r4,0)
61        __(str(r4,0(r3)))
62        __(li r3,1) /* can't assume that low 32 bits of r3 are non-zero */
63        .globl C(touch_page_end)
64C(touch_page_end):
65        __(blr)
66_endfn
67                               
68_exportfn(C(current_stack_pointer))
69        __(mr r3,sp)
70        __(blr)
71_endfn
72       
73_exportfn(C(count_leading_zeros))
74        __ifdef(`PPC64')
75        __(cntlzd r3,r3)
76        __else
77        __(cntlzw r3,r3)
78        __endif
79        __(blr)
80_endfn
81
82_exportfn(C(noop))
83        __(blr)
84_endfn
85
86_exportfn(C(set_fpscr))
87        __(stru(sp,-32(sp)))
88        __(stw r3,12(sp))
89        __(lfd f0,8(sp))
90        __(mtfsf 0xff,f0)
91        __(la sp,32(sp))
92        __(blr)
93_endfn
94
95
96_exportfn(C(get_fpscr))
97        __(stru(sp,-32(sp)))
98        __(mffs f0)
99        __(stfd f0,8(sp))
100        __(lwz r3,12(sp))
101        __(la sp,32(sp))
102        __(blr)
103_endfn
104               
105
106/* The Linux kernel is constantly enabling and disabling the FPU and enabling */
107/* FPU exceptions.  We can't touch the FPU without turning off the FPSCR`FEX' */
108/* bit and we can't turn off the FPSCR`FEX' bit without touching the FPU. */
109/* Force a distinguished exception, and let the handler for that exception */
110/* zero the fpscr in its exception context. */
111
112_exportfn(C(zero_fpscr))
113        __(uuo_zero_fpscr())
114        __(blr)
115_endfn
116       
117       
118_exportfn(C(save_fp_context))
119        __(subi r4,r3,8)
120        __(stfdu f0,8(r4))
121        __(stfdu f1,8(r4))
122        __(stfdu f2,8(r4))
123        __(stfdu f3,8(r4))
124        __(stfdu f4,8(r4))
125        __(stfdu f5,8(r4))
126        __(stfdu f6,8(r4))
127        __(stfdu f7,8(r4))
128        __(stfdu f8,8(r4))
129        __(stfdu f9,8(r4))
130        __(stfdu f10,8(r4))
131        __(stfdu f11,8(r4))
132        __(stfdu f12,8(r4))
133        __(stfdu f13,8(r4))
134        __(stfdu f14,8(r4))
135        __(stfdu f15,8(r4))
136        __(stfdu f16,8(r4))
137        __(stfdu f17,8(r4))
138        __(stfdu f18,8(r4))
139        __(stfdu f19,8(r4))
140        __(stfdu f20,8(r4))
141        __(stfdu f21,8(r4))
142        __(stfdu f22,8(r4))
143        __(stfdu f23,8(r4))
144        __(stfdu f24,8(r4))
145        __(stfdu f25,8(r4))
146        __(stfdu f26,8(r4))
147        __(stfdu f27,8(r4))
148        __(stfdu f28,8(r4))
149        __(stfdu f29,8(r4))
150        __(stfdu f30,8(r4))
151        __(stfdu f31,8(r4))
152        __(mffs f0)
153        __(stfd f0,8(r4))
154        __(lfd f0,0(r3))
155        __(blr)
156_endfn
157
158_exportfn(C(restore_fp_context))
159        __(mr r4,r3)
160        __(lfdu f1,8(r4))
161        __(lfdu f2,8(r4))
162        __(lfdu f3,8(r4))
163        __(lfdu f4,8(r4))
164        __(lfdu f5,8(r4))
165        __(lfdu f6,8(r4))
166        __(lfdu f7,8(r4))
167        __(lfdu f8,8(r4))
168        __(lfdu f9,8(r4))
169        __(lfdu f10,8(r4))
170        __(lfdu f11,8(r4))
171        __(lfdu f12,8(r4))
172        __(lfdu f13,8(r4))
173        __(lfdu f14,8(r4))
174        __(lfdu f15,8(r4))
175        __(lfdu f16,8(r4))
176        __(lfdu f17,8(r4))
177        __(lfdu f18,8(r4))
178        __(lfdu f19,8(r4))
179        __(lfdu f20,8(r4))
180        __(lfdu f21,8(r4))
181        __(lfdu f22,8(r4))
182        __(lfdu f23,8(r4))
183        __(lfdu f24,8(r4))
184        __(lfdu f25,8(r4))
185        __(lfdu f26,8(r4))
186        __(lfdu f27,8(r4))
187        __(lfdu f28,8(r4))
188        __(lfdu f29,8(r4))
189        __(lfdu f30,8(r4))
190        __(lfdu f31,8(r4))
191        __(lfd f0,8(r4))
192        __(mtfsf 0xff,f0)
193        __(lfd f0,0(r3))
194        __(blr)
195_endfn
196
197
198
199/* Atomically store new value (r5) in *r3, if old value == expected. */
200/* Return actual old value. */
201
202_exportfn(C(store_conditional))
203        __(mr r6,r3)
2041:      __(lrarx(r3,0,r6))
205        __(cmpw r3,r4)
206        __(bne- 2f)
207        __(strcx(r5,0,r6))
208        __(bne- 1b)
209        __(isync)
210        __(blr)
2112:      __(li r0,RESERVATION_DISCHARGE)
212        __(strcx(r0,0,r0))
213        __(blr)
214_endfn
215
216/* Atomically store new_value(r4) in *r3 ;  return previous contents */
217/* of *r3. */
218
219_exportfn(C(atomic_swap))
220        __(sync)
2211:      __(lrarx(r5,0,r3))
222        __(strcx(r4,0,r3))
223        __(bne- 1b)
224        __(isync)
225        __(mr r3,r5)
226        __(blr)
227_endfn
228
229/* Logior the value in *r3 with the value in r4 (presumably a bitmask with exactly 1 */
230/* bit set.)  Return non-zero if any of the bits in that bitmask were already set. */
231       
232_exportfn(C(atomic_ior))
233        __(sync)
2341:      __(lrarx(r5,0,r3))
235        __(or r6,r4,r5)
236        __(strcx(r6,0,r3))
237        __(bne- 1b)
238        __(isync)
239        __(and r3,r4,r5)
240        __(blr)
241_endfn
242
243
244/* Logand the value in *r3 with the value in r4 (presumably a bitmask with exactly 1 */
245/* bit set.)  Return the value now in *r3 (for some value of "now" */
246
247_exportfn(C(atomic_and))
248        __(sync)
2491:      __(lrarx(r5,0,r3))
250        __(and r6,r4,r5)
251        __(strcx(r6,0,r3))
252        __(bne- 1b)
253        __(isync)
254        __(mr r3,r6)
255        __(blr)
256_endfn
257               
258       
259        __ifdef(`DARWIN')
260_exportfn(C(enable_fp_exceptions))
261        __(.long 0)
262        __(blr)
263_endfn
264       
265_exportfn(C(disable_fp_exceptions))
266        __(.long 0)
267        __(blr)
268_endfn
269
270_exportfn(C(pseudo_sigreturn))
271        __(.long 0)
272        __(b C(pseudo_sigreturn))
273_endfn
274        __endif
275       
276/* Copy all 32 Altivec registers (+ VSCR & VRSAVE) to the buffer */
277/* in r3.  If the buffer's non-NULL, it's aligned and big enough, */
278/* and Altivec is present. */
279
280_exportfn(C(put_vector_registers))
281        __(cmpri(r3,0))
282        __(li r4,0)
283        __(beqlr)
284        __(stvx v0,r3,r4)
285        __(la r4,16(r4))
286        __(stvx v1,r3,r4)
287        __(la r4,16(r4))
288        __(stvx v2,r3,r4)
289        __(la r4,16(r4))
290        __(stvx v3,r3,r4)
291        __(la r4,16(r4))
292        __(stvx v4,r3,r4)
293        __(la r4,16(r4))
294        __(stvx v5,r3,r4)
295        __(la r4,16(r4))
296        __(stvx v6,r3,r4)
297        __(la r4,16(r4))
298        __(stvx v7,r3,r4)
299        __(la r4,16(r4))
300        __(stvx v8,r3,r4)
301        __(la r4,16(r4))
302        __(stvx v9,r3,r4)
303        __(la r4,16(r4))
304        __(stvx v10,r3,r4)
305        __(la r4,16(r4))
306        __(stvx v11,r3,r4)
307        __(la r4,16(r4))
308        __(stvx v12,r3,r4)
309        __(la r4,16(r4))
310        __(stvx v13,r3,r4)
311        __(la r4,16(r4))
312        __(stvx v14,r3,r4)
313        __(la r4,16(r4))
314        __(stvx v15,r3,r4)
315        __(la r4,16(r4))
316        __(stvx v16,r3,r4)
317        __(la r4,16(r4))
318        __(stvx v17,r3,r4)
319        __(la r4,16(r4))
320        __(stvx v18,r3,r4)
321        __(la r4,16(r4))
322        __(stvx v19,r3,r4)
323        __(la r4,16(r4))
324        __(stvx v20,r3,r4)
325        __(la r4,16(r4))
326        __(stvx v21,r3,r4)
327        __(la r4,16(r4))
328        __(stvx v22,r3,r4)
329        __(la r4,16(r4))
330        __(stvx v23,r3,r4)
331        __(la r4,16(r4))
332        __(stvx v24,r3,r4)
333        __(la r4,16(r4))
334        __(stvx v25,r3,r4)
335        __(la r4,16(r4))
336        __(stvx v26,r3,r4)
337        __(la r4,16(r4))
338        __(stvx v27,r3,r4)
339        __(la r4,16(r4))
340        __(stvx v28,r3,r4)
341        __(la r4,16(r4))
342        __(stvx v29,r3,r4)
343        __(la r4,16(r4))
344        __(stvx v30,r3,r4)
345        __(la r4,16(r4))
346        __(stvx v31,r3,r4)
347        __(la r4,16(r4))
348        __(mfvscr v0)
349        __(stvx v0,r3,r4)
350        __(mfspr r5,256)
351        __(stw r5,8(r4))
352        __(blr)
353_endfn
354
355_exportfn(C(get_vector_registers))
356        __(cmpri(r3,0))
357        __(li r4,32*16)
358        __(beqlr)
359        __(lvx v0,r3,r4)
360        __(mtvscr v0)
361        __(lwz r5,8(r4))
362        __(mtspr 256,r5)
363        __(la r4,-16(r4))
364        __(lvx v31,r3,r4)
365        __(la r4,-16(r4))
366        __(lvx v30,r3,r4)
367        __(la r4,-16(r4))
368        __(lvx v29,r3,r4)
369        __(la r4,-16(r4))
370        __(lvx v28,r3,r4)
371        __(la r4,-16(r4))
372        __(lvx v27,r3,r4)
373        __(la r4,-16(r4))
374        __(lvx v26,r3,r4)
375        __(la r4,-16(r4))
376        __(lvx v25,r3,r4)
377        __(la r4,-16(r4))
378        __(lvx v24,r3,r4)
379        __(la r4,-16(r4))
380        __(lvx v23,r3,r4)
381        __(la r4,-16(r4))
382        __(lvx v22,r3,r4)
383        __(la r4,-16(r4))
384        __(lvx v21,r3,r4)
385        __(la r4,-16(r4))
386        __(lvx v20,r3,r4)
387        __(la r4,-16(r4))
388        __(lvx v19,r3,r4)
389        __(la r4,-16(r4))
390        __(lvx v18,r3,r4)
391        __(la r4,-16(r4))
392        __(lvx v17,r3,r4)
393        __(la r4,-16(r4))
394        __(lvx v16,r3,r4)
395        __(la r4,-16(r4))
396        __(lvx v15,r3,r4)
397        __(la r4,-16(r4))
398        __(lvx v14,r3,r4)
399        __(la r4,-16(r4))
400        __(lvx v13,r3,r4)
401        __(la r4,-16(r4))
402        __(lvx v12,r3,r4)
403        __(la r4,-16(r4))
404        __(lvx v11,r3,r4)
405        __(la r4,-16(r4))
406        __(lvx v10,r3,r4)
407        __(la r4,-16(r4))
408        __(lvx v9,r3,r4)
409        __(la r4,-16(r4))
410        __(lvx v8,r3,r4)
411        __(la r4,-16(r4))
412        __(lvx v7,r3,r4)
413        __(la r4,-16(r4))
414        __(lvx v6,r3,r4)
415        __(la r4,-16(r4))
416        __(lvx v5,r3,r4)
417        __(la r4,-16(r4))
418        __(lvx v4,r3,r4)
419        __(la r4,-16(r4))
420        __(lvx v3,r3,r4)
421        __(la r4,-16(r4))
422        __(lvx v2,r3,r4)
423        __(la r4,-16(r4))
424        __(lvx v1,r3,r4)
425        __(la r4,-16(r4))
426        __(lvx v0,r3,r4)
427        __(blr)
428_endfn
429
430/* zero N (r4) dnodes, starting at the dnode-aligned address in r3 */
431_exportfn(C(zero_dnodes))
432        __(cmpri(r4,0))
433        __(li r5,0)
434        __(li r6,0)
435        __(b 1f)
4360:      __(subi r4,r4,1)
437        __(str(r5,0(r3)))
438        __(cmpri(r4,0))
439        __(str(r6,node_size(r3)))
440        __(la r3,dnode_size(r3))
4411:      __(bne 0b)
442        __(blr)
443_endfn               
444        _endfile
Note: See TracBrowser for help on using the repository browser.