[movitz-cvs] CVS update: movitz/losp/muerte/inspect.lisp

Frode Vatvedt Fjeld ffjeld at common-lisp.net
Thu Jul 8 21:48:58 UTC 2004


Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv1632

Modified Files:
	inspect.lisp 
Log Message:
Added %bignum-canonicalize.

Date: Thu Jul  8 14:48:58 2004
Author: ffjeld

Index: movitz/losp/muerte/inspect.lisp
diff -u movitz/losp/muerte/inspect.lisp:1.15 movitz/losp/muerte/inspect.lisp:1.16
--- movitz/losp/muerte/inspect.lisp:1.15	Thu Jul  8 11:53:47 2004
+++ movitz/losp/muerte/inspect.lisp	Thu Jul  8 14:48:58 2004
@@ -10,7 +10,7 @@
 ;;;; Author:        Frode Vatvedt Fjeld <frodef at acm.org>
 ;;;; Created at:    Fri Oct 24 09:50:41 2003
 ;;;;                
-;;;; $Id: inspect.lisp,v 1.15 2004/07/08 18:53:47 ffjeld Exp $
+;;;; $Id: inspect.lisp,v 1.16 2004/07/08 21:48:58 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -245,7 +245,7 @@
 	   (+ -1 object-location
 	      #.(movitz::movitz-type-word-size :movitz-funobj)
 	      (funobj-num-constants object))))
-      ((or string code-vector (simple-array (unsigned-byte 8)))
+      ((or string code-vector (simple-array (unsigned-byte 8) 1))
        (<= object-location
 	   location
 	   (+ -1 object-location
@@ -272,6 +272,37 @@
 
 (defun %bignum-bigits (x)
   (%bignum-bigits x))
+
+(defun %bignum-canonicalize (x)
+  "Assuming x is a bignum, return the canonical integer value. That is,
+either return a fixnum, or destructively modify the bignum's length so
+that the msb isn't zero. DO NOT APPLY TO NON-BIGNUM VALUES!"
+  (macrolet
+      ((do-it ()
+	 `(with-inline-assembly (:returns :eax)
+	    (:load-lexical (:lexical-binding x) :eax)
+	    (:movl (:eax ,movitz:+other-type-offset+) :ecx)
+	    (:shrl 16 :ecx)
+	   shrink-loop
+	    (:cmpl 1 :ecx)
+	    (:je 'shrink-no-more)
+	    (:cmpl 0 (:eax (:ecx 4) ,(+ -4 (bt:slot-offset 'movitz:movitz-bignum 'movitz::bigit0))))
+	    (:jnz 'shrink-done)
+	    (:subl 1 :ecx)
+	    (:jmp 'shrink-loop)
+	   shrink-no-more
+	    (:cmpl ,(1+ movitz:+movitz-most-positive-fixnum+)
+		   (:eax ,(bt:slot-offset 'movitz:movitz-bignum 'movitz::bigit0)))
+	    (:jc '(:sub-program (fixnum-result)
+		   (:movl (:eax ,(bt:slot-offset 'movitz:movitz-bignum 'movitz::bigit0))
+		    :ecx)
+		   (:leal ((:ecx ,movitz:+movitz-fixnum-factor+)) :eax)
+		   (:jmp 'done)))
+	   shrink-done
+	    (:movw :cx (:eax ,(bt:slot-offset 'movitz:movitz-bignum 'movitz::length)))
+	   done
+	    )))
+    (do-it)))
 
 (defun copy-bignum (old)
   (check-type old bignum)





More information about the Movitz-cvs mailing list