diff options
Diffstat (limited to 'Source/JavaScriptCore/llint/LowLevelInterpreter64.asm')
-rw-r--r-- | Source/JavaScriptCore/llint/LowLevelInterpreter64.asm | 47 |
1 files changed, 32 insertions, 15 deletions
diff --git a/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm b/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm index 5225bdda9..a153586f4 100644 --- a/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm +++ b/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm @@ -893,33 +893,50 @@ _llint_op_put_scoped_var: dispatch(4) -_llint_op_get_global_var: +macro getGlobalVar(size) traceExecution() - loadis 16[PB, PC, 8], t1 + loadp 16[PB, PC, 8], t0 loadis 8[PB, PC, 8], t3 - loadp CodeBlock[cfr], t0 - loadp CodeBlock::m_globalObject[t0], t0 - loadp JSGlobalObject::m_registers[t0], t0 - loadp [t0, t1, 8], t2 - storep t2, [cfr, t3, 8] - loadp 24[PB, PC, 8], t3 - valueProfile(t2, t3) - dispatch(4) + loadp [t0], t1 + storep t1, [cfr, t3, 8] + loadp (size - 1) * 8[PB, PC, 8], t0 + valueProfile(t1, t0) + dispatch(size) +end + +_llint_op_get_global_var: + getGlobalVar(4) + + +_llint_op_get_global_var_watchable: + getGlobalVar(5) _llint_op_put_global_var: traceExecution() loadis 16[PB, PC, 8], t1 - loadp CodeBlock[cfr], t0 - loadp CodeBlock::m_globalObject[t0], t0 - loadp JSGlobalObject::m_registers[t0], t0 + loadp 8[PB, PC, 8], t0 loadConstantOrVariable(t1, t2) - loadis 8[PB, PC, 8], t1 writeBarrier(t2) - storep t2, [t0, t1, 8] + storep t2, [t0] dispatch(3) +_llint_op_put_global_var_check: + traceExecution() + loadp 24[PB, PC, 8], t2 + loadis 16[PB, PC, 8], t1 + loadp 8[PB, PC, 8], t0 + btbnz [t2], .opPutGlobalVarCheckSlow + loadConstantOrVariable(t1, t2) + writeBarrier(t2) + storep t2, [t0] + dispatch(5) +.opPutGlobalVarCheckSlow: + callSlowPath(_llint_slow_path_put_global_var_check) + dispatch(5) + + _llint_op_get_by_id: traceExecution() # We only do monomorphic get_by_id caching for now, and we do not modify the |