Changeset 5042
- Timestamp:
- Aug 28, 2006, 3:51:29 AM (18 years ago)
- Location:
- trunk/ccl/compiler/X86
- Files:
-
- 2 edited
-
X8664/x8664-vinsns.lisp (modified) (2 diffs)
-
x862.lisp (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ccl/compiler/X86/X8664/x8664-vinsns.lisp
r4959 r5042 663 663 664 664 665 (define-x8664-vinsn u8->char (((dest :lisp)) 665 (define-x8664-vinsn u8->char (((dest :lisp) 666 (src :u8)) 666 667 ((src :u8)) 667 668 ()) 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))) 671 671 672 672 … … 793 793 (movq (:%q src) (:%q dest)) 794 794 (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))) 795 801 796 802 (define-x8664-vinsn unbox-s8 (((dest :s8)) -
trunk/ccl/compiler/X86/x862.lisp
r4989 r5042 1481 1481 (unscaled-idx nil) 1482 1482 (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)) 1497 1511 (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 1521 1547 (with-imm-temps 1522 1548 () (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) 1541 1550 (if (and index-known-fixnum 1542 1551 (<= index-known-fixnum (arch::target-max-16-bit-constant-index arch))) … … 1552 1561 (! misc-ref-s16 temp src idx-reg) 1553 1562 (! 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) 1557 1567 (ecase type-keyword 1558 1568 (:double-float-vector … … 1583 1593 (if (eq type-keyword :fixnum-vector) 1584 1594 (! 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) 1590 1601 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-1-bit-constant-index arch))) 1591 1602 (! misc-ref-c-bit-fixnum target src index-known-fixnum) … … 3411 3422 (case src-mode 3412 3423 (#.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))) 3414 3427 (t 3415 3428 (unless (eql dest-gpr src-gpr) … … 5814 5827 (progn 5815 5828 (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))))) 5817 5832 (^)))) 5818 5833
Note:
See TracChangeset
for help on using the changeset viewer.
