Restore PPC build.
[sbcl.git] / src / compiler / ppc / call.lisp
index 229a078..825784f 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* register-arg-scn
@@ -28,7 +28,7 @@
 ;;; 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)))
@@ -38,7 +38,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)
   (specify-save-tn
    (physenv-debug-live-tn (make-normal-tn *backend-t-primitive-type*) env)
    (make-wired-tn *backend-t-primitive-type*
 ;;; 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*)))
 
@@ -88,7 +88,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 addi 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)
   (:ignore copy-more-arg-follows)
@@ -381,6 +399,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:
@@ -638,7 +665,7 @@ default-value-8
      (:temporary (:sc descriptor-reg
                   :offset lra-offset
                   :from (:argument ,(if (eq return :tail) 2 1))
-                  :to :eval)
+                  :to (:result 0))
                  return-pc-pass)
 
      ,(if named
@@ -650,9 +677,8 @@ default-value-8
                             :from (:argument ,(if (eq return :tail) 0 1))
                             :to :eval)
                        lexenv))
-     ,@(unless named
-         '((:temporary (:scs (descriptor-reg) :from (:argument 0) :to :eval)
-                       function)))
+     (:temporary (:scs (descriptor-reg) :from (:argument 0) :to :eval)
+                 function)
      (:temporary (:sc any-reg :offset nargs-offset :to :eval)
                  nargs-pass)
 
@@ -751,12 +777,10 @@ default-value-8
                   ;; Conditionally insert a conditional trap:
                   (when step-instrumenting
                     ;; Get the symbol-value of SB!IMPL::*STEPPING*
-                    (loadw stepping
-                           null-tn
-                           (+ symbol-value-slot
-                              (truncate (static-symbol-offset 'sb!impl::*stepping*)
-                                        n-word-bytes))
-                           other-pointer-lowtag)
+                    #!-sb-thread
+                    (load-symbol-value stepping sb!impl::*stepping*)
+                    #!+sb-thread
+                    (loadw stepping thread-base-tn thread-stepping-slot)
                     (inst cmpw stepping null-tn)
                     ;; If it's not null, trap.
                     (inst beq step-done-label)
@@ -784,8 +808,17 @@ default-value-8
                    ;; FUNCTION is loaded, but before ENTRY-POINT is
                    ;; calculated.
                    (insert-step-instrumenting name-pass)
-                   (loadw entry-point name-pass fdefn-raw-addr-slot
-                          other-pointer-lowtag)
+                   ;; The raw-addr (ENTRY-POINT) will be one of:
+                   ;; closure_tramp, undefined_tramp, or somewhere
+                   ;; within a simple-fun object.  If the latter, then
+                   ;; it is essential (due to it being an interior
+                   ;; pointer) that the function itself be in a
+                   ;; register before the raw-addr is loaded.
+                   (sb!assem:without-scheduling ()
+                     (loadw function name-pass fdefn-fun-slot
+                            other-pointer-lowtag)
+                     (loadw entry-point name-pass fdefn-raw-addr-slot
+                            other-pointer-lowtag))
                    (do-next-filler))
                  `((sc-case arg-fun
                      (descriptor-reg (move lexenv arg-fun))
@@ -1231,12 +1264,10 @@ default-value-8
   (:vop-var vop)
   (:generator 3
     ;; Get the symbol-value of SB!IMPL::*STEPPING*
-    (loadw stepping
-           null-tn
-           (+ symbol-value-slot
-              (truncate (static-symbol-offset 'sb!impl::*stepping*)
-                        n-word-bytes))
-           other-pointer-lowtag)
+    #!-sb-thread
+    (load-symbol-value stepping sb!impl::*stepping*)
+    #!+sb-thread
+    (loadw stepping thread-base-tn thread-stepping-slot)
     (inst cmpw stepping null-tn)
     ;; If it's not null, trap.
     (inst beq DONE)