Changeset 15884


Ignore:
Timestamp:
Aug 29, 2013, 3:12:11 AM (6 years ago)
Author:
gb
Message:

Re-do some aspects of vector initialization
(X862-ALLOCATE-INITIALIZED-GVECTOR). Apparently fixes ticket:1108 in
the trunk.

Location:
trunk/source/compiler/X86
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/compiler/X86/X8632/x8632-vinsns.lisp

    r15772 r15884  
    13501350  (popl (:%l dest)))
    13511351
     1352(define-x8632-vinsn (vpop-gvector-element :pop :node :vsp)
     1353    (()
     1354     ((vector :lisp)
     1355      (idx :u32const)))
     1356  (popl (:@ (:apply + x8632::misc-data-offset (:apply ash idx x8632::word-shift))
     1357            (:%l vector))))
     1358
    13521359(define-x8632-vinsn (push-argregs :push :node :vsp) (()
    13531360                                                     ())
  • trunk/source/compiler/X86/X8664/x8664-vinsns.lisp

    r15606 r15884  
    261261                                     (idx :s32const)))
    262262  (movq (:%q val) (:@ (:apply + x8664::misc-data-offset (:apply ash idx 3)) (:%q v))))
     263
     264
     265
    263266
    264267(define-x8664-vinsn misc-set-immediate-c-node (()
     
    14851488     ())
    14861489  (popq (:%q dest)))
     1490
     1491(define-x8664-vinsn (vpop-gvector-element :pop :node :vsp)
     1492    (()
     1493     ((vector :lisp)
     1494      (idx :u32const))
     1495     ())
     1496  (popq (:@ (:apply + x8664::misc-data-offset (:apply ash idx x8664::word-shift)) (:%q vector))))
    14871497
    14881498                                           
  • trunk/source/compiler/X86/x862.lisp

    r15883 r15884  
    27502750                          (nx2-constant-index-ok-for-type-keyword index-known-fixnum type-keyword))
    27512751                   (multiple-value-setq (src result-reg unscaled-idx)
    2752                      (x862-two-untargeted-reg-forms seg
    2753                                                   vector src
    2754                                                   value result-reg))
     2752                     (if (and (null vreg) (typep constval '(signed-byte 32)))
     2753                       (x862-one-untargeted-reg-form seg vector src)
     2754                       
     2755                       (x862-two-untargeted-reg-forms seg
     2756                                                      vector src
     2757                                                      value result-reg)))
    27552758                   (multiple-value-setq (src unscaled-idx result-reg)
    27562759                     (x862-three-untargeted-reg-forms seg
     
    27782781                (! check-misc-bound unscaled-idx src))
    27792782              (! check-misc-bound unscaled-idx src))))
    2780         (x862-vset1 seg vreg xfer type-keyword src unscaled-idx index-known-fixnum result-reg (x862-unboxed-reg-for-aset seg type-keyword result-reg safe constval) constval needs-memoization)))))
     2783        (x862-vset1 seg vreg xfer type-keyword src unscaled-idx index-known-fixnum result-reg (when result-reg (x862-unboxed-reg-for-aset seg type-keyword result-reg safe constval)) constval needs-memoization)))))
    27812784
    27822785
     
    34023405;;; try to use some other node temp.
    34033406(defun x862-try-non-conflicting-reg (suggested reserved)
    3404   (let* ((mask *x862-gpr-locations-valid-mask*))
     3407  (let* ((mask *x862-gpr-locations-valid-mask*)
     3408         (bit (hard-regspec-value suggested)))
    34053409    (or (when (and (node-reg-p suggested)
    3406                    (logbitp (hard-regspec-value suggested) mask))
     3410                   (logbitp bit mask))
    34073411          (setq mask (logior mask reserved))
    34083412          (%available-node-temp (logand *available-backend-node-temps*
    34093413                                        (lognot mask))))
    3410         suggested)))
     3414        (if (logbitp bit reserved)
     3415          (%available-node-temp (logand *available-backend-node-temps*
     3416                                        (lognot reserved)))
     3417          suggested))))
    34113418
    34123419(defun x862-one-untargeted-reg-form (seg form suggested &optional (reserved 0))
     
    54425449             (arch (backend-target-arch *target-backend*))
    54435450             (n (length initforms))
     5451             (vreg-val (hard-regspec-value vreg))
    54445452             (nntriv (let* ((count 0))
    54455453                       (declare (fixnum count))
    54465454                       (dolist (f initforms count)
    5447                          (unless (x86-side-effect-free-form-p f)
     5455                         (unless (and (x86-side-effect-free-form-p f)
     5456                                      (let* ((reg (x862-reg-for-form f vreg)))
     5457                                        (not (eql (if reg
     5458                                                    (hard-regspec-value reg))
     5459                                                  vreg-val))))
    54485460                           (incf count)))))
    54495461             (header (arch::make-vheader n subtag)))
     
    54615473               (! %allocate-uvector vreg)
    54625474               (unless (eql n 0)
    5463                  (! %init-gvector vreg  (ash n (arch::target-word-shift arch)))))
     5475                 (do* ((idx (1- n) (1- idx)))
     5476                      ((< idx 0))
     5477                   (! vpop-gvector-element vreg idx))))
    54645478              (t
    5465                (let* ((pending ())
    5466                       (vstack *x862-vstack*))
    5467                  (declare (fixnum vstack))
     5479               (let* ((pending ()))
    54685480                 (dolist (form initforms)
    5469                    (if (x86-side-effect-free-form-p form)
     5481                   (if (and (x86-side-effect-free-form-p form)
     5482                            (let* ((reg (x862-reg-for-form form vreg)))
     5483                              (not (eql (if reg (hard-regspec-value reg)) vreg-val))))
    54705484                     (push form pending)
    54715485                     (progn
     
    54845498                   (with-node-temps (target) (nodetemp)
    54855499                     (do* ((forms pending (cdr forms))
    5486                            (index (1- n) (1- index))
    5487                            (pushed-cell (+ vstack (the fixnum (ash nntriv (arch::target-word-shift arch))))))
     5500                           (index (1- n) (1- index)))
    54885501                          ((null forms))
    5489                        (declare (list forms) (fixnum pushed-cell))
     5502                       (declare (list forms))
    54905503                       (let* ((form (car forms))
    54915504                              (reg nodetemp))
    54925505                         (if form
    5493                            (setq reg (x862-one-untargeted-reg-form seg form nodetemp))
     5506                           (cond ((nx-null form)
     5507                                  (! misc-set-immediate-c-node (target-nil-value) target index))
     5508                                 ((nx-t form)
     5509                                  (! misc-set-immediate-c-node (target-t-value) target index))
     5510                                 (t (let* ((fixval (acode-fixnum-form-p form)))
     5511                                      (cond ((and fixval
     5512                                                  (typep (setq fixval (ash fixval *x862-target-fixnum-shift*)) '(signed-byte 32)))
     5513                                             (! misc-set-immediate-c-node fixval target index))
     5514                                            (t
     5515                                             (setq reg (x862-one-untargeted-reg-form seg form nodetemp))
     5516                                             (! misc-set-c-node reg target index))))))
    54945517                           (progn
    5495                              (decf pushed-cell *x862-target-node-size*)
    5496                              (x862-stack-to-register seg (x862-vloc-ea pushed-cell) nodetemp)))
    5497                          (! misc-set-c-node reg target index)))))
    5498                  (! vstack-discard nntriv))
    5499                ))))
     5518                             (! vpop-gvector-element target index)
     5519                             (setq *x862-top-vstack-lcell* (lcell-parent *x862-top-vstack-lcell*))
     5520                             (x862-adjust-vstack (- *x862-target-node-size*))))
     5521                         )))))))))
    55005522     (^)))
    55015523
Note: See TracChangeset for help on using the changeset viewer.