Changeset 103138 in webkit for trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
- Timestamp:
- Dec 16, 2011, 6:40:35 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r103120 r103138 1546 1546 } 1547 1547 1548 void SpeculativeJIT::compilePutByValForByteArray(Node& node) 1549 { 1550 NodeIndex baseIndex = m_jit.graph().m_varArgChildren[node.firstChild()]; 1551 NodeIndex propertyIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 1]; 1552 NodeIndex valueIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 2]; 1553 NodeIndex storageIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 3]; 1554 1555 if (!isByteArrayPrediction(m_state.forNode(baseIndex).m_type)) { 1556 SpeculateCellOperand base(this, baseIndex); 1557 speculationCheck(BadType, JSValueSource::unboxedCell(base.gpr()), baseIndex, m_jit.branchPtr(MacroAssembler::NotEqual, MacroAssembler::Address(base.gpr(), JSCell::classInfoOffset()), MacroAssembler::TrustedImmPtr(&JSByteArray::s_info))); 1558 } 1548 void SpeculativeJIT::compilePutByValForByteArray(GPRReg base, GPRReg property, Node& node) 1549 { 1550 NodeIndex baseIndex = node.child1(); 1551 NodeIndex valueIndex = node.child3(); 1552 1553 if (!isByteArrayPrediction(m_state.forNode(baseIndex).m_type)) 1554 speculationCheck(BadType, JSValueSource::unboxedCell(base), baseIndex, m_jit.branchPtr(MacroAssembler::NotEqual, MacroAssembler::Address(base, JSCell::classInfoOffset()), MacroAssembler::TrustedImmPtr(&JSByteArray::s_info))); 1559 1555 GPRTemporary value; 1560 1556 GPRReg valueGPR; … … 1603 1599 valueGPR = gpr; 1604 1600 } 1605 StorageOperand storage(this, storageIndex); 1606 SpeculateIntegerOperand property(this, propertyIndex); 1601 ASSERT_UNUSED(valueGPR, valueGPR != property); 1602 ASSERT(valueGPR != base); 1603 GPRTemporary storage(this); 1607 1604 GPRReg storageReg = storage.gpr(); 1608 MacroAssembler::Jump outOfBounds = m_jit.branch32(MacroAssembler::AboveOrEqual, property.gpr(), MacroAssembler::Address(storageReg, ByteArray::offsetOfSize())); 1609 m_jit.store8(value.gpr(), MacroAssembler::BaseIndex(storageReg, property.gpr(), MacroAssembler::TimesOne, ByteArray::offsetOfData())); 1605 ASSERT(valueGPR != storageReg); 1606 m_jit.loadPtr(MacroAssembler::Address(base, JSByteArray::offsetOfStorage()), storageReg); 1607 MacroAssembler::Jump outOfBounds = m_jit.branch32(MacroAssembler::AboveOrEqual, property, MacroAssembler::Address(storageReg, ByteArray::offsetOfSize())); 1608 m_jit.store8(value.gpr(), MacroAssembler::BaseIndex(storageReg, property, MacroAssembler::TimesOne, ByteArray::offsetOfData())); 1610 1609 outOfBounds.link(&m_jit); 1611 1610 noResult(m_compileIndex); … … 1704 1703 } 1705 1704 1706 void SpeculativeJIT::compilePutByValForIntTypedArray(const TypedArrayDescriptor& descriptor, Node& node, size_t elementSize, TypedArraySpeculationRequirements speculationRequirements, TypedArraySignedness signedness) 1707 { 1708 NodeIndex baseIndex = m_jit.graph().m_varArgChildren[node.firstChild()]; 1709 NodeIndex propertyIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 1]; 1710 NodeIndex valueIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 2]; 1711 NodeIndex storageIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 3]; 1712 1713 if (speculationRequirements != NoTypedArrayTypeSpecCheck) { 1714 SpeculateCellOperand base(this, baseIndex); 1715 speculationCheck(BadType, JSValueSource::unboxedCell(base.gpr()), baseIndex, m_jit.branchPtr(MacroAssembler::NotEqual, MacroAssembler::Address(base.gpr()), MacroAssembler::TrustedImmPtr(descriptor.m_classInfo))); 1716 } 1717 1718 StorageOperand storage(this, storageIndex); 1719 GPRReg storageReg = storage.gpr(); 1720 SpeculateIntegerOperand property(this, propertyIndex); 1721 GPRReg propertyReg = property.gpr(); 1722 MacroAssembler::Jump outOfBounds; 1723 if (speculationRequirements != NoTypedArrayTypeSpecCheck || speculationRequirements != NoTypedArraySpecCheck) { 1724 SpeculateCellOperand base(this, baseIndex); 1725 if (speculationRequirements != NoTypedArrayTypeSpecCheck) 1726 speculationCheck(BadType, JSValueSource::unboxedCell(base.gpr()), baseIndex, m_jit.branchPtr(MacroAssembler::NotEqual, MacroAssembler::Address(base.gpr(), JSCell::classInfoOffset()), MacroAssembler::TrustedImmPtr(descriptor.m_classInfo))); 1727 if (speculationRequirements != NoTypedArraySpecCheck) 1728 outOfBounds = m_jit.branch32(MacroAssembler::AboveOrEqual, propertyReg, MacroAssembler::Address(base.gpr(), descriptor.m_lengthOffset)); 1729 } 1705 void SpeculativeJIT::compilePutByValForIntTypedArray(const TypedArrayDescriptor& descriptor, GPRReg base, GPRReg property, Node& node, size_t elementSize, TypedArraySpeculationRequirements speculationRequirements, TypedArraySignedness signedness) 1706 { 1707 NodeIndex baseIndex = node.child1(); 1708 NodeIndex valueIndex = node.child3(); 1709 1710 if (speculationRequirements != NoTypedArrayTypeSpecCheck) 1711 speculationCheck(BadType, JSValueSource::unboxedCell(base), baseIndex, m_jit.branchPtr(MacroAssembler::NotEqual, MacroAssembler::Address(base, JSCell::classInfoOffset()), MacroAssembler::TrustedImmPtr(descriptor.m_classInfo))); 1730 1712 GPRTemporary value; 1731 1713 GPRReg valueGPR; … … 1769 1751 valueGPR = gpr; 1770 1752 } 1753 ASSERT_UNUSED(valueGPR, valueGPR != property); 1754 ASSERT(valueGPR != base); 1755 GPRTemporary storage(this); 1756 GPRReg storageReg = storage.gpr(); 1757 ASSERT(valueGPR != storageReg); 1758 m_jit.loadPtr(MacroAssembler::Address(base, descriptor.m_storageOffset), storageReg); 1759 MacroAssembler::Jump outOfBounds; 1760 if (speculationRequirements != NoTypedArraySpecCheck) 1761 outOfBounds = m_jit.branch32(MacroAssembler::AboveOrEqual, property, MacroAssembler::Address(base, descriptor.m_lengthOffset)); 1771 1762 1772 1763 switch (elementSize) { 1773 1764 case 1: 1774 m_jit.store8(value.gpr(), MacroAssembler::BaseIndex(storageReg, property Reg, MacroAssembler::TimesOne));1765 m_jit.store8(value.gpr(), MacroAssembler::BaseIndex(storageReg, property, MacroAssembler::TimesOne)); 1775 1766 break; 1776 1767 case 2: 1777 m_jit.store16(value.gpr(), MacroAssembler::BaseIndex(storageReg, property Reg, MacroAssembler::TimesTwo));1768 m_jit.store16(value.gpr(), MacroAssembler::BaseIndex(storageReg, property, MacroAssembler::TimesTwo)); 1778 1769 break; 1779 1770 case 4: 1780 m_jit.store32(value.gpr(), MacroAssembler::BaseIndex(storageReg, property Reg, MacroAssembler::TimesFour));1771 m_jit.store32(value.gpr(), MacroAssembler::BaseIndex(storageReg, property, MacroAssembler::TimesFour)); 1781 1772 break; 1782 1773 default: … … 1833 1824 } 1834 1825 1835 void SpeculativeJIT::compilePutByValForFloatTypedArray(const TypedArrayDescriptor& descriptor, Node& node, size_t elementSize, TypedArraySpeculationRequirements speculationRequirements) 1836 { 1837 NodeIndex baseIndex = m_jit.graph().m_varArgChildren[node.firstChild()]; 1838 NodeIndex propertyIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 1]; 1839 NodeIndex valueIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 2]; 1840 NodeIndex storageIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 3]; 1826 void SpeculativeJIT::compilePutByValForFloatTypedArray(const TypedArrayDescriptor& descriptor, GPRReg base, GPRReg property, Node& node, size_t elementSize, TypedArraySpeculationRequirements speculationRequirements) 1827 { 1828 NodeIndex baseIndex = node.child1(); 1829 NodeIndex valueIndex = node.child3(); 1841 1830 1842 1831 SpeculateDoubleOperand valueOp(this, valueIndex); 1843 SpeculateStrictInt32Operand property(this, propertyIndex); 1844 StorageOperand storage(this, storageIndex); 1832 1833 if (speculationRequirements != NoTypedArrayTypeSpecCheck) 1834 speculationCheck(BadType, JSValueSource::unboxedCell(base), baseIndex, m_jit.branchPtr(MacroAssembler::NotEqual, MacroAssembler::Address(base, JSCell::classInfoOffset()), MacroAssembler::TrustedImmPtr(descriptor.m_classInfo))); 1835 1836 GPRTemporary result(this); 1837 1838 GPRTemporary storage(this); 1845 1839 GPRReg storageReg = storage.gpr(); 1846 GPRReg propertyReg = property.gpr();1847 1840 1841 m_jit.loadPtr(MacroAssembler::Address(base, descriptor.m_storageOffset), storageReg); 1848 1842 MacroAssembler::Jump outOfBounds; 1849 if (speculationRequirements != NoTypedArrayTypeSpecCheck || speculationRequirements != NoTypedArraySpecCheck) { 1850 SpeculateCellOperand base(this, baseIndex); 1851 if (speculationRequirements != NoTypedArrayTypeSpecCheck) 1852 speculationCheck(BadType, JSValueSource::unboxedCell(base.gpr()), baseIndex, m_jit.branchPtr(MacroAssembler::NotEqual, MacroAssembler::Address(base.gpr(), JSCell::classInfoOffset()), MacroAssembler::TrustedImmPtr(descriptor.m_classInfo))); 1853 if (speculationRequirements != NoTypedArraySpecCheck) 1854 outOfBounds = m_jit.branch32(MacroAssembler::AboveOrEqual, propertyReg, MacroAssembler::Address(base.gpr(), descriptor.m_lengthOffset)); 1855 } 1856 1857 1843 if (speculationRequirements != NoTypedArraySpecCheck) 1844 outOfBounds = m_jit.branch32(MacroAssembler::AboveOrEqual, property, MacroAssembler::Address(base, descriptor.m_lengthOffset)); 1858 1845 1859 1846 switch (elementSize) { … … 1862 1849 m_jit.moveDouble(valueOp.fpr(), scratch.fpr()); 1863 1850 m_jit.convertDoubleToFloat(valueOp.fpr(), scratch.fpr()); 1864 m_jit.storeFloat(scratch.fpr(), MacroAssembler::BaseIndex(storageReg, property Reg, MacroAssembler::TimesFour));1851 m_jit.storeFloat(scratch.fpr(), MacroAssembler::BaseIndex(storageReg, property, MacroAssembler::TimesFour)); 1865 1852 break; 1866 1853 } 1867 1854 case 8: 1868 m_jit.storeDouble(valueOp.fpr(), MacroAssembler::BaseIndex(storageReg, property Reg, MacroAssembler::TimesEight));1855 m_jit.storeDouble(valueOp.fpr(), MacroAssembler::BaseIndex(storageReg, property, MacroAssembler::TimesEight)); 1869 1856 break; 1870 1857 default:
Note:
See TracChangeset
for help on using the changeset viewer.