Raymond Toy pushed to branch master at cmucl / cmucl

Commits:

3 changed files:

Changes:

  • src/compiler/x86/arith.lisp
    ... ... @@ -731,7 +731,6 @@
    731 731
         DONE))
    
    732 732
     
    
    733 733
     
    
    734
    -;;; note documentation for this function is wrong - rtfm
    
    735 734
     (define-vop (signed-byte-32-len)
    
    736 735
       (:translate integer-length)
    
    737 736
       (:note _N"inline (signed-byte 32) integer-length")
    
    ... ... @@ -747,12 +746,9 @@
    747 746
         (inst not res)
    
    748 747
         POS
    
    749 748
         (inst bsr res res)
    
    750
    -    (inst jmp :z zero)
    
    749
    +    (inst jmp :z DONE)
    
    751 750
         (inst inc res)
    
    752 751
         (inst shl res 2)
    
    753
    -    (inst jmp done)
    
    754
    -    ZERO
    
    755
    -    (inst xor res res)
    
    756 752
         DONE))
    
    757 753
     
    
    758 754
     (define-vop (unsigned-byte-32-len)
    
    ... ... @@ -764,12 +760,11 @@
    764 760
       (:results (res :scs (any-reg)))
    
    765 761
       (:result-types positive-fixnum)
    
    766 762
       (:generator 30
    
    767
    -    (move res arg)
    
    768 763
         ;; The Intel docs say that BSR leaves the destination register
    
    769
    -    ;; undefined if the source is 0.  But AMD64 says the destination
    
    770
    -    ;; register is unchanged.  This also appears to be the case for
    
    771
    -    ;; GCC and LLVM.
    
    772
    -    (inst bsr res res)
    
    764
    +    ;; undefined if the source is 0.  However, gcc, LLVM, and MSVC
    
    765
    +    ;; generate code that pretty much says BSR basically moves the
    
    766
    +    ;; source to the destination if the source is 0.
    
    767
    +    (inst bsr res arg)
    
    773 768
         (inst jmp :z DONE)
    
    774 769
         ;; The result of BSR is one too small for what we want, so
    
    775 770
         ;; increment the result.
    

  • src/general-info/release-21f.md
    ... ... @@ -61,6 +61,7 @@ public domain.
    61 61
           least-positive-float
    
    62 62
         * ~~#278~~ Add some more debugging prints to gencgc
    
    63 63
         * ~~#283~~ Add VOP for `integer-length` for `(unsigned-byte 32)` arg.
    
    64
    +    * ~~#284~~ Microoptimize `signed-byte-32-int-len` VOP for x86.
    
    64 65
       * Other changes:
    
    65 66
       * Improvements to the PCL implementation of CLOS:
    
    66 67
       * Changes to building procedure:
    

  • tests/integer.lisp
    1
    +;; Tests of integer functions
    
    2
    +
    
    3
    +(defpackage :integer-tests
    
    4
    +  (:use :cl :lisp-unit))
    
    5
    +
    
    6
    +(in-package "INTEGER-TESTS")
    
    7
    +
    
    8
    +;; Simple functions for testing INTEGER-LENGTH for numbers of type
    
    9
    +;; (unsigned-byte 32) and (signed-byte 32).
    
    10
    +(defun integer-length-u32 (n)
    
    11
    +  (declare (type (unsigned-byte 32) n))
    
    12
    +  (integer-length n))
    
    13
    +
    
    14
    +(defun integer-length-s32 (n)
    
    15
    +  (declare (type (signed-byte 32) n))
    
    16
    +  (integer-length n))
    
    17
    +
    
    18
    +(define-test integer-length.unsigned-byte-32
    
    19
    +    (:tag :issues)
    
    20
    +  (assert-equal 0 (integer-length-u32 0))
    
    21
    +  (assert-equal 1 (integer-length-u32 1))
    
    22
    +  (assert-equal 31 (integer-length-u32 #x70000000))
    
    23
    +  (assert-equal 31 (integer-length-u32 #x7fffffff))
    
    24
    +  (assert-equal 32 (integer-length-u32 #xffffffff)))
    
    25
    +
    
    26
    +(define-test integer-length.signed-byte-32
    
    27
    +    (:tag :issues)
    
    28
    +  (assert-equal 0 (integer-length-s32 0))
    
    29
    +  (assert-equal 1 (integer-length-s32 1))
    
    30
    +  (assert-equal 31 (integer-length-s32 #x70000000))
    
    31
    +  (assert-equal 31 (integer-length-s32 #x7fffffff))
    
    32
    +  (assert-equal 0 (integer-length-s32 -1))
    
    33
    +  (assert-equal 1 (integer-length-s32 -2))
    
    34
    +  (assert-equal 31 (integer-length-s32 #x-70000000))
    
    35
    +  (assert-equal 31 (integer-length-s32 #x-7fffffff))
    
    36
    +  (assert-equal 31 (integer-length-s32 #x-80000000)))
    
    37
    +
    
    38
    +