X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fppc%2Fvm.lisp;h=cac0428e6664a67758c13b64236ff7197a73af28;hb=ef0891e470ff35840def7a5717ede18a58266e76;hp=058f252e4be2bd40c2c58a189cc0486bdc275e68;hpb=a98cb5fbd7c2eb682613419b4d42f0411278c964;p=sbcl.git diff --git a/src/compiler/ppc/vm.lisp b/src/compiler/ppc/vm.lisp index 058f252..cac0428 100644 --- a/src/compiler/ppc/vm.lisp +++ b/src/compiler/ppc/vm.lisp @@ -74,7 +74,7 @@ (defreg a3 27) (defreg l0 28) (defreg l1 29) - (defreg l2 30) + (defreg #!-sb-thread l2 #!+sb-thread thread 30) (defreg lip 31) (defregset non-descriptor-regs @@ -287,6 +287,11 @@ (sc-number-or-lose 'immediate) nil)))) +(!def-vm-support-routine boxed-immediate-sc-p (sc) + (or (eql sc (sc-number-or-lose 'zero)) + (eql sc (sc-number-or-lose 'null)) + (eql sc (sc-number-or-lose 'immediate)))) + ;;; 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 @@ -330,7 +335,7 @@ #!+sb-thread (defparameter thread-base-tn (make-random-tn :kind :normal :sc (sc-or-lose 'unsigned-reg) - :offset l2-offset)) + :offset thread-offset)) (export 'single-value-return-byte-offset) @@ -376,21 +381,25 @@ (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)))) + (flet ((validp (type width) + (and (valid-funtype `((constant-arg (integer 1 29)) + (constant-arg (mod ,width)) + ,type) + 'fixnum) + (destructuring-bind (size posn integer) + (sb!c::basic-combination-args node) + (declare (ignore integer)) + (<= (+ (sb!c::lvar-value size) + (sb!c::lvar-value posn)) + width))))) + (if (or (validp 'fixnum 29) + (validp '(signed-byte 32) 32) + (validp '(unsigned-byte 32) 32)) + (values :transform '(lambda (size posn integer) + (%%ldb integer size posn))) + (values :default nil)))) (t (values :default nil))))) + +(defun primitive-type-indirect-cell-type (ptype) + (declare (ignore ptype)) + nil)