Changeset 14966
- Timestamp:
- Aug 31, 2011, 1:20:21 PM (13 years ago)
- File:
-
- 1 edited
-
trunk/source/compiler/ARM/arm2.lisp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/compiler/ARM/arm2.lisp
r14959 r14966 2876 2876 (vinsn-sequence-sets-reg-p 2877 2877 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))))))))))))) 2893 2919 2894 2920
Note:
See TracChangeset
for help on using the changeset viewer.
