Changeset 253520 in webkit for trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
- Timestamp:
- Dec 13, 2019, 8:34:45 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r253263 r253520 55 55 #include "JSAsyncGeneratorFunction.h" 56 56 #include "JSCInlines.h" 57 #include "JSFixedArray.h"58 57 #include "JSGeneratorFunction.h" 59 58 #include "JSImmutableButterfly.h" … … 7903 7902 7904 7903 MacroAssembler::JumpList slowPath; 7904 MacroAssembler::JumpList done; 7905 7905 7906 7906 m_jit.load8(MacroAssembler::Address(argument, JSCell::indexingTypeAndMiscOffset()), scratch1GPR); 7907 m_jit.and32(TrustedImm32(IndexingModeMask), scratch1GPR); 7908 auto notShareCase = m_jit.branch32(CCallHelpers::NotEqual, scratch1GPR, TrustedImm32(CopyOnWriteArrayWithContiguous)); 7909 m_jit.loadPtr(MacroAssembler::Address(argument, JSObject::butterflyOffset()), resultGPR); 7910 m_jit.addPtr(TrustedImm32(-static_cast<ptrdiff_t>(JSImmutableButterfly::offsetOfData())), resultGPR); 7911 done.append(m_jit.jump()); 7912 7913 notShareCase.link(&m_jit); 7907 7914 m_jit.and32(TrustedImm32(IndexingShapeMask), scratch1GPR); 7908 7915 m_jit.sub32(TrustedImm32(Int32Shape), scratch1GPR); … … 7915 7922 m_jit.move(lengthGPR, scratch1GPR); 7916 7923 m_jit.lshift32(TrustedImm32(3), scratch1GPR); 7917 m_jit.add32(TrustedImm32(JSFixedArray::offsetOfData()), scratch1GPR); 7918 7919 m_jit.emitAllocateVariableSizedCell<JSFixedArray>(vm(), resultGPR, TrustedImmPtr(m_jit.graph().registerStructure(m_jit.graph().m_vm.fixedArrayStructure.get())), scratch1GPR, scratch1GPR, scratch2GPR, slowPath); 7920 m_jit.store32(lengthGPR, MacroAssembler::Address(resultGPR, JSFixedArray::offsetOfSize())); 7924 m_jit.add32(TrustedImm32(JSImmutableButterfly::offsetOfData()), scratch1GPR); 7925 7926 m_jit.emitAllocateVariableSizedCell<JSImmutableButterfly>(vm(), resultGPR, TrustedImmPtr(m_jit.graph().registerStructure(m_jit.graph().m_vm.immutableButterflyStructures[arrayIndexFromIndexingType(CopyOnWriteArrayWithContiguous) - NumberOfIndexingShapes].get())), scratch1GPR, scratch1GPR, scratch2GPR, slowPath); 7927 m_jit.store32(lengthGPR, MacroAssembler::Address(resultGPR, JSImmutableButterfly::offsetOfPublicLength())); 7928 m_jit.store32(lengthGPR, MacroAssembler::Address(resultGPR, JSImmutableButterfly::offsetOfVectorLength())); 7921 7929 7922 7930 m_jit.loadPtr(MacroAssembler::Address(argument, JSObject::butterflyOffset()), scratch1GPR); 7923 7924 MacroAssembler::JumpList done;7925 7931 7926 7932 m_jit.load8(MacroAssembler::Address(argument, JSCell::indexingTypeAndMiscOffset()), scratch2GPR); … … 7936 7942 m_jit.move(TrustedImm64(JSValue::encode(jsUndefined())), scratch2GPR); 7937 7943 notEmpty.link(&m_jit); 7938 m_jit.store64(scratch2GPR, MacroAssembler::BaseIndex(resultGPR, lengthGPR, MacroAssembler::TimesEight, JS FixedArray::offsetOfData()));7944 m_jit.store64(scratch2GPR, MacroAssembler::BaseIndex(resultGPR, lengthGPR, MacroAssembler::TimesEight, JSImmutableButterfly::offsetOfData())); 7939 7945 m_jit.branchTest32(MacroAssembler::NonZero, lengthGPR).linkTo(loopStart, &m_jit); 7940 7946 done.append(m_jit.jump()); … … 7953 7959 m_jit.boxDouble(doubleFPR, scratch2GPR); 7954 7960 doStore.link(&m_jit); 7955 m_jit.store64(scratch2GPR, MacroAssembler::BaseIndex(resultGPR, lengthGPR, MacroAssembler::TimesEight, JS FixedArray::offsetOfData()));7961 m_jit.store64(scratch2GPR, MacroAssembler::BaseIndex(resultGPR, lengthGPR, MacroAssembler::TimesEight, JSImmutableButterfly::offsetOfData())); 7956 7962 m_jit.branchTest32(MacroAssembler::NonZero, lengthGPR).linkTo(loopStart, &m_jit); 7957 7963 done.append(m_jit.jump()); … … 8143 8149 { 8144 8150 ASSERT(node->op() == NewArrayWithSpread); 8151 JSGlobalObject* globalObject = m_jit.graph().globalObjectFor(node->origin.semantic); 8145 8152 8146 8153 #if USE(JSVALUE64) … … 8150 8157 8151 8158 BitVector* bitVector = node->bitVector(); 8159 8160 if (node->numChildren() == 1 && bitVector->get(0)) { 8161 Edge use = m_jit.graph().varArgChild(node, 0); 8162 SpeculateCellOperand immutableButterfly(this, use); 8163 GPRTemporary result(this); 8164 GPRTemporary butterfly(this); 8165 GPRTemporary scratch1(this); 8166 GPRTemporary scratch2(this); 8167 8168 GPRReg immutableButterflyGPR = immutableButterfly.gpr(); 8169 GPRReg resultGPR = result.gpr(); 8170 GPRReg butterflyGPR = butterfly.gpr(); 8171 GPRReg scratch1GPR = scratch1.gpr(); 8172 GPRReg scratch2GPR = scratch2.gpr(); 8173 8174 RegisteredStructure structure = m_jit.graph().registerStructure(globalObject->originalArrayStructureForIndexingType(CopyOnWriteArrayWithContiguous)); 8175 8176 MacroAssembler::JumpList slowCases; 8177 8178 m_jit.move(immutableButterflyGPR, butterflyGPR); 8179 m_jit.addPtr(TrustedImm32(JSImmutableButterfly::offsetOfData()), butterflyGPR); 8180 8181 emitAllocateJSObject<JSArray>(resultGPR, TrustedImmPtr(structure), butterflyGPR, scratch1GPR, scratch2GPR, slowCases); 8182 8183 addSlowPathGenerator(slowPathCall(slowCases, this, operationNewArrayBuffer, resultGPR, &vm(), structure, immutableButterflyGPR)); 8184 8185 cellResult(resultGPR, node); 8186 return; 8187 } 8188 8152 8189 { 8153 8190 unsigned startLength = 0; … … 8164 8201 if (bitVector->get(i)) { 8165 8202 Edge use = m_jit.graph().varArgChild(node, i); 8166 SpeculateCellOperand fixedArray(this, use);8167 GPRReg fixedArrayGPR = fixedArray.gpr();8168 speculationCheck(Overflow, JSValueRegs(), nullptr, m_jit.branchAdd32(MacroAssembler::Overflow, MacroAssembler::Address( fixedArrayGPR, JSFixedArray::offsetOfSize()), lengthGPR));8203 SpeculateCellOperand immutableButterfly(this, use); 8204 GPRReg immutableButterflyGPR = immutableButterfly.gpr(); 8205 speculationCheck(Overflow, JSValueRegs(), nullptr, m_jit.branchAdd32(MacroAssembler::Overflow, MacroAssembler::Address(immutableButterflyGPR, JSImmutableButterfly::offsetOfPublicLength()), lengthGPR)); 8169 8206 } 8170 8207 } … … 8177 8214 // non-ArrayStorage shaped array. 8178 8215 bool shouldAllowForArrayStorageStructureForLargeArrays = false; 8179 compileAllocateNewArrayWithSize( m_jit.graph().globalObjectFor(node->origin.semantic), resultGPR, lengthGPR, ArrayWithContiguous, shouldAllowForArrayStorageStructureForLargeArrays);8216 compileAllocateNewArrayWithSize(globalObject, resultGPR, lengthGPR, ArrayWithContiguous, shouldAllowForArrayStorageStructureForLargeArrays); 8180 8217 } 8181 8218 … … 8192 8229 Edge use = m_jit.graph().varArgChild(node, i); 8193 8230 if (bitVector->get(i)) { 8194 SpeculateCellOperand fixedArray(this, use);8195 GPRReg fixedArrayGPR = fixedArray.gpr();8196 8197 GPRTemporary fixedIndex(this);8198 GPRReg fixedIndexGPR = fixedIndex.gpr();8231 SpeculateCellOperand immutableButterfly(this, use); 8232 GPRReg immutableButterflyGPR = immutableButterfly.gpr(); 8233 8234 GPRTemporary immutableButterflyIndex(this); 8235 GPRReg immutableButterflyIndexGPR = immutableButterflyIndex.gpr(); 8199 8236 8200 8237 GPRTemporary item(this); 8201 8238 GPRReg itemGPR = item.gpr(); 8202 8239 8203 GPRTemporary fixedLength(this);8204 GPRReg fixedLengthGPR = fixedLength.gpr();8205 8206 m_jit.load32(MacroAssembler::Address( fixedArrayGPR, JSFixedArray::offsetOfSize()), fixedLengthGPR);8207 m_jit.move(TrustedImm32(0), fixedIndexGPR);8208 auto done = m_jit.branchPtr(MacroAssembler::AboveOrEqual, fixedIndexGPR, fixedLengthGPR);8240 GPRTemporary immutableButterflyLength(this); 8241 GPRReg immutableButterflyLengthGPR = immutableButterflyLength.gpr(); 8242 8243 m_jit.load32(MacroAssembler::Address(immutableButterflyGPR, JSImmutableButterfly::offsetOfPublicLength()), immutableButterflyLengthGPR); 8244 m_jit.move(TrustedImm32(0), immutableButterflyIndexGPR); 8245 auto done = m_jit.branchPtr(MacroAssembler::AboveOrEqual, immutableButterflyIndexGPR, immutableButterflyLengthGPR); 8209 8246 auto loopStart = m_jit.label(); 8210 8247 m_jit.load64( 8211 MacroAssembler::BaseIndex( fixedArrayGPR, fixedIndexGPR, MacroAssembler::TimesEight, JSFixedArray::offsetOfData()),8248 MacroAssembler::BaseIndex(immutableButterflyGPR, immutableButterflyIndexGPR, MacroAssembler::TimesEight, JSImmutableButterfly::offsetOfData()), 8212 8249 itemGPR); 8213 8250 8214 8251 m_jit.store64(itemGPR, MacroAssembler::BaseIndex(storageGPR, indexGPR, MacroAssembler::TimesEight)); 8215 m_jit.addPtr(TrustedImm32(1), fixedIndexGPR);8252 m_jit.addPtr(TrustedImm32(1), immutableButterflyIndexGPR); 8216 8253 m_jit.addPtr(TrustedImm32(1), indexGPR); 8217 m_jit.branchPtr(MacroAssembler::Below, fixedIndexGPR, fixedLengthGPR).linkTo(loopStart, &m_jit);8254 m_jit.branchPtr(MacroAssembler::Below, immutableButterflyIndexGPR, immutableButterflyLengthGPR).linkTo(loopStart, &m_jit); 8218 8255 8219 8256 done.link(&m_jit); … … 8240 8277 Edge use = m_jit.graph().m_varArgChildren[node->firstChild() + i]; 8241 8278 if (bitVector->get(i)) { 8242 SpeculateCellOperand fixedArray(this, use);8243 GPRReg arrayGPR = fixedArray.gpr();8279 SpeculateCellOperand immutableButterfly(this, use); 8280 GPRReg immutableButterflyGPR = immutableButterfly.gpr(); 8244 8281 #if USE(JSVALUE64) 8245 m_jit.store64( arrayGPR, &buffer[i]);8282 m_jit.store64(immutableButterflyGPR, &buffer[i]); 8246 8283 #else 8247 8284 char* pointer = static_cast<char*>(static_cast<void*>(&buffer[i])); 8248 m_jit.store32( arrayGPR, pointer + PayloadOffset);8285 m_jit.store32(immutableButterflyGPR, pointer + PayloadOffset); 8249 8286 m_jit.store32(TrustedImm32(JSValue::CellTag), pointer + TagOffset); 8250 8287 #endif … … 8267 8304 GPRReg resultGPR = result.gpr(); 8268 8305 8269 callOperation(operationNewArrayWithSpreadSlow, resultGPR, TrustedImmPtr::weakPointer(m_graph, m_graph.globalObjectFor(node->origin.semantic)), buffer, node->numChildren());8306 callOperation(operationNewArrayWithSpreadSlow, resultGPR, TrustedImmPtr::weakPointer(m_graph, globalObject), buffer, node->numChildren()); 8270 8307 m_jit.exceptionCheck(); 8271 8308 { … … 12614 12651 12615 12652 m_jit.move(scratchGPR, scratch3GPR); 12616 m_jit.addPtr(TrustedImm Ptr(JSImmutableButterfly::offsetOfData()), scratchGPR);12653 m_jit.addPtr(TrustedImm32(JSImmutableButterfly::offsetOfData()), scratchGPR); 12617 12654 12618 12655 emitAllocateJSObject<JSArray>(resultGPR, TrustedImmPtr(arrayStructure), scratchGPR, structureGPR, scratch2GPR, slowButArrayBufferCases);
Note:
See TracChangeset
for help on using the changeset viewer.