Changeset 15080
- Timestamp:
- Nov 19, 2011, 2:27:28 PM (13 years ago)
- File:
-
- 1 edited
-
trunk/source/compiler/ARM/arm2.lisp (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/compiler/ARM/arm2.lisp
r15066 r15080 74 74 `(progn 75 75 (arm2-invalidate-regmap) 76 (backend-gen-label ,',segvar ,,labelnum-var))) 77 (@+ (,labelnum-var) 78 `(progn ;keep regmap 76 79 (backend-gen-label ,',segvar ,,labelnum-var))) 77 80 (-> (,label-var) … … 280 283 (if (memory-spec-p ea) 281 284 (ensuring-node-target (target vreg) 282 (progn 285 (let* ((reg (unless (node-reg-p vreg) 286 (or (arm2-reg-for-ea ea) 287 (arm2-try-non-conflicting-reg target 0))))) 288 (when reg (setq target reg)) 283 289 (arm2-stack-to-register seg ea target) 284 290 (if (addrspec-vcell-p ea) … … 544 550 *arm2-gpr-constants-valid-mask* 0)) 545 551 552 546 553 (defun arm2-update-regmap (vinsn) 547 554 (if (vinsn-attribute-p vinsn :call) … … 1261 1268 (return reg)))))) 1262 1269 1263 1270 (defun arm2-reg-for-ea (ea) 1271 (when (and (memory-spec-p ea) 1272 (not (addrspec-vcell-p ea))) 1273 (let* ((offset (memspec-frame-address-offset ea)) 1274 (mask *arm2-gpr-locations-valid-mask*) 1275 (info *arm2-gpr-locations*)) 1276 (declare (fixnum mask) (simple-vector info)) 1277 (dotimes (reg 16) 1278 (when (and (logbitp reg mask) 1279 (memq offset (svref info reg))) 1280 (return reg)))))) 1264 1281 1265 1282 (defun arm2-reg-for-form (form hint) … … 1267 1284 (cond ((node-reg-p hint) 1268 1285 (if var 1269 (let* ((ea (var-ea var))) 1270 (when (and (memory-spec-p ea) 1271 (not (addrspec-vcell-p ea))) 1272 (let* ((offset (memspec-frame-address-offset ea)) 1273 (mask *arm2-gpr-locations-valid-mask*) 1274 (info *arm2-gpr-locations*)) 1275 (declare (fixnum mask) (simple-vector info)) 1276 (dotimes (reg 16) 1277 (when (and (logbitp reg mask) 1278 (memq offset (svref info reg))) 1279 (return reg)))))) 1286 (arm2-reg-for-ea (var-ea var)) 1280 1287 (multiple-value-bind (value constantp) (acode-constant-p form) 1281 1288 (when constantp … … 3030 3037 (cond ((and (not (and pushed-reg-is-set popped-reg-is-set)) 3031 3038 (or (null popped-reg-is-reffed) 3032 (vinsn-in-sequence-p pushed-reg-is-set popped-reg-is-reffed pop-vinsn))) 3039 (null pushed-reg-is-set) 3040 ;; If the popped register is 3041 ;; referenced and the pushed 3042 ;; register is set, we want to be 3043 ;; sure that the last reference 3044 ;; happens before the first 3045 ;; assignent. We can't be sure 3046 ;; that either of these things 3047 ;; actually happened or happen 3048 ;; unconditionally, and can't 3049 ;; be sure of the order in which 3050 ;; they might happen if the sequence 3051 ;; contains jumps or branches. 3052 (vinsn-in-sequence-p pushed-reg-is-set popped-reg-is-reffed pop-vinsn) 3053 (not (vinsn-sequence-has-some-attribute-p push-vinsn pop-vinsn :branch :jump)))) 3033 3054 ;; We don't try this if anything's pushed on 3034 3055 ;; or popped from the vstack in the … … 3066 3087 (- (the fixnum (svref operands opidx)) 3067 3088 arm::node-size)))))))) 3068 3069 3070 3071 3089 (unless same-reg 3072 3090 (let* ((copy (! copy-gpr popped-reg pushed-reg))) 3073 3091 (remove-dll-node copy) 3074 (if popped-reg-is-reffed 3075 (insert-dll-node-after copy popped-reg-is-reffed) 3076 (if pushed-reg-is-set 3092 (if pushed-reg-is-set 3077 3093 (insert-dll-node-after copy push-vinsn) 3078 (insert-dll-node-before copy p ush-vinsn)))))3094 (insert-dll-node-before copy pop-vinsn)))) 3079 3095 (elide-vinsn push-vinsn) 3080 3096 (elide-vinsn pop-vinsn)) … … 3409 3425 (progn 3410 3426 (setq cdest (arm2-one-untargeted-reg-form seg cform creg restricted) 3411 restricted (arm2-restrict-node-target bdest restricted))3427 restricted (arm2-restrict-node-target cdest restricted)) 3412 3428 (unless adest 3413 3429 (when (same-arm-reg-p areg cdest) … … 3444 3460 (if bconst 3445 3461 (setq bdest (arm2-one-untargeted-reg-form seg bform breg restricted)) 3446 (arm2-elide-pushes seg bpushed (arm2-pop-register seg breg)))3462 (arm2-elide-pushes seg bpushed (arm2-pop-register seg (setq bdest breg)))) 3447 3463 (setq restricted (arm2-restrict-node-target bdest restricted)) 3448 3464 (unless adest … … 3767 3783 (if dest-crf 3768 3784 (! set-eq-bit dest-crf))) 3769 (if (and dest-crf src-gpr) 3770 ;; "Copying" a GPR to a CR field means comparing it to rnil 3771 (! compare-to-nil dest src) 3785 (if dest-crf 3786 ;; "Copying" a GPR to a CR field means comparing it to nil 3787 (if src-gpr 3788 (! compare-to-nil dest src) 3789 (! compare-to-nil dest arm::sp)) 3772 3790 (if (and dest-gpr src-gpr) 3773 3791 (case dest-mode … … 6668 6686 (backend-copy-label merge-else-branch-label falselabel) 6669 6687 (progn 6670 (@ falselabel) 6688 (if (and (not need-else) nil) 6689 (@+ falselabel) 6690 (@ falselabel)) 6671 6691 (arm2-predicate-block falselabel) 6672 6692 (when need-else … … 6695 6715 (multiple-value-setq (*arm2-undo-count* *arm2-cstack* *arm2-vstack* *arm2-top-vstack-lcell*) 6696 6716 (arm2-decode-stack entry-stack))) 6697 (@ endlabel) 6717 (if (and (not need-else) (backend-crf-p vreg) nil) 6718 (@+ endlabel) 6719 (@ endlabel)) 6698 6720 (arm2-predicate-block endlabel)))))))) 6699 6721 … … 6778 6800 (= (hard-regspec-class vreg) hard-reg-class-fpr) 6779 6801 (= (get-regspec-mode vreg) hard-reg-class-fpr-mode-single)) 6780 (! double-float-negate vreg r1)6802 (! single-float-negate vreg r1) 6781 6803 (with-fp-target (r1) (r2 :single-float) 6782 (! double-float-negate r2 r1)6804 (! single-float-negate r2 r1) 6783 6805 (ensuring-node-target (target vreg) 6784 6806 (arm2-copy-register seg target r2)))) … … 8971 8993 (arm2-one-targeted-reg-form seg other other-reg) 8972 8994 (! logand-immediate other-reg other-reg (logand constant #xffffffff)) 8973 (<- other-reg)))) 8995 (if (and (typep constant '(unsigned-byte 29)) 8996 (node-reg-p vreg)) 8997 (! box-fixnum vreg other-reg) 8998 (<- other-reg))))) 8974 8999 (^)))))) 8975 9000
Note:
See TracChangeset
for help on using the changeset viewer.
