Changeset 103250 in webkit for trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
- Timestamp:
- Dec 19, 2011, 11:36:37 AM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r103218 r103250 1554 1554 } 1555 1555 1556 void SpeculativeJIT::compilePutByValForByteArray(GPRReg base, GPRReg property, Node& node) 1557 { 1558 NodeIndex baseIndex = node.child1(); 1559 NodeIndex valueIndex = node.child3(); 1560 1561 if (!isByteArrayPrediction(m_state.forNode(baseIndex).m_type)) 1562 speculationCheck(BadType, JSValueSource::unboxedCell(base), baseIndex, m_jit.branchPtr(MacroAssembler::NotEqual, MacroAssembler::Address(base, JSCell::classInfoOffset()), MacroAssembler::TrustedImmPtr(&JSByteArray::s_info))); 1556 void SpeculativeJIT::compilePutByValForByteArray(Node& node) 1557 { 1558 NodeIndex baseIndex = m_jit.graph().m_varArgChildren[node.firstChild()]; 1559 NodeIndex propertyIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 1]; 1560 NodeIndex valueIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 2]; 1561 NodeIndex storageIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 3]; 1562 1563 if (!isByteArrayPrediction(m_state.forNode(baseIndex).m_type)) { 1564 SpeculateCellOperand base(this, baseIndex); 1565 speculationCheck(BadType, JSValueSource::unboxedCell(base.gpr()), baseIndex, m_jit.branchPtr(MacroAssembler::NotEqual, MacroAssembler::Address(base.gpr(), JSCell::classInfoOffset()), MacroAssembler::TrustedImmPtr(&JSByteArray::s_info))); 1566 } 1563 1567 GPRTemporary value; 1564 1568 GPRReg valueGPR; … … 1607 1611 valueGPR = gpr; 1608 1612 } 1609 ASSERT_UNUSED(valueGPR, valueGPR != property); 1610 ASSERT(valueGPR != base); 1611 GPRTemporary storage(this); 1613 StorageOperand storage(this, storageIndex); 1614 SpeculateIntegerOperand property(this, propertyIndex); 1612 1615 GPRReg storageReg = storage.gpr(); 1613 ASSERT(valueGPR != storageReg); 1614 m_jit.loadPtr(MacroAssembler::Address(base, JSByteArray::offsetOfStorage()), storageReg); 1615 MacroAssembler::Jump outOfBounds = m_jit.branch32(MacroAssembler::AboveOrEqual, property, MacroAssembler::Address(storageReg, ByteArray::offsetOfSize())); 1616 m_jit.store8(value.gpr(), MacroAssembler::BaseIndex(storageReg, property, MacroAssembler::TimesOne, ByteArray::offsetOfData())); 1616 MacroAssembler::Jump outOfBounds = m_jit.branch32(MacroAssembler::AboveOrEqual, property.gpr(), MacroAssembler::Address(storageReg, ByteArray::offsetOfSize())); 1617 m_jit.store8(value.gpr(), MacroAssembler::BaseIndex(storageReg, property.gpr(), MacroAssembler::TimesOne, ByteArray::offsetOfData())); 1617 1618 outOfBounds.link(&m_jit); 1618 1619 noResult(m_compileIndex); … … 1711 1712 } 1712 1713 1713 void SpeculativeJIT::compilePutByValForIntTypedArray(const TypedArrayDescriptor& descriptor, GPRReg base, GPRReg property, Node& node, size_t elementSize, TypedArraySpeculationRequirements speculationRequirements, TypedArraySignedness signedness) 1714 { 1715 NodeIndex baseIndex = node.child1(); 1716 NodeIndex valueIndex = node.child3(); 1717 1718 if (speculationRequirements != NoTypedArrayTypeSpecCheck) 1719 speculationCheck(BadType, JSValueSource::unboxedCell(base), baseIndex, m_jit.branchPtr(MacroAssembler::NotEqual, MacroAssembler::Address(base, JSCell::classInfoOffset()), MacroAssembler::TrustedImmPtr(descriptor.m_classInfo))); 1714 void SpeculativeJIT::compilePutByValForIntTypedArray(const TypedArrayDescriptor& descriptor, Node& node, size_t elementSize, TypedArraySpeculationRequirements speculationRequirements, TypedArraySignedness signedness) 1715 { 1716 NodeIndex baseIndex = m_jit.graph().m_varArgChildren[node.firstChild()]; 1717 NodeIndex propertyIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 1]; 1718 NodeIndex valueIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 2]; 1719 NodeIndex storageIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 3]; 1720 1721 if (speculationRequirements != NoTypedArrayTypeSpecCheck) { 1722 SpeculateCellOperand base(this, baseIndex); 1723 speculationCheck(BadType, JSValueSource::unboxedCell(base.gpr()), baseIndex, m_jit.branchPtr(MacroAssembler::NotEqual, MacroAssembler::Address(base.gpr()), MacroAssembler::TrustedImmPtr(descriptor.m_classInfo))); 1724 } 1725 1726 StorageOperand storage(this, storageIndex); 1727 GPRReg storageReg = storage.gpr(); 1728 SpeculateIntegerOperand property(this, propertyIndex); 1729 GPRReg propertyReg = property.gpr(); 1730 MacroAssembler::Jump outOfBounds; 1731 if (speculationRequirements != NoTypedArrayTypeSpecCheck || speculationRequirements != NoTypedArraySpecCheck) { 1732 SpeculateCellOperand base(this, baseIndex); 1733 if (speculationRequirements != NoTypedArrayTypeSpecCheck) 1734 speculationCheck(BadType, JSValueSource::unboxedCell(base.gpr()), baseIndex, m_jit.branchPtr(MacroAssembler::NotEqual, MacroAssembler::Address(base.gpr(), JSCell::classInfoOffset()), MacroAssembler::TrustedImmPtr(descriptor.m_classInfo))); 1735 if (speculationRequirements != NoTypedArraySpecCheck) 1736 outOfBounds = m_jit.branch32(MacroAssembler::AboveOrEqual, propertyReg, MacroAssembler::Address(base.gpr(), descriptor.m_lengthOffset)); 1737 } 1720 1738 GPRTemporary value; 1721 1739 GPRReg valueGPR; … … 1759 1777 valueGPR = gpr; 1760 1778 } 1761 ASSERT_UNUSED(valueGPR, valueGPR != property);1762 ASSERT(valueGPR != base);1763 GPRTemporary storage(this);1764 GPRReg storageReg = storage.gpr();1765 ASSERT(valueGPR != storageReg);1766 m_jit.loadPtr(MacroAssembler::Address(base, descriptor.m_storageOffset), storageReg);1767 MacroAssembler::Jump outOfBounds;1768 if (speculationRequirements != NoTypedArraySpecCheck)1769 outOfBounds = m_jit.branch32(MacroAssembler::AboveOrEqual, property, MacroAssembler::Address(base, descriptor.m_lengthOffset));1770 1779 1771 1780 switch (elementSize) { 1772 1781 case 1: 1773 m_jit.store8(value.gpr(), MacroAssembler::BaseIndex(storageReg, property , MacroAssembler::TimesOne));1782 m_jit.store8(value.gpr(), MacroAssembler::BaseIndex(storageReg, propertyReg, MacroAssembler::TimesOne)); 1774 1783 break; 1775 1784 case 2: 1776 m_jit.store16(value.gpr(), MacroAssembler::BaseIndex(storageReg, property , MacroAssembler::TimesTwo));1785 m_jit.store16(value.gpr(), MacroAssembler::BaseIndex(storageReg, propertyReg, MacroAssembler::TimesTwo)); 1777 1786 break; 1778 1787 case 4: 1779 m_jit.store32(value.gpr(), MacroAssembler::BaseIndex(storageReg, property , MacroAssembler::TimesFour));1788 m_jit.store32(value.gpr(), MacroAssembler::BaseIndex(storageReg, propertyReg, MacroAssembler::TimesFour)); 1780 1789 break; 1781 1790 default: … … 1832 1841 } 1833 1842 1834 void SpeculativeJIT::compilePutByValForFloatTypedArray(const TypedArrayDescriptor& descriptor, GPRReg base, GPRReg property, Node& node, size_t elementSize, TypedArraySpeculationRequirements speculationRequirements) 1835 { 1836 NodeIndex baseIndex = node.child1(); 1837 NodeIndex valueIndex = node.child3(); 1843 void SpeculativeJIT::compilePutByValForFloatTypedArray(const TypedArrayDescriptor& descriptor, Node& node, size_t elementSize, TypedArraySpeculationRequirements speculationRequirements) 1844 { 1845 NodeIndex baseIndex = m_jit.graph().m_varArgChildren[node.firstChild()]; 1846 NodeIndex propertyIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 1]; 1847 NodeIndex valueIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 2]; 1848 NodeIndex storageIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 3]; 1838 1849 1839 1850 SpeculateDoubleOperand valueOp(this, valueIndex); 1840 1841 if (speculationRequirements != NoTypedArrayTypeSpecCheck) 1842 speculationCheck(BadType, JSValueSource::unboxedCell(base), baseIndex, m_jit.branchPtr(MacroAssembler::NotEqual, MacroAssembler::Address(base, JSCell::classInfoOffset()), MacroAssembler::TrustedImmPtr(descriptor.m_classInfo))); 1843 1844 GPRTemporary result(this); 1845 1846 GPRTemporary storage(this); 1851 SpeculateStrictInt32Operand property(this, propertyIndex); 1852 StorageOperand storage(this, storageIndex); 1847 1853 GPRReg storageReg = storage.gpr(); 1848 1849 m_jit.loadPtr(MacroAssembler::Address(base, descriptor.m_storageOffset), storageReg);1854 GPRReg propertyReg = property.gpr(); 1855 1850 1856 MacroAssembler::Jump outOfBounds; 1851 if (speculationRequirements != NoTypedArraySpecCheck) 1852 outOfBounds = m_jit.branch32(MacroAssembler::AboveOrEqual, property, MacroAssembler::Address(base, descriptor.m_lengthOffset)); 1857 if (speculationRequirements != NoTypedArrayTypeSpecCheck || speculationRequirements != NoTypedArraySpecCheck) { 1858 SpeculateCellOperand base(this, baseIndex); 1859 if (speculationRequirements != NoTypedArrayTypeSpecCheck) 1860 speculationCheck(BadType, JSValueSource::unboxedCell(base.gpr()), baseIndex, m_jit.branchPtr(MacroAssembler::NotEqual, MacroAssembler::Address(base.gpr(), JSCell::classInfoOffset()), MacroAssembler::TrustedImmPtr(descriptor.m_classInfo))); 1861 if (speculationRequirements != NoTypedArraySpecCheck) 1862 outOfBounds = m_jit.branch32(MacroAssembler::AboveOrEqual, propertyReg, MacroAssembler::Address(base.gpr(), descriptor.m_lengthOffset)); 1863 } 1864 1865 1853 1866 1854 1867 switch (elementSize) { … … 1857 1870 m_jit.moveDouble(valueOp.fpr(), scratch.fpr()); 1858 1871 m_jit.convertDoubleToFloat(valueOp.fpr(), scratch.fpr()); 1859 m_jit.storeFloat(scratch.fpr(), MacroAssembler::BaseIndex(storageReg, property , MacroAssembler::TimesFour));1872 m_jit.storeFloat(scratch.fpr(), MacroAssembler::BaseIndex(storageReg, propertyReg, MacroAssembler::TimesFour)); 1860 1873 break; 1861 1874 } 1862 1875 case 8: 1863 m_jit.storeDouble(valueOp.fpr(), MacroAssembler::BaseIndex(storageReg, property , MacroAssembler::TimesEight));1876 m_jit.storeDouble(valueOp.fpr(), MacroAssembler::BaseIndex(storageReg, propertyReg, MacroAssembler::TimesEight)); 1864 1877 break; 1865 1878 default:
Note:
See TracChangeset
for help on using the changeset viewer.