Changeset 5042


Ignore:
Timestamp:
Aug 28, 2006, 3:51:29 AM (18 years ago)
Author:
Gary Byers
Message:

%UNBOX-U8, u8-vref stuff.

Location:
trunk/ccl/compiler/X86
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/ccl/compiler/X86/X8664/x8664-vinsns.lisp

    r4959 r5042  
    663663
    664664
    665 (define-x8664-vinsn u8->char (((dest :lisp))
     665(define-x8664-vinsn u8->char (((dest :lisp)
     666                               (src :u8))
    666667                              ((src :u8))
    667668                              ())
    668   (imulq (:$b x8664::fixnumone) (:%q src)(:%q dest))
    669   (shlq (:$ub (- x8664::charcode-shift x8664::fixnum-shift)) (:%q dest))
    670   (movb (:$b x8664::subtag-character) (:%b dest)))
     669  (shll (:$ub x8664::charcode-shift) (:%l src))
     670  (leaq  (:@ x8664::subtag-character (:%q src)) (:%q dest)))
    671671
    672672
     
    793793  (movq (:%q src) (:%q dest))
    794794  (shrq (:$ub x8664::fixnumshift) (:%q dest)))
     795
     796(define-x8664-vinsn %unbox-u8 (((dest :u8))
     797                              ((src :lisp)))
     798  (movl (:%l src) (:%l dest))
     799  (shrl (:$ub x8664::fixnumshift) (:%l dest))
     800  (movzbl (:%b dest) (:%l dest)))
    795801
    796802(define-x8664-vinsn unbox-s8 (((dest :s8))
  • trunk/ccl/compiler/X86/x862.lisp

    r4989 r5042  
    14811481                         (unscaled-idx nil)
    14821482                         (src nil))
    1483                     (ensuring-node-target
    1484                         (target vreg)
    1485                       (if (or safe (not index-known-fixnum))
    1486                         (multiple-value-setq (src unscaled-idx)
    1487                           (x862-two-untargeted-reg-forms seg vector x8664::arg_y index x8664::arg_z))
    1488                         (setq src (x862-one-untargeted-reg-form seg vector x8664::arg_z)))
    1489                       (when safe
    1490                         (if (typep safe 'fixnum)
    1491                           (! trap-unless-typecode= src safe))
    1492                         (unless index-known-fixnum
    1493                           (! trap-unless-fixnum unscaled-idx))
    1494                         (! check-misc-bound unscaled-idx src))
    1495                       (if is-32-bit
    1496                         (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-32-bit-constant-index arch)))
     1483                    (if (or safe (not index-known-fixnum))
     1484                      (multiple-value-setq (src unscaled-idx)
     1485                        (x862-two-untargeted-reg-forms seg vector x8664::arg_y index x8664::arg_z))
     1486                      (setq src (x862-one-untargeted-reg-form seg vector x8664::arg_z)))
     1487                    (when safe
     1488                      (if (typep safe 'fixnum)
     1489                        (! trap-unless-typecode= src safe))
     1490                      (unless index-known-fixnum
     1491                        (! trap-unless-fixnum unscaled-idx))
     1492                      (! check-misc-bound unscaled-idx src))
     1493                    (if is-32-bit
     1494                      (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-32-bit-constant-index arch)))
     1495                        (cond ((eq type-keyword :single-float-vector)
     1496                               (! misc-ref-c-single-float x8664::fp1 src index-known-fixnum)
     1497                               (ensuring-node-target (target vreg)
     1498                                 (! single->node target x8664::fp1)))
     1499                              (t
     1500                               (with-imm-temps () (temp)
     1501                                 (if is-signed
     1502                                   (! misc-ref-c-s32 temp src index-known-fixnum)
     1503                                   (! misc-ref-c-u32 temp src index-known-fixnum))
     1504                                 (ensuring-node-target (target vreg)
     1505                                   (! box-fixnum target temp)))))
     1506                        (with-imm-temps
     1507                            () (idx-reg)
     1508                          (if index-known-fixnum
     1509                            (x862-absolute-natural seg idx-reg nil (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum 2)))
     1510                            (! scale-32bit-misc-index idx-reg unscaled-idx))
    14971511                          (cond ((eq type-keyword :single-float-vector)
    1498                                  (! misc-ref-c-single-float x8664::fp1 src index-known-fixnum)
    1499                                  (! single->node target x8664::fp1))
    1500                                 (t
    1501                                  (with-imm-temps () (temp)
    1502                                    (if is-signed
    1503                                      (! misc-ref-c-s32 temp src index-known-fixnum)
    1504                                      (! misc-ref-c-u32 temp src index-known-fixnum))
    1505                                    (! box-fixnum target temp))))
    1506                           (with-imm-temps
    1507                               () (idx-reg)
    1508                             (if index-known-fixnum
    1509                               (x862-absolute-natural seg idx-reg nil (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum 2)))
    1510                               (! scale-32bit-misc-index idx-reg unscaled-idx))
    1511                             (cond ((eq type-keyword :single-float-vector)
    1512                                    (! misc-ref-single-float x8664::fp1 src idx-reg)
    1513                                    (! single->node target x8664::fp1))
    1514                                   (t (with-imm-temps
    1515                                          (idx-reg) (temp)
    1516                                        (if is-signed
    1517                                          (! misc-ref-s32 temp src idx-reg)
    1518                                          (! misc-ref-u32 temp src idx-reg))
    1519                                        (! box-fixnum target temp))))))
    1520                         (if is-8-bit
     1512                                 (! misc-ref-single-float x8664::fp1 src idx-reg)
     1513                                 (ensuring-node-target (target vreg)
     1514                                   
     1515                                   (! single->node target x8664::fp1)))
     1516                                (t (with-imm-temps
     1517                                       (idx-reg) (temp)
     1518                                     (if is-signed
     1519                                       (! misc-ref-s32 temp src idx-reg)
     1520                                       (! misc-ref-u32 temp src idx-reg))
     1521                                     (ensuring-node-target (target vreg)
     1522                                       (! box-fixnum target temp)))))))
     1523                      (if is-8-bit
     1524                        (with-imm-temps
     1525                            () (temp)
     1526                          (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-8-bit-constant-index arch)))
     1527                            (if is-signed
     1528                              (! misc-ref-c-s8 temp src index-known-fixnum)
     1529                              (! misc-ref-c-u8 temp src index-known-fixnum))
     1530                            (with-imm-temps
     1531                                () (idx-reg)
     1532                              (if index-known-fixnum
     1533                                (x862-absolute-natural seg idx-reg nil (+ (arch::target-misc-data-offset arch) index-known-fixnum))
     1534                                (! scale-8bit-misc-index idx-reg unscaled-idx))
     1535                              (if is-signed
     1536                                (! misc-ref-s8 temp src idx-reg)
     1537                                (! misc-ref-u8 temp src idx-reg))))
     1538                          (if (eq type-keyword :simple-string)
     1539                            (ensuring-node-target (target vreg)
     1540                              (! u8->char target temp))
     1541                            (if (and (= vreg-mode hard-reg-class-gpr-mode-u8)
     1542                                     (eq type-keyword :unsigned-8-bit-vector))
     1543                              (x862-copy-register seg vreg temp)
     1544                              (ensuring-node-target (target vreg)
     1545                                (! box-fixnum target temp)))))
     1546                        (if is-16-bit
    15211547                          (with-imm-temps
    15221548                              () (temp)
    1523                             (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-8-bit-constant-index arch)))
    1524                               (if is-signed
    1525                                 (! misc-ref-c-s8 temp src index-known-fixnum)
    1526                                 (! misc-ref-c-u8 temp src index-known-fixnum))
    1527                               (with-imm-temps
    1528                                   () (idx-reg)
    1529                                 (if index-known-fixnum
    1530                                   (x862-absolute-natural seg idx-reg nil (+ (arch::target-misc-data-offset arch) index-known-fixnum))
    1531                                   (! scale-8bit-misc-index idx-reg unscaled-idx))
    1532                                 (if is-signed
    1533                                   (! misc-ref-s8 temp src idx-reg)
    1534                                   (! misc-ref-u8 temp src idx-reg))))
    1535                             (if (eq type-keyword :simple-string)
    1536                               (! u8->char target temp)
    1537                               (! box-fixnum target temp)))
    1538                           (if is-16-bit
    1539                             (with-imm-temps
    1540                                 () (temp)
     1549                            (ensuring-node-target (target vreg)
    15411550                              (if (and index-known-fixnum
    15421551                                       (<= index-known-fixnum (arch::target-max-16-bit-constant-index arch)))
     
    15521561                                    (! misc-ref-s16 temp src idx-reg)
    15531562                                    (! misc-ref-u16 temp src idx-reg))))
    1554                               (! box-fixnum target temp))
    1555                             ;; Down to the dregs.
    1556                             (if is-64-bit
     1563                              (! box-fixnum target temp)))
     1564                          ;; Down to the dregs.
     1565                          (if is-64-bit
     1566                            (ensuring-node-target (target vreg)
    15571567                              (ecase type-keyword
    15581568                                (:double-float-vector
     
    15831593                                   (if (eq type-keyword :fixnum-vector)
    15841594                                     (! box-fixnum target s64-reg)
    1585                                      (x862-box-s64 seg target s64-reg)))))
    1586                               (progn
    1587                                 (unless is-1-bit
    1588                                   (nx-error "~& unsupported vector type: ~s"
    1589                                             type-keyword))
     1595                                     (x862-box-s64 seg target s64-reg))))))
     1596                            (progn
     1597                              (unless is-1-bit
     1598                                (nx-error "~& unsupported vector type: ~s"
     1599                                          type-keyword))
     1600                              (ensuring-node-target (target vreg)
    15901601                                (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-1-bit-constant-index arch)))
    15911602                                  (! misc-ref-c-bit-fixnum target src index-known-fixnum)
     
    34113422                     (case src-mode
    34123423                       (#.hard-reg-class-gpr-mode-node
    3413                         (! unbox-u8 dest src))
     3424                        (if *x862-reckless*
     3425                          (! %unbox-u8 dest src)
     3426                          (! unbox-u8 dest src)))
    34143427                       (t
    34153428                        (unless (eql dest-gpr src-gpr)
     
    58145827    (progn
    58155828      (ensuring-node-target (target vreg)
    5816         (! fixnum->char target (x862-one-untargeted-reg-form seg c x8664::arg_z)))
     5829        (with-imm-target () (dest :u8)
     5830          (! u8->char target (let* ((*x862-reckless* t))
     5831                               (x862-one-untargeted-reg-form seg c dest)))))
    58175832      (^))))
    58185833
Note: See TracChangeset for help on using the changeset viewer.