[movitz-cvs] CVS update: movitz/losp/muerte/integers.lisp
Frode Vatvedt Fjeld
ffjeld at common-lisp.net
Wed Aug 31 22:34:17 UTC 2005
Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv26302
Modified Files:
integers.lisp
Log Message:
Improved bignum support for logand and lognot.
Date: Thu Sep 1 00:34:14 2005
Author: ffjeld
Index: movitz/losp/muerte/integers.lisp
diff -u movitz/losp/muerte/integers.lisp:1.109 movitz/losp/muerte/integers.lisp:1.110
--- movitz/losp/muerte/integers.lisp:1.109 Fri Aug 26 21:39:14 2005
+++ movitz/losp/muerte/integers.lisp Thu Sep 1 00:34:14 2005
@@ -9,7 +9,7 @@
;;;; Created at: Wed Nov 8 18:44:57 2000
;;;; Distribution: See the accompanying file COPYING.
;;;;
-;;;; $Id: integers.lisp,v 1.109 2005/08/26 19:39:14 ffjeld Exp $
+;;;; $Id: integers.lisp,v 1.110 2005/08/31 22:34:14 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -328,6 +328,9 @@
(deftype negative-fixnum ()
`(integer #.movitz:+movitz-most-negative-fixnum+ -1))
+(deftype negative-bignum ()
+ `(integer * #.(cl:1- movitz::+movitz-most-negative-fixnum+)))
+
(defun fixnump (x)
(typep x 'fixnum))
@@ -1482,6 +1485,36 @@
(:eax :edx (:offset movitz-bignum bigit0)))
(:subl 4 :edx)
(:jnc 'pb-pb-and-loop)))))
+ ((negative-bignum fixnum)
+ (with-inline-assembly (:returns :eax)
+ (:load-lexical (:lexical-binding x) :untagged-fixnum-ecx)
+ (:load-lexical (:lexical-binding y) :eax)
+ (:leal ((:ecx 4) -4) :ecx)
+ (:notl :ecx)
+ (:andl :ecx :eax)))
+ ((negative-bignum positive-bignum)
+ (cond
+ ((<= (%bignum-bigits y) (%bignum-bigits x))
+ (let ((r (copy-bignum y)))
+ (with-inline-assembly (:returns :eax)
+ (:load-lexical (:lexical-binding r) :eax)
+ (:load-lexical (:lexical-binding x) :ebx)
+ (:xorl :edx :edx)
+ (:movl #xffffffff :ecx)
+ loop
+ (:addl (:ebx :edx (:offset movitz-bignum bigit0))
+ :ecx)
+ (:notl :ecx)
+ (:andl :ecx (:eax :edx (:offset movitz-bignum bigit0)))
+ (:notl :ecx)
+ (:cmpl -1 :ecx)
+ (:je 'carry)
+ (:xorl :ecx :ecx)
+ carry
+ (:addl 4 :edx)
+ (:cmpw :dx (:eax (:offset movitz-bignum length)))
+ (:ja 'loop))))
+ (t (error "Logand not implemented."))))
)))
(do-it)))
(t (&rest integers)
@@ -1639,10 +1672,7 @@
(reduce #'logxor integers)))))
(defun lognot (integer)
- (check-type integer fixnum)
- (with-inline-assembly (:returns :eax)
- (:compile-form (:result-mode :eax) integer)
- (:xorl #.(cl:- #xffffffff movitz::+movitz-fixnum-zmask+) :eax)))
+ (- -1 integer))
(defun ldb%byte (size position integer)
"This is LDB with explicit byte-size and position parameters."
More information about the Movitz-cvs
mailing list