X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fir2tran.lisp;h=24bccb729f1fbd2e9ae5fa1052ae904bc63d946b;hb=70c40b1892a606163d0f60ac7b20093724e8e5e5;hp=af5c7e4f66bd37d1d75f92543f2e9387d013f529;hpb=e6f4c7523aa628ece995ee01879d3fb90eed6d9f;p=sbcl.git diff --git a/src/compiler/ir2tran.lisp b/src/compiler/ir2tran.lisp index af5c7e4..24bccb7 100644 --- a/src/compiler/ir2tran.lisp +++ b/src/compiler/ir2tran.lisp @@ -1542,8 +1542,7 @@ (progn (labels ((,unbind (vars) (declare (optimize (speed 2) (debug 0))) - (let ((unbound-marker (%primitive make-other-immediate-type - 0 sb!vm:unbound-marker-widetag))) + (let ((unbound-marker (%primitive make-unbound-marker))) (dolist (var vars) ;; CLHS says "bound and then made to have no value" -- user ;; should not be able to tell the difference between that and this. @@ -1768,6 +1767,46 @@ (def list*)) +(defoptimizer (mask-signed-field ir2-convert) ((width x) node block) + (block nil + (when (constant-lvar-p width) + (case (lvar-value width) + (#.(- sb!vm:n-word-bits sb!vm:n-fixnum-tag-bits) + (when (or (csubtypep (lvar-type x) + (specifier-type 'word)) + (csubtypep (lvar-type x) + (specifier-type 'sb!vm:signed-word))) + (let* ((lvar (node-lvar node)) + (temp (make-normal-tn + (if (csubtypep (lvar-type x) + (specifier-type 'word)) + (primitive-type-of most-positive-word) + (primitive-type-of + (- (ash most-positive-word -1)))))) + (results (lvar-result-tns + lvar + (list (primitive-type-or-lose 'fixnum))))) + (emit-move node block (lvar-tn node block x) temp) + (vop sb!vm::move-from-word/fixnum node block + temp (first results)) + (move-lvar-result node block results lvar) + (return)))) + (#.sb!vm:n-word-bits + (when (csubtypep (lvar-type x) (specifier-type 'word)) + (let* ((lvar (node-lvar node)) + (temp (make-normal-tn + (primitive-type-of most-positive-word))) + (results (lvar-result-tns + lvar + (list (primitive-type + (specifier-type 'sb!vm:signed-word)))))) + (emit-move node block (lvar-tn node block x) temp) + (vop sb!vm::word-move node block + temp (first results)) + (move-lvar-result node block results lvar) + (return)))))) + (ir2-convert-full-call node block))) + ;;; Convert the code in a component into VOPs. (defun ir2-convert (component) (declare (type component component))