Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(278)

Side by Side Diff: src/objects-inl.h

Issue 1302513004: [simd.js] Macro-ize more SIMD code (2). (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: 2 more #undefs Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/objects-printer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 // Review notes: 5 // Review notes:
6 // 6 //
7 // - The use of macros in these inline functions may seem superfluous 7 // - The use of macros in these inline functions may seem superfluous
8 // but it is absolutely needed to make sure gcc generates optimal 8 // but it is absolutely needed to make sure gcc generates optimal
9 // code. gcc is not happy when attempting to inline too deep. 9 // code. gcc is not happy when attempting to inline too deep.
10 // 10 //
(...skipping 1240 matching lines...) Expand 10 before | Expand all | Expand 10 after
1251 1251
1252 #define WRITE_INT_FIELD(p, offset, value) \ 1252 #define WRITE_INT_FIELD(p, offset, value) \
1253 (*reinterpret_cast<int*>(FIELD_ADDR(p, offset)) = value) 1253 (*reinterpret_cast<int*>(FIELD_ADDR(p, offset)) = value)
1254 1254
1255 #define READ_INTPTR_FIELD(p, offset) \ 1255 #define READ_INTPTR_FIELD(p, offset) \
1256 (*reinterpret_cast<const intptr_t*>(FIELD_ADDR_CONST(p, offset))) 1256 (*reinterpret_cast<const intptr_t*>(FIELD_ADDR_CONST(p, offset)))
1257 1257
1258 #define WRITE_INTPTR_FIELD(p, offset, value) \ 1258 #define WRITE_INTPTR_FIELD(p, offset, value) \
1259 (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)) = value) 1259 (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)) = value)
1260 1260
1261 #define READ_UINT8_FIELD(p, offset) \
1262 (*reinterpret_cast<const uint8_t*>(FIELD_ADDR_CONST(p, offset)))
1263
1264 #define WRITE_UINT8_FIELD(p, offset, value) \
1265 (*reinterpret_cast<uint8_t*>(FIELD_ADDR(p, offset)) = value)
1266
1267 #define READ_INT8_FIELD(p, offset) \
1268 (*reinterpret_cast<const int8_t*>(FIELD_ADDR_CONST(p, offset)))
1269
1270 #define WRITE_INT8_FIELD(p, offset, value) \
1271 (*reinterpret_cast<int8_t*>(FIELD_ADDR(p, offset)) = value)
1272
1261 #define READ_UINT16_FIELD(p, offset) \ 1273 #define READ_UINT16_FIELD(p, offset) \
1262 (*reinterpret_cast<const uint16_t*>(FIELD_ADDR_CONST(p, offset))) 1274 (*reinterpret_cast<const uint16_t*>(FIELD_ADDR_CONST(p, offset)))
1263 1275
1264 #define WRITE_UINT16_FIELD(p, offset, value) \ 1276 #define WRITE_UINT16_FIELD(p, offset, value) \
1265 (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset)) = value) 1277 (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset)) = value)
1266 1278
1267 #define READ_INT16_FIELD(p, offset) \ 1279 #define READ_INT16_FIELD(p, offset) \
1268 (*reinterpret_cast<const int16_t*>(FIELD_ADDR_CONST(p, offset))) 1280 (*reinterpret_cast<const int16_t*>(FIELD_ADDR_CONST(p, offset)))
1269 1281
1270 #define WRITE_INT16_FIELD(p, offset, value) \ 1282 #define WRITE_INT16_FIELD(p, offset, value) \
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
1537 bool Type::Equals(Type* that) { \ 1549 bool Type::Equals(Type* that) { \
1538 for (int lane = 0; lane < lane_count; ++lane) { \ 1550 for (int lane = 0; lane < lane_count; ++lane) { \
1539 if (this->get_lane(lane) != that->get_lane(lane)) return false; \ 1551 if (this->get_lane(lane) != that->get_lane(lane)) return false; \
1540 } \ 1552 } \
1541 return true; \ 1553 return true; \
1542 } 1554 }
1543 SIMD128_TYPES(SIMD128_VALUE_EQUALS) 1555 SIMD128_TYPES(SIMD128_VALUE_EQUALS)
1544 #undef SIMD128_VALUE_EQUALS 1556 #undef SIMD128_VALUE_EQUALS
1545 1557
1546 1558
1547 float Float32x4::get_lane(int lane) const {
1548 DCHECK(lane < 4 && lane >= 0);
1549 #if defined(V8_TARGET_LITTLE_ENDIAN) 1559 #if defined(V8_TARGET_LITTLE_ENDIAN)
1550 return READ_FLOAT_FIELD(this, kValueOffset + lane * kFloatSize); 1560 #define SIMD128_READ_LANE(lane_type, lane_count, field_type, field_size) \
1561 lane_type value = \
1562 READ_##field_type##_FIELD(this, kValueOffset + lane * field_size);
1551 #elif defined(V8_TARGET_BIG_ENDIAN) 1563 #elif defined(V8_TARGET_BIG_ENDIAN)
1552 return READ_FLOAT_FIELD(this, kValueOffset + (3 - lane) * kFloatSize); 1564 #define SIMD128_READ_LANE(lane_type, lane_count, field_type, field_size) \
1565 lane_type value = READ_##field_type##_FIELD( \
1566 this, kValueOffset + (lane_count - lane - 1) * field_size);
1553 #else 1567 #else
1554 #error Unknown byte ordering 1568 #error Unknown byte ordering
1555 #endif 1569 #endif
1556 }
1557 1570
1558
1559 void Float32x4::set_lane(int lane, float value) {
1560 DCHECK(lane < 4 && lane >= 0);
1561 #if defined(V8_TARGET_LITTLE_ENDIAN) 1571 #if defined(V8_TARGET_LITTLE_ENDIAN)
1562 WRITE_FLOAT_FIELD(this, kValueOffset + lane * kFloatSize, value); 1572 #define SIMD128_WRITE_LANE(lane_count, field_type, field_size, value) \
1573 WRITE_##field_type##_FIELD(this, kValueOffset + lane * field_size, value);
1563 #elif defined(V8_TARGET_BIG_ENDIAN) 1574 #elif defined(V8_TARGET_BIG_ENDIAN)
1564 WRITE_FLOAT_FIELD(this, kValueOffset + (3 - lane) * kFloatSize, value); 1575 #define SIMD128_WRITE_LANE(lane_count, field_type, field_size, value) \
1576 WRITE_##field_type##_FIELD( \
1577 this, kValueOffset + (lane_count - lane - 1) * field_size, value);
1565 #else 1578 #else
1566 #error Unknown byte ordering 1579 #error Unknown byte ordering
1567 #endif 1580 #endif
1568 } 1581
1582 #define SIMD128_NUMERIC_LANE_FNS(type, lane_type, lane_count, field_type, \
1583 field_size) \
1584 lane_type type::get_lane(int lane) const { \
1585 DCHECK(lane < lane_count && lane >= 0); \
1586 SIMD128_READ_LANE(lane_type, lane_count, field_type, field_size) \
1587 return value; \
1588 } \
1589 \
1590 void type::set_lane(int lane, lane_type value) { \
1591 DCHECK(lane < lane_count && lane >= 0); \
1592 SIMD128_WRITE_LANE(lane_count, field_type, field_size, value) \
1593 }
1594
1595 SIMD128_NUMERIC_LANE_FNS(Float32x4, float, 4, FLOAT, kFloatSize)
1596 SIMD128_NUMERIC_LANE_FNS(Int32x4, int32_t, 4, INT32, kInt32Size)
1597 SIMD128_NUMERIC_LANE_FNS(Int16x8, int16_t, 8, INT16, kShortSize)
1598 SIMD128_NUMERIC_LANE_FNS(Int8x16, int8_t, 16, INT8, kCharSize)
1599 #undef SIMD128_NUMERIC_LANE_FNS
1569 1600
1570 1601
1571 int32_t Int32x4::get_lane(int lane) const { 1602 #define SIMD128_BOOLEAN_LANE_FNS(type, lane_type, lane_count, field_type, \
1572 DCHECK(lane < 4 && lane >= 0); 1603 field_size) \
1573 #if defined(V8_TARGET_LITTLE_ENDIAN) 1604 bool type::get_lane(int lane) const { \
1574 return READ_INT32_FIELD(this, kValueOffset + lane * kInt32Size); 1605 DCHECK(lane < lane_count && lane >= 0); \
1575 #elif defined(V8_TARGET_BIG_ENDIAN) 1606 SIMD128_READ_LANE(lane_type, lane_count, field_type, field_size) \
1576 return READ_INT32_FIELD(this, kValueOffset + (3 - lane) * kInt32Size); 1607 DCHECK(value == 0 || value == -1); \
1577 #else 1608 return value != 0; \
1578 #error Unknown byte ordering 1609 } \
1579 #endif 1610 \
1580 } 1611 void type::set_lane(int lane, bool value) { \
1612 DCHECK(lane < lane_count && lane >= 0); \
1613 int32_t int_val = value ? -1 : 0; \
1614 SIMD128_WRITE_LANE(lane_count, field_type, field_size, int_val) \
1615 }
1581 1616
1617 SIMD128_BOOLEAN_LANE_FNS(Bool32x4, int32_t, 4, INT32, kInt32Size)
1618 SIMD128_BOOLEAN_LANE_FNS(Bool16x8, int16_t, 8, INT16, kShortSize)
1619 SIMD128_BOOLEAN_LANE_FNS(Bool8x16, int8_t, 16, INT8, kCharSize)
1620 #undef SIMD128_BOOLEAN_LANE_FNS
1582 1621
1583 void Int32x4::set_lane(int lane, int32_t value) { 1622 #undef SIMD128_READ_LANE
1584 DCHECK(lane < 4 && lane >= 0); 1623 #undef SIMD128_WRITE_LANE
1585 #if defined(V8_TARGET_LITTLE_ENDIAN)
1586 WRITE_INT32_FIELD(this, kValueOffset + lane * kInt32Size, value);
1587 #elif defined(V8_TARGET_BIG_ENDIAN)
1588 WRITE_INT32_FIELD(this, kValueOffset + (3 - lane) * kInt32Size, value);
1589 #else
1590 #error Unknown byte ordering
1591 #endif
1592 }
1593
1594
1595 bool Bool32x4::get_lane(int lane) const {
1596 DCHECK(lane < 4 && lane >= 0);
1597 int32_t value;
1598 #if defined(V8_TARGET_LITTLE_ENDIAN)
1599 value = READ_INT32_FIELD(this, kValueOffset + lane * kInt32Size);
1600 #elif defined(V8_TARGET_BIG_ENDIAN)
1601 value = READ_INT32_FIELD(this, kValueOffset + (3 - lane) * kInt32Size);
1602 #else
1603 #error Unknown byte ordering
1604 #endif
1605 DCHECK(value == 0 || value == -1);
1606 return value != 0;
1607 }
1608
1609
1610 void Bool32x4::set_lane(int lane, bool value) {
1611 DCHECK(lane < 4 && lane >= 0);
1612 int32_t int_val = value ? -1 : 0;
1613 #if defined(V8_TARGET_LITTLE_ENDIAN)
1614 WRITE_INT32_FIELD(this, kValueOffset + lane * kInt32Size, int_val);
1615 #elif defined(V8_TARGET_BIG_ENDIAN)
1616 WRITE_INT32_FIELD(this, kValueOffset + (3 - lane) * kInt32Size, int_val);
1617 #else
1618 #error Unknown byte ordering
1619 #endif
1620 }
1621
1622
1623 int16_t Int16x8::get_lane(int lane) const {
1624 DCHECK(lane < 8 && lane >= 0);
1625 #if defined(V8_TARGET_LITTLE_ENDIAN)
1626 return READ_INT16_FIELD(this, kValueOffset + lane * kShortSize);
1627 #elif defined(V8_TARGET_BIG_ENDIAN)
1628 return READ_INT16_FIELD(this, kValueOffset + (7 - lane) * kShortSize);
1629 #else
1630 #error Unknown byte ordering
1631 #endif
1632 }
1633
1634
1635 void Int16x8::set_lane(int lane, int16_t value) {
1636 DCHECK(lane < 8 && lane >= 0);
1637 #if defined(V8_TARGET_LITTLE_ENDIAN)
1638 WRITE_INT16_FIELD(this, kValueOffset + lane * kShortSize, value);
1639 #elif defined(V8_TARGET_BIG_ENDIAN)
1640 WRITE_INT16_FIELD(this, kValueOffset + (7 - lane) * kShortSize, value);
1641 #else
1642 #error Unknown byte ordering
1643 #endif
1644 }
1645
1646
1647 bool Bool16x8::get_lane(int lane) const {
1648 DCHECK(lane < 8 && lane >= 0);
1649 int16_t value;
1650 #if defined(V8_TARGET_LITTLE_ENDIAN)
1651 return READ_INT16_FIELD(this, kValueOffset + lane * kShortSize);
1652 #elif defined(V8_TARGET_BIG_ENDIAN)
1653 return READ_INT16_FIELD(this, kValueOffset + (7 - lane) * kShortSize);
1654 #else
1655 #error Unknown byte ordering
1656 #endif
1657 DCHECK(value == 0 || value == -1);
1658 return value != 0;
1659 }
1660
1661
1662 void Bool16x8::set_lane(int lane, bool value) {
1663 DCHECK(lane < 8 && lane >= 0);
1664 int16_t int_val = value ? -1 : 0;
1665 #if defined(V8_TARGET_LITTLE_ENDIAN)
1666 WRITE_INT16_FIELD(this, kValueOffset + lane * kShortSize, int_val);
1667 #elif defined(V8_TARGET_BIG_ENDIAN)
1668 WRITE_INT16_FIELD(this, kValueOffset + (7 - lane) * kShortSize, int_val);
1669 #else
1670 #error Unknown byte ordering
1671 #endif
1672 }
1673
1674
1675 int8_t Int8x16::get_lane(int lane) const {
1676 DCHECK(lane < 16 && lane >= 0);
1677 #if defined(V8_TARGET_LITTLE_ENDIAN)
1678 return READ_BYTE_FIELD(this, kValueOffset + lane * kCharSize);
1679 #elif defined(V8_TARGET_BIG_ENDIAN)
1680 return READ_BYTE_FIELD(this, kValueOffset + (15 - lane) * kCharSize);
1681 #else
1682 #error Unknown byte ordering
1683 #endif
1684 }
1685
1686
1687 void Int8x16::set_lane(int lane, int8_t value) {
1688 DCHECK(lane < 16 && lane >= 0);
1689 #if defined(V8_TARGET_LITTLE_ENDIAN)
1690 WRITE_BYTE_FIELD(this, kValueOffset + lane * kCharSize, value);
1691 #elif defined(V8_TARGET_BIG_ENDIAN)
1692 WRITE_BYTE_FIELD(this, kValueOffset + (15 - lane) * kCharSize, value);
1693 #else
1694 #error Unknown byte ordering
1695 #endif
1696 }
1697
1698
1699 bool Bool8x16::get_lane(int lane) const {
1700 DCHECK(lane < 16 && lane >= 0);
1701 int8_t value;
1702 #if defined(V8_TARGET_LITTLE_ENDIAN)
1703 value = READ_BYTE_FIELD(this, kValueOffset + lane * kCharSize);
1704 #elif defined(V8_TARGET_BIG_ENDIAN)
1705 value = READ_BYTE_FIELD(this, kValueOffset + (15 - lane) * kCharSize);
1706 #else
1707 #error Unknown byte ordering
1708 #endif
1709 DCHECK(value == 0 || value == -1);
1710 return value != 0;
1711 }
1712
1713
1714 void Bool8x16::set_lane(int lane, bool value) {
1715 DCHECK(lane < 16 && lane >= 0);
1716 int8_t int_val = value ? -1 : 0;
1717 #if defined(V8_TARGET_LITTLE_ENDIAN)
1718 WRITE_BYTE_FIELD(this, kValueOffset + lane * kCharSize, int_val);
1719 #elif defined(V8_TARGET_BIG_ENDIAN)
1720 WRITE_BYTE_FIELD(this, kValueOffset + (15 - lane) * kCharSize, int_val);
1721 #else
1722 #error Unknown byte ordering
1723 #endif
1724 }
1725 1624
1726 1625
1727 ACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset) 1626 ACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset)
1728 1627
1729 1628
1730 Object** FixedArray::GetFirstElementAddress() { 1629 Object** FixedArray::GetFirstElementAddress() {
1731 return reinterpret_cast<Object**>(FIELD_ADDR(this, OffsetOfElementAt(0))); 1630 return reinterpret_cast<Object**>(FIELD_ADDR(this, OffsetOfElementAt(0)));
1732 } 1631 }
1733 1632
1734 1633
(...skipping 6158 matching lines...) Expand 10 before | Expand all | Expand 10 after
7893 #undef WRITE_FIELD 7792 #undef WRITE_FIELD
7894 #undef NOBARRIER_WRITE_FIELD 7793 #undef NOBARRIER_WRITE_FIELD
7895 #undef WRITE_BARRIER 7794 #undef WRITE_BARRIER
7896 #undef CONDITIONAL_WRITE_BARRIER 7795 #undef CONDITIONAL_WRITE_BARRIER
7897 #undef READ_DOUBLE_FIELD 7796 #undef READ_DOUBLE_FIELD
7898 #undef WRITE_DOUBLE_FIELD 7797 #undef WRITE_DOUBLE_FIELD
7899 #undef READ_INT_FIELD 7798 #undef READ_INT_FIELD
7900 #undef WRITE_INT_FIELD 7799 #undef WRITE_INT_FIELD
7901 #undef READ_INTPTR_FIELD 7800 #undef READ_INTPTR_FIELD
7902 #undef WRITE_INTPTR_FIELD 7801 #undef WRITE_INTPTR_FIELD
7802 #undef READ_UINT8_FIELD
7803 #undef WRITE_UINT8_FIELD
7804 #undef READ_INT8_FIELD
7805 #undef WRITE_INT8_FIELD
7903 #undef READ_UINT16_FIELD 7806 #undef READ_UINT16_FIELD
7904 #undef WRITE_UINT16_FIELD 7807 #undef WRITE_UINT16_FIELD
7905 #undef READ_INT16_FIELD 7808 #undef READ_INT16_FIELD
7906 #undef WRITE_INT16_FIELD 7809 #undef WRITE_INT16_FIELD
7907 #undef READ_UINT32_FIELD 7810 #undef READ_UINT32_FIELD
7908 #undef WRITE_UINT32_FIELD 7811 #undef WRITE_UINT32_FIELD
7909 #undef READ_INT32_FIELD 7812 #undef READ_INT32_FIELD
7910 #undef WRITE_INT32_FIELD 7813 #undef WRITE_INT32_FIELD
7911 #undef READ_FLOAT_FIELD 7814 #undef READ_FLOAT_FIELD
7912 #undef WRITE_FLOAT_FIELD 7815 #undef WRITE_FLOAT_FIELD
7913 #undef READ_UINT64_FIELD 7816 #undef READ_UINT64_FIELD
7914 #undef WRITE_UINT64_FIELD 7817 #undef WRITE_UINT64_FIELD
7915 #undef READ_INT64_FIELD 7818 #undef READ_INT64_FIELD
7916 #undef WRITE_INT64_FIELD 7819 #undef WRITE_INT64_FIELD
7917 #undef READ_BYTE_FIELD 7820 #undef READ_BYTE_FIELD
7918 #undef WRITE_BYTE_FIELD 7821 #undef WRITE_BYTE_FIELD
7919 #undef NOBARRIER_READ_BYTE_FIELD 7822 #undef NOBARRIER_READ_BYTE_FIELD
7920 #undef NOBARRIER_WRITE_BYTE_FIELD 7823 #undef NOBARRIER_WRITE_BYTE_FIELD
7921 7824
7922 } } // namespace v8::internal 7825 } } // namespace v8::internal
7923 7826
7924 #endif // V8_OBJECTS_INL_H_ 7827 #endif // V8_OBJECTS_INL_H_
OLDNEW
« no previous file with comments | « no previous file | src/objects-printer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698