Changeset 14194


Ignore:
Timestamp:
Aug 16, 2010, 5:57:49 PM (9 years ago)
Author:
rme
Message:

Start at keeping track of which registers contain which stack locations. This
is ported from the ARM port.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/compiler/X86/x862.lisp

    r14176 r14194  
    7474     ,@body))
    7575
     76(defun x862-emit-vinsn (vlist name vinsn-table &rest vregs)
     77  (x862-update-regmap (apply #'%emit-vinsn vlist name vinsn-table vregs)))
    7678
    7779(defmacro with-x86-local-vinsn-macros ((segvar &optional vreg-var xfer-var) &body body)
     
    8890                      (warn "VINSN \"~A\" not defined" ,template-name-var))
    8991                    `(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)
    9193                      (setq *x862-tos-reg* nil)))))
    9294       (macrolet ((<- (,retvreg-var)
    9395                    `(x862-copy-register ,',segvar ,',vreg-var ,,retvreg-var))
    9496                  (@  (,labelnum-var)
    95                     `(backend-gen-label ,',segvar ,,labelnum-var))
     97                    `(progn
     98                       (x862-invalidate-regmap)
     99                       (backend-gen-label ,',segvar ,,labelnum-var)))
    96100                  (@= (,labelnum-var)
    97                     `(x862-emit-aligned-label ,',segvar ,,labelnum-var))
     101                    `(progn
     102                       (x862-invalidate-regmap)
     103                       (x862-emit-aligned-label ,',segvar ,,labelnum-var)))
    98104                  (-> (,label-var)
    99105                    `(! jump (aref *backend-labels* ,,label-var)))
     
    199205
    200206(defvar *x862-result-reg* x8664::arg_z)
     207
     208(defvar *x862-gpr-locations* nil)
     209(defvar *x862-gpr-locations-valid-mask* 0)
    201210
    202211(defvar *x8664-nvrs*
     
    603612           (*x862-fcells* (afunc-fcells afunc))
    604613           *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*))
    606618      (set-fill-pointer
    607619       *backend-labels*
     
    806818                (setf (%svref v i) ref-fun)))))))))
    807819
     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
    808890(defun x862-generate-pc-source-map (debug-info)
    809891  (let* ((definition-source-note (getf debug-info '%function-source-note))
     
    13431425
    13441426(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))
    13461430
    13471431
     
    13651449    end))
    13661450
    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))))))
    13711462
    13721463(defun x862-stack-to-register (seg memspec reg)
     
    13781469        (! vframe-load reg offset  *x862-vstack*)))))
    13791470
     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
    13801495(defun x862-lcell-to-register (seg lcell reg)
    13811496  (with-x86-local-vinsn-macros (seg)
     
    13881503(defun x862-register-to-stack (seg reg memspec)
    13891504  (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)))
    13911509
    13921510
     
    38944012      (! vpush-register src)
    38954013      (setq *x862-tos-reg* src)
     4014      (x862-regmap-note-store src *x862-vstack*)
    38964015      (x862-new-vstack-lcell (or why :node) *x862-target-lcell-size* (or attr 0) info)
    38974016      (x862-adjust-vstack *x862-target-node-size*))))
Note: See TracChangeset for help on using the changeset viewer.