Lisp HUG Maillist Archive

Optimization...

Correction... (needed positive shift values)

(defun ceiling-pwr2 (n)
  (declare (fixnum n))
  (declare (optimize (speed 3) #|(safety 0)|# (space 3) (float 0)))
  (let ((nn (sys:integer-to-int32 n)))
    (declare (sys:int32 nn))
    (labels ((iter (n nsh)
               (declare (sys:int32 n))
               (declare (fixnum nsh))
               (sys:int32-logior n (sys:int32>> n nsh))))
      (declare (type '(function (sys:int32 fixnum) sys:int32) iter))
      (declare (inline iter))
      (sys:int32-to-integer
       (sys:int32-1+
        (iter 
         (iter
          (iter
           (iter
            (iter (sys:int32-1- nn) 1)
            2)
           4)
          8)
         16)))
      )))

Dr. David McClain
Chief Technical Officer
Refined Audiometrics Laboratory
4391 N. Camino Ferreo
Tucson, AZ  85750

email: dbm@refined-audiometrics.com
phone: 1.520.390.3995
web: http://refined-audiometrics.com



Re: Optimization...

On Tue, 8 Jul 2008 16:49:01 -0700, David McClain <dbm@refined-audiometrics.com> wrote:

> Correction... (needed positive shift values)

I just finished almost the same code when yours arrived:

  (defun ceiling-pwr2 (n)
    (declare (optimize (float 0)))
    (declare (fixnum n))
    (labels ((iter (n nsh)
               (declare (sys:int32 n) (fixnum nsh))
               (sys:int32-logior n (sys:int32>> n nsh))))
      (declare (inline iter))
      (the fixnum
           (sys:int32-to-integer
            (sys:int32-1+ (iter
                           (iter
                            (iter
                             (iter
                              (iter (sys:int32-1- (sys:integer-to-int32 n)) 1)
                              2)
                             4)
                            8)
                           16))))))

Note the THE for the return value to avoid the
SYSTEM::CHECK-IN-MAKE-BIGNUM call.

Edi.


Updated at: 2020-12-10 08:42 UTC