X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86%2Fvm.lisp;h=4079bdec5dcd4a95cb6d8e895ee81735757d0b7f;hb=7c406887c08477181e869b1b98142d99b52990ac;hp=833dd739f00fd23a928d1bbd1acd522f0d997462;hpb=0d871fd7a98fc4af92a8b942a1154761466ad8c9;p=sbcl.git diff --git a/src/compiler/x86/vm.lisp b/src/compiler/x86/vm.lisp index 833dd73..4079bde 100644 --- a/src/compiler/x86/vm.lisp +++ b/src/compiler/x86/vm.lisp @@ -160,7 +160,8 @@ ;;; (What a KLUDGE! Anyone who wants to come in and clean up this mess ;;; has my gratitude.) (FIXME: Maybe this should be me..) (eval-when (:compile-toplevel :load-toplevel :execute) - (def!constant kludge-nondeterministic-catch-block-size 6)) + (def!constant kludge-nondeterministic-catch-block-size + #!-win32 6 #!+win32 8)) (!define-storage-classes @@ -231,6 +232,8 @@ (character-reg registers :locations #!-sb-unicode #.*byte-regs* #!+sb-unicode #.*dword-regs* + #!+sb-unicode #!+sb-unicode + :element-size 2 #!-sb-unicode #!-sb-unicode :reserve-locations (#.ah-offset #.al-offset) :constant-scs (immediate) @@ -381,7 +384,7 @@ (!def-vm-support-routine immediate-constant-sc (value) (typecase value ((or (integer #.sb!xc:most-negative-fixnum #.sb!xc:most-positive-fixnum) - #-sb-xc-host system-area-pointer character) + character) (sc-number-or-lose 'immediate)) (symbol (when (static-symbol-p value) @@ -401,13 +404,34 @@ (eql value (log 2l0 10l0)) (eql value (log 2l0 2.718281828459045235360287471352662L0))) (sc-number-or-lose 'fp-constant))))) + +;; For an immediate TN, return its value encoded for use as a literal. +;; For any other TN, return the TN. Only works for FIXNUMs, +;; STATIC-SYMBOLs, and CHARACTERS (FLOATs and SAPs are handled +;; elsewhere). +(defun encode-value-if-immediate (tn) + (if (sc-is tn immediate) + (let ((val (tn-value tn))) + (etypecase val + (integer (fixnumize val)) + (symbol (+ nil-value (static-symbol-offset val))) + (character (logior (ash (char-code val) n-widetag-bits) + character-widetag)))) + tn)) ;;;; miscellaneous function call parameters ;;; offsets of special stack frame locations (def!constant ocfp-save-offset 0) (def!constant return-pc-save-offset 1) -(def!constant code-save-offset 2) + +(declaim (inline frame-word-offset)) +(defun frame-word-offset (index) + (- (1+ index))) + +(declaim (inline frame-byte-offset)) +(defun frame-byte-offset (index) + (* (frame-word-offset index) n-word-bytes)) ;;; FIXME: This is a bad comment (changed since when?) and there are others ;;; like it in this file. It'd be nice to clarify them. Failing that deleting @@ -449,3 +473,34 @@ (immediate-constant "Immed") (noise (symbol-name (sc-name sc)))))) ;;; FIXME: Could this, and everything that uses it, be made #!+SB-SHOW? + +(!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 + ((valid-funtype '(fixnum fixnum) '*) + (values :direct nil)) + ((valid-funtype '((signed-byte 32) (signed-byte 32)) '*) + (values :direct nil)) + ((valid-funtype '((unsigned-byte 32) (unsigned-byte 32)) '*) + (values :direct nil)) + (t (values :default nil)))) + (logbitp + (cond + ((and (valid-funtype '((integer 0 29) fixnum) '*) + (sb!c::constant-lvar-p (first (sb!c::basic-combination-args node)))) + (values :transform '(lambda (index integer) + (%logbitp integer index)))) + ((valid-funtype '((integer 0 31) (signed-byte 32)) '*) + (values :transform '(lambda (index integer) + (%logbitp integer index)))) + ((valid-funtype '((integer 0 31) (unsigned-byte 32)) '*) + (values :transform '(lambda (index integer) + (%logbitp integer index)))) + (t (values :default nil)))) + (t (values :default nil)))))