summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/llint/LowLevelInterpreter.asm')
-rw-r--r--Source/JavaScriptCore/llint/LowLevelInterpreter.asm92
1 files changed, 75 insertions, 17 deletions
diff --git a/Source/JavaScriptCore/llint/LowLevelInterpreter.asm b/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
index 10a5aaeab..db4b71dfd 100644
--- a/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
+++ b/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
@@ -110,9 +110,13 @@ end
# Some common utilities.
macro crash()
- storei t0, 0xbbadbeef[]
- move 0, t0
- call t0
+ if C_LOOP
+ cloopCrash
+ else
+ storei t0, 0xbbadbeef[]
+ move 0, t0
+ call t0
+ end
end
macro assert(assertion)
@@ -124,7 +128,10 @@ macro assert(assertion)
end
macro preserveReturnAddressAfterCall(destinationRegister)
- if ARMv7
+ if C_LOOP
+ # In our case, we're only preserving the bytecode vPC.
+ move lr, destinationRegister
+ elsif ARMv7
move lr, destinationRegister
elsif X86 or X86_64
pop destinationRegister
@@ -134,7 +141,10 @@ macro preserveReturnAddressAfterCall(destinationRegister)
end
macro restoreReturnAddressBeforeReturn(sourceRegister)
- if ARMv7
+ if C_LOOP
+ # In our case, we're only restoring the bytecode vPC.
+ move sourceRegister, lr
+ elsif ARMv7
move sourceRegister, lr
elsif X86 or X86_64
push sourceRegister
@@ -149,13 +159,26 @@ macro traceExecution()
end
end
+macro callTargetFunction(callLinkInfo)
+ if C_LOOP
+ cloopCallJSFunction LLIntCallLinkInfo::machineCodeTarget[callLinkInfo]
+ else
+ call LLIntCallLinkInfo::machineCodeTarget[callLinkInfo]
+ dispatchAfterCall()
+ end
+end
+
macro slowPathForCall(advance, slowPath)
callCallSlowPath(
advance,
slowPath,
macro (callee)
- call callee
- dispatchAfterCall()
+ if C_LOOP
+ cloopCallJSFunction callee
+ else
+ call callee
+ dispatchAfterCall()
+ end
end)
end
@@ -532,7 +555,12 @@ _llint_op_jmp_scopes:
_llint_op_loop_if_true:
- nop
+ traceExecution()
+ jumpTrueOrFalse(
+ macro (value, target) btinz value, target end,
+ _llint_slow_path_jtrue)
+
+
_llint_op_jtrue:
traceExecution()
jumpTrueOrFalse(
@@ -541,7 +569,12 @@ _llint_op_jtrue:
_llint_op_loop_if_false:
- nop
+ traceExecution()
+ jumpTrueOrFalse(
+ macro (value, target) btiz value, target end,
+ _llint_slow_path_jfalse)
+
+
_llint_op_jfalse:
traceExecution()
jumpTrueOrFalse(
@@ -550,7 +583,13 @@ _llint_op_jfalse:
_llint_op_loop_if_less:
- nop
+ traceExecution()
+ compare(
+ macro (left, right, target) bilt left, right, target end,
+ macro (left, right, target) bdlt left, right, target end,
+ _llint_slow_path_jless)
+
+
_llint_op_jless:
traceExecution()
compare(
@@ -568,7 +607,13 @@ _llint_op_jnless:
_llint_op_loop_if_greater:
- nop
+ traceExecution()
+ compare(
+ macro (left, right, target) bigt left, right, target end,
+ macro (left, right, target) bdgt left, right, target end,
+ _llint_slow_path_jgreater)
+
+
_llint_op_jgreater:
traceExecution()
compare(
@@ -586,7 +631,13 @@ _llint_op_jngreater:
_llint_op_loop_if_lesseq:
- nop
+ traceExecution()
+ compare(
+ macro (left, right, target) bilteq left, right, target end,
+ macro (left, right, target) bdlteq left, right, target end,
+ _llint_slow_path_jlesseq)
+
+
_llint_op_jlesseq:
traceExecution()
compare(
@@ -604,7 +655,13 @@ _llint_op_jnlesseq:
_llint_op_loop_if_greatereq:
- nop
+ traceExecution()
+ compare(
+ macro (left, right, target) bigteq left, right, target end,
+ macro (left, right, target) bdgteq left, right, target end,
+ _llint_slow_path_jgreatereq)
+
+
_llint_op_jgreatereq:
traceExecution()
compare(
@@ -641,6 +698,7 @@ _llint_op_new_func_exp:
_llint_op_call:
traceExecution()
+ arrayProfileForCall()
doCall(_llint_slow_path_call)
@@ -715,9 +773,9 @@ _llint_op_get_pnames:
dispatch(0) # The slow_path either advances the PC or jumps us to somewhere else.
-_llint_op_push_scope:
+_llint_op_push_with_scope:
traceExecution()
- callSlowPath(_llint_slow_path_push_scope)
+ callSlowPath(_llint_slow_path_push_with_scope)
dispatch(2)
@@ -727,9 +785,9 @@ _llint_op_pop_scope:
dispatch(1)
-_llint_op_push_new_scope:
+_llint_op_push_name_scope:
traceExecution()
- callSlowPath(_llint_slow_path_push_new_scope)
+ callSlowPath(_llint_slow_path_push_name_scope)
dispatch(4)