0.9.2.40:
[sbcl.git] / src / compiler / mips / vm.lisp
index fb2eeb3..b20d78b 100644 (file)
@@ -1,3 +1,14 @@
+;;;; miscellaneous VM definition noise for MIPS
+
+;;;; This software is part of the SBCL system. See the README file for
+;;;; more information.
+;;;;
+;;;; This software is derived from the CMU CL system, which was
+;;;; written at Carnegie Mellon University and released into the
+;;;; public domain. The software is in the public domain and is
+;;;; provided with absolutely no warranty. See the COPYING and CREDITS
+;;;; files for more information.
+
 (in-package "SB!VM")
 
 \f
 (macrolet ((defreg (name offset)
               (let ((offset-sym (symbolicate name "-OFFSET")))
                 `(eval-when (:compile-toplevel :load-toplevel :execute)
-                  (defconstant ,offset-sym ,offset)
+                  (def!constant ,offset-sym ,offset)
                   (setf (svref *register-names* ,offset-sym) ,(symbol-name name)))))
 
           (defregset (name &rest regs)
               `(eval-when (:compile-toplevel :load-toplevel :execute)
                 (defparameter ,name
                   (list ,@(mapcar #'(lambda (name) (symbolicate name "-OFFSET")) regs))))))
-  (defreg zero 0)
-  (defreg nl3 1)
-  (defreg cfunc 2)
-  (defreg nl4 3)
-  (defreg nl0 4) ; First C argument reg.
-  (defreg nl1 5)
-  (defreg nl2 6)
-  (defreg nargs 7)
-  (defreg a0 8)
-  (defreg a1 9)
-  (defreg a2 10)
-  (defreg a3 11)
-  (defreg a4 12)
-  (defreg a5 13)
-  (defreg fdefn 14)
-  (defreg lexenv 15)
-  ;; First saved reg
-  (defreg nfp 16)
-  (defreg ocfp 17)
-  (defreg lra 18)
-  (defreg l0 19)
-  (defreg null 20)
-  (defreg bsp 21)
-  (defreg cfp 22)
-  (defreg csp 23)
-  (defreg l1 24)
-  (defreg alloc 25)
-  (defreg nsp 29)
-  (defreg code 30)
-  (defreg lip 31)
+  ;; Wired zero register.
+  (defreg zero 0) ; NULL
+  ;; Reserved for assembler use.
+  (defreg nl3 1) ; untagged temporary 3
+  ;; C return registers.
+  (defreg cfunc 2) ; FF function address, wastes a register
+  (defreg nl4 3) ; PA flag
+  ;; C argument registers.
+  (defreg nl0 4) ; untagged temporary 0
+  (defreg nl1 5) ; untagged temporary 1
+  (defreg nl2 6) ; untagged temporary 2
+  (defreg nargs 7) ; number of function arguments
+  ;; C unsaved temporaries.
+  (defreg a0 8) ; function arg 0
+  (defreg a1 9) ; function arg 1
+  (defreg a2 10) ; function arg 2
+  (defreg a3 11) ; function arg 3
+  (defreg a4 12) ; function arg 4
+  (defreg a5 13) ; function arg 5
+  (defreg fdefn 14) ; ?
+  (defreg lexenv 15) ; wastes a register
+  ;; C saved registers.
+  (defreg nfp 16) ; non-lisp frame pointer
+  (defreg ocfp 17) ; caller's control frame pointer
+  (defreg lra 18) ; tagged Lisp return address
+  (defreg l0 19) ; tagged temporary 0
+  (defreg null 20) ; NIL
+  (defreg bsp 21) ; binding stack pointer
+  (defreg cfp 22) ; control frame pointer
+  (defreg csp 23) ; control stack pointer
+  ;; More C unsaved temporaries.
+  (defreg l1 24) ; tagged temporary 1
+  (defreg alloc 25) ; ALLOC pointer
+  ;; 26 and 27 are used by the system kernel.
+  ;; 28 is the global pointer of our C runtime.
+  (defreg nsp 29) ; number (native) stack pointer
+  ;; C frame pointer, or additional saved register.
+  (defreg code 30) ; current function object
+  ;; Return link register.
+  (defreg lip 31) ; Lisp interior pointer
 
   (defregset non-descriptor-regs
       nl0 nl1 nl2 nl3 nl4 cfunc nargs)
       ((null classes)
        (nreverse forms))))
 
-(def!constant sb!vm::kludge-nondeterministic-catch-block-size 7)
+(def!constant kludge-nondeterministic-catch-block-size 7)
 
 (!define-storage-classes
 
   ;; The non-descriptor stacks.
   (signed-stack non-descriptor-stack) ; (signed-byte 32)
   (unsigned-stack non-descriptor-stack) ; (unsigned-byte 32)
-  (base-char-stack non-descriptor-stack) ; non-descriptor characters.
+  (character-stack non-descriptor-stack) ; non-descriptor characters.
   (sap-stack non-descriptor-stack) ; System area pointers.
   (single-stack non-descriptor-stack) ; single-floats
   (double-stack non-descriptor-stack :element-size 2) ; double floats.
    :alternate-scs (control-stack))
 
   ;; Non-Descriptor characters
-  (base-char-reg registers
+  (character-reg registers
    :locations #.non-descriptor-regs
    :reserve-locations #.reserve-non-descriptor-regs
    :constant-scs (immediate)
    :save-p t
-   :alternate-scs (base-char-stack))
+   :alternate-scs (character-stack))
 
   ;; Non-Descriptor SAP's (arbitrary pointers into address space)
   (sap-reg registers
    :alternate-scs (complex-double-stack))
 
   ;; A catch or unwind block.
-  (catch-block control-stack :element-size sb!vm::kludge-nondeterministic-catch-block-size)
+  (catch-block control-stack :element-size kludge-nondeterministic-catch-block-size)
 
   ;; floating point numbers temporarily stuck in integer registers for c-call
   (single-int-carg-reg registers
                    :sc (sc-or-lose ',sc)
                    :offset ,offset-sym)))))
   (defregtn zero any-reg)
-  (defregtn lip interior-reg)
-  (defregtn code descriptor-reg)
-  (defregtn alloc any-reg)
-  (defregtn null descriptor-reg)
-
   (defregtn nargs any-reg)
+
   (defregtn fdefn descriptor-reg)
   (defregtn lexenv descriptor-reg)
 
+  (defregtn nfp any-reg)
+  (defregtn ocfp any-reg)
+
+  (defregtn null descriptor-reg)
+
   (defregtn bsp any-reg)
-  (defregtn csp any-reg)
   (defregtn cfp any-reg)
-  (defregtn ocfp any-reg)
+  (defregtn csp any-reg)
+  (defregtn alloc any-reg)
   (defregtn nsp any-reg)
-  (defregtn nfp any-reg))
+
+  (defregtn code descriptor-reg)
+  (defregtn lip interior-reg))
 \f
-;;;
-;;; Immediate-Constant-SC  --  Interface
-;;;
-;;; If value can be represented as an immediate constant, then return the
+;;; 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)
   (typecase value
     ((integer 0 0)
      (if (static-symbol-p value)
         (sc-number-or-lose 'immediate)
         nil))
-    ((signed-byte 30)
+    ((or (integer #.sb!xc:most-negative-fixnum #.sb!xc:most-positive-fixnum)
+        system-area-pointer character)
      (sc-number-or-lose 'immediate))
     (system-area-pointer
      (sc-number-or-lose 'immediate))
 ;;; 
 (defconstant-eqx register-arg-names '(a0 a1 a2 a3 a4 a5) #'equal)
 
-); Eval-When (Compile Load Eval)
+) ; EVAL-WHEN
 
 
 ;;; A list of TN's describing the register arguments.
                              :offset n))
          *register-arg-offsets*))
 
-;;; SINGLE-VALUE-RETURN-BYTE-OFFSET
-;;;
 ;;; This is used by the debugger.
-;;;
 (defconstant single-value-return-byte-offset 8)
-
 \f
-;;; LOCATION-PRINT-NAME  --  Interface
-;;;
-;;;    This function is called by debug output routines that want a pretty name
+;;; 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)
   (declare (type tn tn))
   (let ((sb (sb-name (sc-sb (tn-sc tn))))
       (constant (format nil "Const~D" offset))
       (immediate-constant "Immed"))))
 
-(defun extern-alien-name (name)
-  (declare (type simple-base-string name))
-  name)
+