X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcompiler%2Fppc%2Fvm.lisp;h=e31f47431f0e39a0c20e314be5736545961636df;hb=a7ec2f1af6881c93585d97fb2fdcdfd98006f217;hp=0de57d5c7dd99ed5fad3f93eed693320e24f4ea5;hpb=b3403ba11749366786ed574f4cdf51813dff2ff7;p=sbcl.git diff --git a/src/compiler/ppc/vm.lisp b/src/compiler/ppc/vm.lisp index 0de57d5..e31f474 100644 --- a/src/compiler/ppc/vm.lisp +++ b/src/compiler/ppc/vm.lisp @@ -118,7 +118,7 @@ ((null classes) (nreverse forms)))) -(def!constant kludge-nondeterministic-catch-block-size 7) +(def!constant kludge-nondeterministic-catch-block-size 6) (define-storage-classes @@ -278,12 +278,20 @@ (null (sc-number-or-lose 'null)) ((or (integer #.sb!xc:most-negative-fixnum #.sb!xc:most-positive-fixnum) - system-area-pointer character) + character) (sc-number-or-lose 'immediate)) (symbol (if (static-symbol-p value) (sc-number-or-lose 'immediate) nil)))) + +;;; A predicate to see if a character can be used as an inline +;;; constant (the immediate field in the instruction used is sixteen +;;; bits wide, which is not the same as any defined subtype of +;;; CHARACTER). +(defun inlinable-character-constant-p (char) + (and (characterp char) + (< (char-code char) #x10000))) ;;;; function call parameters @@ -337,3 +345,45 @@ (constant (format nil "Const~D" offset)) (immediate-constant "Immed")))) +(!def-vm-support-routine combination-implementation-style (node) + (declare (type sb!c::combination node)) + (flet ((valid-funtype (args result) + (sb!c::valid-fun-use node + (sb!c::specifier-type + `(function ,args ,result))))) + (case (sb!c::combination-fun-source-name node) + (logtest + (cond + ((or (valid-funtype '(fixnum fixnum) '*) + (valid-funtype '((signed-byte 32) (signed-byte 32)) '*) + (valid-funtype '((unsigned-byte 32) (unsigned-byte 32)) '*)) + (values :direct nil)) + (t (values :default nil)))) + (logbitp + (cond + ((or (valid-funtype '((constant-arg (integer 0 29)) fixnum) '*) + (valid-funtype '((constant-arg (integer 0 31)) (signed-byte 32)) '*) + (valid-funtype '((constant-arg (integer 0 31)) (unsigned-byte 32)) '*)) + (values :transform '(lambda (index integer) + (%logbitp integer index)))) + (t (values :default nil)))) + ;; FIXME: can handle MIN and MAX here + (sb!kernel:%ldb + (cond + ((or (valid-funtype '((constant-arg (integer 1 29)) + (constant-arg (integer 0 29)) + fixnum) + 'fixnum) + (valid-funtype '((constant-arg (integer 1 29)) + (constant-arg (integer 0 29)) + (signed-byte 32)) + 'fixnum) + (valid-funtype '((constant-arg (integer 1 29)) + (constant-arg (integer 0 29)) + (unsigned-byte 32)) + 'fixnum)) + (values :transform + '(lambda (size posn integer) + (%%ldb integer size posn)))) + (t (values :default nil)))) + (t (values :default nil)))))