X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fgeneric%2Fearly-objdef.lisp;h=eb6927509bbb286d175cbaa4b3ef4e7c1c410c53;hb=74cf7a4d01664fbf72a662ba093ad67ca243b524;hp=6967fe41d2ec1868b928df310da9d01b6a7d6337;hpb=dd04bd449535e9016b5652a708a3cac2ca24c87d;p=sbcl.git diff --git a/src/compiler/generic/early-objdef.lisp b/src/compiler/generic/early-objdef.lisp index 6967fe4..eb69275 100644 --- a/src/compiler/generic/early-objdef.lisp +++ b/src/compiler/generic/early-objdef.lisp @@ -33,6 +33,25 @@ ;;; might easily be more, since these values have stayed highly ;;; constrained for more than a decade, an inviting target for ;;; inventive abstraction-phobic maintainers.:-) +;;; +;;; Another way to look at lowtags is that there is no one lowtag +;;; length. On 32-bit platforms, fixnums and other-immediates have a +;;; lowtag length of two bits, and pointers have a lowtag length of +;;; three bits. On 64-bit platforms, fixnums and pointers gain an +;;; extra bit, and six "pad" lowtags waste the extra encoding space so +;;; obtained. +;;; +;;; x00 -- fixnum +;;; x10 -- other-immediate +;;; 001 -- instance-pointer +;;; 011 -- list-pointer +;;; 101 -- fun-pointer +;;; 111 -- other-pointer +;;; +;;; If you change the tag layout, check the various functions in +;;; src/runtime/runtime.h to see if they need to be updated, along +;;; with print_obj() in src/runtime/print.c, possibly gc_init_tables() +;;; in src/runtime/gc-common-c and possibly the code in src/code/room. (eval-when (:compile-toplevel :load-toplevel :execute) ;; The EVAL-WHEN is necessary (at least for Lispworks), because the ;; second DEFENUM uses the value of OTHER-IMMEDIATE-0-LOWTAG, which is @@ -40,19 +59,20 @@ #!+#.(cl:if (cl:= 64 sb!vm:n-word-bits) '(and) '(or)) (defenum () even-fixnum-lowtag - instance-pointer-lowtag other-immediate-0-lowtag pad0-lowtag - pad1-lowtag pad2-lowtag + instance-pointer-lowtag + pad1-lowtag other-immediate-1-lowtag + pad2-lowtag list-pointer-lowtag odd-fixnum-lowtag - fun-pointer-lowtag other-immediate-2-lowtag pad3-lowtag + fun-pointer-lowtag pad4-lowtag - pad5-lowtag other-immediate-3-lowtag + pad5-lowtag other-pointer-lowtag) #!+#.(cl:if (cl:= 32 sb!vm:n-word-bits) '(and) '(or)) (defenum () @@ -79,7 +99,7 @@ (string= name "-LOWTAG" :start1 (- len 7)) (zerop (logand (symbol-value sym) fixnum-tag-mask))) (push sym fixtags)))) - `',fixtags) + `',(sort fixtags #'string< :key #'symbol-name)) #'equal) ;;; the heap types, stored in 8 bits of the header of an object on the @@ -154,10 +174,10 @@ fdefn-widetag ; 01010110 no-tls-value-marker-widetag ; 01011010 - #!-(and sb-lutex sb-thread) + #!-sb-simd-pack unused01-widetag - #!+(and sb-lutex sb-thread) - lutex-widetag ; 01011110 + #!+sb-simd-pack + simd-pack-widetag ; 01011110 unused02-widetag ; 01100010 unused03-widetag ; 01100110 unused04-widetag ; 01101010