Eliminate "unused variable" warning from ARRAY-ROW-MAJOR-INDEX
[sbcl.git] / src / compiler / mips / call.lisp
index 8ceb602..0a42bdc 100644 (file)
@@ -15,7 +15,7 @@
 
 ;;; Return a wired TN describing the N'th full call argument passing
 ;;; location.
-(!def-vm-support-routine standard-arg-location (n)
+(defun standard-arg-location (n)
   (declare (type unsigned-byte n))
   (if (< n register-arg-count)
       (make-wired-tn *backend-t-primitive-type*
@@ -29,7 +29,7 @@
 ;;; true, then use the standard (full call) location, otherwise use any legal
 ;;; location.  Even in the non-standard case, this may be restricted by a
 ;;; desire to use a subroutine call instruction.
-(!def-vm-support-routine make-return-pc-passing-location (standard)
+(defun make-return-pc-passing-location (standard)
   (if standard
       (make-wired-tn *backend-t-primitive-type* register-arg-scn lra-offset)
       (make-restricted-tn *backend-t-primitive-type* register-arg-scn)))
@@ -39,7 +39,7 @@
 ;;; standard convention, but is totally unrestricted in non-standard
 ;;; conventions, since we can always fetch it off of the stack using
 ;;; the arg pointer.
-(!def-vm-support-routine make-old-fp-passing-location (standard)
+(defun make-old-fp-passing-location (standard)
   (if standard
       (make-wired-tn *fixnum-primitive-type* immediate-arg-scn ocfp-offset)
       (make-normal-tn *fixnum-primitive-type*)))
 ;;; Make the TNs used to hold OLD-FP and RETURN-PC within the current
 ;;; function. We treat these specially so that the debugger can find
 ;;; them at a known location.
-(!def-vm-support-routine make-old-fp-save-location (env)
+(defun make-old-fp-save-location (env)
   (specify-save-tn
    (physenv-debug-live-tn (make-normal-tn *fixnum-primitive-type*) env)
    (make-wired-tn *fixnum-primitive-type*
                   control-stack-arg-scn
                   ocfp-save-offset)))
 
-(!def-vm-support-routine make-return-pc-save-location (env)
+(defun make-return-pc-save-location (env)
   (let ((ptype *backend-t-primitive-type*))
     (specify-save-tn
      (physenv-debug-live-tn (make-normal-tn ptype) env)
 ;;; Make a TN for the standard argument count passing location.  We only
 ;;; need to make the standard location, since a count is never passed when we
 ;;; are using non-standard conventions.
-(!def-vm-support-routine make-arg-count-location ()
+(defun make-arg-count-location ()
   (make-wired-tn *fixnum-primitive-type* immediate-arg-scn nargs-offset))
 
 
 ;;; Make a TN to hold the number-stack frame pointer.  This is allocated
 ;;; once per component, and is component-live.
-(!def-vm-support-routine make-nfp-tn ()
+(defun make-nfp-tn ()
   (component-live-tn
    (make-wired-tn *fixnum-primitive-type* immediate-arg-scn nfp-offset)))
 
-(!def-vm-support-routine make-stack-pointer-tn ()
+(defun make-stack-pointer-tn ()
   (make-normal-tn *fixnum-primitive-type*))
 
-(!def-vm-support-routine make-number-stack-pointer-tn ()
+(defun make-number-stack-pointer-tn ()
   (make-normal-tn *fixnum-primitive-type*))
 
 ;;; Return a list of TNs that can be used to represent an unknown-values
 ;;; continuation within a function.
-(!def-vm-support-routine make-unknown-values-locations ()
+(defun make-unknown-values-locations ()
   (list (make-stack-pointer-tn)
         (make-normal-tn *fixnum-primitive-type*)))
 
@@ -90,7 +90,7 @@
 ;;; VM-dependent initialization of the IR2-COMPONENT structure.  We push
 ;;; placeholder entries in the Constants to leave room for additional
 ;;; noise in the code object header.
-(!def-vm-support-routine select-component-format (component)
+(defun select-component-format (component)
   (declare (type component component))
   (dotimes (i code-constants-offset)
     (vector-push-extend nil
       (when nfp
         (inst addu val nfp (bytes-needed-for-non-descriptor-stack-frame))))))
 
+;;; Accessing a slot from an earlier stack frame is definite hackery.
+(define-vop (ancestor-frame-ref)
+  (:args (frame-pointer :scs (descriptor-reg))
+         (variable-home-tn :load-if nil))
+  (:results (value :scs (descriptor-reg any-reg)))
+  (:policy :fast-safe)
+  (:generator 4
+    (aver (sc-is variable-home-tn control-stack))
+    (loadw value frame-pointer (tn-offset variable-home-tn))))
+(define-vop (ancestor-frame-set)
+  (:args (frame-pointer :scs (descriptor-reg))
+         (value :scs (descriptor-reg any-reg)))
+  (:results (variable-home-tn :load-if nil))
+  (:policy :fast-safe)
+  (:generator 4
+    (aver (sc-is variable-home-tn control-stack))
+    (storew value frame-pointer (tn-offset variable-home-tn))))
 
 (define-vop (xep-allocate-frame)
   (:info start-lab copy-more-arg-follows)
   (:generator 1
     ;; Make sure the function is aligned, and drop a label pointing to this
     ;; function header.
-    (align n-lowtag-bits)
+    (emit-alignment n-lowtag-bits)
     (trace-table-entry trace-table-fun-prologue)
     (emit-label start-lab)
     ;; Allocate function header.
@@ -367,9 +384,9 @@ default-value-8
 
     (when lra-label
       (inst compute-code-from-lra code-tn code-tn lra-label temp))
-    (inst addu csp-tn csp-tn 4)
+    (inst addu csp-tn csp-tn n-word-bytes)
     (storew (first *register-arg-tns*) csp-tn -1)
-    (inst addu start csp-tn -4)
+    (inst addu start csp-tn (- n-word-bytes))
     (inst li count (fixnumize 1))
 
     (emit-label done)
@@ -405,6 +422,15 @@ default-value-8
               nvals)
   (:temporary (:scs (non-descriptor-reg)) temp))
 
+\f
+;;; This hook in the codegen pass lets us insert code before fall-thru entry
+;;; points, local-call entry points, and tail-call entry points.  The default
+;;; does nothing.
+(defun emit-block-header (start-label trampoline-label fall-thru-p alignp)
+  (declare (ignore fall-thru-p alignp))
+  (when trampoline-label
+    (emit-label trampoline-label))
+  (emit-label start-label))
 
 \f
 ;;;; Local call with unknown values convention return:
@@ -703,7 +729,7 @@ default-value-8
          '((:temporary (:scs (non-descriptor-reg)) temp)
            (:temporary (:sc control-stack :offset nfp-save-offset) nfp-save)))
 
-     (:temporary (:sc interior-reg :offset lip-offset) entry-point)
+     (:temporary (:sc interior-reg) entry-point)
 
      (:generator ,(+ (if named 5 0)
                      (if variable 19 1)
@@ -783,14 +809,9 @@ default-value-8
                 (insert-step-instrumenting (callable-tn)
                   ;; Conditionally insert a conditional trap:
                   (when step-instrumenting
-                    ;; Get the symbol-value of SB!IMPL::*STEPPING*
-                    (inst lw stepping null-tn
-                          (- (+ symbol-value-slot
-                                (truncate (static-symbol-offset 'sb!impl::*stepping*)
-                                          n-word-bytes))
-                             other-pointer-lowtag))
-                    ;; If it's not null, trap.
-                    (inst beq stepping step-done-label)
+                    (load-symbol-value stepping sb!impl::*stepping*)
+                    ;; If it's not NIL, trap.
+                    (inst beq stepping null-tn step-done-label)
                     (inst nop)
                     ;; CONTEXT-PC will be pointing here when the
                     ;; interrupt is handled, not after the BREAK.
@@ -798,9 +819,9 @@ default-value-8
                     ;; Construct a trap code with the low bits from
                     ;; SINGLE-STEP-AROUND-TRAP and the high bits from
                     ;; the register number of CALLABLE-TN.
-                    (inst break (logior single-step-around-trap
-                                        (ash (reg-tn-encoding callable-tn)
-                                             5)))
+                    (inst break 0 (logior single-step-around-trap
+                                          (ash (reg-tn-encoding callable-tn)
+                                               5)))
                     (emit-label step-done-label))))
 
            ,@(if named
@@ -1150,9 +1171,6 @@ default-value-8
 (define-full-reffer more-arg * 0 0 (descriptor-reg any-reg) * %more-arg)
 
 ;;; Turn more arg (context, count) into a list.
-(defoptimizer (%listify-rest-args stack-allocate-result) ((&rest args))
-  t)
-
 (define-vop (listify-rest-args)
   (:args (context-arg :target context :scs (descriptor-reg))
          (count-arg :target count :scs (any-reg)))
@@ -1174,7 +1192,7 @@ default-value-8
       (move context context-arg)
       (move count count-arg)
       ;; Check to see if there are any arguments.
-      (inst beq count zero-tn done)
+      (inst beq count done)
       (move result null-tn t)
 
       ;; We need to do this atomically.
@@ -1202,7 +1220,7 @@ default-value-8
 
         ;; Dec count, and if != zero, go back for more.
         (inst addu count count (fixnumize -1))
-        (inst bne count zero-tn loop)
+        (inst bne count loop)
 
         ;; Store the value in the car (in delay slot)
         (storew temp dst 0 list-pointer-lowtag)
@@ -1251,7 +1269,7 @@ default-value-8
     (let ((err-lab
            (generate-error-code vop invalid-arg-count-error nargs)))
       (cond ((zerop count)
-             (inst bne nargs zero-tn err-lab)
+             (inst bne nargs err-lab)
              (inst nop))
             (t
              (inst li temp (fixnumize count))
@@ -1291,19 +1309,14 @@ default-value-8
   (:policy :fast-safe)
   (:vop-var vop)
   (:generator 3
-    ;; Get the symbol-value of SB!IMPL::*STEPPING*
-    (inst lw stepping null-tn
-          (- (+ symbol-value-slot
-                (truncate (static-symbol-offset 'sb!impl::*stepping*)
-                          n-word-bytes))
-             other-pointer-lowtag))
-    ;; If it's not null, trap.
-    (inst beq stepping DONE)
+    (load-symbol-value stepping sb!impl::*stepping*)
+    ;; If it's not NIL, trap.
+    (inst beq stepping null-tn DONE)
     (inst nop)
     ;; CONTEXT-PC will be pointing here when the interrupt is handled,
     ;; not after the BREAK.
     (note-this-location vop :step-before-vop)
     ;; CALLEE-REGISTER-OFFSET isn't needed for before-traps, so we
     ;; can just use a bare SINGLE-STEP-BEFORE-TRAP as the code.
-    (inst break single-step-before-trap)
+    (inst break 0 single-step-before-trap)
     DONE))