X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=contrib%2Fsb-rotate-byte%2Fcompiler.lisp;h=7165b3690abcf7b04767d18a53052aadbf862c35;hb=a30cbc0b0ed6bd7e7720465e07be6547d7295495;hp=95dcf655fa39a1d8485944631b39852bbbdcf3ef;hpb=cec71f1e4e1ead387f2ea642f760e553b6053f2b;p=sbcl.git diff --git a/contrib/sb-rotate-byte/compiler.lisp b/contrib/sb-rotate-byte/compiler.lisp index 95dcf65..7165b36 100644 --- a/contrib/sb-rotate-byte/compiler.lisp +++ b/contrib/sb-rotate-byte/compiler.lisp @@ -29,10 +29,10 @@ (defoptimizer (%rotate-byte derive-type) ((count size posn num)) ;; FIXME: this looks fairly unwieldy. I'm sure it can be made ;; simpler, and also be made to deal with negative integers too. - (let ((size (sb-c::continuation-type size))) + (let ((size (sb-c::lvar-type size))) (if (numeric-type-p size) (let ((size-high (numeric-type-high size)) - (num-type (sb-c::continuation-type num))) + (num-type (sb-c::lvar-type num))) (if (and size-high num-type (<= size-high sb-vm:n-word-bits) @@ -48,9 +48,11 @@ 'integer) (deftransform %rotate-byte ((count size pos integer) - ((or (integer -31 -1) (integer 1 31)) + ((integer -31 31) (constant-arg (member 32)) (constant-arg (member 0)) (unsigned-byte 32)) *) "inline 32-bit rotation" + ;; FIXME: What happens when, as here, the two type specifiers for + ;; COUNT overlap? Which gets to run first? '(%unsigned-32-rotate-byte count integer))