Changeset 5431
- Timestamp:
- Oct 29, 2006, 11:24:28 PM (18 years ago)
- File:
-
- 1 edited
-
trunk/ccl/level-0/l0-bignum64.lisp (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ccl/level-0/l0-bignum64.lisp
r3882 r5431 1808 1808 1809 1809 1810 #+(or safe-but-slow 64-bit-target) 1810 #+safe-but-slow 1811 ;;; This is basically the same algorithm as the "destructive" 1812 ;;; version below; while it may be more readable, it's often 1813 ;;; slower and conses too much to be at all viable. 1811 1814 (defun %bignum-bignum-gcd (u v) 1812 1815 (setq u (abs u) v (abs v)) … … 1823 1826 (setq u (ash u -1) v (ash v -1)))) 1824 1827 1825 #-(or safe-but-slow 64-bit-target) 1828 1829 1830 1831 #-safe-but-slow 1826 1832 (progn 1827 1833 (defun %positive-bignum-bignum-gcd (u0 v0) … … 1867 1873 v-trailing-0-bits))) 1868 1874 (loop 1869 (let* ((fix-u (and (= u-len 1) 1870 (let* ((hi-u (bignum-ref-hi u 0))) 1871 (declare (fixnum hi-u)) 1872 (= hi-u (the fixnum 1873 (logand hi-u (ash most-positive-fixnum -16))))) 1874 (uvref u 0))) 1875 (fix-v (and (= v-len 1) 1876 (let* ((hi-v (bignum-ref-hi v 0))) 1877 (declare (fixnum hi-v)) 1878 (= hi-v (the fixnum 1879 (logand hi-v (ash most-positive-fixnum -16))))) 1880 (uvref v 0)))) 1875 (let* ((fix-u (and (<= u-len 2) 1876 (%maybe-fixnum-from-one-or-two-digit-bignum u))) 1877 (fix-v (and (<= v-len 2) 1878 (%maybe-fixnum-from-one-or-two-digit-bignum v)))) 1881 1879 (if fix-v 1882 1880 (if fix-u … … 1885 1883 (if fix-u 1886 1884 (return (ash (bignum-fixnum-gcd v fix-u) shift))))) 1887 1888 1885 (let* ((signum (if (> u-len v-len) 1889 1886 1 … … 1942 1939 1943 1940 1941 ;;; nbits can't be zero here. 1942 (defun bignum-shift-right-loop-1 (nbits result source len idx) 1943 (declare (type bignum-type result source) 1944 (type (mod 32) nbits) 1945 (type bignum-index idx len)) 1946 (let* ((rbits (logand 31 (the (mod 32) (- 32 nbits))))) 1947 (declare (type (mod 32) rbits)) 1948 (dotimes (j len) 1949 (let* ((x (bignum-ref source idx))) 1950 (declare (type bignum-element-type x)) 1951 (setq x (%ilsr nbits x)) 1952 (incf idx) 1953 (let* ((y (bignum-ref source idx))) 1954 (declare (type bignum-element-type y)) 1955 (setq y (%ilsl rbits y)) 1956 (setf (bignum-ref result j) 1957 (%logior x y))))) 1958 (setf (bignum-ref result len) 1959 (%ilsr nbits (bignum-ref source idx))) 1960 idx)) 1961 1962 1944 1963 (defun %logcount (bignum idx) 1945 1964 (%ilogcount (bignum-ref bignum idx))) … … 2004 2023 carry carry-out))))) 2005 2024 2006 (defun %bignum-count-trailing-zero p-bits (bignum)2025 (defun %bignum-count-trailing-zero-bits (bignum) 2007 2026 (let* ((count 0)) 2008 2027 (dotimes (i (%bignum-length bignum)) … … 2012 2031 (incf count 32) 2013 2032 (progn 2014 (do* ((bit 31 (1- bit))) 2015 ((zerop bit)) 2033 (dotimes (bit 32) 2016 2034 (declare (type (mod 32) bit)) 2017 2035 (if (logbitp bit digit)
Note:
See TracChangeset
for help on using the changeset viewer.
