(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))
\f
;;;; SB definitions
'fp-complex-double-zero
'fp-complex-double-immediate)))))
+(!def-vm-support-routine boxed-immediate-sc-p (sc)
+ (eql sc (sc-number-or-lose 'immediate)))
\f
;;;; miscellaneous function call parameters
(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)))))