[JSC] Put .throwStackOverflow code after the fast path in LLInt doVMEntry
authoryusukesuzuki@slowstart.org <yusukesuzuki@slowstart.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 7 Sep 2018 16:57:03 +0000 (16:57 +0000)
committeryusukesuzuki@slowstart.org <yusukesuzuki@slowstart.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 7 Sep 2018 16:57:03 +0000 (16:57 +0000)
https://bugs.webkit.org/show_bug.cgi?id=189410

Reviewed by Mark Lam.

Put .throwStackOverflow code after the fast path in LLInt doVMEntry to
make doVMEntry code tight.

* llint/LLIntThunks.cpp:
(JSC::vmEntryToWasm): Deleted.
* llint/LLIntThunks.h:
(JSC::vmEntryToWasm):
* llint/LowLevelInterpreter32_64.asm:
* llint/LowLevelInterpreter64.asm:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@235785 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/llint/LLIntThunks.cpp
Source/JavaScriptCore/llint/LLIntThunks.h
Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
Source/JavaScriptCore/llint/LowLevelInterpreter64.asm

index 9946087..8ebbe36 100644 (file)
@@ -1,3 +1,20 @@
+2018-09-07  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
+
+        [JSC] Put .throwStackOverflow code after the fast path in LLInt doVMEntry
+        https://bugs.webkit.org/show_bug.cgi?id=189410
+
+        Reviewed by Mark Lam.
+
+        Put .throwStackOverflow code after the fast path in LLInt doVMEntry to
+        make doVMEntry code tight.
+
+        * llint/LLIntThunks.cpp:
+        (JSC::vmEntryToWasm): Deleted.
+        * llint/LLIntThunks.h:
+        (JSC::vmEntryToWasm):
+        * llint/LowLevelInterpreter32_64.asm:
+        * llint/LowLevelInterpreter64.asm:
+
 2018-09-06  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
 
         [WebAssembly] Optimize JS to Wasm call by removing Vector allocation
index 28b9a8e..2446bdb 100644 (file)
 
 namespace JSC {
 
-EncodedJSValue JS_EXPORT_PRIVATE vmEntryToWasm(void* code, VM* vm, ProtoCallFrame* frame)
-{
-    code = retagCodePtr<WasmEntryPtrTag, JSEntryPtrTag>(code);
-    return vmEntryToJavaScript(code, vm, frame);
-}
-    
 #if ENABLE(JIT)
 
 namespace LLInt {
index f6a84b8..839ff1e 100644 (file)
@@ -38,7 +38,11 @@ extern "C" {
     EncodedJSValue vmEntryToNative(void*, VM*, ProtoCallFrame*);
 }
 
-EncodedJSValue JS_EXPORT_PRIVATE vmEntryToWasm(void*, VM*, ProtoCallFrame*);
+inline EncodedJSValue vmEntryToWasm(void* code, VM* vm, ProtoCallFrame* frame)
+{
+    code = retagCodePtr<WasmEntryPtrTag, JSEntryPtrTag>(code);
+    return vmEntryToJavaScript(code, vm, frame);
+}
 
 namespace LLInt {
 
index 0bcb054..daaa8a4 100644 (file)
@@ -157,11 +157,6 @@ macro doVMEntry(makeCall)
     # before we start copying the args from the protoCallFrame below.
     if C_LOOP
         bpaeq t3, VM::m_cloopStackLimit[vm], .stackHeightOK
-    else
-        bpaeq t3, VM::m_softStackLimit[vm], .stackHeightOK
-    end
-
-    if C_LOOP
         move entry, t4
         move vm, t5
         cloopCallSlowPath _llint_stack_check_at_vm_entry, vm, t3
@@ -173,38 +168,11 @@ macro doVMEntry(makeCall)
 .stackCheckFailed:
         move t4, entry
         move t5, vm
-    end
-
-.throwStackOverflow:
-    subp 8, sp # Align stack for cCall2() to make a call.
-    move vm, a0
-    move protoCallFrame, a1
-    cCall2(_llint_throw_stack_overflow_error)
-
-    if ARMv7
-        vmEntryRecord(cfr, t3)
-        move t3, sp
-    else
-        vmEntryRecord(cfr, sp)
-    end
-
-    loadp VMEntryRecord::m_vm[sp], t5
-    loadp VMEntryRecord::m_prevTopCallFrame[sp], t4
-    storep t4, VM::topCallFrame[t5]
-    loadp VMEntryRecord::m_prevTopEntryFrame[sp], t4
-    storep t4, VM::topEntryFrame[t5]
-
-    if ARMv7
-        subp cfr, CalleeRegisterSaveSize, t5
-        move t5, sp
+        jmp .throwStackOverflow
     else
-        subp cfr, CalleeRegisterSaveSize, sp
+        bpb t3, VM::m_softStackLimit[vm], .throwStackOverflow
     end
 
-    popCalleeSaves()
-    functionEpilogue()
-    ret
-
 .stackHeightOK:
     move t3, sp
     move 4, t3
@@ -270,6 +238,36 @@ macro doVMEntry(makeCall)
     popCalleeSaves()
     functionEpilogue()
     ret
+
+.throwStackOverflow:
+    subp 8, sp # Align stack for cCall2() to make a call.
+    move vm, a0
+    move protoCallFrame, a1
+    cCall2(_llint_throw_stack_overflow_error)
+
+    if ARMv7
+        vmEntryRecord(cfr, t3)
+        move t3, sp
+    else
+        vmEntryRecord(cfr, sp)
+    end
+
+    loadp VMEntryRecord::m_vm[sp], t5
+    loadp VMEntryRecord::m_prevTopCallFrame[sp], t4
+    storep t4, VM::topCallFrame[t5]
+    loadp VMEntryRecord::m_prevTopEntryFrame[sp], t4
+    storep t4, VM::topEntryFrame[t5]
+
+    if ARMv7
+        subp cfr, CalleeRegisterSaveSize, t5
+        move t5, sp
+    else
+        subp cfr, CalleeRegisterSaveSize, sp
+    end
+
+    popCalleeSaves()
+    functionEpilogue()
+    ret
 end
 
 macro makeJavaScriptCall(entry, temp, unused)
index d0d49b2..ece418d 100644 (file)
@@ -146,11 +146,6 @@ macro doVMEntry(makeCall)
     # before we start copying the args from the protoCallFrame below.
     if C_LOOP
         bpaeq t3, VM::m_cloopStackLimit[vm], .stackHeightOK
-    else
-        bpaeq t3, VM::m_softStackLimit[vm], .stackHeightOK
-    end
-
-    if C_LOOP
         move entry, t4
         move vm, t5
         cloopCallSlowPath _llint_stack_check_at_vm_entry, vm, t3
@@ -162,27 +157,11 @@ macro doVMEntry(makeCall)
 .stackCheckFailed:
         move t4, entry
         move t5, vm
+        jmp .throwStackOverflow
+    else
+        bpb t3, VM::m_softStackLimit[vm], .throwStackOverflow
     end
 
-.throwStackOverflow:
-    move vm, a0
-    move protoCallFrame, a1
-    cCall2(_llint_throw_stack_overflow_error)
-
-    vmEntryRecord(cfr, t4)
-
-    loadp VMEntryRecord::m_vm[t4], vm
-    loadp VMEntryRecord::m_prevTopCallFrame[t4], extraTempReg
-    storep extraTempReg, VM::topCallFrame[vm]
-    loadp VMEntryRecord::m_prevTopEntryFrame[t4], extraTempReg
-    storep extraTempReg, VM::topEntryFrame[vm]
-
-    subp cfr, CalleeRegisterSaveSize, sp
-
-    popCalleeSaves()
-    functionEpilogue()
-    ret
-
 .stackHeightOK:
     move t3, sp
     move 4, t3
@@ -247,6 +226,25 @@ macro doVMEntry(makeCall)
     popCalleeSaves()
     functionEpilogue()
     ret
+
+.throwStackOverflow:
+    move vm, a0
+    move protoCallFrame, a1
+    cCall2(_llint_throw_stack_overflow_error)
+
+    vmEntryRecord(cfr, t4)
+
+    loadp VMEntryRecord::m_vm[t4], vm
+    loadp VMEntryRecord::m_prevTopCallFrame[t4], extraTempReg
+    storep extraTempReg, VM::topCallFrame[vm]
+    loadp VMEntryRecord::m_prevTopEntryFrame[t4], extraTempReg
+    storep extraTempReg, VM::topEntryFrame[vm]
+
+    subp cfr, CalleeRegisterSaveSize, sp
+
+    popCalleeSaves()
+    functionEpilogue()
+    ret
 end