(eval-when (:compile-toplevel :load-toplevel :execute)
(defvar *byte-register-names* (make-array 32 :initial-element nil))
- (defvar *word-register-names* (make-array 16 :initial-element nil))
- (defvar *dword-register-names* (make-array 16 :initial-element nil))
+ (defvar *word-register-names* (make-array 32 :initial-element nil))
+ (defvar *dword-register-names* (make-array 32 :initial-element nil))
(defvar *qword-register-names* (make-array 32 :initial-element nil))
(defvar *float-register-names* (make-array 16 :initial-element nil)))
(defreg bp 10 :word)
(defreg si 12 :word)
(defreg di 14 :word)
- (defregset *word-regs* ax cx dx bx si di)
+ (defreg r8w 16 :word)
+ (defreg r9w 18 :word)
+ (defreg r10w 20 :word)
+ (defreg r11w 22 :word)
+ (defreg r12w 24 :word)
+ (defreg r13w 26 :word)
+ (defreg r14w 28 :word)
+ (defreg r15w 30 :word)
+ (defregset *word-regs* ax cx dx bx si di r8w r9w r10w
+ #+nil r11w #+nil r12w r13w r14w r15w)
;; double word registers
(defreg eax 0 :dword)
(defreg ebp 10 :dword)
(defreg esi 12 :dword)
(defreg edi 14 :dword)
- (defregset *dword-regs* eax ecx edx ebx esi edi)
+ (defreg r8d 16 :dword)
+ (defreg r9d 18 :dword)
+ (defreg r10d 20 :dword)
+ (defreg r11d 22 :dword)
+ (defreg r12d 24 :dword)
+ (defreg r13d 26 :dword)
+ (defreg r14d 28 :dword)
+ (defreg r15d 30 :dword)
+ (defregset *dword-regs* eax ecx edx ebx esi edi r8d r9d r10d
+ #+nil r11d #+nil r12w r13d r14d r15d)
;; quadword registers
(defreg rax 0 :qword)
(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
(define-storage-base float-registers :finite :size 16)
-(define-storage-base stack :unbounded :size 8)
+(define-storage-base stack :unbounded :size 4 :size-increment 1)
(define-storage-base constant :non-packed)
(define-storage-base immediate-constant :non-packed)
(define-storage-base noise :unbounded :size 2)
(fp-complex-single-immediate immediate-constant)
(fp-complex-double-immediate immediate-constant)
+ #!+sb-simd-pack (int-sse-immediate immediate-constant)
+ #!+sb-simd-pack (double-sse-immediate immediate-constant)
+ #!+sb-simd-pack (single-sse-immediate immediate-constant)
+
(immediate immediate-constant)
;;
(double-stack stack)
(complex-single-stack stack) ; complex-single-floats
(complex-double-stack stack :element-size 2) ; complex-double-floats
-
+ #!+sb-simd-pack
+ (int-sse-stack stack :element-size 2)
+ #!+sb-simd-pack
+ (double-sse-stack stack :element-size 2)
+ #!+sb-simd-pack
+ (single-sse-stack stack :element-size 2)
;;
;; magic SCs
:save-p t
:alternate-scs (complex-double-stack))
+ ;; temporary only
+ #!+sb-simd-pack
+ (sse-reg float-registers
+ :locations #.*float-regs*)
+ ;; regular values
+ #!+sb-simd-pack
+ (int-sse-reg float-registers
+ :locations #.*float-regs*
+ :constant-scs (int-sse-immediate)
+ :save-p t
+ :alternate-scs (int-sse-stack))
+ #!+sb-simd-pack
+ (double-sse-reg float-registers
+ :locations #.*float-regs*
+ :constant-scs (double-sse-immediate)
+ :save-p t
+ :alternate-scs (double-sse-stack))
+ #!+sb-simd-pack
+ (single-sse-reg float-registers
+ :locations #.*float-regs*
+ :constant-scs (single-sse-immediate)
+ :save-p t
+ :alternate-scs (single-sse-stack))
+
;; a catch or unwind block
(catch-block stack :element-size kludge-nondeterministic-catch-block-size))
(defparameter *double-sc-names* '(double-reg double-stack))
(defparameter *complex-sc-names* '(complex-single-reg complex-single-stack
complex-double-reg complex-double-stack))
+#!+sb-simd-pack
+(defparameter *oword-sc-names* '(sse-reg int-sse-reg single-sse-reg double-sse-reg
+ sse-stack int-sse-stack single-sse-stack double-sse-stack))
) ; EVAL-WHEN
\f
;;;; miscellaneous TNs for the various registers
(def-misc-reg-tns unsigned-reg rax rbx rcx rdx rbp rsp rdi rsi
r8 r9 r10 r11 r12 r13 r14 r15)
- (def-misc-reg-tns dword-reg eax ebx ecx edx ebp esp edi esi)
- (def-misc-reg-tns word-reg ax bx cx dx bp sp di si)
+ (def-misc-reg-tns dword-reg eax ebx ecx edx ebp esp edi esi
+ r8d r9d r10d r11d r12d r13d r14d r15d)
+ (def-misc-reg-tns word-reg ax bx cx dx bp sp di si
+ r8w r9w r10w r11w r12w r13w r14w r15w)
(def-misc-reg-tns byte-reg al cl dl bl sil dil r8b r9b r10b
r11b r12b r13b r14b r15b)
(def-misc-reg-tns single-reg
float0 float1 float2 float3 float4 float5 float6 float7
float8 float9 float10 float11 float12 float13 float14 float15))
+(defun reg-in-size (tn size)
+ (make-random-tn :kind :normal
+ :sc (sc-or-lose
+ (ecase size
+ (:byte 'byte-reg)
+ (:word 'word-reg)
+ (:dword 'dword-reg)
+ (:qword 'unsigned-reg)))
+ :offset (tn-offset tn)))
+
;; A register that's never used by the code generator, and can therefore
;; be used as an assembly temporary in cases where a VOP :TEMPORARY can't
;; be used.
;;; If value can be represented as an immediate constant, then return
;;; the appropriate SC number, otherwise return NIL.
-(!def-vm-support-routine immediate-constant-sc (value)
+(defun immediate-constant-sc (value)
(typecase value
((or (integer #.sb!xc:most-negative-fixnum #.sb!xc:most-positive-fixnum)
character)
(sc-number-or-lose
(if (eql value #c(0d0 0d0))
'fp-complex-double-zero
- 'fp-complex-double-immediate)))))
-
+ 'fp-complex-double-immediate)))
+ #!+sb-simd-pack
+ (#+sb-xc-host nil
+ #-sb-xc-host (simd-pack double-float)
+ (sc-number-or-lose 'double-sse-immediate))
+ #!+sb-simd-pack
+ (#+sb-xc-host nil
+ #-sb-xc-host (simd-pack single-float)
+ (sc-number-or-lose 'single-sse-immediate))
+ #!+sb-simd-pack
+ (#+sb-xc-host nil
+ #-sb-xc-host simd-pack
+ (sc-number-or-lose 'int-sse-immediate))))
+
+(defun boxed-immediate-sc-p (sc)
+ (eql sc (sc-number-or-lose 'immediate)))
\f
;;;; miscellaneous function call parameters
\f
;;; This function is called by debug output routines that want a pretty name
;;; for a TN's location. It returns a thing that can be printed with PRINC.
-(!def-vm-support-routine location-print-name (tn)
+(defun location-print-name (tn)
(declare (type tn tn))
(let* ((sc (tn-sc tn))
(sb (sb-name (sc-sb sc)))
(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 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) '*)
+ ;; 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)))))