Title: [232106] trunk/Source/_javascript_Core
Revision
232106
Author
[email protected]
Date
2018-05-22 22:05:13 -0700 (Tue, 22 May 2018)

Log Message

[JSC] Clean up stringGetByValStubGenerator
https://bugs.webkit.org/show_bug.cgi?id=185864

Reviewed by Saam Barati.

We clean up stringGetByValStubGenerator.

1. Unify 32bit and 64bit implementations.
2. Rename stringGetByValStubGenerator to stringGetByValGenerator, move it to ThunkGenerators.cpp.
3. Remove string type check since this code is invoked only when we know regT0 is JSString*.
4. Do not tag Cell in stringGetByValGenerator side. 32bit code stores Cell with tag in JITPropertyAccess32_64 side.
5. Fix invalid use of loadPtr for StringImpl::flags. Should use load32.

* jit/JIT.h:
* jit/JITPropertyAccess.cpp:
(JSC::JIT::emitSlow_op_get_by_val):
(JSC::JIT::stringGetByValStubGenerator): Deleted.
* jit/JITPropertyAccess32_64.cpp:
(JSC::JIT::emit_op_get_by_val):
(JSC::JIT::emitSlow_op_get_by_val):
(JSC::JIT::stringGetByValStubGenerator): Deleted.
* jit/ThunkGenerators.cpp:
(JSC::stringGetByValGenerator):
* jit/ThunkGenerators.h:

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (232105 => 232106)


--- trunk/Source/_javascript_Core/ChangeLog	2018-05-23 04:44:44 UTC (rev 232105)
+++ trunk/Source/_javascript_Core/ChangeLog	2018-05-23 05:05:13 UTC (rev 232106)
@@ -1,5 +1,32 @@
 2018-05-22  Yusuke Suzuki  <[email protected]>
 
+        [JSC] Clean up stringGetByValStubGenerator
+        https://bugs.webkit.org/show_bug.cgi?id=185864
+
+        Reviewed by Saam Barati.
+
+        We clean up stringGetByValStubGenerator.
+
+        1. Unify 32bit and 64bit implementations.
+        2. Rename stringGetByValStubGenerator to stringGetByValGenerator, move it to ThunkGenerators.cpp.
+        3. Remove string type check since this code is invoked only when we know regT0 is JSString*.
+        4. Do not tag Cell in stringGetByValGenerator side. 32bit code stores Cell with tag in JITPropertyAccess32_64 side.
+        5. Fix invalid use of loadPtr for StringImpl::flags. Should use load32.
+
+        * jit/JIT.h:
+        * jit/JITPropertyAccess.cpp:
+        (JSC::JIT::emitSlow_op_get_by_val):
+        (JSC::JIT::stringGetByValStubGenerator): Deleted.
+        * jit/JITPropertyAccess32_64.cpp:
+        (JSC::JIT::emit_op_get_by_val):
+        (JSC::JIT::emitSlow_op_get_by_val):
+        (JSC::JIT::stringGetByValStubGenerator): Deleted.
+        * jit/ThunkGenerators.cpp:
+        (JSC::stringGetByValGenerator):
+        * jit/ThunkGenerators.h:
+
+2018-05-22  Yusuke Suzuki  <[email protected]>
+
         [JSC] Use branchIfString/branchIfNotString instead of structure checkings
         https://bugs.webkit.org/show_bug.cgi?id=185810
 

Modified: trunk/Source/_javascript_Core/jit/JIT.h (232105 => 232106)


--- trunk/Source/_javascript_Core/jit/JIT.h	2018-05-23 04:44:44 UTC (rev 232105)
+++ trunk/Source/_javascript_Core/jit/JIT.h	2018-05-23 05:05:13 UTC (rev 232106)
@@ -890,7 +890,6 @@
 
         std::unique_ptr<JITDisassembler> m_disassembler;
         RefPtr<Profiler::Compilation> m_compilation;
-        static CodeRef<JITThunkPtrTag> stringGetByValStubGenerator(VM*);
 
         PCToCodeOriginMapBuilder m_pcToCodeOriginMapBuilder;
 

Modified: trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp (232105 => 232106)


--- trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp	2018-05-23 04:44:44 UTC (rev 232105)
+++ trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp	2018-05-23 05:05:13 UTC (rev 232106)
@@ -50,47 +50,6 @@
 namespace JSC {
 #if USE(JSVALUE64)
 
-JIT::CodeRef<JITThunkPtrTag> JIT::stringGetByValStubGenerator(VM* vm)
-{
-    JSInterfaceJIT jit(vm);
-    JumpList failures;
-    jit.tagReturnAddress();
-    failures.append(jit.branchIfNotString(regT0));
-
-    // Load string length to regT2, and start the process of loading the data pointer into regT0
-    jit.load32(Address(regT0, JSString::offsetOfLength()), regT2);
-    jit.loadPtr(Address(regT0, JSString::offsetOfValue()), regT0);
-    failures.append(jit.branchTest32(Zero, regT0));
-
-    // Do an unsigned compare to simultaneously filter negative indices as well as indices that are too large
-    failures.append(jit.branch32(AboveOrEqual, regT1, regT2));
-    
-    // Load the character
-    JumpList is16Bit;
-    JumpList cont8Bit;
-    // Load the string flags
-    jit.loadPtr(Address(regT0, StringImpl::flagsOffset()), regT2);
-    jit.loadPtr(Address(regT0, StringImpl::dataOffset()), regT0);
-    is16Bit.append(jit.branchTest32(Zero, regT2, TrustedImm32(StringImpl::flagIs8Bit())));
-    jit.load8(BaseIndex(regT0, regT1, TimesOne, 0), regT0);
-    cont8Bit.append(jit.jump());
-    is16Bit.link(&jit);
-    jit.load16(BaseIndex(regT0, regT1, TimesTwo, 0), regT0);
-    cont8Bit.link(&jit);
-
-    failures.append(jit.branch32(AboveOrEqual, regT0, TrustedImm32(0x100)));
-    jit.move(TrustedImmPtr(vm->smallStrings.singleCharacterStrings()), regT1);
-    jit.loadPtr(BaseIndex(regT1, regT0, ScalePtr, 0), regT0);
-    jit.ret();
-    
-    failures.link(&jit);
-    jit.move(TrustedImm32(0), regT0);
-    jit.ret();
-    
-    LinkBuffer patchBuffer(jit, GLOBAL_THUNK_ID);
-    return FINALIZE_CODE(patchBuffer, JITThunkPtrTag, "String get_by_val stub");
-}
-
 void JIT::emit_op_get_by_val(Instruction* currentInstruction)
 {
     int dst = currentInstruction[1].u.operand;
@@ -250,7 +209,7 @@
     Jump nonCell = jump();
     linkSlowCase(iter); // base array check
     Jump notString = branchIfNotString(regT0);
-    emitNakedCall(CodeLocationLabel<NoPtrTag>(m_vm->getCTIStub(stringGetByValStubGenerator).retaggedCode<NoPtrTag>()));
+    emitNakedCall(CodeLocationLabel<NoPtrTag>(m_vm->getCTIStub(stringGetByValGenerator).retaggedCode<NoPtrTag>()));
     Jump failed = branchTest64(Zero, regT0);
     emitPutVirtualRegister(dst, regT0);
     emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_get_by_val));

Modified: trunk/Source/_javascript_Core/jit/JITPropertyAccess32_64.cpp (232105 => 232106)


--- trunk/Source/_javascript_Core/jit/JITPropertyAccess32_64.cpp	2018-05-23 04:44:44 UTC (rev 232105)
+++ trunk/Source/_javascript_Core/jit/JITPropertyAccess32_64.cpp	2018-05-23 05:05:13 UTC (rev 232106)
@@ -128,48 +128,6 @@
     callOperation(operationDeleteByValJSResult, dst, JSValueRegs(regT1, regT0), JSValueRegs(regT3, regT2));
 }
 
-JIT::CodeRef<JITThunkPtrTag> JIT::stringGetByValStubGenerator(VM* vm)
-{
-    JSInterfaceJIT jit(vm);
-    JumpList failures;
-    failures.append(jit.branchIfNotString(regT0));
-    
-    // Load string length to regT1, and start the process of loading the data pointer into regT0
-    jit.load32(Address(regT0, JSString::offsetOfLength()), regT1);
-    jit.loadPtr(Address(regT0, JSString::offsetOfValue()), regT0);
-    failures.append(jit.branchTest32(Zero, regT0));
-    
-    // Do an unsigned compare to simultaneously filter negative indices as well as indices that are too large
-    failures.append(jit.branch32(AboveOrEqual, regT2, regT1));
-    
-    // Load the character
-    JumpList is16Bit;
-    JumpList cont8Bit;
-    // Load the string flags
-    jit.loadPtr(Address(regT0, StringImpl::flagsOffset()), regT1);
-    jit.loadPtr(Address(regT0, StringImpl::dataOffset()), regT0);
-    is16Bit.append(jit.branchTest32(Zero, regT1, TrustedImm32(StringImpl::flagIs8Bit())));
-    jit.load8(BaseIndex(regT0, regT2, TimesOne, 0), regT0);
-    cont8Bit.append(jit.jump());
-    is16Bit.link(&jit);
-    jit.load16(BaseIndex(regT0, regT2, TimesTwo, 0), regT0);
-
-    cont8Bit.link(&jit);
-    
-    failures.append(jit.branch32(AboveOrEqual, regT0, TrustedImm32(0x100)));
-    jit.move(TrustedImmPtr(vm->smallStrings.singleCharacterStrings()), regT1);
-    jit.loadPtr(BaseIndex(regT1, regT0, ScalePtr, 0), regT0);
-    jit.move(TrustedImm32(JSValue::CellTag), regT1); // We null check regT0 on return so this is safe
-    jit.ret();
-
-    failures.link(&jit);
-    jit.move(TrustedImm32(0), regT0);
-    jit.ret();
-    
-    LinkBuffer patchBuffer(jit, GLOBAL_THUNK_ID);
-    return FINALIZE_CODE(patchBuffer, JITThunkPtrTag, "String get_by_val stub");
-}
-
 void JIT::emit_op_get_by_val(Instruction* currentInstruction)
 {
     int dst = currentInstruction[1].u.operand;
@@ -177,7 +135,7 @@
     int property = currentInstruction[3].u.operand;
     ArrayProfile* profile = ""
     ByValInfo* byValInfo = m_codeBlock->addByValInfo();
-    
+
     emitLoad2(base, regT1, regT0, property, regT3, regT2);
     
     emitJumpSlowCaseIfNotJSCell(base, regT1);
@@ -309,9 +267,9 @@
     Jump nonCell = jump();
     linkSlowCase(iter); // base array check
     Jump notString = branchIfNotString(regT0);
-    emitNakedCall(CodeLocationLabel<NoPtrTag>(m_vm->getCTIStub(stringGetByValStubGenerator).retaggedCode<NoPtrTag>()));
+    emitNakedCall(CodeLocationLabel<NoPtrTag>(m_vm->getCTIStub(stringGetByValGenerator).retaggedCode<NoPtrTag>()));
     Jump failed = branchTestPtr(Zero, regT0);
-    emitStore(dst, regT1, regT0);
+    emitStoreCell(dst, regT0);
     emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_get_by_val));
     failed.link(this);
     notString.link(this);

Modified: trunk/Source/_javascript_Core/jit/ThunkGenerators.cpp (232105 => 232106)


--- trunk/Source/_javascript_Core/jit/ThunkGenerators.cpp	2018-05-23 04:44:44 UTC (rev 232105)
+++ trunk/Source/_javascript_Core/jit/ThunkGenerators.cpp	2018-05-23 05:05:13 UTC (rev 232106)
@@ -612,6 +612,58 @@
     return FINALIZE_CODE(patchBuffer, JITThunkPtrTag, "unreachable thunk");
 }
 
+MacroAssemblerCodeRef<JITThunkPtrTag> stringGetByValGenerator(VM* vm)
+{
+    // regT0 is JSString*, and regT1 (64bit) or regT2 (32bit) is int index.
+    // Return regT0 = result JSString* if succeeds. Otherwise, return regT0 = 0.
+#if USE(JSVALUE64)
+    GPRReg stringGPR = GPRInfo::regT0;
+    GPRReg indexGPR = GPRInfo::regT1;
+    GPRReg scratchGPR = GPRInfo::regT2;
+#else
+    GPRReg stringGPR = GPRInfo::regT0;
+    GPRReg indexGPR = GPRInfo::regT2;
+    GPRReg scratchGPR = GPRInfo::regT1;
+#endif
+
+    JSInterfaceJIT jit(vm);
+    JSInterfaceJIT::JumpList failures;
+    jit.tagReturnAddress();
+
+    // Load string length to regT2, and start the process of loading the data pointer into regT0
+    jit.load32(JSInterfaceJIT::Address(stringGPR, JSString::offsetOfLength()), scratchGPR);
+    jit.loadPtr(JSInterfaceJIT::Address(stringGPR, JSString::offsetOfValue()), stringGPR);
+    failures.append(jit.branchTestPtr(JSInterfaceJIT::Zero, stringGPR));
+
+    // Do an unsigned compare to simultaneously filter negative indices as well as indices that are too large
+    failures.append(jit.branch32(JSInterfaceJIT::AboveOrEqual, indexGPR, scratchGPR));
+
+    // Load the character
+    JSInterfaceJIT::JumpList is16Bit;
+    JSInterfaceJIT::JumpList cont8Bit;
+    // Load the string flags
+    jit.load32(JSInterfaceJIT::Address(stringGPR, StringImpl::flagsOffset()), scratchGPR);
+    jit.loadPtr(JSInterfaceJIT::Address(stringGPR, StringImpl::dataOffset()), stringGPR);
+    is16Bit.append(jit.branchTest32(JSInterfaceJIT::Zero, scratchGPR, JSInterfaceJIT::TrustedImm32(StringImpl::flagIs8Bit())));
+    jit.load8(JSInterfaceJIT::BaseIndex(stringGPR, indexGPR, JSInterfaceJIT::TimesOne, 0), stringGPR);
+    cont8Bit.append(jit.jump());
+    is16Bit.link(&jit);
+    jit.load16(JSInterfaceJIT::BaseIndex(stringGPR, indexGPR, JSInterfaceJIT::TimesTwo, 0), stringGPR);
+    cont8Bit.link(&jit);
+
+    failures.append(jit.branch32(JSInterfaceJIT::AboveOrEqual, stringGPR, JSInterfaceJIT::TrustedImm32(0x100)));
+    jit.move(JSInterfaceJIT::TrustedImmPtr(vm->smallStrings.singleCharacterStrings()), indexGPR);
+    jit.loadPtr(JSInterfaceJIT::BaseIndex(indexGPR, stringGPR, JSInterfaceJIT::ScalePtr, 0), stringGPR);
+    jit.ret();
+
+    failures.link(&jit);
+    jit.move(JSInterfaceJIT::TrustedImm32(0), stringGPR);
+    jit.ret();
+
+    LinkBuffer patchBuffer(jit, GLOBAL_THUNK_ID);
+    return FINALIZE_CODE(patchBuffer, JITThunkPtrTag, "String get_by_val stub");
+}
+
 static void stringCharLoad(SpecializedThunkJIT& jit)
 {
     // load string

Modified: trunk/Source/_javascript_Core/jit/ThunkGenerators.h (232105 => 232106)


--- trunk/Source/_javascript_Core/jit/ThunkGenerators.h	2018-05-23 04:44:44 UTC (rev 232105)
+++ trunk/Source/_javascript_Core/jit/ThunkGenerators.h	2018-05-23 05:05:13 UTC (rev 232106)
@@ -51,6 +51,7 @@
 MacroAssemblerCodeRef<JITThunkPtrTag> internalFunctionConstructGenerator(VM*);
 MacroAssemblerCodeRef<JITThunkPtrTag> arityFixupGenerator(VM*);
 MacroAssemblerCodeRef<JITThunkPtrTag> unreachableGenerator(VM*);
+MacroAssemblerCodeRef<JITThunkPtrTag> stringGetByValGenerator(VM*);
 
 MacroAssemblerCodeRef<JITThunkPtrTag> charCodeAtThunkGenerator(VM*);
 MacroAssemblerCodeRef<JITThunkPtrTag> charAtThunkGenerator(VM*);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to