Changeset 103255 in webkit for trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
- Timestamp:
- Dec 19, 2011, 12:22:31 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r103250 r103255 1554 1554 } 1555 1555 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 } 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))); 1567 1563 GPRTemporary value; 1568 1564 GPRReg valueGPR; … … 1611 1607 valueGPR = gpr; 1612 1608 } 1613 StorageOperand storage(this, storageIndex); 1614 SpeculateIntegerOperand property(this, propertyIndex); 1609 ASSERT_UNUSED(valueGPR, valueGPR != property); 1610 ASSERT(valueGPR != base); 1611 GPRTemporary storage(this); 1615 1612 GPRReg storageReg = storage.gpr(); 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())); 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())); 1618 1617 outOfBounds.link(&m_jit); 1619 1618 noResult(m_compileIndex); … … 1712 1711 } 1713 1712 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 } 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))); 1738 1720 GPRTemporary value; 1739 1721 GPRReg valueGPR; … … 1777 1759 valueGPR = gpr; 1778 1760 } 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)); 1779 1770 1780 1771 switch (elementSize) { 1781 1772 case 1: 1782 m_jit.store8(value.gpr(), MacroAssembler::BaseIndex(storageReg, property Reg, MacroAssembler::TimesOne));1773 m_jit.store8(value.gpr(), MacroAssembler::BaseIndex(storageReg, property, MacroAssembler::TimesOne)); 1783 1774 break; 1784 1775 case 2: 1785 m_jit.store16(value.gpr(), MacroAssembler::BaseIndex(storageReg, property Reg, MacroAssembler::TimesTwo));1776 m_jit.store16(value.gpr(), MacroAssembler::BaseIndex(storageReg, property, MacroAssembler::TimesTwo)); 1786 1777 break; 1787 1778 case 4: 1788 m_jit.store32(value.gpr(), MacroAssembler::BaseIndex(storageReg, property Reg, MacroAssembler::TimesFour));1779 m_jit.store32(value.gpr(), MacroAssembler::BaseIndex(storageReg, property, MacroAssembler::TimesFour)); 1789 1780 break; 1790 1781 default: … … 1841 1832 } 1842 1833 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]; 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(); 1849 1838 1850 1839 SpeculateDoubleOperand valueOp(this, valueIndex); 1851 SpeculateStrictInt32Operand property(this, propertyIndex); 1852 StorageOperand storage(this, storageIndex); 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); 1853 1847 GPRReg storageReg = storage.gpr(); 1854 GPRReg propertyReg = property.gpr();1855 1848 1849 m_jit.loadPtr(MacroAssembler::Address(base, descriptor.m_storageOffset), storageReg); 1856 1850 MacroAssembler::Jump outOfBounds; 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 1851 if (speculationRequirements != NoTypedArraySpecCheck) 1852 outOfBounds = m_jit.branch32(MacroAssembler::AboveOrEqual, property, MacroAssembler::Address(base, descriptor.m_lengthOffset)); 1866 1853 1867 1854 switch (elementSize) { … … 1870 1857 m_jit.moveDouble(valueOp.fpr(), scratch.fpr()); 1871 1858 m_jit.convertDoubleToFloat(valueOp.fpr(), scratch.fpr()); 1872 m_jit.storeFloat(scratch.fpr(), MacroAssembler::BaseIndex(storageReg, property Reg, MacroAssembler::TimesFour));1859 m_jit.storeFloat(scratch.fpr(), MacroAssembler::BaseIndex(storageReg, property, MacroAssembler::TimesFour)); 1873 1860 break; 1874 1861 } 1875 1862 case 8: 1876 m_jit.storeDouble(valueOp.fpr(), MacroAssembler::BaseIndex(storageReg, property Reg, MacroAssembler::TimesEight));1863 m_jit.storeDouble(valueOp.fpr(), MacroAssembler::BaseIndex(storageReg, property, MacroAssembler::TimesEight)); 1877 1864 break; 1878 1865 default:
Note:
See TracChangeset
for help on using the changeset viewer.