Optimize CONCATENATE transform.
[sbcl.git] / src / compiler / ppc / insts.lisp
index 9dceec4..cdb9f5a 100644 (file)
@@ -42,7 +42,7 @@
 
 (defvar *disassem-use-lisp-reg-names* t)
 
-(!def-vm-support-routine location-number (loc)
+(defun location-number (loc)
   (etypecase loc
     (null)
     (number)
       (#.fun-end-breakpoint-trap
        (nt "Function end breakpoint trap"))
       (#.object-not-instance-trap
-       (nt "Object not instance trap"))
-    )))
+       (nt "Object not instance trap")))))
 
 (eval-when (:compile-toplevel :execute)
 
                     (when (typep si 'fixup)
                       (ecase ,fixup
                         ((:ha :l) (note-fixup segment ,fixup si)))
-                      (setq si 0))
+                      (setq si (or (fixup-offset si) 0)))
                     (emit-d-form-inst segment ,op (reg-tn-encoding rt) (reg-tn-encoding ra) si)))))
 
            (define-d-rs-ui-instruction (name op &key (cost 1) other-dependencies)
     `(inst nor. ,ra ,rs ,rs))
 
 
-  (!def-vm-support-routine emit-nop (segment)
+  (defun emit-nop (segment)
                            (emit-word segment #x60000000))
 
   (define-instruction-macro extlwi (ra rs n b)
   (define-instruction-macro extlwi. (ra rs n b)
     `(inst rlwinm. ,ra ,rs ,b 0 (1- ,n)))
 
+  (define-instruction-macro extrwi (ra rs n b)
+    `(inst rlwinm ,ra ,rs (mod (+ ,b ,n) 32) (- 32 ,n) 31))
+
+  (define-instruction-macro extrwi. (ra rs n b)
+    `(inst rlwinm. ,ra ,rs (mod (+ ,b ,n) 32) (- 32 ,n) 31))
+
   (define-instruction-macro srwi (ra rs n)
     `(inst rlwinm ,ra ,rs (- 32 ,n) ,n 31))
 
   (define-instruction-macro srwi. (ra rs n)
     `(inst rlwinm. ,ra ,rs (- 32 ,n) ,n 31))
 
+  (define-instruction-macro clrlwi (ra rs n)
+    `(inst rlwinm ,ra ,rs 0 ,n 31))
+
+  (define-instruction-macro clrlwi. (ra rs n)
+    `(inst rlwinm. ,ra ,rs 0 ,n 31))
+
   (define-instruction-macro clrrwi (ra rs n)
     `(inst rlwinm ,ra ,rs 0 0 (- 31 ,n)))
 
                    (inst ori temp temp (ldb (byte 16 0) delta))
                    (inst add dst src temp))))))
 
-;; this function is misnamed.  should be compute-code-from-lip,
-;; if the use in xep-allocate-frame is typical
-;; (someone says code = fn - header - label-offset + other-pointer-tag)
-(define-instruction compute-code-from-fn (segment dst src label temp)
+;; code = lip - header - label-offset + other-pointer-tag
+(define-instruction compute-code-from-lip (segment dst src label temp)
   (:declare (type tn dst src temp) (type label label))
   (:attributes variable-length)
   (:dependencies (reads src) (writes dst) (writes temp))
                              (component-header-length))))))
 
 ;; code = lra - other-pointer-tag - header - label-offset + other-pointer-tag
+;;      = lra - (header + label-offset)
 (define-instruction compute-code-from-lra (segment dst src label temp)
   (:declare (type tn dst src temp) (type label label))
   (:attributes variable-length)
                                 (component-header-length)))))))
 
 ;; lra = code + other-pointer-tag + header + label-offset - other-pointer-tag
+;;     = code + header + label-offset
 (define-instruction compute-lra-from-code (segment dst src label temp)
   (:declare (type tn dst src temp) (type label label))
   (:attributes variable-length)