Reorder 64-bit lowtags.
[sbcl.git] / src / compiler / generic / early-objdef.lisp
index 6967fe4..bda8fcd 100644 (file)
 ;;; 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
   #!+#.(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 ()