Changeset 232105 in webkit
- Timestamp:
- May 22, 2018 9:44:44 PM (6 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r232100 r232105 1 2018-05-22 Yusuke Suzuki <utatane.tea@gmail.com> 2 3 [JSC] Use branchIfString/branchIfNotString instead of structure checkings 4 https://bugs.webkit.org/show_bug.cgi?id=185810 5 6 Reviewed by Saam Barati. 7 8 Let's use branchIfString/branchIfNotString helper functions instead of 9 checking structure with jsString's structure. It's easy to read. And 10 it emits less code since we do not need to embed string structure's 11 raw pointer in 32bit environment. 12 13 * jit/JIT.h: 14 * jit/JITInlines.h: 15 (JSC::JIT::emitLoadCharacterString): 16 (JSC::JIT::checkStructure): Deleted. 17 * jit/JITOpcodes32_64.cpp: 18 (JSC::JIT::emitSlow_op_eq): 19 (JSC::JIT::compileOpEqJumpSlow): 20 (JSC::JIT::emitSlow_op_neq): 21 * jit/JITPropertyAccess.cpp: 22 (JSC::JIT::stringGetByValStubGenerator): 23 (JSC::JIT::emitSlow_op_get_by_val): 24 (JSC::JIT::emitByValIdentifierCheck): 25 * jit/JITPropertyAccess32_64.cpp: 26 (JSC::JIT::stringGetByValStubGenerator): 27 (JSC::JIT::emitSlow_op_get_by_val): 28 * jit/JSInterfaceJIT.h: 29 (JSC::ThunkHelpers::jsStringLengthOffset): Deleted. 30 (JSC::ThunkHelpers::jsStringValueOffset): Deleted. 31 * jit/SpecializedThunkJIT.h: 32 (JSC::SpecializedThunkJIT::loadJSStringArgument): 33 * jit/ThunkGenerators.cpp: 34 (JSC::stringCharLoad): 35 (JSC::charCodeAtThunkGenerator): 36 (JSC::charAtThunkGenerator): 37 * runtime/JSString.h: 38 1 39 2018-05-22 Mark Lam <mark.lam@apple.com> 2 40 -
trunk/Source/JavaScriptCore/jit/JIT.h
r232048 r232105 798 798 void emitRightShiftFastPath(Instruction* currentInstruction, OpcodeID); 799 799 800 Jump checkStructure(RegisterID reg, Structure* structure);801 802 800 void updateTopCallFrame(); 803 801 -
trunk/Source/JavaScriptCore/jit/JITInlines.h
r232048 r232105 100 100 ALWAYS_INLINE void JIT::emitLoadCharacterString(RegisterID src, RegisterID dst, JumpList& failures) 101 101 { 102 failures.append(branch Structure(NotEqual, Address(src, JSCell::structureIDOffset()), m_vm->stringStructure.get()));103 failures.append(branch32(NotEqual, MacroAssembler::Address(src, ThunkHelpers::jsStringLengthOffset()), TrustedImm32(1)));104 loadPtr(MacroAssembler::Address(src, ThunkHelpers::jsStringValueOffset()), dst);102 failures.append(branchIfNotString(src)); 103 failures.append(branch32(NotEqual, MacroAssembler::Address(src, JSString::offsetOfLength()), TrustedImm32(1))); 104 loadPtr(MacroAssembler::Address(src, JSString::offsetOfValue()), dst); 105 105 failures.append(branchTest32(Zero, dst)); 106 106 loadPtr(MacroAssembler::Address(dst, StringImpl::flagsOffset()), regT1); … … 197 197 #endif 198 198 return call; 199 }200 201 ALWAYS_INLINE JIT::Jump JIT::checkStructure(RegisterID reg, Structure* structure)202 {203 return branchStructure(NotEqual, Address(reg, JSCell::structureIDOffset()), structure);204 199 } 205 200 -
trunk/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp
r232074 r232105 462 462 463 463 linkSlowCase(iter); // tags equal and JSCell 464 genericCase.append(branch Ptr(NotEqual, Address(regT0, JSCell::structureIDOffset()), TrustedImmPtr(m_vm->stringStructure.get())));465 genericCase.append(branch Ptr(NotEqual, Address(regT2, JSCell::structureIDOffset()), TrustedImmPtr(m_vm->stringStructure.get())));464 genericCase.append(branchIfNotString(regT0)); 465 genericCase.append(branchIfNotString(regT2)); 466 466 467 467 // String case. … … 500 500 501 501 linkSlowCase(iter); // tags equal and JSCell 502 genericCase.append(branch Ptr(NotEqual, Address(regT0, JSCell::structureIDOffset()), TrustedImmPtr(m_vm->stringStructure.get())));503 genericCase.append(branch Ptr(NotEqual, Address(regT2, JSCell::structureIDOffset()), TrustedImmPtr(m_vm->stringStructure.get())));502 genericCase.append(branchIfNotString(regT0)); 503 genericCase.append(branchIfNotString(regT2)); 504 504 505 505 // String case. … … 548 548 549 549 linkSlowCase(iter); // tags equal and JSCell 550 genericCase.append(branch Ptr(NotEqual, Address(regT0, JSCell::structureIDOffset()), TrustedImmPtr(m_vm->stringStructure.get())));551 genericCase.append(branch Ptr(NotEqual, Address(regT2, JSCell::structureIDOffset()), TrustedImmPtr(m_vm->stringStructure.get())));550 genericCase.append(branchIfNotString(regT0)); 551 genericCase.append(branchIfNotString(regT2)); 552 552 553 553 // String case. -
trunk/Source/JavaScriptCore/jit/JITPropertyAccess.cpp
r232070 r232105 56 56 JumpList failures; 57 57 jit.tagReturnAddress(); 58 failures.append(jit.branchStructure( 59 NotEqual, 60 Address(regT0, JSCell::structureIDOffset()), 61 vm->stringStructure.get())); 58 failures.append(jit.branchIfNotString(regT0)); 62 59 63 60 // Load string length to regT2, and start the process of loading the data pointer into regT0 64 jit.load32(Address(regT0, ThunkHelpers::jsStringLengthOffset()), regT2);65 jit.loadPtr(Address(regT0, ThunkHelpers::jsStringValueOffset()), regT0);61 jit.load32(Address(regT0, JSString::offsetOfLength()), regT2); 62 jit.loadPtr(Address(regT0, JSString::offsetOfValue()), regT0); 66 63 failures.append(jit.branchTest32(Zero, regT0)); 67 64 … … 253 250 Jump nonCell = jump(); 254 251 linkSlowCase(iter); // base array check 255 Jump notString = branchStructure(NotEqual, 256 Address(regT0, JSCell::structureIDOffset()), 257 m_vm->stringStructure.get()); 252 Jump notString = branchIfNotString(regT0); 258 253 emitNakedCall(CodeLocationLabel<NoPtrTag>(m_vm->getCTIStub(stringGetByValStubGenerator).retaggedCode<NoPtrTag>())); 259 254 Jump failed = branchTest64(Zero, regT0); … … 1258 1253 slowCases.append(branchPtr(NotEqual, cell, TrustedImmPtr(byValInfo->cachedSymbol.get()))); 1259 1254 else { 1260 slowCases.append(branch Structure(NotEqual, Address(cell, JSCell::structureIDOffset()), m_vm->stringStructure.get()));1255 slowCases.append(branchIfNotString(cell)); 1261 1256 loadPtr(Address(cell, JSString::offsetOfValue()), scratch); 1262 1257 slowCases.append(branchPtr(NotEqual, scratch, TrustedImmPtr(propertyName.impl()))); -
trunk/Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp
r232047 r232105 133 133 JSInterfaceJIT jit(vm); 134 134 JumpList failures; 135 failures.append(jit.branch Structure(NotEqual, Address(regT0, JSCell::structureIDOffset()), vm->stringStructure.get()));135 failures.append(jit.branchIfNotString(regT0)); 136 136 137 137 // Load string length to regT1, and start the process of loading the data pointer into regT0 138 jit.load32(Address(regT0, ThunkHelpers::jsStringLengthOffset()), regT1);139 jit.loadPtr(Address(regT0, ThunkHelpers::jsStringValueOffset()), regT0);138 jit.load32(Address(regT0, JSString::offsetOfLength()), regT1); 139 jit.loadPtr(Address(regT0, JSString::offsetOfValue()), regT0); 140 140 failures.append(jit.branchTest32(Zero, regT0)); 141 141 … … 309 309 Jump nonCell = jump(); 310 310 linkSlowCase(iter); // base array check 311 Jump notString = branch Structure(NotEqual, Address(regT0, JSCell::structureIDOffset()), m_vm->stringStructure.get());311 Jump notString = branchIfNotString(regT0); 312 312 emitNakedCall(CodeLocationLabel<NoPtrTag>(m_vm->getCTIStub(stringGetByValStubGenerator).retaggedCode<NoPtrTag>())); 313 313 Jump failed = branchTestPtr(Zero, regT0); -
trunk/Source/JavaScriptCore/jit/JSInterfaceJIT.h
r232048 r232105 61 61 62 62 VM* m_vm; 63 };64 65 struct ThunkHelpers {66 static unsigned jsStringLengthOffset() { return OBJECT_OFFSETOF(JSString, m_length); }67 static unsigned jsStringValueOffset() { return OBJECT_OFFSETOF(JSString, m_value); }68 63 }; 69 64 -
trunk/Source/JavaScriptCore/jit/SpecializedThunkJIT.h
r232048 r232105 66 66 } 67 67 68 void loadJSStringArgument( VM& vm,int argument, RegisterID dst)68 void loadJSStringArgument(int argument, RegisterID dst) 69 69 { 70 70 loadCellArgument(argument, dst); 71 m_failures.append(branchStructure(NotEqual, 72 Address(dst, JSCell::structureIDOffset()), 73 vm.stringStructure.get())); 71 m_failures.append(branchIfNotString(dst)); 74 72 } 75 73 -
trunk/Source/JavaScriptCore/jit/ThunkGenerators.cpp
r232048 r232105 613 613 } 614 614 615 static void stringCharLoad(SpecializedThunkJIT& jit , VM* vm)615 static void stringCharLoad(SpecializedThunkJIT& jit) 616 616 { 617 617 // load string 618 jit.loadJSStringArgument( *vm,SpecializedThunkJIT::ThisArgument, SpecializedThunkJIT::regT0);618 jit.loadJSStringArgument(SpecializedThunkJIT::ThisArgument, SpecializedThunkJIT::regT0); 619 619 620 620 // Load string length to regT2, and start the process of loading the data pointer into regT0 621 jit.load32(MacroAssembler::Address(SpecializedThunkJIT::regT0, ThunkHelpers::jsStringLengthOffset()), SpecializedThunkJIT::regT2);622 jit.loadPtr(MacroAssembler::Address(SpecializedThunkJIT::regT0, ThunkHelpers::jsStringValueOffset()), SpecializedThunkJIT::regT0);621 jit.load32(MacroAssembler::Address(SpecializedThunkJIT::regT0, JSString::offsetOfLength()), SpecializedThunkJIT::regT2); 622 jit.loadPtr(MacroAssembler::Address(SpecializedThunkJIT::regT0, JSString::offsetOfValue()), SpecializedThunkJIT::regT0); 623 623 jit.appendFailure(jit.branchTest32(MacroAssembler::Zero, SpecializedThunkJIT::regT0)); 624 624 … … 654 654 { 655 655 SpecializedThunkJIT jit(vm, 1); 656 stringCharLoad(jit , vm);656 stringCharLoad(jit); 657 657 jit.returnInt32(SpecializedThunkJIT::regT0); 658 658 return jit.finalize(vm->jitStubs->ctiNativeTailCall(vm), "charCodeAt"); … … 662 662 { 663 663 SpecializedThunkJIT jit(vm, 1); 664 stringCharLoad(jit , vm);664 stringCharLoad(jit); 665 665 charToString(jit, vm, SpecializedThunkJIT::regT0, SpecializedThunkJIT::regT0, SpecializedThunkJIT::regT1); 666 666 jit.returnJSCell(SpecializedThunkJIT::regT0); -
trunk/Source/JavaScriptCore/runtime/JSString.h
r231337 r232105 81 81 friend class MarkStack; 82 82 friend class SlotVisitor; 83 friend struct ThunkHelpers;84 83 85 84 typedef JSCell Base;
Note: See TracChangeset
for help on using the changeset viewer.