From 9319cf4aecb9b151a7b8aa82f808451533f57a01 Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Thu, 3 Dec 2015 14:28:18 +0000 Subject: [PATCH] better out-of-line MASK-SIGNED-FIELD Pick off some common cases where the compiler can inline no-consing variants. --- src/code/numbers.lisp | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/code/numbers.lisp b/src/code/numbers.lisp index e5eb56058..8dc26d095 100644 --- a/src/code/numbers.lisp +++ b/src/code/numbers.lisp @@ -1190,13 +1190,20 @@ and the number of 0 bits if INTEGER is negative." #!+sb-doc "Extract SIZE lower bits from INTEGER, considering them as a 2-complement SIZE-bits representation of a signed integer." - (cond ((zerop size) - 0) - ((logbitp (1- size) integer) - (dpb integer (byte size 0) -1)) - (t - (ldb (byte size 0) integer)))) - + (typecase size + ((eql 0) 0) + ((integer 0 #.sb!vm:n-fixnum-bits) + (number-dispatch ((integer integer)) + ;; FIXME: a case here to reduce BIGNUM arguments to FIXNUM for + ;; (INTEGER 1 #.SB!VM:N-FIXNUM-BITS) SIZE would be excellent. + (((foreach fixnum bignum)) + (if (logbitp (1- size) integer) + (dpb integer (byte (1- size) 0) -1) + (ldb (byte (1- size) 0) integer))))) + ((unsigned-byte) + (if (logbitp (1- size) integer) + (dpb integer (byte (1- size) 0) -1) + (ldb (byte (1- size) 0) integer))))) ;;;; BOOLE -- 2.11.4.GIT