Changeset 14967
- Timestamp:
- Aug 31, 2011, 1:30:34 PM (13 years ago)
- File:
-
- 1 edited
-
trunk/source/compiler/X86/x862.lisp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/compiler/X86/x862.lisp
r14959 r14967 3370 3370 (vinsn-sequence-sets-reg-p 3371 3371 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))))))))))))) 3387 3415 3388 3416
Note:
See TracChangeset
for help on using the changeset viewer.
