Changeset 14194
- Timestamp:
- Aug 16, 2010, 10:57:49 AM (14 years ago)
- File:
-
- 1 edited
-
trunk/source/compiler/X86/x862.lisp (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/source/compiler/X86/x862.lisp
r14176 r14194 74 74 ,@body)) 75 75 76 (defun x862-emit-vinsn (vlist name vinsn-table &rest vregs) 77 (x862-update-regmap (apply #'%emit-vinsn vlist name vinsn-table vregs))) 76 78 77 79 (defmacro with-x86-local-vinsn-macros ((segvar &optional vreg-var xfer-var) &body body) … … 88 90 (warn "VINSN \"~A\" not defined" ,template-name-var)) 89 91 `(prog1 90 ( %emit-vinsn ,',segvar ',,template-name-var (backend-p2-vinsn-templates *target-backend*) ,@,args-var)92 (x862-emit-vinsn ,',segvar ',,template-name-var (backend-p2-vinsn-templates *target-backend*) ,@,args-var) 91 93 (setq *x862-tos-reg* nil))))) 92 94 (macrolet ((<- (,retvreg-var) 93 95 `(x862-copy-register ,',segvar ,',vreg-var ,,retvreg-var)) 94 96 (@ (,labelnum-var) 95 `(backend-gen-label ,',segvar ,,labelnum-var)) 97 `(progn 98 (x862-invalidate-regmap) 99 (backend-gen-label ,',segvar ,,labelnum-var))) 96 100 (@= (,labelnum-var) 97 `(x862-emit-aligned-label ,',segvar ,,labelnum-var)) 101 `(progn 102 (x862-invalidate-regmap) 103 (x862-emit-aligned-label ,',segvar ,,labelnum-var))) 98 104 (-> (,label-var) 99 105 `(! jump (aref *backend-labels* ,,label-var))) … … 199 205 200 206 (defvar *x862-result-reg* x8664::arg_z) 207 208 (defvar *x862-gpr-locations* nil) 209 (defvar *x862-gpr-locations-valid-mask* 0) 201 210 202 211 (defvar *x8664-nvrs* … … 603 612 (*x862-fcells* (afunc-fcells afunc)) 604 613 *x862-recorded-symbols* 605 (*x862-emitted-source-notes* '())) 614 (*x862-emitted-source-notes* '()) 615 (*x862-gpr-locations-valid-mask* 0) 616 (*x862-gpr-locations* (make-array 16 :initial-element nil))) 617 (declare (dynamic-extent *x862-gpr-locations*)) 606 618 (set-fill-pointer 607 619 *backend-labels* … … 806 818 (setf (%svref v i) ref-fun))))))))) 807 819 820 (eval-when (:compile-toplevel) 821 (declaim (inline x862-invalidate-regmap))) 822 823 (defun x862-invalidate-regmap () 824 (setq *x862-gpr-locations-valid-mask* 0)) 825 826 (defun x862-update-regmap (vinsn) 827 (if (vinsn-attribute-p vinsn :call) 828 (x862-invalidate-regmap) 829 (setq *x862-gpr-locations-valid-mask* 830 (logandc2 *x862-gpr-locations-valid-mask* (vinsn-gprs-set vinsn)))) 831 vinsn) 832 833 (defun x862-regmap-note-store (gpr loc) 834 (let* ((gpr (%hard-regspec-value gpr))) 835 (assert (< gpr 16) nil "bad regno") 836 ;; Any other GPRs that had contained loc no longer do so. 837 (dotimes (i 16) 838 (unless (eql i gpr) 839 (when (and (logbitp i *x862-gpr-locations-valid-mask*) 840 (memq loc (svref *x862-gpr-locations* i))) 841 (when (null (setf (svref *x862-gpr-locations* i) 842 (delete loc (svref *x862-gpr-locations* i)))) 843 (setq *x862-gpr-locations-valid-mask* 844 (logandc2 *x862-gpr-locations-valid-mask* (ash 1 i))))))) 845 (if (logbitp gpr *x862-gpr-locations-valid-mask*) 846 (push loc (svref *x862-gpr-locations* gpr)) 847 (setf (svref *x862-gpr-locations* gpr) (list loc))) 848 (setq *x862-gpr-locations-valid-mask* 849 (logior *x862-gpr-locations-valid-mask* (ash 1 gpr))))) 850 851 ;;; For vpush: nothing else should claim to contain loc. 852 (defun x862-regmap-note-reg-location (gpr loc) 853 (let* ((gpr (%hard-regspec-value gpr))) 854 (if (logbitp gpr *x862-gpr-locations-valid-mask*) 855 (push loc (svref *x862-gpr-locations* gpr)) 856 (setf (svref *x862-gpr-locations* gpr) (list loc))) 857 (setq *x862-gpr-locations-valid-mask* 858 (logior *x862-gpr-locations-valid-mask* (ash 1 gpr))))) 859 860 (defun x862-regmap-note-vstack-delta (new old) 861 (when (< new old) 862 (let* ((mask *x862-gpr-locations-valid-mask*) 863 (info *x862-gpr-locations*)) 864 (unless (eql 0 mask) 865 (dotimes (i 16 (setq *x862-gpr-locations-valid-mask* mask)) 866 (when (logbitp i mask) 867 (let* ((locs (svref info i)) 868 (head (cons nil locs)) 869 (tail head)) 870 (declare (dynamic-extent head)) 871 (dolist (loc locs) 872 (if (>= loc new) 873 (setf (cdr tail) (cddr tail)) 874 (setq tail (cdr tail)))) 875 (when (null (setf (svref info i) (cdr head))) 876 (setq mask (logandc2 mask (ash 1 i))))))))))) 877 878 (defun x862-copy-regmap (mask from to) 879 (dotimes (i 16) 880 (when (logbitp i mask) 881 (setf (svref to i) (copy-list (svref from i)))))) 882 883 (defmacro with-x862-saved-regmap ((mask map) &body body) 884 `(let* ((,mask *x862-gpr-locations-valid-mask*) 885 (,map (make-array 16 :initial-element nil))) 886 (declare (dynamic-extent ,map)) 887 (x862-copy-regmap ,mask *x862-gpr-locations* ,map) 888 ,@body)) 889 808 890 (defun x862-generate-pc-source-map (debug-info) 809 891 (let* ((definition-source-note (getf debug-info '%function-source-note)) … … 1343 1425 1344 1426 (defun x862-set-vstack (new) 1345 (setq *x862-vstack* (or new 0))) 1427 (setq new (or new 0)) 1428 (x862-regmap-note-vstack-delta new *x862-vstack*) 1429 (setq *x862-vstack* new)) 1346 1430 1347 1431 … … 1365 1449 end)) 1366 1450 1367 1368 1369 1370 1451 (defun x862-register-for-frame-offset (offset &optional suggested) 1452 (let* ((mask *x862-gpr-locations-valid-mask*) 1453 (info *x862-gpr-locations*)) 1454 (if (and suggested 1455 (logbitp suggested mask) 1456 (memq offset (svref info suggested))) 1457 suggested 1458 (dotimes (reg 16) 1459 (when (and (logbitp reg mask) 1460 (memq offset (svref info reg))) 1461 (return reg)))))) 1371 1462 1372 1463 (defun x862-stack-to-register (seg memspec reg) … … 1378 1469 (! vframe-load reg offset *x862-vstack*))))) 1379 1470 1471 #+not-yet 1472 (defun x862-stack-to-register (seg memspec reg) 1473 (with-x86-local-vinsn-macros (seg) 1474 (let* ((offset (memspec-frame-address-offset memspec)) 1475 (mask *x862-gpr-locations-valid-mask*) 1476 (info *x862-gpr-locations*) 1477 (regno (%hard-regspec-value reg)) 1478 (other (x862-register-for-frame-offset offset regno))) 1479 (assert (< regno 16) nil "bad regno") 1480 (unless (eql regno other) 1481 (cond (other 1482 (let* ((vinsn (! copy-gpr reg other))) 1483 (setq *x862-gpr-locations-valid-mask* 1484 (logior mask (ash 1 regno))) 1485 (setf (svref info regno) 1486 (copy-list (svref info other))) 1487 vinsn)) 1488 (t 1489 (let* ((vinsn (! vframe-load reg offset *x862-vstack*))) 1490 (setq *x862-gpr-locations-valid-mask* 1491 (logior mask (ash 1 regno))) 1492 (setf (svref info regno) (list offset)) 1493 vinsn))))))) 1494 1380 1495 (defun x862-lcell-to-register (seg lcell reg) 1381 1496 (with-x86-local-vinsn-macros (seg) … … 1388 1503 (defun x862-register-to-stack (seg reg memspec) 1389 1504 (with-x86-local-vinsn-macros (seg) 1390 (! vframe-store reg (memspec-frame-address-offset memspec) *x862-vstack*))) 1505 (let* ((offset (memspec-frame-address-offset memspec)) 1506 (vinsn (! vframe-store reg offset *x862-vstack*))) 1507 (x862-regmap-note-store (%hard-regspec-value reg) offset) 1508 vinsn))) 1391 1509 1392 1510 … … 3894 4012 (! vpush-register src) 3895 4013 (setq *x862-tos-reg* src) 4014 (x862-regmap-note-store src *x862-vstack*) 3896 4015 (x862-new-vstack-lcell (or why :node) *x862-target-lcell-size* (or attr 0) info) 3897 4016 (x862-adjust-vstack *x862-target-node-size*))))
Note:
See TracChangeset
for help on using the changeset viewer.
