[movitz-cvs] CVS update: movitz/losp/muerte/scavenge.lisp
Frode Vatvedt Fjeld
ffjeld at common-lisp.net
Fri Jun 11 23:26:14 UTC 2004
Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv17833
Modified Files:
scavenge.lisp
Log Message:
Rearranged vector objects a bit. Changed map-heap-words
accordingly. Also fixed some serious bugs in map-heap-words.
Date: Fri Jun 11 16:26:14 2004
Author: ffjeld
Index: movitz/losp/muerte/scavenge.lisp
diff -u movitz/losp/muerte/scavenge.lisp:1.9 movitz/losp/muerte/scavenge.lisp:1.10
--- movitz/losp/muerte/scavenge.lisp:1.9 Thu Jun 10 12:29:45 2004
+++ movitz/losp/muerte/scavenge.lisp Fri Jun 11 16:26:14 2004
@@ -10,7 +10,7 @@
;;;; Author: Frode Vatvedt Fjeld <frodef at acm.org>
;;;; Created at: Mon Mar 29 14:54:08 2004
;;;;
-;;;; $Id: scavenge.lisp,v 1.9 2004/06/10 19:29:45 ffjeld Exp $
+;;;; $Id: scavenge.lisp,v 1.10 2004/06/11 23:26:14 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -42,7 +42,13 @@
(movitz:tag primary))))
`(with-inline-assembly (:returns :boolean-zf=1)
(:compile-form (:result-mode :eax) ,x)
- (:cmpw ,code :ax)))))
+ (:cmpw ,code :ax))))
+ (word-upper16 (x)
+ "Consider x as a 32-bit integer, and return the upper 16 bits (as a fixnum)."
+ `(with-inline-assembly (:returns :eax)
+ (:compile-form (:result-mode :eax) ,x)
+ (:andl #xffff0000 :eax)
+ (:shrl ,(- 16 movitz:+movitz-fixnum-shift+) :eax))))
(do ((scan start-location (1+ scan)))
((>= scan end-location))
(let (;; (*i* i)
@@ -53,11 +59,11 @@
((scavenge-typep x :illegal)
(error "Illegal word ~Z at ~S." x scan))
((scavenge-typep x :bignum)
+ (assert (evenp scan))
;; Just skip the bigits
- (let* ((bigits (memref scan 2 0 :unsigned-byte16))
- (size (+ 2 (logand bigits -2))))
- (assert (and (plusp bigits) (evenp size)))
- (incf scan size)))
+ (let* ((bigits (word-upper16 x))
+ (delta (1+ (logand bigits -2))))
+ (incf scan delta)))
((scavenge-typep x :funobj)
;; Process code-vector pointer specially..
(let* ((funobj (%word-offset scan #.(movitz:tag :other)))
@@ -79,14 +85,14 @@
#.(bt:enum-value 'movitz:movitz-vector-element-type :u8))
(scavenge-wide-typep x :vector
#.(bt:enum-value 'movitz:movitz-vector-element-type :character)))
- (let ((len (memref scan 2 0 :unsigned-byte16)))
+ (let ((len (word-upper16 x)))
(incf scan (1+ (* 2 (truncate (+ 7 len) 8))))))
((scavenge-wide-typep x :vector #.(bt:enum-value 'movitz:movitz-vector-element-type :u16))
- (let ((len (memref scan 2 0 :unsigned-byte16)))
+ (let ((len (word-upper16 x)))
(incf scan (1+ (* 2 (truncate (+ 3 len) 4))))))
((scavenge-wide-typep x :vector #.(bt:enum-value 'movitz:movitz-vector-element-type :u32))
- (let ((len (memref scan 2 0 :unsigned-byte16)))
- (incf scan (1+ (* 2 (truncate (+ 1 len) 2))))))
+ (let ((len (word-upper16 x)))
+ (incf scan (1+ (logand (1+ len) -2)))))
((eq x (fixnum-word 3))
(incf scan)
(incf scan (memref scan 0 0 :lisp)))
More information about the Movitz-cvs
mailing list