X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcompiler%2Fx86-64%2Fvm.lisp;h=91298cccbaa4af1016ac152e87ad08763489d5ef;hb=f21e0f5b908263715ea0d867edb64ceba5a3d668;hp=77bd30eef2a08004f5998784a4ff2f87fec830c2;hpb=56a2dbbb9d79a62db99cc4061e50fca74fcf907e;p=sbcl.git diff --git a/src/compiler/x86-64/vm.lisp b/src/compiler/x86-64/vm.lisp index 77bd30e..91298cc 100644 --- a/src/compiler/x86-64/vm.lisp +++ b/src/compiler/x86-64/vm.lisp @@ -170,7 +170,10 @@ (eval-when (:compile-toplevel :load-toplevel :execute) (defparameter *register-arg-names* '(rdx rdi rsi))) (defregset *register-arg-offsets* rdx rdi rsi) - (defregset *c-call-register-arg-offsets* rdi rsi rdx rcx r8 r9)) + #!-win32 + (defregset *c-call-register-arg-offsets* rdi rsi rdx rcx r8 r9) + #!+win32 + (defregset *c-call-register-arg-offsets* rcx rdx r8 r9)) ;;;; SB definitions @@ -477,6 +480,8 @@ 'fp-complex-double-zero 'fp-complex-double-immediate))))) +(!def-vm-support-routine boxed-immediate-sc-p (sc) + (eql sc (sc-number-or-lose 'immediate))) ;;;; miscellaneous function call parameters @@ -550,9 +555,33 @@ (def!constant cfp-offset rbp-offset) ; pfw - needed by stuff in /code (!def-vm-support-routine combination-implementation-style (node) - (declare (type sb!c::combination node) (ignore node)) - (values :default nil)) - -(defun primitive-type-indirect-cell-type (ptype) - (declare (ignore ptype)) - nil) + (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) '*) + ;; todo: nothing prevents this from testing an unsigned word against + ;; a signed word, except for the mess of VOPs it would demand + (valid-funtype '((signed-byte 64) (signed-byte 64)) '*) + (valid-funtype '((unsigned-byte 64) (unsigned-byte 64)) '*)) + (values :maybe nil)) + (t + (values :default nil)))) + (logbitp + (cond + ((or (and (valid-funtype '#.`((integer 0 ,(- 63 n-fixnum-tag-bits)) + fixnum) '*) + (sb!c::constant-lvar-p + (first (sb!c::basic-combination-args node)))) + (valid-funtype '((integer 0 63) (signed-byte 64)) '*) + (valid-funtype '((integer 0 63) (unsigned-byte 64)) '*)) + (values :transform '(lambda (index integer) + (%logbitp integer index)))) + (t + (values :default nil)))) + (t + (values :default nil)))))