Changeset 15422


Ignore:
Timestamp:
Jul 9, 2012, 9:40:27 PM (7 years ago)
Author:
gb
Message:

Load single-float constants from pc-relative memory, too.
Don't do predication on more than 2 consecutive vinsns.
Elide pushes/pops that involve SINGLE-FLOATs.

Location:
trunk/source/compiler/ARM
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/compiler/ARM/arm-vinsns.lisp

    r15340 r15422  
    32923292     ())
    32933293  (fcpys dest arm::single-float-zero))
     3294
     3295(define-arm-vinsn (load-single-float-constant-from-data :predicatable)
     3296    (((dest :double-float))
     3297     ((val :u32const)))
     3298  (flds dest (:= :x))
     3299  (:data)
     3300  :x
     3301  (:word val)
     3302  :code)
    32943303
    32953304(define-arm-vinsn (load-double-float-constant-from-data :predicatable)
  • trunk/source/compiler/ARM/arm2.lisp

    r15419 r15422  
    13891389          (if (typep form 'short-float)
    13901390            (let* ((bits (arm2-single-float-bits form)))
    1391               (with-imm-temps () ((bitsreg :u32))
    1392                 (! lri bitsreg bits)
    1393                 (! load-single-float-constant vreg bitsreg)))
     1391              (! load-single-float-constant-from-data vreg bits))
    13941392            (multiple-value-bind (high low) (arm2-double-float-bits form)
    13951393              (declare (integer high low))
     
    30403038               (elide-vinsn push-vinsn)
    30413039               (elide-vinsn pop-vinsn))
    3042               ((and (eql (hard-regspec-class pushed-reg) hard-reg-class-fpr)
    3043                     (eql (get-regspec-mode pushed-reg)
    3044                          hard-reg-class-fpr-mode-double))
    3045                ;; If we're pushing a double-float register that gets
    3046                ;; set by the intervening vinsns, try to copy it to and
    3047                ;; from a free FPR instead.
    3048                (multiple-value-bind (used-gprs used-fprs)
     3040              ((eql (hard-regspec-class pushed-reg) hard-reg-class-fpr)
     3041               (let* ((mode (get-regspec-mode pushed-reg))
     3042                      (double-p (eql mode hard-reg-class-fpr-mode-double)))
     3043                 ;; If we're pushing float register that gets
     3044                 ;; set by the intervening vinsns, try to copy it to and
     3045                 ;; from a free FPR instead.
     3046                 (multiple-value-bind (used-gprs used-fprs)
    30493047                   (regs-set-in-vinsn-sequence push-vinsn pop-vinsn)
    30503048                 (declare (ignore used-gprs))
    3051                  ;; We have 16 non-volatile single-floats or 8
    3052                  ;; non-volatile double-floats
    3053                  (let* ((nfprs 7)
     3049                 ;; We have 14 volatile single-floats or 7
     3050                 ;; volatile double-floats
     3051                 (let* ((nfprs (if double-p 7 14))
    30543052                        (free-fpr
    30553053                         (dotimes (r nfprs nil)
    3056                            (unless (logtest (target-fpr-mask r :double-float)
     3054                           (unless (logtest (target-fpr-mask
     3055                                             r (if double-p :double-float :single-float))
    30573056                                            used-fprs)
    30583057                             (return r)))))
    30593058                   (when free-fpr
    3060                      (let* ((reg ($ free-fpr :class :fpr :mode :double-float))
    3061                             (save (! double-to-double reg pushed-reg))
    3062                             (restore (! double-to-double popped-reg reg)))
     3059                     (let* ((reg ($ free-fpr :class :fpr :mode mode))
     3060                            (save (if double-p
     3061                                    (! double-to-double reg pushed-reg)
     3062                                    (! single-to-single reg pushed-reg)))
     3063                            (restore (if double-p
     3064                                       (! double-to-double popped-reg reg)
     3065                                       (! single-to-single popped-reg reg))))
    30633066                       (remove-dll-node save)
    30643067                       (insert-dll-node-after save push-vinsn)
     
    30663069                       (insert-dll-node-before restore pop-vinsn)
    30673070                       (elide-vinsn push-vinsn)
    3068                        (elide-vinsn pop-vinsn))))))))))
     3071                       (elide-vinsn pop-vinsn)))))))))))
    30693072      (when (and (vinsn-attribute-p push-vinsn :vsp))
    30703073        (unless (or
     
    65726575             (null (cdr refs)))
    65736576      (when (do* ((next (dll-node-succ branch) (dll-node-succ next))
     6577                  (count 0 (1+ count))
    65746578                  (vinsn-p nil))
    65756579                 ((eq next lab) (return vinsn-p))
     6580              (declare (fixnum count))
    65766581              (if (typep next 'vinsn-label)
    65776582                (unless (typep (vinsn-label-id next) 'vinsn-note)
    65786583                  (return))
    65796584                (progn
     6585                  (when (= count 2)
     6586                    (return))
    65806587                  (unless (and (typep next 'vinsn)
    65816588                               (null (vinsn-annotation next))
Note: See TracChangeset for help on using the changeset viewer.