[movitz-cvs] CVS update: movitz/losp/muerte/integers.lisp
Frode Vatvedt Fjeld
ffjeld at common-lisp.net
Thu Jul 15 00:26:26 UTC 2004
Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv12672
Modified Files:
integers.lisp
Log Message:
Added %negatef, in an effort to reduce bignum consing a bit.
Date: Wed Jul 14 17:26:26 2004
Author: ffjeld
Index: movitz/losp/muerte/integers.lisp
diff -u movitz/losp/muerte/integers.lisp:1.64 movitz/losp/muerte/integers.lisp:1.65
--- movitz/losp/muerte/integers.lisp:1.64 Wed Jul 14 16:45:12 2004
+++ movitz/losp/muerte/integers.lisp Wed Jul 14 17:26:26 2004
@@ -9,7 +9,7 @@
;;;; Created at: Wed Nov 8 18:44:57 2000
;;;; Distribution: See the accompanying file COPYING.
;;;;
-;;;; $Id: integers.lisp,v 1.64 2004/07/14 23:45:12 ffjeld Exp $
+;;;; $Id: integers.lisp,v 1.65 2004/07/15 00:26:26 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -87,6 +87,19 @@
(define-simple-typep (bit bitp) (x)
(or (eq x 0) (eq x 1)))
+;;;
+
+(defun %negatef (x p0 p1)
+ "Negate x. If x is not eq to p0 or p1, negate x destructively."
+ (etypecase x
+ (fixnum (- x))
+ (bignum
+ (if (or (eq x p0) (eq x p1))
+ (- x)
+ (with-inline-assembly (:returns :eax)
+ (:compile-form (:result-mode :eax) x)
+ (:xorl #xff00 (:eax #.movitz:+other-type-offset+)))))))
+
;;; Addition
(define-compiler-macro + (&whole form &rest operands &environment env)
@@ -364,7 +377,6 @@
(:call-global-constant cons-commit)
(:locally (:movl ,(bt:enum-value 'movitz::atomically-status :inactive)
(:edi (:edi-offset atomically-status))))
-
pfix-pbig-done)
))
(((integer * -1) (integer 0 *))
@@ -372,7 +384,7 @@
(((integer 0 *) (integer * -1))
(- x (- y)))
(((integer * -1) (integer * -1))
- (+ (- x) (- y)))
+ (%negatef (+ (- x) (- y)) x y))
)))
(do-it)))
(t (&rest terms)
@@ -511,7 +523,7 @@
(((integer 0 *) (integer * -1))
(+ minuend (- subtrahend)))
(((integer * -1) (integer 0 *))
- (- (+ (- minuend) subtrahend)))
+ (%negatef (+ (- minuend) subtrahend) minuend subtrahend))
(((integer * -1) (integer * -1))
(+ minuend (- subtrahend)))
)))
@@ -520,7 +532,7 @@
(declare (dynamic-extent subtrahends))
(if subtrahends
(reduce #'- subtrahends :initial-value minuend)
- (- 0 minuend)))))
+ (- minuend)))))
(define-modify-macro decf (&optional (delta-form 1)) -)
@@ -1469,15 +1481,17 @@
(((integer * -1) (integer 0 *))
(multiple-value-bind (q r)
(truncate (- number) divisor)
- (values (- q) (- r))))
+ (values (%negatef q number divisor)
+ (%negatef r number divisor))))
(((integer 0 *) (integer * -1))
(multiple-value-bind (q r)
(truncate (- number) divisor)
- (values (- q) r)))
+ (values (%negatef q number divisor)
+ r)))
(((integer * -1) (integer * -1))
(multiple-value-bind (q r)
(truncate (- number) divisor)
- (values q (- r))))
+ (values q (%negatef r number divisor))))
))))
(defun / (number &rest denominators)
More information about the Movitz-cvs
mailing list