Changeset 14966


Ignore:
Timestamp:
Aug 31, 2011, 1:20:21 PM (13 years ago)
Author:
R. Matthew Emerson
Message:

In arm2-elide-pushes, instead of pushing/popping a double-float register,
copy it to/from an otherwise-unused FPR if possible.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/compiler/ARM/arm2.lisp

    r14959 r14966  
    28762876                                      (vinsn-sequence-sets-reg-p
    28772877                                       push-vinsn pop-vinsn popped-reg))))
    2878             (unless (and pushed-reg-is-set popped-reg-is-set)
    2879               (unless same-reg
    2880                 (let* ((copy (if (eq (hard-regspec-class pushed-reg)
    2881                                      hard-reg-class-fpr)
    2882                                (if (eql (get-regspec-mode pushed-reg)
    2883                                         hard-reg-class-fpr-mode-single)
    2884                                  (! single-to-single popped-reg pushed-reg)
    2885                                  (! double-to-double popped-reg pushed-reg))
    2886                                (! copy-gpr popped-reg pushed-reg))))
    2887                   (remove-dll-node copy)
    2888                   (if pushed-reg-is-set
    2889                     (insert-dll-node-after copy push-vinsn)
    2890                     (insert-dll-node-before copy push-vinsn))))
    2891               (elide-vinsn push-vinsn)
    2892               (elide-vinsn pop-vinsn))))))))
     2878            (cond
     2879              ((not (and pushed-reg-is-set popped-reg-is-set))
     2880               (unless same-reg
     2881                 (let* ((copy (if (eq (hard-regspec-class pushed-reg)
     2882                                      hard-reg-class-fpr)
     2883                                (if (eql (get-regspec-mode pushed-reg)
     2884                                         hard-reg-class-fpr-mode-single)
     2885                                  (! single-to-single popped-reg pushed-reg)
     2886                                  (! double-to-double popped-reg pushed-reg))
     2887                                (! copy-gpr popped-reg pushed-reg))))
     2888                   (remove-dll-node copy)
     2889                   (if pushed-reg-is-set
     2890                     (insert-dll-node-after copy push-vinsn)
     2891                     (insert-dll-node-before copy push-vinsn))))
     2892               (elide-vinsn push-vinsn)
     2893               (elide-vinsn pop-vinsn))
     2894              ((and (eql (hard-regspec-class pushed-reg) hard-reg-class-fpr)
     2895                    (eql (get-regspec-mode pushed-reg)
     2896                         hard-reg-class-fpr-mode-double))
     2897               ;; If we're pushing a double-float register that gets
     2898               ;; set by the intervening vinsns, try to copy it to and
     2899               ;; from a free FPR instead.
     2900               (multiple-value-bind (used-gprs used-fprs)
     2901                   (regs-set-in-vinsn-sequence push-vinsn pop-vinsn)
     2902                 (declare (ignore used-gprs))
     2903                 (let* ((nfprs 16)
     2904                        (free-fpr
     2905                         (dotimes (r nfprs nil)
     2906                           (unless (logtest (target-fpr-mask r :double-float)
     2907                                            used-fprs)
     2908                             (return r)))))
     2909                   (when free-fpr
     2910                     (let* ((reg ($ free-fpr :class :fpr :mode :double-float))
     2911                            (save (! double-to-double reg pushed-reg))
     2912                            (restore (! double-to-double popped-reg reg)))
     2913                       (remove-dll-node save)
     2914                       (insert-dll-node-after save push-vinsn)
     2915                       (remove-dll-node restore)
     2916                       (insert-dll-node-before restore pop-vinsn)
     2917                       (elide-vinsn push-vinsn)
     2918                       (elide-vinsn pop-vinsn)))))))))))))
    28932919               
    28942920       
Note: See TracChangeset for help on using the changeset viewer.