Changeset 13443


Ignore:
Timestamp:
Feb 9, 2010, 5:33:20 AM (10 years ago)
Author:
rme
Message:

x862-vref1: Try to avoid boxing signed and unsigned 32-bit return
values when the destination is known to be an unboxed register of the
appropriate flavor.

x862-box-s32: More stylish use of target-arch-case.

File:
1 edited

Legend:

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

    r13253 r13443  
    15231523(defun x862-box-s32 (seg node-dest s32-src)
    15241524  (with-x86-local-vinsn-macros (seg)
    1525     (if (target-arch-case
    1526          (:x8632 nil)
    1527          (:x8664 t))
    1528       (! box-fixnum node-dest s32-src)
     1525    (target-arch-case
     1526     (:x8632
    15291527      (let* ((arg_z ($ *x862-arg-z*))
    1530              (imm0 ($ *x862-imm0* :mode :s32)))
    1531         (x862-copy-register seg imm0 s32-src)
    1532         (! call-subprim (subprim-name->offset '.SPmakes32))
    1533         (x862-copy-register seg node-dest arg_z)))))
     1528             (imm0 ($ *x862-imm0* :mode :s32)))
     1529        (x862-copy-register seg imm0 s32-src)
     1530        (! call-subprim (subprim-name->offset '.SPmakes32))
     1531        (x862-copy-register seg node-dest arg_z)))
     1532     (:x8664
     1533      (! box-fixnum node-dest s32-src)))))
    15341534
    15351535(defun x862-box-s64 (seg node-dest s64-src)
     
    16281628          (is-32-bit
    16291629           (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-32-bit-constant-index arch)))
    1630              (cond ((eq type-keyword :single-float-vector)
    1631                     (with-fp-target () (fp-val :single-float)
    1632                       (if (and (eql vreg-class hard-reg-class-fpr)
    1633                                (eql vreg-mode hard-reg-class-fpr-mode-single))
    1634                         (setq fp-val vreg))
    1635                       (! misc-ref-c-single-float fp-val src index-known-fixnum)
    1636                       (if (eql vreg-class hard-reg-class-fpr)
    1637                         (<- fp-val)
    1638                         (ensuring-node-target (target vreg)
    1639                           (target-arch-case
    1640                            (:x8632 (x862-single->heap seg target fp-val))
    1641                            (:x8664 (! single->node target fp-val)))))))
    1642                    (t
    1643                     (with-additional-imm-reg ()
    1644                       (with-imm-target () temp
    1645                         (if is-signed
    1646                           (! misc-ref-c-s32 temp src index-known-fixnum)
    1647                           (! misc-ref-c-u32 temp src index-known-fixnum))
    1648                         (ensuring-node-target (target vreg)
    1649                           (if (eq type-keyword :simple-string)
    1650                             (! u32->char target temp)
    1651                             (target-arch-case
    1652                              (:x8632
    1653                               (if is-signed
    1654                                 (x862-box-s32 seg target temp)
    1655                                 (x862-box-u32 seg target temp)))
    1656                              (:x8664
    1657                               (! box-fixnum target temp)))))))))
     1630             (case type-keyword
     1631               (:single-float-vector
     1632                (with-fp-target () (fp-val :single-float)
     1633                  (if (and (eql vreg-class hard-reg-class-fpr)
     1634                           (eql vreg-mode hard-reg-class-fpr-mode-single))
     1635                    (setq fp-val vreg))
     1636                  (! misc-ref-c-single-float fp-val src index-known-fixnum)
     1637                  (if (eql vreg-class hard-reg-class-fpr)
     1638                    (<- fp-val)
     1639                    (ensuring-node-target (target vreg)
     1640                      (target-arch-case
     1641                       (:x8632 (x862-single->heap seg target fp-val))
     1642                       (:x8664 (! single->node target fp-val)))))))
     1643               (:signed-32-bit-vector
     1644                (with-imm-target () (s32-reg :s32)
     1645                  (if (eql vreg-mode hard-reg-class-gpr-mode-s32)
     1646                    (setq s32-reg vreg))
     1647                  (! misc-ref-c-s32 s32-reg src index-known-fixnum)
     1648                  (unless (eq vreg s32-reg)
     1649                    (ensuring-node-target (target vreg)
     1650                      (x862-box-s32 seg target s32-reg)))))
     1651               (:unsigned-32-bit-vector
     1652                (with-imm-target () (u32-reg :u32)
     1653                  (if (eql vreg-mode hard-reg-class-gpr-mode-u32)
     1654                    (setq u32-reg vreg))
     1655                  (! misc-ref-c-u32 u32-reg src index-known-fixnum)
     1656                  (unless (eq vreg u32-reg)
     1657                    (ensuring-node-target (target vreg)
     1658                      (x862-box-u32 seg target u32-reg)))))
     1659               (t
     1660                (with-imm-target () temp
     1661                  (if is-signed
     1662                    (! misc-ref-c-s32 temp src index-known-fixnum)
     1663                    (! misc-ref-c-u32 temp src index-known-fixnum))
     1664                  (ensuring-node-target (target vreg)
     1665                    (if (eq type-keyword :simple-string)
     1666                      (! u32->char target temp)
     1667                      (if is-signed
     1668                        (x862-box-s32 seg target temp)
     1669                        (x862-box-u32 seg target temp)))))))
    16581670             (with-imm-target () idx-reg
    16591671               (if index-known-fixnum
    16601672                 (x862-absolute-natural seg idx-reg nil (ash index-known-fixnum 2))
    16611673                 (! scale-32bit-misc-index idx-reg unscaled-idx))
    1662                (cond ((eq type-keyword :single-float-vector)
    1663                       (with-fp-target () (fp-val :single-float)
    1664                         (if (and (eql vreg-class hard-reg-class-fpr)
    1665                                  (eql vreg-mode hard-reg-class-fpr-mode-single))
    1666                           (setq fp-val vreg))
    1667                         (! misc-ref-single-float fp-val src idx-reg)
    1668                         (if (eq vreg-class hard-reg-class-fpr)
    1669                           (<- fp-val)
    1670                           (ensuring-node-target (target vreg)
    1671                             (target-arch-case
    1672                              (:x8632 (x862-single->heap seg target fp-val))
    1673                              (:x8664 (! single->node target fp-val)))))))
    1674                      (t
    1675                       (with-imm-target () temp
     1674               (case type-keyword
     1675                 (:single-float-vector
     1676                  (with-fp-target () (fp-val :single-float)
     1677                    (if (and (eql vreg-class hard-reg-class-fpr)
     1678                             (eql vreg-mode hard-reg-class-fpr-mode-single))
     1679                      (setq fp-val vreg))
     1680                    (! misc-ref-single-float fp-val src idx-reg)
     1681                    (if (eq vreg-class hard-reg-class-fpr)
     1682                      (<- fp-val)
     1683                      (ensuring-node-target (target vreg)
     1684                        (target-arch-case
     1685                         (:x8632 (x862-single->heap seg target fp-val))
     1686                         (:x8664 (! single->node target fp-val)))))))
     1687                 (:signed-32-bit-vector
     1688                  (with-imm-target () (s32-reg :s32)
     1689                    (if (eql vreg-mode hard-reg-class-gpr-mode-s32)
     1690                      (setq s32-reg vreg))
     1691                    (! misc-ref-s32 s32-reg src idx-reg)
     1692                    (unless (eq vreg s32-reg)
     1693                      (ensuring-node-target (target vreg)
     1694                        (x862-box-s32 seg target s32-reg)))))
     1695                 (:unsigned-32-bit-vector
     1696                  (with-imm-target () (u32-reg :u32)
     1697                    (if (eql vreg-mode hard-reg-class-gpr-mode-u32)
     1698                      (setq u32-reg vreg))
     1699                    (! misc-ref-u32 u32-reg src idx-reg)
     1700                    (unless (eq vreg u32-reg)
     1701                      (ensuring-node-target (target vreg)
     1702                        (x862-box-u32 seg target u32-reg)))))
     1703                 (t
     1704                  (with-imm-target () temp
     1705                    (if is-signed
     1706                      (! misc-ref-s32 temp src idx-reg)
     1707                      (! misc-ref-u32 temp src idx-reg))
     1708                    (ensuring-node-target (target vreg)
     1709                      (if (eq type-keyword :simple-string)
     1710                        (! u32->char target temp)
    16761711                        (if is-signed
    1677                           (! misc-ref-s32 temp src idx-reg)
    1678                           (! misc-ref-u32 temp src idx-reg))
    1679                         (ensuring-node-target (target vreg)
    1680                           (if (eq type-keyword :simple-string)
    1681                             (! u32->char target temp)
    1682                             (target-arch-case
    1683                              (:x8632 (if is-signed
    1684                                        (x862-box-s32 seg target temp)
    1685                                        (x862-box-u32 seg target temp)))
    1686                              (:x8664 (! box-fixnum target temp)))))))))))
     1712                          (x862-box-s32 seg target temp)
     1713                          (x862-box-u32 seg target temp))))))))))
    16871714          (is-8-bit
    16881715           (with-imm-target () temp
Note: See TracChangeset for help on using the changeset viewer.