Changeset 5448
- Timestamp:
- Nov 3, 2006, 11:41:05 AM (18 years ago)
- File:
-
- 1 edited
-
trunk/ccl/compiler/X86/x862.lisp (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ccl/compiler/X86/x862.lisp
r5373 r5448 1428 1428 1429 1429 1430 (defun x862-vref1 (seg vreg xfer type-keyword src unscaled-idx index-known-fixnum) 1431 (with-x86-local-vinsn-macros (seg vreg xfer) 1432 (when vreg 1433 (let* ((arch (backend-target-arch *target-backend*)) 1434 (is-node (member type-keyword (arch::target-gvector-types arch))) 1435 (is-1-bit (member type-keyword (arch::target-1-bit-ivector-types arch))) 1436 1437 (is-8-bit (member type-keyword (arch::target-8-bit-ivector-types arch))) 1438 (is-16-bit (member type-keyword (arch::target-16-bit-ivector-types arch))) 1439 (is-32-bit (member type-keyword (arch::target-32-bit-ivector-types arch))) 1440 (is-64-bit (member type-keyword (arch::target-64-bit-ivector-types arch))) 1441 (is-signed (member type-keyword '(:signed-8-bit-vector :signed-16-bit-vector :signed-32-bit-vector :fixnum-vector))) 1442 (vreg-class (and (not (eq vreg :push)) (hard-regspec-class vreg))) 1443 (vreg-mode 1444 (if (eql vreg-class hard-reg-class-gpr) 1445 (get-regspec-mode vreg) 1446 hard-reg-class-gpr-mode-invalid))) 1447 (cond 1448 (is-node 1449 (if (eq vreg :push) 1450 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-64-bit-constant-index arch))) 1451 (! push-misc-ref-c-node src index-known-fixnum) 1452 (! push-misc-ref-node src unscaled-idx)) 1453 (ensuring-node-target (target vreg) 1454 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-64-bit-constant-index arch))) 1455 (! misc-ref-c-node target src index-known-fixnum) 1456 (! misc-ref-node target src unscaled-idx))))) 1457 (is-32-bit 1458 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-32-bit-constant-index arch))) 1459 (cond ((eq type-keyword :single-float-vector) 1460 (with-fp-target () (fp-val :single-float) 1461 (if (and (eql vreg-class hard-reg-class-fpr) 1462 (eql vreg-mode hard-reg-class-fpr-mode-single)) 1463 (setq fp-val vreg)) 1464 (! misc-ref-c-single-float fp-val src index-known-fixnum) 1465 (if (eql vreg-class hard-reg-class-fpr) 1466 (<- fp-val) 1467 (ensuring-node-target (target vreg) 1468 (! single->node target fp-val))))) 1469 (t 1470 (with-imm-target () temp 1471 (if is-signed 1472 (! misc-ref-c-s32 temp src index-known-fixnum) 1473 (! misc-ref-c-u32 temp src index-known-fixnum)) 1474 (ensuring-node-target (target vreg) 1475 (if (eq type-keyword :simple-string) 1476 (! u32->char target temp) 1477 (! box-fixnum target temp)))))) 1478 (with-imm-target () idx-reg 1479 (if index-known-fixnum 1480 (x862-absolute-natural seg idx-reg nil (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum 2))) 1481 (! scale-32bit-misc-index idx-reg unscaled-idx)) 1482 (cond ((eq type-keyword :single-float-vector) 1483 (with-fp-target () (fp-val :single-float) 1484 (if (and (eql vreg-class hard-reg-class-fpr) 1485 (eql vreg-mode hard-reg-class-fpr-mode-single)) 1486 (setq fp-val vreg)) 1487 (! misc-ref-single-float fp-val src idx-reg) 1488 (if (eq vreg-class hard-reg-class-fpr) 1489 (<- fp-val) 1490 (ensuring-node-target (target vreg) 1491 (! single->node target fp-val))))) 1492 (t (with-imm-target () temp 1493 (if is-signed 1494 (! misc-ref-s32 temp src idx-reg) 1495 (! misc-ref-u32 temp src idx-reg)) 1496 (ensuring-node-target (target vreg) 1497 (if (eq type-keyword :simple-string) 1498 (! u32->char target temp) 1499 (! box-fixnum target temp))))))))) 1500 (is-8-bit 1501 (with-imm-target () temp 1502 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-8-bit-constant-index arch))) 1503 (if is-signed 1504 (! misc-ref-c-s8 temp src index-known-fixnum) 1505 (! misc-ref-c-u8 temp src index-known-fixnum)) 1506 (with-imm-target () idx-reg 1507 (if index-known-fixnum 1508 (x862-absolute-natural seg idx-reg nil (+ (arch::target-misc-data-offset arch) index-known-fixnum)) 1509 (! scale-8bit-misc-index idx-reg unscaled-idx)) 1510 (if is-signed 1511 (! misc-ref-s8 temp src idx-reg) 1512 (! misc-ref-u8 temp src idx-reg)))) 1513 (if (eq type-keyword :simple-string) 1514 (ensuring-node-target (target vreg) 1515 (! u32->char target temp)) 1516 (if (and (= vreg-mode hard-reg-class-gpr-mode-u8) 1517 (eq type-keyword :unsigned-8-bit-vector)) 1518 (x862-copy-register seg vreg temp) 1519 (ensuring-node-target (target vreg) 1520 (! box-fixnum target temp)))))) 1521 (is-16-bit 1522 (with-imm-target () temp 1523 (ensuring-node-target (target vreg) 1524 (if (and index-known-fixnum 1525 (<= index-known-fixnum (arch::target-max-16-bit-constant-index arch))) 1526 (if is-signed 1527 (! misc-ref-c-s16 temp src index-known-fixnum) 1528 (! misc-ref-c-u16 temp src index-known-fixnum)) 1529 (with-imm-target () idx-reg 1530 (if index-known-fixnum 1531 (x862-absolute-natural seg idx-reg nil (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum 1))) 1532 (! scale-16bit-misc-index idx-reg unscaled-idx)) 1533 (if is-signed 1534 (! misc-ref-s16 temp src idx-reg) 1535 (! misc-ref-u16 temp src idx-reg)))) 1536 (! box-fixnum target temp)))) 1537 ;; Down to the dregs. 1538 (is-64-bit 1539 (case type-keyword 1540 (:double-float-vector 1541 (with-fp-target () (fp-val :double-float) 1542 (if (and (eql vreg-class hard-reg-class-fpr) 1543 (eql vreg-mode hard-reg-class-fpr-mode-double)) 1544 (setq fp-val vreg)) 1545 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-64-bit-constant-index arch))) 1546 (! misc-ref-c-double-float fp-val src index-known-fixnum) 1547 (progn 1548 (if index-known-fixnum 1549 (x862-absolute-natural seg unscaled-idx nil (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum 3)))) 1550 (! misc-ref-double-float fp-val src unscaled-idx))) 1551 (if (eq vreg-class hard-reg-class-fpr) 1552 (<- fp-val) 1553 (ensuring-node-target (target vreg) 1554 (x862-double->heap seg target fp-val))))) 1555 ((:signed-64-bit-vector :fixnum-vector) 1556 (ensuring-node-target (target vreg) 1557 1558 (with-imm-target () (s64-reg :s64) 1559 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-64-bit-constant-index arch))) 1560 (! misc-ref-c-s64 s64-reg src index-known-fixnum) 1561 (progn 1562 (if index-known-fixnum 1563 (x862-absolute-natural seg unscaled-idx nil (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum 3)))) 1564 (! misc-ref-s64 s64-reg src unscaled-idx))) 1565 (if (eq type-keyword :fixnum-vector) 1566 (! box-fixnum target s64-reg) 1567 (x862-box-s64 seg target s64-reg))))) 1568 (t 1569 (with-imm-target () (u64-reg :u64) 1570 (if (eql vreg-mode hard-reg-class-gpr-mode-u64) 1571 (setq u64-reg vreg)) 1572 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-64-bit-constant-index arch))) 1573 (! misc-ref-c-u64 u64-reg src index-known-fixnum) 1574 (progn 1575 (if index-known-fixnum 1576 (x862-absolute-natural seg unscaled-idx nil (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum 3)))) 1577 (! misc-ref-u64 u64-reg src unscaled-idx))) 1578 (unless (eq u64-reg vreg) 1579 (ensuring-node-target (target vreg) 1580 (x862-box-u64 seg target u64-reg))))))) 1581 (t 1582 (unless is-1-bit 1583 (nx-error "~& unsupported vector type: ~s" 1584 type-keyword)) 1585 (ensuring-node-target (target vreg) 1586 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-1-bit-constant-index arch))) 1587 (! misc-ref-c-bit-fixnum target src index-known-fixnum) 1588 (with-imm-temps 1589 () (word-index bitnum) 1590 (if index-known-fixnum 1591 (progn 1592 (x862-lri seg word-index (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum -6))) 1593 (x862-lri seg bitnum (logand index-known-fixnum #x63))) 1594 (! word-index-and-bitnum-from-index word-index bitnum unscaled-idx)) 1595 (! ref-bit-vector-fixnum target bitnum src word-index)))))))) 1596 (^))) 1597 1430 1598 ;;; safe = T means assume "vector" is miscobj, do bounds check. 1431 1599 ;;; safe = fixnum means check that subtag of vector = "safe" and do … … 1434 1602 ;;; This mostly knows how to reference the elements of an immediate miscobj. 1435 1603 (defun x862-vref (seg vreg xfer type-keyword vector index safe) 1436 (let* ((arch (backend-target-arch *target-backend*))1437 (is-node (member type-keyword (arch::target-gvector-types arch)))1438 (is-1-bit (member type-keyword (arch::target-1-bit-ivector-types arch)))1439 1440 (is-8-bit (member type-keyword (arch::target-8-bit-ivector-types arch)))1441 (is-16-bit (member type-keyword (arch::target-16-bit-ivector-types arch)))1442 (is-32-bit (member type-keyword (arch::target-32-bit-ivector-types arch)))1443 (is-64-bit (member type-keyword (arch::target-64-bit-ivector-types arch)))1444 (is-signed (member type-keyword '(:signed-8-bit-vector :signed-16-bit-vector :signed-32-bit-vector :fixnum-vector))))1445 (if is-node1446 (x862-misc-node-ref seg vreg xfer vector index safe)1447 (with-x86-local-vinsn-macros (seg vreg xfer)1448 (if (null vreg)1449 (progn1450 (x862-form seg nil nil vector)1451 (x862-form seg nil xfer index))1452 (let* ((vreg-class (hard-regspec-class vreg))1453 (vreg-mode1454 (if (= vreg-class hard-reg-class-gpr)1455 (get-regspec-mode vreg)1456 hard-reg-class-gpr-mode-invalid)))1457 (declare (fixnum vreg-class vreg-mode))1458 (if (and (= vreg-class hard-reg-class-fpr)1459 (eq type-keyword :double-float-vector))1460 (x862-df-vref seg vreg xfer vector index safe)1461 (if (and (= vreg-class hard-reg-class-fpr)1462 (eq type-keyword :single-float-vector))1463 (x862-sf-vref seg vreg xfer vector index safe)1464 (if (target-arch-case1465 1466 (:x86641467 (and (= vreg-mode hard-reg-class-gpr-mode-u64)1468 is-64-bit1469 (not (or (eq type-keyword :signed-64-bit-vector)1470 (eq type-keyword :fixnum-vector)1471 (eq type-keyword :double-float-vector))))))1472 1473 (x862-natural-vref seg vreg xfer vector index safe)1474 (let* ((index-known-fixnum (acode-fixnum-form-p index))1475 (unscaled-idx nil)1476 (src nil))1477 (if (or safe (not index-known-fixnum))1478 (multiple-value-setq (src unscaled-idx)1479 (x862-two-untargeted-reg-forms seg vector x8664::arg_y index x8664::arg_z))1480 (setq src (x862-one-untargeted-reg-form seg vector x8664::arg_z)))1481 (when safe1482 (if (typep safe 'fixnum)1483 (! trap-unless-typecode= src safe))1484 (unless index-known-fixnum1485 (! trap-unless-fixnum unscaled-idx))1486 (! check-misc-bound unscaled-idx src))1487 (if is-32-bit1488 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-32-bit-constant-index arch)))1489 (cond ((eq type-keyword :single-float-vector)1490 (! misc-ref-c-single-float x8664::fp1 src index-known-fixnum)1491 (ensuring-node-target (target vreg)1492 (! single->node target x8664::fp1)))1493 (t1494 (with-imm-temps () (temp)1495 (if is-signed1496 (! misc-ref-c-s32 temp src index-known-fixnum)1497 (! misc-ref-c-u32 temp src index-known-fixnum))1498 (ensuring-node-target (target vreg)1499 (if (eq type-keyword :simple-string)1500 (! u32->char target temp)1501 (! box-fixnum target temp))))))1502 (with-imm-temps1503 () (idx-reg)1504 (if index-known-fixnum1505 (x862-absolute-natural seg idx-reg nil (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum 2)))1506 (! scale-32bit-misc-index idx-reg unscaled-idx))1507 (cond ((eq type-keyword :single-float-vector)1508 (! misc-ref-single-float x8664::fp1 src idx-reg)1509 (ensuring-node-target (target vreg)1510 1511 (! single->node target x8664::fp1)))1512 (t (with-imm-temps1513 (idx-reg) (temp)1514 (if is-signed1515 (! misc-ref-s32 temp src idx-reg)1516 (! misc-ref-u32 temp src idx-reg))1517 (ensuring-node-target (target vreg)1518 (if (eq type-keyword :simple-string)1519 (! u32->char target temp)1520 (! box-fixnum target temp))))))))1521 (if is-8-bit1522 (with-imm-temps1523 () (temp)1524 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-8-bit-constant-index arch)))1525 (if is-signed1526 (! misc-ref-c-s8 temp src index-known-fixnum)1527 (! misc-ref-c-u8 temp src index-known-fixnum))1528 (with-imm-temps1529 () (idx-reg)1530 (if index-known-fixnum1531 (x862-absolute-natural seg idx-reg nil (+ (arch::target-misc-data-offset arch) index-known-fixnum))1532 (! scale-8bit-misc-index idx-reg unscaled-idx))1533 (if is-signed1534 (! misc-ref-s8 temp src idx-reg)1535 (! misc-ref-u8 temp src idx-reg))))1536 (if (eq type-keyword :simple-string)1537 (ensuring-node-target (target vreg)1538 (! u32->char target temp))1539 (if (and (= vreg-mode hard-reg-class-gpr-mode-u8)1540 (eq type-keyword :unsigned-8-bit-vector))1541 (x862-copy-register seg vreg temp)1542 (ensuring-node-target (target vreg)1543 (! box-fixnum target temp)))))1544 (if is-16-bit1545 (with-imm-temps1546 () (temp)1547 (ensuring-node-target (target vreg)1548 (if (and index-known-fixnum1549 (<= index-known-fixnum (arch::target-max-16-bit-constant-index arch)))1550 (if is-signed1551 (! misc-ref-c-s16 temp src index-known-fixnum)1552 (! misc-ref-c-u16 temp src index-known-fixnum))1553 (with-imm-temps1554 () (idx-reg)1555 (if index-known-fixnum1556 (x862-absolute-natural seg idx-reg nil (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum 1)))1557 (! scale-16bit-misc-index idx-reg unscaled-idx))1558 (if is-signed1559 (! misc-ref-s16 temp src idx-reg)1560 (! misc-ref-u16 temp src idx-reg))))1561 (! box-fixnum target temp)))1562 ;; Down to the dregs.1563 (if is-64-bit1564 (ensuring-node-target (target vreg)1565 (ecase type-keyword1566 (:double-float-vector1567 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-64-bit-constant-index arch)))1568 (! misc-ref-c-double-float 0 src index-known-fixnum)1569 (progn1570 (if index-known-fixnum1571 (x862-absolute-natural seg unscaled-idx nil (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum 3))))1572 (! misc-ref-double-float x8664::fp1 src unscaled-idx)))1573 (x862-double->heap seg target x8664::fp1))1574 (:unsigned-64-bit-vector1575 (with-imm-target () (u64-reg :u64)1576 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-64-bit-constant-index arch)))1577 (! misc-ref-c-u64 u64-reg src index-known-fixnum)1578 (progn1579 (if index-known-fixnum1580 (x862-absolute-natural seg unscaled-idx nil (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum 3))))1581 (! misc-ref-u64 u64-reg src unscaled-idx)))1582 (x862-box-u64 seg target u64-reg)))1583 ((:signed-64-bit-vector :fixnum-vector)1584 (with-imm-target () (s64-reg :s64)1585 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-64-bit-constant-index arch)))1586 (! misc-ref-c-s64 s64-reg src index-known-fixnum)1587 (progn1588 (if index-known-fixnum1589 (x862-absolute-natural seg unscaled-idx nil (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum 3))))1590 (! misc-ref-s64 s64-reg src unscaled-idx)))1591 (if (eq type-keyword :fixnum-vector)1592 (! box-fixnum target s64-reg)1593 (x862-box-s64 seg target s64-reg))))))1594 (progn1595 (unless is-1-bit1596 (nx-error "~& unsupported vector type: ~s"1597 type-keyword))1598 (ensuring-node-target (target vreg)1599 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-1-bit-constant-index arch)))1600 (! misc-ref-c-bit-fixnum target src index-known-fixnum)1601 (with-imm-temps1602 () (word-index bitnum)1603 (if index-known-fixnum1604 (progn1605 (x862-lri seg word-index (+ (arch::target-misc-data-offset arch) (ash index-known-fixnum -6)))1606 (x862-lri seg bitnum (logand index-known-fixnum #x63)))1607 (! word-index-and-bitnum-from-index word-index bitnum unscaled-idx))1608 (! ref-bit-vector-fixnum target bitnum src word-index)))))))))1609 (^)))))))))))1610 1611 ;;; In this case, the target register is an fp reg and the vector is declared1612 ;;; do be a double-float vector. Avoid boxing the result!1613 (defun x862-df-vref (seg vreg xfer vector index safe)1614 1604 (with-x86-local-vinsn-macros (seg vreg xfer) 1615 (let* ((index-known-fixnum (acode-fixnum-form-p index)) 1616 (arch (backend-target-arch *target-backend*)) 1617 (src) 1618 (unscaled-idx)) 1619 (if (or safe (not index-known-fixnum)) 1620 (multiple-value-setq (src unscaled-idx) 1621 (x862-two-untargeted-reg-forms seg vector x8664::arg_y index x8664::arg_z)) 1622 (setq src (x862-one-untargeted-reg-form seg vector x8664::arg_z))) 1623 (when safe 1624 (if (typep safe 'fixnum) 1625 (! trap-unless-typecode= src safe)) 1626 (unless index-known-fixnum 1627 (! trap-unless-fixnum unscaled-idx)) 1628 (! check-misc-bound unscaled-idx src)) 1629 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-64-bit-constant-index arch))) 1630 (! misc-ref-c-double-float vreg src index-known-fixnum) 1631 (progn 1632 (if index-known-fixnum 1633 (x862-absolute-natural seg unscaled-idx nil (+ (arch::target-misc-dfloat-offset arch) (ash index-known-fixnum 3)))) 1634 (! misc-ref-double-float vreg src unscaled-idx))) 1635 (^)))) 1605 (if (null vreg) 1606 (progn 1607 (x862-form seg nil nil vector) 1608 (x862-form seg nil xfer index)) 1609 (let* ((index-known-fixnum (acode-fixnum-form-p index)) 1610 (unscaled-idx nil) 1611 (src nil)) 1612 (if (or safe (not index-known-fixnum)) 1613 (multiple-value-setq (src unscaled-idx) 1614 (x862-two-untargeted-reg-forms seg vector x8664::arg_y index x8664::arg_z)) 1615 (setq src (x862-one-untargeted-reg-form seg vector x8664::arg_z))) 1616 (when safe 1617 (if (typep safe 'fixnum) 1618 (! trap-unless-typecode= src safe)) 1619 (unless index-known-fixnum 1620 (! trap-unless-fixnum unscaled-idx)) 1621 (! check-misc-bound unscaled-idx src)) 1622 (x862-vref1 seg vreg xfer type-keyword src unscaled-idx index-known-fixnum))))) 1623 1624 1636 1625 1637 1626 (defun x862-aset2 (seg target array i j new safe typename &optional dim0 dim1) … … 1706 1695 target) 1707 1696 1697 (defun x862-error-for-simple-2d-array-type (type-keyword) 1698 (ecase type-keyword 1699 (:simple-vector arch::error-object-not-simple-array-t-2d) 1700 (:simple-string arch::error-object-not-simple-array-char-2d) 1701 (:bit-vector arch::error-object-not-simple-array-bit-2d) 1702 (:unsigned-8-bit-vector arch::error-object-not-simple-array-u8-2d) 1703 (:signed-8-bit-vector arch::error-object-not-simple-array-s8-2d) 1704 (:unsigned-16-bit-vector arch::error-object-not-simple-array-u16-2d) 1705 (:signed-16-bit-vector arch::error-object-not-simple-array-s16-2d) 1706 (:unsigned-32-bit-vector arch::error-object-not-simple-array-u32-2d) 1707 (:signed-32-bit-vector arch::error-object-not-simple-array-s32-2d) 1708 (:unsigned-64-bit-vector arch::error-object-not-simple-array-u64-2d) 1709 (:signed-64-bit-vector arch::error-object-not-simple-array-s64-2d) 1710 (:double-float-vector arch::error-object-not-simple-array-double-float-2d) 1711 (:single-float-vector arch::error-object-not-simple-array-double-float-2d))) 1712 1708 1713 (defun x862-aref2 (seg vreg xfer array i j safe typekeyword &optional dim0 dim1) 1709 1714 (with-x86-local-vinsn-macros (seg vreg xfer) 1710 1715 (let* ((i-known-fixnum (acode-fixnum-form-p i)) 1711 1716 (j-known-fixnum (acode-fixnum-form-p j)) 1712 (arch (backend-target-arch *target-backend*))1713 1717 (src) 1714 (need-scale t)1715 1718 (unscaled-i) 1716 1719 (unscaled-j) … … 1731 1734 (when safe 1732 1735 (when (typep safe 'fixnum) 1733 (! trap-unless-array-header src) 1734 (! check-arrayH-rank src 2) 1735 (! check-arrayH-flags src 1736 (! trap-unless-simple-array-2 1737 src 1736 1738 (dpb safe target::arrayH.flags-cell-subtag-byte 1737 1739 (ash 1 $arh_simple_bit)) 1738 (ecase typekeyword 1739 (:double-float-vector arch::error-object-not-simple-array-double-float-2d) 1740 (:singe-float-vector arch::error-object-not-simple-array-double-float-2d)) 1741 )) 1740 (x862-error-for-simple-2d-array-type typekeyword))) 1742 1741 (unless i-known-fixnum 1743 1742 (! trap-unless-fixnum unscaled-i)) 1744 1743 (unless j-known-fixnum 1745 1744 (! trap-unless-fixnum unscaled-j))) 1746 (with-imm-temps () (dim1 idx-reg) 1745 (with-node-target (src unscaled-i unscaled-j) idx-reg 1746 (with-imm-target () dim1 1747 1747 (unless constidx 1748 1748 (if safe 1749 1749 (! check-2d-bound dim1 unscaled-i unscaled-j src) 1750 1750 (! 2d-dim1 dim1 src)) 1751 (! 2d-unscaled-index idx-reg src unscaled-i unscaled-j dim1))1752 (with-node-t emps () (v)1751 (! 2d-unscaled-index idx-reg dim1 unscaled-i unscaled-j)) 1752 (with-node-target (idx-reg) v 1753 1753 (! array-data-vector-ref v src) 1754 (let* ((bias (arch::target-misc-data-offset arch))) 1755 (multiple-value-bind (shift limit) 1756 (case typekeyword 1757 (:double-float-vector 1758 (setq bias (arch::target-misc-dfloat-offset arch)) 1759 (values 3 (arch::target-max-64-bit-constant-index arch))) 1760 ((:single-float-vector 1761 :s32-vector 1762 :u32-vector) 1763 (values 2 (arch::target-max-32-bit-constant-index arch)))) 1764 (when (and constidx (>= constidx limit)) 1765 (x862-absolute-natural seg idx-reg nil (+ bias 1766 (ash constidx shift))) 1767 (setq constidx nil need-scale nil)))) 1768 (case typekeyword 1769 (:double-float-vector 1770 (if constidx 1771 (! misc-ref-c-double-float vreg v constidx) 1772 (progn 1773 (! misc-ref-double-float vreg v idx-reg)))) 1774 (:single-float-vector 1775 (if constidx 1776 (! misc-ref-c-single-float vreg v constidx) 1777 (progn 1778 (when need-scale (! scale-32bit-misc-index idx-reg idx-reg)) 1779 (! misc-ref-single-float vreg v idx-reg))))))) 1780 (^)))) 1781 1782 (defun x862-sf-vref (seg vreg xfer vector index safe) 1783 (with-x86-local-vinsn-macros (seg vreg xfer) 1784 (let* ((index-known-fixnum (acode-fixnum-form-p index)) 1785 (arch (backend-target-arch *target-backend*)) 1786 (src) 1787 (unscaled-idx)) 1788 (if (or safe (not index-known-fixnum)) 1789 (multiple-value-setq (src unscaled-idx) 1790 (x862-two-untargeted-reg-forms seg vector x8664::arg_y index x8664::arg_z)) 1791 (setq src (x862-one-untargeted-reg-form seg vector x8664::arg_z))) 1792 (when safe 1793 (if (typep safe 'fixnum) 1794 (! trap-unless-typecode= src safe)) 1795 (unless index-known-fixnum 1796 (! trap-unless-fixnum unscaled-idx)) 1797 (! check-misc-bound unscaled-idx src)) 1798 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-32-bit-constant-index arch))) 1799 (! misc-ref-c-single-float vreg src index-known-fixnum) 1800 (with-imm-temps () (idx-reg) 1801 (if index-known-fixnum 1802 (x862-absolute-natural seg idx-reg nil (+ (arch::target-misc-dfloat-offset arch) (ash index-known-fixnum 3))) 1803 (! scale-32bit-misc-index idx-reg unscaled-idx)) 1804 (! misc-ref-single-float vreg src idx-reg))) 1805 (^)))) 1806 1807 ;;; Vreg is of mode u32/u64; so's the vector element. Don't box result. 1808 (defun x862-natural-vref (seg vreg xfer vector index safe) 1809 (with-x86-local-vinsn-macros (seg vreg xfer) 1810 (let* ((index-known-fixnum (acode-fixnum-form-p index)) 1811 (src) 1812 (unscaled-idx)) 1813 (if (or safe (not index-known-fixnum)) 1814 (multiple-value-setq (src unscaled-idx) 1815 (x862-two-untargeted-reg-forms seg vector x8664::arg_y index x8664::arg_z)) 1816 (setq src (x862-one-untargeted-reg-form seg vector x8664::arg_z))) 1817 (when safe 1818 (if (typep safe 'fixnum) 1819 (! trap-unless-typecode= src safe)) 1820 (unless index-known-fixnum 1821 (! trap-unless-fixnum unscaled-idx)) 1822 (! check-misc-bound unscaled-idx src)) 1823 (target-arch-case 1824 1825 (:x8664 1826 (if (and index-known-fixnum (<= index-known-fixnum x8664::max-64-bit-constant-index)) 1827 (! misc-ref-c-u64 vreg src index-known-fixnum) 1828 (progn 1829 (if index-known-fixnum 1830 (x862-absolute-natural seg unscaled-idx nil (+ x8664::misc-data-offset (ash index-known-fixnum 3)))) 1831 (! misc-ref-u64 vreg src unscaled-idx))))) 1832 (^)))) 1754 (x862-vref1 seg vreg xfer typekeyword v idx-reg constidx))))))) 1755 1756 1833 1757 1834 1758 (defun x862-natural-vset (seg vreg xfer vector index value safe) … … 1889 1813 (typep val 'bit))))) 1890 1814 (if typep val)))) 1815 1816 #|| 1817 ;;; Caller has to have handled node case specially, may also have wanted to have 1818 ;;; targeted the value to a specific register. 1819 (defun x862-vset1 (seg vreg xfer type-keyword vector index-reg index-known-fixnum val-reg constval) 1820 (let* ((arch (backend-target-arch *target-backend*)) 1821 (is-node (member type-keyword (arch::target-gvector-types arch))) 1822 (is-1-bit (member type-keyword (arch::target-1-bit-ivector-types arch))) 1823 (is-8-bit (member type-keyword (arch::target-8-bit-ivector-types arch))) 1824 (is-16-bit (member type-keyword (arch::target-16-bit-ivector-types arch))) 1825 (is-32-bit (member type-keyword (arch::target-32-bit-ivector-types arch))) 1826 (is-64-bit (member type-keyword (arch::target-64-bit-ivector-types arch)))) 1827 (cond (is-node 1828 (! misc-set-node val-reg vector index-reg) 1829 )))) 1830 ||# 1891 1831 1892 1832 (defun x862-vset (seg vreg xfer type-keyword vector index value safe) … … 4148 4088 (^)))) 4149 4089 4150 ;;; If safe, ensure that index is a fixnum (if non-constant)4151 ;;; and check vector bound.4152 ;;; If we're going to have to evaluate the index into a register (to do4153 ;;; the bounds check), but know that the index could be a constant 16-bit4154 ;;; displacement, this'll look pretty silly ..4155 (defun x862-misc-node-ref (seg vreg xfer miscobj index safe)4156 (with-x86-local-vinsn-macros (seg vreg xfer)4157 (let* ((index-known-fixnum (acode-fixnum-form-p index))4158 (arch (backend-target-arch *target-backend*))4159 (unscaled-idx nil)4160 (src nil))4161 (if (or safe (not (and index-known-fixnum (<= index-known-fixnum (arch::target-max-32-bit-constant-index arch)))))4162 (multiple-value-setq (src unscaled-idx)4163 (x862-two-untargeted-reg-forms seg miscobj x8664::arg_y index x8664::arg_z))4164 (setq src (x862-one-untargeted-reg-form seg miscobj x8664::arg_z)))4165 (when safe4166 (if (typep safe 'fixnum)4167 (! trap-unless-typecode= src safe))4168 (unless index-known-fixnum4169 (! trap-unless-fixnum unscaled-idx))4170 (! check-misc-bound unscaled-idx src))4171 (when vreg4172 (if (eq vreg :push)4173 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-64-bit-constant-index arch)))4174 (! push-misc-ref-c-node src index-known-fixnum)4175 (! push-misc-ref-node src unscaled-idx))4176 (ensuring-node-target (target vreg)4177 (if (and index-known-fixnum (<= index-known-fixnum (arch::target-max-64-bit-constant-index arch)))4178 (! misc-ref-c-node target src index-known-fixnum)4179 (! misc-ref-node target src unscaled-idx)))))4180 (^))))4181 4090 4182 4091 (defun x862-misc-node-set (seg vreg xfer miscobj index value safe) … … 5209 5118 (with-x86-local-vinsn-macros (seg vreg xfer) 5210 5119 (let* ((index (arch::builtin-function-name-offset name)) 5211 (idx-subprim ( x862-builtin-index-subprim index))5120 (idx-subprim (if index (x862-builtin-index-subprim index))) 5212 5121 (tail-p (x862-tailcallok xfer))) 5213 5122 (when tail-p … … 5216 5125 (if idx-subprim 5217 5126 (setq subprim idx-subprim) 5218 ( ! lri ($ x8664::imm0) (ash index *x862-target-fixnum-shift*)))5127 (if index (! lri ($ x8664::imm0) (ash index *x862-target-fixnum-shift*)))) 5219 5128 (if tail-p 5220 5129 (! jump-subprim subprim) … … 5532 5441 (pushnew (%nx1-operator %svref) *x862-operator-supports-push*) 5533 5442 (defx862 x862-%svref %svref (seg vreg xfer vector index) 5534 (x862- misc-node-ref seg vreg xfer vector index nil))5443 (x862-vref seg vreg xfer :simple-vector vector index nil)) 5535 5444 5536 5445 (pushnew (%nx1-operator svref) *x862-operator-supports-push*) 5537 5446 (defx862 x862-svref svref (seg vreg xfer vector index) 5538 (x862- misc-node-ref seg vreg xfer vector index (unless *x862-reckless* (nx-lookup-target-uvector-subtag :simple-vector))))5447 (x862-vref seg vreg xfer :simple-vector vector index (unless *x862-reckless* (nx-lookup-target-uvector-subtag :simple-vector)))) 5539 5448 5540 5449 ;;; It'd be nice if this didn't box the result. Worse things happen ... … … 5734 5643 (pushnew (%nx1-operator struct-ref) *x862-operator-supports-push*) 5735 5644 (defx862 x862-struct-ref struct-ref (seg vreg xfer struct offset) 5736 (x862- misc-node-ref seg vreg xferstruct offset (unless *x862-reckless* (nx-lookup-target-uvector-subtag :struct))))5645 (x862-vref seg vreg xfer :struct struct offset (unless *x862-reckless* (nx-lookup-target-uvector-subtag :struct)))) 5737 5646 5738 5647 (defx862 x862-struct-set struct-set (seg vreg xfer struct offset value) … … 6610 6519 (defx862 x862-%aref1 %aref1 (seg vreg xfer v i) 6611 6520 (let* ((vtype (acode-form-type v t)) 6612 (atype (if vtype (specifier-type vtype))) 6521 (ctype (if vtype (specifier-type vtype))) 6522 (atype (if (array-ctype-p ctype) ctype)) 6613 6523 (keyword (if (and atype 6524 (= 1 (length (array-ctype-dimensions atype))) 6614 6525 (not (array-ctype-complexp atype))) 6615 6526 (funcall … … 6618 6529 atype)))) 6619 6530 (if keyword 6620 (x862-vref seg vreg xfer keyword v i (not *x862-reckless*)) 6531 (x862-vref seg vreg xfer keyword v i (unless *x862-reckless* 6532 (nx-lookup-target-uvector-subtag keyword))) 6621 6533 (x862-binary-builtin seg vreg xfer '%aref1 v i)))) 6622 6534 … … 7591 7503 (x862-use-operator op seg vreg xfer n0 n1 *nx-t*))) 7592 7504 7593 (defx862 x862-%aref2 aref2 (seg vreg xfer typename arr i j &optional dim0 dim1)7505 (defx862 x862-%aref2 simple-typed-aref2 (seg vreg xfer typename arr i j &optional dim0 dim1) 7594 7506 (if (null vreg) 7595 7507 (progn … … 7602 7514 (dim0 (acode-fixnum-form-p dim0)) 7603 7515 (dim1 (acode-fixnum-form-p dim1))) 7604 (case type-keyword 7605 (:double-float-vector 7606 (if (= (hard-regspec-class vreg) hard-reg-class-fpr) 7607 (x862-aref2 seg vreg xfer arr i j safe type-keyword dim0 dim1) 7608 (with-fp-target () (target :double-float) 7609 (x862-aref2 seg target nil arr i j safe type-keyword dim0 dim1) 7610 (<- target) 7611 (^)))) 7612 (:single-float-vector 7613 (if (= (hard-regspec-class vreg) hard-reg-class-fpr) 7614 (x862-aref2 seg vreg xfer arr i j safe fixtype dim0 dim1) 7615 (with-fp-target () (target :single-float) 7616 (x862-aref2 seg target nil arr i j safe type-keyword dim0 dim1) 7617 (<- target) 7618 (^)))) 7619 (t (error "Bug: shouldn't have tried to open-code %AREF2 call."))))) 7516 (x862-aref2 seg vreg xfer arr i j safe type-keyword dim0 dim1))) 7517 7518 (defx862 x862-generic-aref2 general-aref2 (seg vreg xfer arr i j) 7519 (let* ((atype0 (acode-form-type arr t)) 7520 (ctype (if atype0 (specifier-type atype0))) 7521 (atype (if (array-ctype-p ctype) ctype)) 7522 (keyword (and atype 7523 (= 2 (length (array-ctype-dimensions atype))) 7524 (not (array-ctype-complexp atype)) 7525 (funcall 7526 (arch::target-array-type-name-from-ctype-function 7527 (backend-target-arch *target-backend*)) 7528 atype)))) 7529 (cond (keyword 7530 (let* ((dims (array-ctype-dimensions atype)) 7531 (dim0 (car dims)) 7532 (dim1 (cadr dims))) 7533 (x862-aref2 seg 7534 vreg 7535 xfer 7536 arr 7537 i 7538 j 7539 (if *x862-reckless* 7540 *nx-nil* 7541 (nx-lookup-target-uvector-subtag keyword )) 7542 keyword ;(make-acode (%nx1-operator immediate) ) 7543 (if (typep dim0 'fixnum) dim0) (if (typep dim1 'fixnum) dim1)))) 7544 (t 7545 (x862-three-targeted-reg-forms seg 7546 arr ($ x8664::arg_x) 7547 i ($ x8664::arg_y) 7548 j ($ x8664::arg_z)) 7549 (x862-fixed-call-builtin seg vreg xfer nil (subprim-name->offset '.SParef2)))))) 7550 7620 7551 7621 7552 (defx862 x862-%aset2 aset2 (seg vreg xfer typename arr i j new &optional dim0 dim1)
Note:
See TracChangeset
for help on using the changeset viewer.
