From: Christophe R. <cs...@ca...> - 2003-09-20 09:27:26
|
Hi, Alexey Dejneka <ade...@us...> writes: > Index: numbers.lisp > @@ -1358,8 +1358,8 @@ > #. > (collect ((forms)) > (flet ((definition (name lambda-list width pattern) > - ;; We rely on (SUBTYPEP `(UNSIGNED-BYTE ,WIDTH) > - ;; 'BIGNUM-ELEMENT-TYPE) > + (assert (sb!xc:subtypep `(unsigned-byte ,width) > + 'bignum-element-type)) > `(defun ,name ,lambda-list > (flet ((prepare-argument (x) > (declare (integer x)) This breaks building on alpha... how are we relying on this? It didn't seem immediately obvious. Cheers, Christophe -- http://www-jcsu.jesus.cam.ac.uk/~csr21/ +44 1223 510 299/+44 7729 383 757 (set-pprint-dispatch 'number (lambda (s o) (declare (special b)) (format s b))) (defvar b "~&Just another Lisp hacker~%") (pprint #36rJesusCollegeCambridge) |
From: Alexey D. <ade...@co...> - 2003-09-21 07:06:41
|
Christophe Rhodes <cs...@ca...> writes: > Alexey Dejneka <ade...@us...> writes: > > > - ;; We rely on (SUBTYPEP `(UNSIGNED-BYTE ,WIDTH) > > - ;; 'BIGNUM-ELEMENT-TYPE) > > + (assert (sb!xc:subtypep `(unsigned-byte ,width) > > + 'bignum-element-type)) [...] > This breaks building on alpha... how are we relying on this? It > didn't seem immediately obvious. It is important for out-of-line versions (flet ((prepare-argument (x) (declare (integer x)) (etypecase x ((unsigned-byte ,width) x) (fixnum (logand x ,pattern)) (bignum (logand (%bignum-ref x 0) ,pattern))))) The last case cuts an argument to BIGNUM-ELEMENT-TYPE. Of course, it can be replaced with (logior (%bignum-ref x 0) (ash (%bignum-ref x 1) 32)), but does Alpha backend support 64-bit arguments? -- Regards, Alexey Dejneka "Alas, the spheres of truth are less transparent than those of illusion." -- L.E.J. Brouwer |
From: Christophe R. <cs...@ca...> - 2003-09-21 10:42:04
|
Alexey Dejneka <ade...@co...> writes: > Christophe Rhodes <cs...@ca...> writes: > >> This breaks building on alpha... how are we relying on this? It >> didn't seem immediately obvious. > > It is important for out-of-line versions > > (flet ((prepare-argument (x) > (declare (integer x)) > (etypecase x > ((unsigned-byte ,width) x) > (fixnum (logand x ,pattern)) > (bignum (logand (%bignum-ref x 0) ,pattern))))) > > The last case cuts an argument to BIGNUM-ELEMENT-TYPE. Of course, it > can be replaced with (logior (%bignum-ref x 0) (ash (%bignum-ref x 1) > 32)), but does Alpha backend support 64-bit arguments? It does, yes. Thanks. I'll take a look at this later. Cheers, Christophe -- http://www-jcsu.jesus.cam.ac.uk/~csr21/ +44 1223 510 299/+44 7729 383 757 (set-pprint-dispatch 'number (lambda (s o) (declare (special b)) (format s b))) (defvar b "~&Just another Lisp hacker~%") (pprint #36rJesusCollegeCambridge) |
From: Christophe R. <cs...@ca...> - 2003-09-22 08:48:14
|
Alexey Dejneka <ade...@co...> writes: > The last case cuts an argument to BIGNUM-ELEMENT-TYPE. Of course, it > can be replaced with (logior (%bignum-ref x 0) (ash (%bignum-ref x 1) > 32)), but does Alpha backend support 64-bit arguments? Maybe I'm missing something... Would it not be easier to do e.g. (defun +-mod32 (x y) (logand (+ x y) #.(1- (ash 1 width)))) and similar for the other modular functions? Christophe -- http://www-jcsu.jesus.cam.ac.uk/~csr21/ +44 1223 510 299/+44 7729 383 757 (set-pprint-dispatch 'number (lambda (s o) (declare (special b)) (format s b))) (defvar b "~&Just another Lisp hacker~%") (pprint #36rJesusCollegeCambridge) |
From: Alexey D. <ade...@co...> - 2003-09-22 10:04:55
|
Christophe Rhodes <cs...@ca...> writes: > Alexey Dejneka <ade...@co...> writes: > > > The last case cuts an argument to BIGNUM-ELEMENT-TYPE. Of course, it > > can be replaced with (logior (%bignum-ref x 0) (ash (%bignum-ref x 1) > > 32)), but does Alpha backend support 64-bit arguments? > > Maybe I'm missing something... > > Would it not be easier to do e.g. > (defun +-mod32 (x y) > (logand (+ x y) #.(1- (ash 1 width)))) > and similar for the other modular functions? It will not work; it will be transformed to (defun +-mod32 (x y) (+-mod32 (+ x y))) which results in a full recursive call of +-MOD32 (because there is no VOP without restrictions on argument types). If you add (DECLARE (NOTINLINE +)), it will probably work, but it will be less efficient than the current version. But you can replace ASSERT with IF, and if the condition fails use your version. -- Regards, Alexey Dejneka "Alas, the spheres of truth are less transparent than those of illusion." -- L.E.J. Brouwer |
From: Christophe R. <cs...@ca...> - 2003-09-22 10:10:59
|
Alexey Dejneka <ade...@co...> writes: > Christophe Rhodes <cs...@ca...> writes: > >> Maybe I'm missing something... >> >> Would it not be easier to do e.g. >> (defun +-mod32 (x y) >> (logand (+ x y) #.(1- (ash 1 width)))) >> and similar for the other modular functions? > > It will not work; it will be transformed to > > (defun +-mod32 (x y) > (+-mod32 (+ x y))) > > which results in a full recursive call of +-MOD32 (because there > is no VOP without restrictions on argument types). I knew I was missing something :-) thanks. > If you add (DECLARE (NOTINLINE +)), it will probably work, but it > will be less efficient than the current version. But you can > replace ASSERT with IF, and if the condition fails use your > version. Are we after efficiency for the out-of-line versions? Are they used for anything other than constant-folding? Cheers, Christophe -- http://www-jcsu.jesus.cam.ac.uk/~csr21/ +44 1223 510 299/+44 7729 383 757 (set-pprint-dispatch 'number (lambda (s o) (declare (special b)) (format s b))) (defvar b "~&Just another Lisp hacker~%") (pprint #36rJesusCollegeCambridge) |
From: Alexey D. <ade...@co...> - 2003-09-22 11:25:12
|
Christophe Rhodes <cs...@ca...> writes: > Alexey Dejneka <ade...@co...> writes: > > > Christophe Rhodes <cs...@ca...> writes: > > > >> Maybe I'm missing something... > >> > >> Would it not be easier to do e.g. > >> (defun +-mod32 (x y) > >> (logand (+ x y) #.(1- (ash 1 width)))) > >> and similar for the other modular functions? > > > > It will not work; it will be transformed to > > > > (defun +-mod32 (x y) > > (+-mod32 (+ x y))) > > > > which results in a full recursive call of +-MOD32 (because there > > is no VOP without restrictions on argument types). > > I knew I was missing something :-) thanks. > > > If you add (DECLARE (NOTINLINE +)), it will probably work, but it > > will be less efficient than the current version. But you can > > replace ASSERT with IF, and if the condition fails use your > > version. > > Are we after efficiency for the out-of-line versions? If something could be made more efficient without sacrificing correctness... why not? > Are they used > for anything other than constant-folding? They are used if argument types are not known to be good; see your first implementation of +-MOD32 above. -- Regards, Alexey Dejneka "Alas, the spheres of truth are less transparent than those of illusion." -- L.E.J. Brouwer |