Update of /project/movitz/cvsroot/movitz/losp/muerte
In directory clnet:/tmp/cvs-serv1287
Modified Files:
arithmetic-macros.lisp
Log Message:
Fix constant-folding for logand.
--- /project/movitz/cvsroot/movitz/losp/muerte/arithmetic-macros.lisp 2008/04/21 19:29:17 1.22
+++ /project/movitz/cvsroot/movitz/losp/muerte/arithmetic-macros.lisp 2008/04/27 19:26:14 1.23
@@ -10,7 +10,7 @@
;;;; Author: Frode Vatvedt Fjeld <frodef(a)acm.org>
;;;; Created at: Sat Jul 17 13:42:46 2004
;;;;
-;;;; $Id: arithmetic-macros.lisp,v 1.22 2008/04/21 19:29:17 ffjeld Exp $
+;;;; $Id: arithmetic-macros.lisp,v 1.23 2008/04/27 19:26:14 ffjeld Exp $
;;;;
;;;;------------------------------------------------------------------
@@ -305,22 +305,28 @@
finally (return (if (= -1 folded-constant)
non-constants
(cons folded-constant non-constants))))))
- (case (length constant-folded-integers)
- (0 0)
- (1 (first constant-folded-integers))
- (2 (cond
- ((typep (first constant-folded-integers)
- '(unsigned-byte 32))
- (let ((x (first constant-folded-integers)))
- `(with-inline-assembly (:returns :untagged-fixnum-ecx
- :type (unsigned-byte ,(integer-length x)))
- (:compile-form (:result-mode :untagged-fixnum-ecx)
- ,(second constant-folded-integers))
- (:andl ,x :ecx))))
- (t `(no-macro-call logand
- ,(first constant-folded-integers)
- ,(second constant-folded-integers)))))
- (t `(logand (logand ,(first constant-folded-integers) ,(second constant-folded-integers))
+ (cond
+ ((null constant-folded-integers)
+ 0)
+ ((null (rest constant-folded-integers))
+ (first constant-folded-integers))
+ ((eql 0 (first constant-folded-integers))
+ `(progn ,@(rest constant-folded-integers) 0))
+ ((null (cddr constant-folded-integers))
+ (cond
+ ((typep (first constant-folded-integers)
+ '(unsigned-byte 32))
+ (let ((x (first constant-folded-integers)))
+ `(with-inline-assembly (:returns :untagged-fixnum-ecx
+ :type (unsigned-byte ,(integer-length x)))
+ (:compile-form (:result-mode :untagged-fixnum-ecx)
+ ,(second constant-folded-integers))
+ (:andl ,x :ecx))))
+ (t `(no-macro-call logand
+ ,(first constant-folded-integers)
+ ,(second constant-folded-integers)))))
+ (t `(logand (logand ,(first constant-folded-integers)
+ ,(second constant-folded-integers))
,@(cddr constant-folded-integers))))))
(define-compiler-macro logior (&whole form &rest integers &environment env)
@@ -410,7 +416,7 @@
(t form)))
(define-compiler-macro ldb (&whole form &environment env bytespec integer)
- (let ((bytespec (movitz::movitz-macroexpand bytespec env)))
+ (let ((bytespec (movitz-macroexpand bytespec env)))
(if (not (and (consp bytespec) (eq 'byte (car bytespec))))
form
`(ldb%byte ,(second bytespec) ,(third bytespec) ,integer))))