From f6a2e547ef4e4895c3536835123b44338221ac2d Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Tue, 2 Mar 2004 09:37:48 +0000 Subject: [PATCH] 0.8.8.11: Exploit the new widetag structure on PPC. --- src/compiler/ppc/type-vops.lisp | 54 +++++++++++++++++++++++++++++++-------- version.lisp-expr | 2 +- 2 files changed, 44 insertions(+), 12 deletions(-) diff --git a/src/compiler/ppc/type-vops.lisp b/src/compiler/ppc/type-vops.lisp index 649dd74..3b2b34a 100644 --- a/src/compiler/ppc/type-vops.lisp +++ b/src/compiler/ppc/type-vops.lisp @@ -53,20 +53,52 @@ (last (null (cdr remaining)))) (cond ((atom header) - (inst cmpwi temp header) - (if last - (inst b? (if not-p :ne :eq) target) - (inst beq when-true))) + (cond + ((and (not last) (null (cddr remaining)) + (atom (cadr remaining)) + (= (logcount (logxor header (cadr remaining))) 1)) + (inst andi. temp temp (ldb (byte 8 0) (logeqv header (cadr remaining)))) + (inst cmpwi temp (ldb (byte 8 0) (logand header (cadr remaining)))) + (inst b? (if not-p :ne :eq) target) + (return)) + (t + (inst cmpwi temp header) + (if last + (inst b? (if not-p :ne :eq) target) + (inst beq when-true))))) (t (let ((start (car header)) (end (cdr header))) - (unless (= start bignum-widetag) - (inst cmpwi temp start) - (inst blt when-false)) - (inst cmpwi temp end) - (if last - (inst b? (if not-p :gt :le) target) - (inst ble when-true))))))) + (cond + ((and last (not (= start bignum-widetag)) + (= (+ start 4) end) + (= (logcount (logxor start end)) 1)) + (inst andi. temp temp (ldb (byte 8 0) (logeqv start end))) + (inst cmpwi temp (ldb (byte 8 0) (logand start end))) + (inst b? (if not-p :ne :eq) target)) + ((and (not last) (null (cddr remaining)) + (= (+ start 4) end) (= (logcount (logxor start end)) 1) + (listp (cadr remaining)) + (= (+ (caadr remaining) 4) (cdadr remaining)) + (= (logcount (logxor (caadr remaining) (cdadr remaining))) 1) + (= (logcount (logxor (caadr remaining) start)) 1)) + (inst andi. temp temp (ldb (byte 8 0) (logeqv start (cdadr remaining)))) + (inst cmpwi temp (ldb (byte 8 0) (logand start (cdadr remaining)))) + (inst b? (if not-p :ne :eq) target) + (return)) + (t + (unless (= start bignum-widetag) + (inst cmpwi temp start) + (if (= end complex-array-widetag) + (progn + (aver last) + (inst b? (if not-p :lt :ge) target)) + (inst blt when-false))) + (unless (= end complex-array-widetag) + (inst cmpwi temp end) + (if last + (inst b? (if not-p :gt :le) target) + (inst ble when-true)))))))))) (emit-label drop-through))))) ;;; Simple type checking and testing: diff --git a/version.lisp-expr b/version.lisp-expr index b993143..e4d7463 100644 --- a/version.lisp-expr +++ b/version.lisp-expr @@ -17,4 +17,4 @@ ;;; checkins which aren't released. (And occasionally for internal ;;; versions, especially for internal versions off the main CVS ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".) -"0.8.8.10" +"0.8.8.11" -- 1.7.10.4