Changeset 315


Ignore:
Timestamp:
Jan 17, 2004, 7:47:03 PM (21 years ago)
Author:
Gary Byers
Message:

Handle bytespecs with size 0.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ccl/level-1/l1-numbers.lisp

    r281 r315  
    326326
    327327(defun deposit-field (value bytespec integer)
    328   (logior (logandc1 bytespec integer) (logand bytespec value)))
     328  (if (> bytespec 0)   
     329    (logior (logandc1 bytespec integer) (logand bytespec value))
     330    (progn
     331      (require-type value 'integer)
     332      (require-type integer 'integer))))
    329333
    330334;;;;;;;;;;  Byte field functions ;;;;;;;;;;;;;;;;
    331335
     336;;; Size = 0, position = 0 -> 0
     337;;; size = 0, position > 0 -> -position
     338;;; else ->  (ash (byte-mask size) position)
    332339(defun byte (size position)
    333   (unless (and (integerp position) (not (minusp position))) (report-bad-arg position 'unsigned-byte))
    334   (ash (byte-mask size) position))
    335 
    336 
    337 
    338 (defun byte-size (bytespec) (logcount bytespec))
     340  (unless (and (typep size 'integer)
     341               (>= size 0))
     342    (report-bad-arg size 'unsigned-byte))
     343  (unless (and (typep position 'integer)
     344               (>= position 0))
     345    (report-bad-arg position 'unsigned-byte))
     346  (if (eql 0 size)
     347    (if (eql 0 position)
     348      0
     349      (- position))
     350    (ash (byte-mask size) position)))
     351
     352
     353
     354(defun byte-size (bytespec)
     355  (if (> bytespec 0)
     356    (logcount bytespec)
     357    0))
    339358
    340359(defun ldb (bytespec integer)
    341   (if (and (fixnump bytespec) (fixnump integer))
     360  (if (and (fixnump bytespec) (> (the fixnum bytespec) 0)  (fixnump integer))
    342361    (%ilsr (byte-position bytespec) (%ilogand bytespec integer))
    343362    (let ((size (byte-size bytespec))
    344363          (position (byte-position bytespec)))
    345       (if (and (bignump integer)
    346                (<= size  (- 31 ppc32::fixnumshift))
    347                (fixnump position))
    348         (%ldb-fixnum-from-bignum integer size position)
    349         (ash (logand bytespec integer) (- position))))))
     364      (if (eql size 0)
     365        (progn
     366          (require-type integer 'integer)
     367          0)
     368        (if (and (bignump integer)
     369                 (<= size  (- 31 ppc32::fixnumshift))
     370                 (fixnump position))
     371          (%ldb-fixnum-from-bignum integer size position)
     372          (ash (logand bytespec integer) (- position)))))))
    350373
    351374(defun mask-field (bytespec integer)
    352   (logand bytespec integer))
     375  (if (>= bytespec 0)
     376    (logand bytespec integer)
     377    (logand integer 0)))
    353378
    354379(defun dpb (value bytespec integer)
    355   (if (and (fixnump value) (fixnump bytespec) (fixnump integer))
     380  (if (and (fixnump value)
     381           (fixnump bytespec)
     382           (> (the fixnum bytespec) 0)
     383           (fixnump integer))
    356384    (%ilogior (%ilogand bytespec (%ilsl (byte-position bytespec) value))
    357385              (%ilogand (%ilognot bytespec) integer))
     
    359387
    360388(defun ldb-test (bytespec integer)
    361   (logtest bytespec integer))
     389  (if (> bytespec 0)
     390    (logtest bytespec integer)
     391    (progn
     392      (require-type integer 'integer)
     393      nil)))
    362394
    363395; random associated stuff except for the print-object method which is still in
Note: See TracChangeset for help on using the changeset viewer.