Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory common-lisp.net:/tmp/cvs-serv4087
Modified Files:
integers.lisp
Log Message:
Added a bad expt. And a decent integer-length.
Date: Wed Jun 9 15:52:12 2004
Author: ffjeld
Index: movitz/losp/muerte/integers.lisp
diff -u movitz/losp/muerte/integers.lisp:1.30 movitz/losp/muerte/integers.lisp:1.31
--- movitz/losp/muerte/integers.lisp:1.30 Wed Jun 9 13:33:31 2004
+++ movitz/losp/muerte/integers.lisp Wed Jun 9 15:52:12 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.30 2004/06/09 20:33:31 ffjeld Exp $
+;;;; $Id: integers.lisp,v 1.31 2004/06/09 22:52:12 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -788,6 +788,34 @@
(when (< x min)
(setq min x)))))
+;;; Types
+
+(define-typep integer (x &optional (min '*) (max '*))
+ (and (typep x 'integer)
+ (or (eq min '*) (<= min x))
+ (or (eq max '*) (<= x max))))
+
+(deftype signed-byte (&optional (size '*))
+ (cond
+ ((eq size '*)
+ 'integer)
+ ((typep size '(integer 1 *))
+ (list 'integer
+ (- (ash 1 (1- size)))
+ (1- (ash 1 (1- size)))))
+ (t (error "Illegal size for signed-byte."))))
+
+(deftype unsigned-byte (&optional (size '*))
+ (cond
+ ((eq size '*)
+ '(integer 0))
+ ((typep size '(integer 1 *))
+ (list 'integer 0 (1- (ash 1 size))))
+ (t (error "Illegal size for unsigned-byte."))))
+
+(define-simple-typep (bit bitp) (x)
+ (or (eq x 0) (eq x 1)))
+
;; shift
(define-compiler-macro ash (&whole form integer count &environment env)
@@ -857,6 +885,43 @@
(:andb #.(cl:logxor #xff movitz::+movitz-fixnum-zmask+) :al)))
(t (if (= 0 integer) 0 (error "Illegal ash count: ~D" count)))))
+(defun integer-length (integer)
+ "=> number-of-bits"
+ (etypecase integer
+ (fixnum
+ (macrolet
+ ((do-it ()
+ `(with-inline-assembly (:returns :eax)
+ (:xorl :eax :eax)
+ (:compile-form (:result-mode :ecx) integer)
+ (:testl :ecx :ecx)
+ (:jns 'not-negative)
+ (:notl :ecx)
+ not-negative
+ (:bsrl :ecx :ecx)
+ (:jz 'zero)
+ (:leal ((:ecx ,movitz:+movitz-fixnum-factor+)
+ ,(* -1 movitz:+movitz-fixnum-factor+))
+ :eax)
+ zero)))
+ (do-it)))
+ (positive-bignum
+ (macrolet
+ ((do-it ()
+ `(with-inline-assembly (:returns :eax)
+ (:compile-form (:result-mode :ebx) integer)
+ (:movzxw (:ebx ,(bt:slot-offset 'movitz:movitz-bignum 'movitz::length))
+ :ecx)
+ (:leal ((:ecx ,movitz:+movitz-fixnum-factor+) ,(* -1 movitz:+movitz-fixnum-factor+))
+ :eax) ; bigits-1
+ (:bsrl (:ebx (:ecx 4) ,(+ -4 (bt:slot-offset 'movitz:movitz-bignum 'movitz::bigit0)))
+ :ecx)
+ (:shll 5 :eax) ; bits = bigits*32 + (bit-index+1)
+ (:leal ((:ecx ,movitz:+movitz-fixnum-factor+) :eax
+ ,movitz:+movitz-fixnum-factor+)
+ :eax))))
+ (do-it)))))
+
;;; Multiplication
(define-compiler-macro * (&whole form &rest operands &environment env)
@@ -1910,34 +1975,6 @@
(logior (mask-field bytespec newbyte)
(logandc2 integer (mask-field bytespec -1))))
-;;; Types
-
-(define-typep integer (x &optional (min '*) (max '*))
- (and (typep x 'integer)
- (or (eq min '*) (<= min x))
- (or (eq max '*) (<= x max))))
-
-(deftype signed-byte (&optional (size '*))
- (cond
- ((eq size '*)
- 'integer)
- ((typep size '(integer 1 *))
- (list 'integer
- (- (ash 1 (1- size)))
- (1- (ash 1 (1- size)))))
- (t (error "Illegal size for signed-byte."))))
-
-(deftype unsigned-byte (&optional (size '*))
- (cond
- ((eq size '*)
- '(integer 0))
- ((typep size '(integer 1 *))
- (list 'integer 0 (1- (ash 1 size))))
- (t (error "Illegal size for unsigned-byte."))))
-
-(define-simple-typep (bit bitp) (x)
- (or (eq x 0) (eq x 1)))
-
;;;
(defun plus-if (x y)
@@ -1996,4 +2033,19 @@
"=> natural-root"
(check-type natural (integer 0 *))
(do ((i 0 (1+ i)))
- ((> (* i i) natural) (1- i))))
\ No newline at end of file
+ ((> (* i i) natural) (1- i))))
+
+(define-compiler-macro expt (&whole form base-number power-number &environment env)
+ (if (not (and (movitz:movitz-constantp base-number env)
+ (movitz:movitz-constantp power-number env)))
+ form
+ (expt (movitz:movitz-eval base-number env)
+ (movitz:movitz-eval power-number env))))
+
+
+(defun expt (base-number power-number)
+ "Take base-number to the power-number."
+ (do ((i 0 (1+ i))
+ (r 1 (* r base-number)))
+ ((>= i power-number) r)))
+