Changeset 14967


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

Same story as r14966, but for x862-elide-pushes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/compiler/X86/x862.lisp

    r14959 r14967  
    33703370                                      (vinsn-sequence-sets-reg-p
    33713371                                       push-vinsn pop-vinsn popped-reg))))
    3372             (unless (and pushed-reg-is-set popped-reg-is-set)
    3373               (unless same-reg
    3374                 (let* ((copy (if (eq (hard-regspec-class pushed-reg)
    3375                                      hard-reg-class-fpr)
    3376                                (if (= (get-regspec-mode pushed-reg)
    3377                                       hard-reg-class-fpr-mode-double)
    3378                                  (! copy-double-float popped-reg pushed-reg)
    3379                                  (! copy-single-float popped-reg pushed-reg))
    3380                                (! copy-gpr popped-reg pushed-reg))))
    3381                   (remove-dll-node copy)
    3382                   (if pushed-reg-is-set
    3383                     (insert-dll-node-after copy push-vinsn)
    3384                     (insert-dll-node-before copy push-vinsn))))
    3385               (elide-vinsn push-vinsn)
    3386               (elide-vinsn pop-vinsn))))))))
     3372            (cond
     3373              ((not (and pushed-reg-is-set popped-reg-is-set))
     3374               (unless same-reg
     3375                 (let* ((copy (if (eq (hard-regspec-class pushed-reg)
     3376                                      hard-reg-class-fpr)
     3377                                (if (= (get-regspec-mode pushed-reg)
     3378                                       hard-reg-class-fpr-mode-double)
     3379                                  (! copy-double-float popped-reg pushed-reg)
     3380                                  (! copy-single-float popped-reg pushed-reg))
     3381                                (! copy-gpr popped-reg pushed-reg))))
     3382                   (remove-dll-node copy)
     3383                   (if pushed-reg-is-set
     3384                     (insert-dll-node-after copy push-vinsn)
     3385                     (insert-dll-node-before copy push-vinsn))))
     3386               (elide-vinsn push-vinsn)
     3387               (elide-vinsn pop-vinsn))
     3388              ((and (eql (hard-regspec-class pushed-reg) hard-reg-class-fpr)
     3389                    (eql (get-regspec-mode pushed-reg)
     3390                         hard-reg-class-fpr-mode-double))
     3391               ;; If we're pushing a double-float register that gets
     3392               ;; set by the intervening vinsns, try to copy it to and
     3393               ;; from a free FPR instead.
     3394               (multiple-value-bind (used-gprs used-fprs)
     3395                   (regs-set-in-vinsn-sequence push-vinsn pop-vinsn)
     3396                 (declare (ignore used-gprs))
     3397                 (let* ((nfprs (target-arch-case
     3398                                (:x8632 6)
     3399                                (:x8664 14))) ;xmm7 (or xmm15) is fpzero.
     3400                        (free-fpr
     3401                         (dotimes (r nfprs nil)
     3402                           (unless (logtest (target-fpr-mask r :double-float)
     3403                                            used-fprs)
     3404                             (return r)))))
     3405                   (when free-fpr
     3406                     (let* ((reg ($ free-fpr :class :fpr :mode :double-float))
     3407                            (save (! copy-double-float reg pushed-reg))
     3408                            (restore (! copy-double-float popped-reg reg)))
     3409                       (remove-dll-node save)
     3410                       (insert-dll-node-after save push-vinsn)
     3411                       (remove-dll-node restore)
     3412                       (insert-dll-node-before restore pop-vinsn)
     3413                       (elide-vinsn push-vinsn)
     3414                       (elide-vinsn pop-vinsn)))))))))))))
    33873415               
    33883416       
Note: See TracChangeset for help on using the changeset viewer.