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

Frode Vatvedt Fjeld ffjeld at common-lisp.net
Mon May 24 19:34:34 UTC 2004


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

Modified Files:
	primitive-functions.lisp 
Log Message:
Renamed normalize-u32-ecx to box-u32-ecx, and added primitive-function
box-u32 that does the inverse. Improved aref and (setf aref) of
u32-vectors accordingly.

Date: Mon May 24 15:34:34 2004
Author: ffjeld

Index: movitz/losp/muerte/primitive-functions.lisp
diff -u movitz/losp/muerte/primitive-functions.lisp:1.18 movitz/losp/muerte/primitive-functions.lisp:1.19
--- movitz/losp/muerte/primitive-functions.lisp:1.18	Mon May 24 10:58:56 2004
+++ movitz/losp/muerte/primitive-functions.lisp	Mon May 24 15:34:34 2004
@@ -10,7 +10,7 @@
 ;;;; Author:        Frode Vatvedt Fjeld <frodef at acm.org>
 ;;;; Created at:    Tue Oct  2 21:02:18 2001
 ;;;;                
-;;;; $Id: primitive-functions.lisp,v 1.18 2004/05/24 14:58:56 ffjeld Exp $
+;;;; $Id: primitive-functions.lisp,v 1.19 2004/05/24 19:34:34 ffjeld Exp $
 ;;;;                
 ;;;;------------------------------------------------------------------
 
@@ -505,8 +505,8 @@
     (:ret)))
 
 
-(define-primitive-function normalize-u32-ecx ()
-  "Make u32 in ECX into a fixnum or bignum."
+(define-primitive-function box-u32-ecx ()
+  "Make u32 in ECX into a fixnum or bignum in EAX."
   (with-inline-assembly (:returns :multiple-values)
     (:cmpl #.movitz:+movitz-most-positive-fixnum+ :ecx)
     (:ja 'not-fixnum)
@@ -514,6 +514,32 @@
     (:ret)
    not-fixnum
     (:int 107)))			; not implemented by default!
+
+(define-primitive-function unbox-u32 ()
+  "Coerce EAX into a u32 in ECX, or signal type error.
+Preserve EAX, EBX, and EDX."
+  (macrolet
+      ((do-it ()
+	 `(with-inline-assembly (:returns :multiple-values)
+	    (:testl ,(logior #x80000000 movitz:+movitz-fixnum-zmask+)
+		    :eax)
+	    (:jnz 'not-fixnum)
+	    (:movl :eax :ecx)
+	    (:shrl ,movitz:+movitz-fixnum-shift+ :ecx)
+	    (:ret)
+	   not-fixnum
+	    (:leal (:eax ,(- (movitz:tag :other))) :ecx)
+	    (:testb 7 :cl)
+	    (:jnz 'fail)
+	    (:cmpl ,(dpb 1 (byte 16 16) (movitz:tag :bignum 0))
+		   (:eax ,movitz:+other-type-offset+))
+	    (:jne 'fail)
+	    (:movl (:eax ,(bt:slot-offset 'movitz::movitz-bignum 'movitz::bigit0))
+		   :ecx)
+	    (:ret)
+	   fail
+	    (:int 107))))
+    (do-it)))
 
 ;;;;
 





More information about the Movitz-cvs mailing list