Changeset 5195


Ignore:
Timestamp:
Sep 11, 2006, 8:21:12 PM (18 years ago)
Author:
Gary Byers
Message:

Partly inline 2-arg logior, logand.

File:
1 edited

Legend:

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

    r5178 r5195  
    63736373  (x862-binary-builtin seg vreg xfer 'logbitp bitnum int))
    63746374
     6375(defun x862-inline-logior2 (seg vreg xfer form1 form2)
     6376  (with-x86-local-vinsn-macros (seg vreg xfer)
     6377    (let* ((fix1 (acode-fixnum-form-p form1))
     6378           (fix2 (acode-fixnum-form-p form2)))
     6379      (if (and fix1 fix2)
     6380        (x862-use-operator (%nx1-operator fixnum) seg vreg xfer (logior fix1 fix2))
     6381        (let* ((fixval (or fix1 fix2))
     6382               (fiximm (if fixval (<= (integer-length fixval)
     6383                                      (- 31 *x862-target-fixnum-shift*))))
     6384               (otherform (when fiximm (if fix1 form2 form1))))
     6385          (let* ((out-of-line (backend-get-next-label))
     6386                 (done (backend-get-next-label)))
     6387            (ensuring-node-target (target vreg)
     6388              (if otherform
     6389                (x862-one-targeted-reg-form seg otherform ($ x8664::arg_z))
     6390                (x862-two-targeted-reg-forms seg form1 ($ x8664::arg_y) form2 ($ x8664::arg_z)))
     6391              (if otherform
     6392                (unless (acode-fixnum-form-p otherform)
     6393                  (! branch-unless-arg-fixnum ($ x8664::arg_z) (aref *backend-labels* out-of-line)))
     6394                (if (acode-fixnum-form-p form1)
     6395                  (! branch-unless-arg-fixnum ($ x8664::arg_z) (aref *backend-labels* out-of-line))
     6396                  (if (acode-fixnum-form-p form2)
     6397                    (! branch-unless-arg-fixnum ($ x8664::arg_y) (aref *backend-labels* out-of-line)) 
     6398                    (! branch-unless-both-args-fixnums ($ x8664::arg_y) ($ x8664::arg_z) (aref *backend-labels* out-of-line)))))
     6399              (if otherform
     6400                (! %logior-c ($ x8664::arg_z) ($ x8664::arg_z) (ash fixval x8664::fixnumshift))
     6401                (! %logior2 ($ x8664::arg_z) ($ x8664::arg_z) ($ x8664::arg_y)))
     6402              (-> done)
     6403              (@ out-of-line)
     6404              (if otherform
     6405                (x862-lri seg ($ x8664::arg_y) (ash fixval x8664::fixnumshift)))
     6406              (! call-subprim-2 ($ x8664::arg_z) (subprim-name->offset '.SPbuiltin-logior) ($ x8664::arg_y) ($ x8664::arg_z))
     6407              (@ done)
     6408              (x862-copy-register seg target ($ x8664::arg_z))
     6409              (^))))))))
     6410
    63756411(defx862 x862-logior2 logior2 (seg vreg xfer form1 form2)
    6376   (x862-binary-builtin seg vreg xfer 'logior-2 form1 form2))
     6412  (if (or (x862-explicit-non-fixnum-type-p form1)
     6413          (x862-explicit-non-fixnum-type-p form2))
     6414    (x862-binary-builtin seg vreg xfer 'logior-2 form1 form2)
     6415    (x862-inline-logior2 seg vreg xfer form1 form2)))
    63776416
    63786417(defx862 x862-logxor2 logxor2 (seg vreg xfer form1 form2)
    63796418  (x862-binary-builtin seg vreg xfer 'logxor-2 form1 form2))
    63806419
     6420(defun x862-inline-logand2 (seg vreg xfer form1 form2)
     6421  (with-x86-local-vinsn-macros (seg vreg xfer)
     6422    (let* ((fix1 (acode-fixnum-form-p form1))
     6423           (fix2 (acode-fixnum-form-p form2)))
     6424      (if (and fix1 fix2)
     6425        (x862-use-operator (%nx1-operator fixnum) seg vreg xfer (logand fix1 fix2))
     6426        (let* ((fixval (or fix1 fix2))
     6427               (fiximm (if fixval (<= (integer-length fixval)
     6428                                      (- 31 *x862-target-fixnum-shift*))))
     6429               (otherform (when fiximm (if fix1 form2 form1))))
     6430          (let* ((out-of-line (backend-get-next-label))
     6431                 (done (backend-get-next-label)))
     6432            (ensuring-node-target (target vreg)
     6433              (if otherform
     6434                (x862-one-targeted-reg-form seg otherform ($ x8664::arg_z))
     6435                (x862-two-targeted-reg-forms seg form1 ($ x8664::arg_y) form2 ($ x8664::arg_z)))
     6436              (if otherform
     6437                (unless (acode-fixnum-form-p otherform)
     6438                  (! branch-unless-arg-fixnum ($ x8664::arg_z) (aref *backend-labels* out-of-line)))
     6439                (if (acode-fixnum-form-p form1)
     6440                  (! branch-unless-arg-fixnum ($ x8664::arg_z) (aref *backend-labels* out-of-line))
     6441                  (if (acode-fixnum-form-p form2)
     6442                    (! branch-unless-arg-fixnum ($ x8664::arg_y) (aref *backend-labels* out-of-line)) 
     6443                    (! branch-unless-both-args-fixnums ($ x8664::arg_y) ($ x8664::arg_z) (aref *backend-labels* out-of-line)))))
     6444              (if otherform
     6445                (! %logand-c ($ x8664::arg_z) ($ x8664::arg_z) (ash fixval x8664::fixnumshift))
     6446                (! %logand2 ($ x8664::arg_z) ($ x8664::arg_z) ($ x8664::arg_y)))
     6447              (-> done)
     6448              (@ out-of-line)
     6449              (if otherform
     6450                (x862-lri seg ($ x8664::arg_y) (ash fixval x8664::fixnumshift)))
     6451              (! call-subprim-2 ($ x8664::arg_z) (subprim-name->offset '.SPbuiltin-logand) ($ x8664::arg_y) ($ x8664::arg_z))
     6452              (@ done)
     6453              (x862-copy-register seg target ($ x8664::arg_z))
     6454              (^))))))))
     6455
    63816456(defx862 x862-logand2 logand2 (seg vreg xfer form1 form2)
    6382   (x862-binary-builtin seg vreg xfer 'logand-2 form1 form2))
     6457
     6458  (if (or (x862-explicit-non-fixnum-type-p form1)
     6459          (x862-explicit-non-fixnum-type-p form2))
     6460    (x862-binary-builtin seg vreg xfer 'logand-2 form1 form2)
     6461    (x862-inline-logand2 seg vreg xfer form1 form2)))
    63836462
    63846463(defx862 x862-%quo2 %quo2 (seg vreg xfer form1 form2)
Note: See TracChangeset for help on using the changeset viewer.