source: trunk/source/compiler/PPC/ppc-arch.lisp @ 13330

Last change on this file since 13330 was 13330, checked in by gz, 10 years ago

Changes in handling of weak vectors (i.e. populations and weak hash table vectors) in ephemeral gc, to allow egc to collect ephemeral objects stored in older weak vectors:

  • all tenured populations are now processed at every gc. (In normal use, population.data has newest conses at the front, and processing will terminate as soon as it reaches a cons not in the area being gc'd, so in practice this will only process cells actually added in the current generation, which should limit the performance impact)
  • the intergenerational pointers of all tenured weak hash vectors are now processed at every gc.

Details:

  • add new global WEAKVLL to store weak vectors between gc's, update it during gc.
  • initialize GCweakvll from WEAKVLL so tenured vectors are included.
  • keep the gc-link field in weak vectors untagged (i.e. tagged as a fixnum) so can control when they get forwarded.
  • when marking/reaping weak hash vectors, use refbits to skip over uninteresting entries.
  • during normal mark phase, arrange to not mark population.data even if intergen.
  • account for population.termination becoming intergen even if it wasn't before.
  • save WEAKVLL when image is saved
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 16.1 KB
Line 
1;;;-*- Mode: Lisp; Package: (PPC :use CL) -*-
2;;;
3;;;   Copyright (C) 2009 Clozure Associates
4;;;   Copyright (C) 1994-2001 Digitool, Inc
5;;;   This file is part of Clozure CL. 
6;;;
7;;;   Clozure CL is licensed under the terms of the Lisp Lesser GNU Public
8;;;   License , known as the LLGPL and distributed with Clozure CL as the
9;;;   file "LICENSE".  The LLGPL consists of a preamble and the LGPL,
10;;;   which is distributed with Clozure CL as the file "LGPL".  Where these
11;;;   conflict, the preamble takes precedence. 
12;;;
13;;;   Clozure CL is referenced in the preamble as the "LIBRARY."
14;;;
15;;;   The LLGPL is also available online at
16;;;   http://opensource.franz.com/preamble.html
17
18(defpackage "PPC"
19  (:use "CL"))
20
21(require "ARCH")
22
23(in-package "PPC")
24;;; Lisp registers.
25(eval-when (:compile-toplevel :execute)
26  (defmacro defregs (&body regs)
27    `(progn
28       (ccl::defenum () ,@regs)
29       (defparameter *gpr-register-names* ,(coerce (mapcar #'string regs) 'vector))))
30  (defmacro deffpregs (&body regs)
31    `(progn
32       (ccl::defenum () ,@regs)
33       (defparameter *fpr-register-names* ,(coerce (mapcar #'string regs) 'vector))))
34  (defmacro defvregs (&body regs)
35    `(progn
36      (ccl::defenum () ,@regs)
37      (defparameter *vector-register-names* ,(coerce (mapcar #'string regs) 'vector))
38      )))
39
40(defregs
41  rzero                                 ; Always contains 0; not as handy as it sounds.
42  sp                                    ; The control stack.  Aligned on 16-byte boundary.
43  target-1                              ; volatile reg on Darwin, tp or TOC on Linux.
44  imm0                                  ; Unboxed, volatile registers.
45  imm1 
46  imm2 
47  imm3 
48  imm4
49  imm5
50  allocptr
51  allocbase
52  nargs                                 ; Volatile.  SHOULDN'T be used for tag extraction. (TWI handler confusion.)
53  tsp                                   ; Temp-stack pointer.
54  target-2
55  loc-pc                                ; for return PC only.
56  vsp                                   ; Value stack pointer; grows towards 0.
57  fn                                    ; Current function (constants vector).
58  temp3                                 ; Boxed, volatile registers.  Some
59                                        ; may be defined on function entry.
60  temp2 
61  temp1 
62  temp0 
63  arg_x                                 ; Next-to-next-to-last function arg.
64  arg_y                                 ; Next-to-last function argument.
65  arg_z                                 ; Last function argument.
66  save7                                 ; Boxed, nonvolatile registers.
67  save6
68  save5
69  save4 
70  save3 
71  save2 
72  save1 
73  save0
74  )
75
76(deffpregs 
77  fp0
78  fp1
79  fp2
80  fp3
81  fp4
82  fp5
83  fp6
84  fp7
85  fp8
86  fp9
87  fp10
88  fp11
89  fp12
90  fp13
91  fp14
92  fp15
93  fp16
94  fp17
95  fp18
96  fp19
97  fp20
98  fp21
99  fp22
100  fp23
101  fp24
102  fp25
103  fp26
104  fp27
105  fp28
106  fp29
107  fp30
108  fp31)
109
110(defvregs
111  vr0                                   ; General temp vector register
112  vr1                                   ; Most-significant quadword when word-aligning
113  vr2                                   ; Least-significant quadword when word-aligning
114  vr3                                   ; Operand A resulting from word-aligning
115  vr4                                   ; Operand B resulting from word-aligning
116  vr5                                   ; Result from operations on A and B
117  vr6
118  vr7
119  vr8
120  vr9
121  vr10
122  vr11
123  vr12
124  vr13
125  vr14
126  vr15
127  vr16
128  vr17
129  vr18
130  vr19
131  ;;By convention, registers after this point are considered non-volatile. Callee should save.
132  vr20
133  vr21
134  vr22
135  vr23
136  vr24
137  vr25
138  vr26
139  vr27                                  ; Permutation control register A for loads
140  vr28                                  ; Permutation control register B for stores
141  vr29                                  ; mask register
142  vr30                                  ; All zeros
143  vr31                                  ; All ones
144  )
145
146
147
148;;; Calling sequence may pass additional arguments in temp registers.
149;;; "nfn" (new function) is always passed; it's the new value of "fn".
150(defconstant nfn temp2)
151
152;;; CLOS may pass the context for, e.g.., CALL-NEXT-METHOD in
153;;;; the "next-method-context" register.
154(defconstant next-method-context temp1)
155
156
157;;; It's handy to have 0.0 in an fpr.
158(defconstant fp-zero fp31)
159
160; Also handy to have #x4330000080000000 in an fpr, for s32->float conversion.
161(defconstant fp-s32conv fp30)
162
163(defconstant fname temp3)
164
165;;; Calling sequence may pass additional arguments in temp registers.
166;;; "nfn" (new function) is always passed; it's the new value of "fn".
167(defconstant nfn temp2)
168
169;;; CLOS may pass the context for, e.g.., CALL-NEXT-METHOD in
170;;;; the "next-method-context" register.
171(defconstant next-method-context temp1)
172
173
174;;; It's handy to have 0.0 in an fpr.
175(defconstant fp-zero fp31)
176
177; Also handy to have #x4330000080000000 in an fpr, for s32->float conversion.
178(defconstant fp-s32conv fp30)
179
180(ccl::defenum (:prefix "FPSCR-" :suffix "-BIT")
181  fx
182  fex
183  vx
184  ox
185  ux
186  zx
187  xx
188  vxsnan
189  vxisi
190  vxidi
191  vxzdz
192  vximz
193  vxvc
194  fr
195  fi
196  fprfc
197  fl
198  fg
199  fe
200  fu
201  nil
202  vxsoft
203  vxsqrt
204  vxcvi
205  ve
206  oe
207  ue
208  ze
209  xe
210  ni
211  rn0
212  rn1
213)
214
215(ccl::defenum (:prefix "PPC-" :suffix "-BIT")
216  lt
217  gt
218  eq
219  so
220)
221
222;;; Kernel globals are allocated "below" nil.  This list (used to map
223;;; symbolic names to rnil-relative offsets) must (of course) exactly
224;;; match the kernel's notion of where things are.
225;;; The order here matches "ccl:lisp-kernel;lisp_globals.h" & the
226;;; lisp_globals record in "ccl:lisp-kernel;*constants*.s"
227(defparameter *ppc-kernel-globals*
228  '(get-tcr                             ; callback to obtain (real) tcr
229    tcr-count
230    interrupt-signal                    ; used by PROCESS-INTERRUPT
231    kernel-imports                      ; some things we need to have imported for us.
232    objc-2-personality
233    savetoc                  ; used to save TOC on some platforms
234    saver13                             ; used to save r13 on some platforms
235    subprims-base                       ; start of dynamic subprims jump table
236    ret1valaddr                         ; magic multiple-values return address.
237    tcr-key                             ; tsd key for thread's tcr
238    area-lock                           ; serialize access to gc
239    exception-lock                      ; serialize exception handling
240    static-conses                       ; when FREEZE is in effect
241    default-allocation-quantum          ; log2_heap_segment_size, as a fixnum.
242    intflag                             ; interrupt-pending flag
243    gc-inhibit-count                    ; for gc locking
244    refbits                             ; oldspace refbits
245    oldspace-dnode-count                ; number of dnodes in dynamic space that are older than
246                                        ; youngest generation
247    altivec-present                     ; non-zero if cpu supports AltiVec
248    fwdnum                              ; fixnum: GC "forwarder" call count.
249    gc-count                            ; fixnum: GC call count.
250    gcable-pointers                     ; linked-list of weak macptrs.
251    heap-start                          ; start of lisp heap
252    heap-end                            ; end of lisp heap
253    statically-linked                   ; true if the lisp kernel is statically linked
254    stack-size                          ; value of --stack-size arg
255    objc-2-begin-catch                  ; objc_begin_catch
256    kernel-path
257    all-areas                           ; doubly-linked area list
258    lexpr-return                        ; multiple-value lexpr return address
259    lexpr-return1v                      ; single-value lexpr return address
260    in-gc                               ; non-zero when GC-ish thing active
261    free-static-conses                  ; fixnum
262    objc-2-end-catch                    ; _objc_end_catch
263    short-float-zero                    ; low half of 1.0d0
264    double-float-one                    ; high half of 1.0d0
265    static-cons-area                    ;
266    exception-saved-registers           ; saved registers from exception frame
267    oldest-ephemeral                    ; doublenode address of oldest ephemeral object or 0
268    tenured-area                        ; the tenured_area.
269    errno                               ; address of C lib errno
270    argv                                ; address of C lib argv
271    host-platform                       ; 0 on MacOS, 1 on PPC Linux, 2 on VxWorks ...
272    batch-flag                          ; non-zero if --batch specified
273    unwind-resume                       ; _Unwind_Resume
274    weak-gc-method                      ; weak gc algorithm.
275    image-name                          ; current image name
276    initial-tcr                         ; initial thread's context record
277    weakvll                             ; all populations as of last GC
278    ))
279
280;;; The order here matches "ccl:lisp-kernel;lisp_globals.h" and the nrs record
281;;; in "ccl:lisp-kernel;constants.s".
282(defparameter *ppc-nil-relative-symbols*
283  '(t
284    nil
285    ccl::%err-disp
286    ccl::cmain
287    eval
288    ccl::apply-evaluated-function
289    error   
290    ccl::%defun
291    ccl::%defvar
292    ccl::%defconstant
293    ccl::%macro
294    ccl::%kernel-restart
295    *package*
296    ccl::*total-bytes-freed*
297    :allow-other-keys   
298    ccl::%toplevel-catch%
299    ccl::%toplevel-function%
300    ccl::%pascal-functions%   
301    ccl::*all-metered-functions*
302    ccl::*total-gc-microseconds*
303    ccl::%builtin-functions%
304    ccl::%unbound-function%
305    ccl::%init-misc
306    ccl::%macro-code%
307    ccl::%closure-code%
308    ccl::%new-gcable-ptr
309    ccl::*gc-event-status-bits*
310    ccl::*post-gc-hook*
311    ccl::%handlers%
312    ccl::%all-packages%
313    ccl::*keyword-package* 
314    ccl::%finalization-alist%
315    ccl::%foreign-thread-control
316    ))
317
318;;; Old (and slightly confusing) name; NIL used to be in a register.
319(defparameter *ppc-nilreg-relative-symbols* *ppc-nil-relative-symbols*)
320
321
322
323
324
325(eval-when (:compile-toplevel :load-toplevel :execute)
326(defparameter *ppc-subprims-shift* 2)
327(defparameter *ppc-subprims-base* (ash 5 12) )
328)
329
330;;; For now, nothing's nailed down and we don't say anything about
331;;; registers clobbered.
332;;; These are shared between ppc32 and ppc64.
333(let* ((origin *ppc-subprims-base*)
334       (step (ash 1 *ppc-subprims-shift*)))
335  (flet ((define-ppc-subprim (name)
336             (ccl::make-subprimitive-info :name (string name)
337                                          :offset (prog1 origin
338                                                    (incf origin step)))))
339    (macrolet ((defppcsubprim (name)
340                   `(define-ppc-subprim ',name)))
341      (defparameter *ppc-subprims*
342        (vector
343         (defppcsubprim .SPjmpsym)
344         (defppcsubprim .SPjmpnfn)
345         (defppcsubprim .SPfuncall)
346         (defppcsubprim .SPmkcatch1v)
347         (defppcsubprim .SPmkunwind)
348         (defppcsubprim .SPmkcatchmv)
349         (defppcsubprim .SPthrow)
350         (defppcsubprim .SPnthrowvalues)
351         (defppcsubprim .SPnthrow1value)
352         (defppcsubprim .SPbind)
353         (defppcsubprim .SPbind-self)
354         (defppcsubprim .SPbind-nil)
355         (defppcsubprim .SPbind-self-boundp-check)
356         (defppcsubprim .SPrplaca)
357         (defppcsubprim .SPrplacd)
358         (defppcsubprim .SPconslist)
359         (defppcsubprim .SPconslist-star)
360         (defppcsubprim .SPstkconslist)
361         (defppcsubprim .SPstkconslist-star)
362         (defppcsubprim .SPmkstackv)
363         (defppcsubprim .SPsubtag-misc-ref)
364         (defppcsubprim .SPsetqsym)
365         (defppcsubprim .SPprogvsave)
366         (defppcsubprim .SPstack-misc-alloc)
367         (defppcsubprim .SPgvector)
368         (defppcsubprim .SPnvalret)
369         (defppcsubprim .SPmvpass)
370         (defppcsubprim .SPfitvals)
371         (defppcsubprim .SPnthvalue)
372         (defppcsubprim .SPvalues)
373         (defppcsubprim .SPdefault-optional-args)
374         (defppcsubprim .SPopt-supplied-p)
375         (defppcsubprim .SPheap-rest-arg)
376         (defppcsubprim .SPreq-heap-rest-arg)
377         (defppcsubprim .SPheap-cons-rest-arg)
378         (defppcsubprim .SPsimple-keywords)
379         (defppcsubprim .SPkeyword-args)
380         (defppcsubprim .SPkeyword-bind)
381         (defppcsubprim .SPpoweropen-ffcall)
382         (defppcsubprim .SParef2)
383         (defppcsubprim .SPksignalerr)
384         (defppcsubprim .SPstack-rest-arg)
385         (defppcsubprim .SPreq-stack-rest-arg)
386         (defppcsubprim .SPstack-cons-rest-arg)
387         (defppcsubprim .SPpoweropen-callbackX)
388         (defppcsubprim .SPcall-closure)
389         (defppcsubprim .SPgetXlong)
390         (defppcsubprim .SPspreadargz)
391         (defppcsubprim .SPtfuncallgen)
392         (defppcsubprim .SPtfuncallslide)
393         (defppcsubprim .SPtfuncallvsp)
394         (defppcsubprim .SPtcallsymgen)
395         (defppcsubprim .SPtcallsymslide)
396         (defppcsubprim .SPtcallsymvsp)
397         (defppcsubprim .SPtcallnfngen)
398         (defppcsubprim .SPtcallnfnslide)
399         (defppcsubprim .SPtcallnfnvsp)
400         (defppcsubprim .SPmisc-ref)
401         (defppcsubprim .SPmisc-set)
402         (defppcsubprim .SPstkconsyz)
403         (defppcsubprim .SPstkvcell0)
404         (defppcsubprim .SPstkvcellvsp)
405         (defppcsubprim .SPmakestackblock)
406         (defppcsubprim .SPmakestackblock0)
407         (defppcsubprim .SPmakestacklist)
408         (defppcsubprim .SPstkgvector)
409         (defppcsubprim .SPmisc-alloc)
410         (defppcsubprim .SPpoweropen-ffcallX)
411         (defppcsubprim .SPgvset)
412         (defppcsubprim .SPmacro-bind)
413         (defppcsubprim .SPdestructuring-bind)
414         (defppcsubprim .SPdestructuring-bind-inner)
415         (defppcsubprim .SPrecover-values)
416         (defppcsubprim .SPvpopargregs)
417         (defppcsubprim .SPinteger-sign)
418         (defppcsubprim .SPsubtag-misc-set)
419         (defppcsubprim .SPspread-lexpr-z)
420         (defppcsubprim .SPstore-node-conditional)
421         (defppcsubprim .SPreset)
422         (defppcsubprim .SPmvslide)
423         (defppcsubprim .SPsave-values)
424         (defppcsubprim .SPadd-values)
425         (defppcsubprim .SPpoweropen-callback)
426         (defppcsubprim .SPmisc-alloc-init)
427         (defppcsubprim .SPstack-misc-alloc-init)
428         (defppcsubprim .SPset-hash-key)
429         (defppcsubprim .SPaset2)
430         (defppcsubprim .SPcallbuiltin)
431         (defppcsubprim .SPcallbuiltin0)
432         (defppcsubprim .SPcallbuiltin1)
433         (defppcsubprim .SPcallbuiltin2)
434         (defppcsubprim .SPcallbuiltin3)
435         (defppcsubprim .SPpopj)
436         (defppcsubprim .SPrestorefullcontext)
437         (defppcsubprim .SPsavecontextvsp)
438         (defppcsubprim .SPsavecontext0)
439         (defppcsubprim .SPrestorecontext)
440         (defppcsubprim .SPlexpr-entry)
441         (defppcsubprim .SPpoweropen-syscall)
442         (defppcsubprim .SPbuiltin-plus)
443         (defppcsubprim .SPbuiltin-minus)
444         (defppcsubprim .SPbuiltin-times)
445         (defppcsubprim .SPbuiltin-div)
446         (defppcsubprim .SPbuiltin-eq)
447         (defppcsubprim .SPbuiltin-ne)
448         (defppcsubprim .SPbuiltin-gt)
449         (defppcsubprim .SPbuiltin-ge)
450         (defppcsubprim .SPbuiltin-lt)
451         (defppcsubprim .SPbuiltin-le)
452         (defppcsubprim .SPbuiltin-eql)
453         (defppcsubprim .SPbuiltin-length)
454         (defppcsubprim .SPbuiltin-seqtype)
455         (defppcsubprim .SPbuiltin-assq)
456         (defppcsubprim .SPbuiltin-memq)
457         (defppcsubprim .SPbuiltin-logbitp)
458         (defppcsubprim .SPbuiltin-logior)
459         (defppcsubprim .SPbuiltin-logand)
460         (defppcsubprim .SPbuiltin-ash)
461         (defppcsubprim .SPbuiltin-negate)
462         (defppcsubprim .SPbuiltin-logxor)
463         (defppcsubprim .SPbuiltin-aref1)
464         (defppcsubprim .SPbuiltin-aset1)
465         (defppcsubprim .SPbreakpoint)
466         (defppcsubprim .SPeabi-ff-call)
467         (defppcsubprim .SPeabi-callback)
468         (defppcsubprim .SPeabi-syscall)
469         (defppcsubprim .SPgetu64)
470         (defppcsubprim .SPgets64)
471         (defppcsubprim .SPmakeu64)
472         (defppcsubprim .SPmakes64)
473         (defppcsubprim .SPspecref)
474         (defppcsubprim .SPspecset)
475         (defppcsubprim .SPspecrefcheck)
476         (defppcsubprim .SPrestoreintlevel)
477         (defppcsubprim .SPmakes32)
478         (defppcsubprim .SPmakeu32)
479         (defppcsubprim .SPgets32)
480         (defppcsubprim .SPgetu32)
481         (defppcsubprim .SPfix-overflow)
482         (defppcsubprim .SPmvpasssym)
483         (defppcsubprim .SParef3)
484         (defppcsubprim .SPaset3)
485         (defppcsubprim .SPpoweropen-ffcall-return-registers)
486         (defppcsubprim .SPnmkunwind)
487         (defppcsubprim .SPset-hash-key-conditional)
488         (defppcsubprim .SPunbind-interrupt-level)
489         (defppcsubprim .SPunbind)
490         (defppcsubprim .SPunbind-n)
491         (defppcsubprim .SPunbind-to)
492         (defppcsubprim .SPbind-interrupt-level-m1)
493         (defppcsubprim .SPbind-interrupt-level)
494         (defppcsubprim .SPbind-interrupt-level-0)
495         (defppcsubprim .SPprogvrestore)
496         )))))
497
498
499 
500(provide "PPC-ARCH")
Note: See TracBrowser for help on using the repository browser.