summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/llint
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-06-20 13:01:08 +0200
committerSimon Hausmann <simon.hausmann@nokia.com>2012-06-20 13:01:08 +0200
commit49233e234e5c787396cadb2cea33b31ae0cd65c1 (patch)
tree5410cb9a8fd53168bb60d62c54b654d86f03c38d /Source/JavaScriptCore/llint
parentb211c645d8ab690f713515dfdc84d80b11c27d2c (diff)
downloadqtwebkit-49233e234e5c787396cadb2cea33b31ae0cd65c1.tar.gz
Imported WebKit commit 3a8c29f35d00659d2ce7a0ccdfa8304f14e82327 (http://svn.webkit.org/repository/webkit/trunk@120813)
New snapshot with Windows build fixes
Diffstat (limited to 'Source/JavaScriptCore/llint')
-rw-r--r--Source/JavaScriptCore/llint/LLIntOfflineAsmConfig.h4
-rw-r--r--Source/JavaScriptCore/llint/LLIntSlowPaths.cpp64
-rw-r--r--Source/JavaScriptCore/llint/LLIntSlowPaths.h228
-rw-r--r--Source/JavaScriptCore/llint/LLIntThunks.cpp16
-rw-r--r--Source/JavaScriptCore/llint/LowLevelInterpreter.asm8
-rw-r--r--Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm48
-rw-r--r--Source/JavaScriptCore/llint/LowLevelInterpreter64.asm47
7 files changed, 243 insertions, 172 deletions
diff --git a/Source/JavaScriptCore/llint/LLIntOfflineAsmConfig.h b/Source/JavaScriptCore/llint/LLIntOfflineAsmConfig.h
index 2539ee9b3..7720f5ec2 100644
--- a/Source/JavaScriptCore/llint/LLIntOfflineAsmConfig.h
+++ b/Source/JavaScriptCore/llint/LLIntOfflineAsmConfig.h
@@ -94,14 +94,14 @@
#if CPU(ARM_THUMB2)
#define OFFLINE_ASM_GLOBAL_LABEL(label) \
".globl " SYMBOL_STRING(label) "\n" \
- HIDE_SYMBOL(name) "\n" \
+ HIDE_SYMBOL(label) "\n" \
".thumb\n" \
".thumb_func " THUMB_FUNC_PARAM(label) "\n" \
SYMBOL_STRING(label) ":\n"
#else
#define OFFLINE_ASM_GLOBAL_LABEL(label) \
".globl " SYMBOL_STRING(label) "\n" \
- HIDE_SYMBOL(name) "\n" \
+ HIDE_SYMBOL(label) "\n" \
SYMBOL_STRING(label) ":\n"
#endif
diff --git a/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp b/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp
index b13e84b53..ca3eb1eb0 100644
--- a/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp
+++ b/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp
@@ -475,8 +475,10 @@ LLINT_SLOW_PATH_DECL(slow_path_convert_this)
LLINT_BEGIN();
JSValue v1 = LLINT_OP(1).jsValue();
ASSERT(v1.isPrimitive());
+#if ENABLE(VALUE_PROFILER)
pc[OPCODE_LENGTH(op_convert_this) - 1].u.profile->m_buckets[0] =
JSValue::encode(v1.structureOrUndefined());
+#endif
LLINT_RETURN(v1.toThisObject(exec));
}
@@ -621,64 +623,88 @@ LLINT_SLOW_PATH_DECL(slow_path_add)
LLINT_RETURN(jsAddSlowCase(exec, v1, v2));
}
+// The following arithmetic and bitwise operations need to be sure to run
+// toNumber() on their operands in order. (A call to toNumber() is idempotent
+// if an exception is already set on the ExecState.)
+
LLINT_SLOW_PATH_DECL(slow_path_mul)
{
LLINT_BEGIN();
- LLINT_RETURN(jsNumber(LLINT_OP_C(2).jsValue().toNumber(exec) * LLINT_OP_C(3).jsValue().toNumber(exec)));
+ double a = LLINT_OP_C(2).jsValue().toNumber(exec);
+ double b = LLINT_OP_C(3).jsValue().toNumber(exec);
+ LLINT_RETURN(jsNumber(a * b));
}
LLINT_SLOW_PATH_DECL(slow_path_sub)
{
LLINT_BEGIN();
- LLINT_RETURN(jsNumber(LLINT_OP_C(2).jsValue().toNumber(exec) - LLINT_OP_C(3).jsValue().toNumber(exec)));
+ double a = LLINT_OP_C(2).jsValue().toNumber(exec);
+ double b = LLINT_OP_C(3).jsValue().toNumber(exec);
+ LLINT_RETURN(jsNumber(a - b));
}
LLINT_SLOW_PATH_DECL(slow_path_div)
{
LLINT_BEGIN();
- LLINT_RETURN(jsNumber(LLINT_OP_C(2).jsValue().toNumber(exec) / LLINT_OP_C(3).jsValue().toNumber(exec)));
+ double a = LLINT_OP_C(2).jsValue().toNumber(exec);
+ double b = LLINT_OP_C(3).jsValue().toNumber(exec);
+ LLINT_RETURN(jsNumber(a / b));
}
LLINT_SLOW_PATH_DECL(slow_path_mod)
{
LLINT_BEGIN();
- LLINT_RETURN(jsNumber(fmod(LLINT_OP_C(2).jsValue().toNumber(exec), LLINT_OP_C(3).jsValue().toNumber(exec))));
+ double a = LLINT_OP_C(2).jsValue().toNumber(exec);
+ double b = LLINT_OP_C(3).jsValue().toNumber(exec);
+ LLINT_RETURN(jsNumber(fmod(a, b)));
}
LLINT_SLOW_PATH_DECL(slow_path_lshift)
{
LLINT_BEGIN();
- LLINT_RETURN(jsNumber(LLINT_OP_C(2).jsValue().toInt32(exec) << (LLINT_OP_C(3).jsValue().toUInt32(exec) & 31)));
+ int32_t a = LLINT_OP_C(2).jsValue().toInt32(exec);
+ uint32_t b = LLINT_OP_C(3).jsValue().toUInt32(exec);
+ LLINT_RETURN(jsNumber(a << (b & 31)));
}
LLINT_SLOW_PATH_DECL(slow_path_rshift)
{
LLINT_BEGIN();
- LLINT_RETURN(jsNumber(LLINT_OP_C(2).jsValue().toInt32(exec) >> (LLINT_OP_C(3).jsValue().toUInt32(exec) & 31)));
+ int32_t a = LLINT_OP_C(2).jsValue().toInt32(exec);
+ uint32_t b = LLINT_OP_C(3).jsValue().toUInt32(exec);
+ LLINT_RETURN(jsNumber(a >> (b & 31)));
}
LLINT_SLOW_PATH_DECL(slow_path_urshift)
{
LLINT_BEGIN();
- LLINT_RETURN(jsNumber(LLINT_OP_C(2).jsValue().toUInt32(exec) >> (LLINT_OP_C(3).jsValue().toUInt32(exec) & 31)));
+ uint32_t a = LLINT_OP_C(2).jsValue().toUInt32(exec);
+ uint32_t b = LLINT_OP_C(3).jsValue().toUInt32(exec);
+ LLINT_RETURN(jsNumber(a >> (b & 31)));
}
LLINT_SLOW_PATH_DECL(slow_path_bitand)
{
LLINT_BEGIN();
- LLINT_RETURN(jsNumber(LLINT_OP_C(2).jsValue().toInt32(exec) & LLINT_OP_C(3).jsValue().toInt32(exec)));
+ int32_t a = LLINT_OP_C(2).jsValue().toInt32(exec);
+ int32_t b = LLINT_OP_C(3).jsValue().toInt32(exec);
+ LLINT_RETURN(jsNumber(a & b));
}
LLINT_SLOW_PATH_DECL(slow_path_bitor)
{
LLINT_BEGIN();
- LLINT_RETURN(jsNumber(LLINT_OP_C(2).jsValue().toInt32(exec) | LLINT_OP_C(3).jsValue().toInt32(exec)));
+ int32_t a = LLINT_OP_C(2).jsValue().toInt32(exec);
+ int32_t b = LLINT_OP_C(3).jsValue().toInt32(exec);
+ LLINT_RETURN(jsNumber(a | b));
}
LLINT_SLOW_PATH_DECL(slow_path_bitxor)
{
LLINT_BEGIN();
- LLINT_RETURN(jsNumber(LLINT_OP_C(2).jsValue().toInt32(exec) ^ LLINT_OP_C(3).jsValue().toInt32(exec)));
+ int32_t a = LLINT_OP_C(2).jsValue().toInt32(exec);
+ int32_t b = LLINT_OP_C(3).jsValue().toInt32(exec);
+ LLINT_RETURN(jsNumber(a ^ b));
}
LLINT_SLOW_PATH_DECL(slow_path_check_has_instance)
@@ -832,6 +858,14 @@ LLINT_SLOW_PATH_DECL(slow_path_resolve_with_this)
LLINT_END();
}
+LLINT_SLOW_PATH_DECL(slow_path_put_global_var_check)
+{
+ LLINT_BEGIN();
+ CodeBlock* codeBlock = exec->codeBlock();
+ symbolTablePut(codeBlock->globalObject(), exec, codeBlock->identifier(pc[4].u.operand), LLINT_OP_C(2).jsValue(), true);
+ LLINT_END();
+}
+
LLINT_SLOW_PATH_DECL(slow_path_get_by_id)
{
LLINT_BEGIN();
@@ -902,6 +936,8 @@ LLINT_SLOW_PATH_DECL(slow_path_put_by_id)
if (slot.type() == PutPropertySlot::NewProperty) {
if (!structure->isDictionary() && structure->previousID()->propertyStorageCapacity() == structure->propertyStorageCapacity()) {
+ ASSERT(structure->previousID()->transitionWatchpointSetHasBeenInvalidated());
+
// This is needed because some of the methods we call
// below may GC.
pc[0].u.opcode = bitwise_cast<void*>(&llint_op_put_by_id);
@@ -987,7 +1023,7 @@ LLINT_SLOW_PATH_DECL(slow_path_get_argument_by_val)
exec->uncheckedR(unmodifiedArgumentsRegister(pc[2].u.operand)) = arguments;
}
- LLINT_RETURN(getByVal(exec, arguments, LLINT_OP_C(3).jsValue()));
+ LLINT_RETURN_PROFILED(op_get_argument_by_val, getByVal(exec, arguments, LLINT_OP_C(3).jsValue()));
}
LLINT_SLOW_PATH_DECL(slow_path_get_by_pname)
@@ -1546,14 +1582,16 @@ LLINT_SLOW_PATH_DECL(slow_path_debug)
LLINT_SLOW_PATH_DECL(slow_path_profile_will_call)
{
LLINT_BEGIN();
- (*Profiler::enabledProfilerReference())->willExecute(exec, LLINT_OP(1).jsValue());
+ if (Profiler* profiler = globalData.enabledProfiler())
+ profiler->willExecute(exec, LLINT_OP(1).jsValue());
LLINT_END();
}
LLINT_SLOW_PATH_DECL(slow_path_profile_did_call)
{
LLINT_BEGIN();
- (*Profiler::enabledProfilerReference())->didExecute(exec, LLINT_OP(1).jsValue());
+ if (Profiler* profiler = globalData.enabledProfiler())
+ profiler->didExecute(exec, LLINT_OP(1).jsValue());
LLINT_END();
}
diff --git a/Source/JavaScriptCore/llint/LLIntSlowPaths.h b/Source/JavaScriptCore/llint/LLIntSlowPaths.h
index a91cf797e..2e069d073 100644
--- a/Source/JavaScriptCore/llint/LLIntSlowPaths.h
+++ b/Source/JavaScriptCore/llint/LLIntSlowPaths.h
@@ -78,118 +78,122 @@ extern "C" SlowPathReturnType llint_trace_value(ExecState*, Instruction*, int fr
#define LLINT_SLOW_PATH_DECL(name) \
extern "C" SlowPathReturnType llint_##name(ExecState* exec, Instruction* pc)
-LLINT_SLOW_PATH_DECL(trace_prologue);
-LLINT_SLOW_PATH_DECL(trace_prologue_function_for_call);
-LLINT_SLOW_PATH_DECL(trace_prologue_function_for_construct);
-LLINT_SLOW_PATH_DECL(trace_arityCheck_for_call);
-LLINT_SLOW_PATH_DECL(trace_arityCheck_for_construct);
-LLINT_SLOW_PATH_DECL(trace);
-LLINT_SLOW_PATH_DECL(special_trace);
-LLINT_SLOW_PATH_DECL(entry_osr);
-LLINT_SLOW_PATH_DECL(entry_osr_function_for_call);
-LLINT_SLOW_PATH_DECL(entry_osr_function_for_construct);
-LLINT_SLOW_PATH_DECL(entry_osr_function_for_call_arityCheck);
-LLINT_SLOW_PATH_DECL(entry_osr_function_for_construct_arityCheck);
-LLINT_SLOW_PATH_DECL(loop_osr);
-LLINT_SLOW_PATH_DECL(replace);
-LLINT_SLOW_PATH_DECL(register_file_check);
-LLINT_SLOW_PATH_DECL(slow_path_call_arityCheck);
-LLINT_SLOW_PATH_DECL(slow_path_construct_arityCheck);
-LLINT_SLOW_PATH_DECL(slow_path_create_activation);
-LLINT_SLOW_PATH_DECL(slow_path_create_arguments);
-LLINT_SLOW_PATH_DECL(slow_path_create_this);
-LLINT_SLOW_PATH_DECL(slow_path_convert_this);
-LLINT_SLOW_PATH_DECL(slow_path_new_object);
-LLINT_SLOW_PATH_DECL(slow_path_new_array);
-LLINT_SLOW_PATH_DECL(slow_path_new_array_buffer);
-LLINT_SLOW_PATH_DECL(slow_path_new_regexp);
-LLINT_SLOW_PATH_DECL(slow_path_not);
-LLINT_SLOW_PATH_DECL(slow_path_eq);
-LLINT_SLOW_PATH_DECL(slow_path_neq);
-LLINT_SLOW_PATH_DECL(slow_path_stricteq);
-LLINT_SLOW_PATH_DECL(slow_path_nstricteq);
-LLINT_SLOW_PATH_DECL(slow_path_less);
-LLINT_SLOW_PATH_DECL(slow_path_lesseq);
-LLINT_SLOW_PATH_DECL(slow_path_greater);
-LLINT_SLOW_PATH_DECL(slow_path_greatereq);
-LLINT_SLOW_PATH_DECL(slow_path_pre_inc);
-LLINT_SLOW_PATH_DECL(slow_path_pre_dec);
-LLINT_SLOW_PATH_DECL(slow_path_post_inc);
-LLINT_SLOW_PATH_DECL(slow_path_post_dec);
-LLINT_SLOW_PATH_DECL(slow_path_to_jsnumber);
-LLINT_SLOW_PATH_DECL(slow_path_negate);
-LLINT_SLOW_PATH_DECL(slow_path_add);
-LLINT_SLOW_PATH_DECL(slow_path_mul);
-LLINT_SLOW_PATH_DECL(slow_path_sub);
-LLINT_SLOW_PATH_DECL(slow_path_div);
-LLINT_SLOW_PATH_DECL(slow_path_mod);
-LLINT_SLOW_PATH_DECL(slow_path_lshift);
-LLINT_SLOW_PATH_DECL(slow_path_rshift);
-LLINT_SLOW_PATH_DECL(slow_path_urshift);
-LLINT_SLOW_PATH_DECL(slow_path_bitand);
-LLINT_SLOW_PATH_DECL(slow_path_bitor);
-LLINT_SLOW_PATH_DECL(slow_path_bitxor);
-LLINT_SLOW_PATH_DECL(slow_path_check_has_instance);
-LLINT_SLOW_PATH_DECL(slow_path_instanceof);
-LLINT_SLOW_PATH_DECL(slow_path_typeof);
-LLINT_SLOW_PATH_DECL(slow_path_is_object);
-LLINT_SLOW_PATH_DECL(slow_path_is_function);
-LLINT_SLOW_PATH_DECL(slow_path_in);
-LLINT_SLOW_PATH_DECL(slow_path_resolve);
-LLINT_SLOW_PATH_DECL(slow_path_resolve_skip);
-LLINT_SLOW_PATH_DECL(slow_path_resolve_global);
-LLINT_SLOW_PATH_DECL(slow_path_resolve_global_dynamic);
-LLINT_SLOW_PATH_DECL(slow_path_resolve_for_resolve_global_dynamic);
-LLINT_SLOW_PATH_DECL(slow_path_resolve_base);
-LLINT_SLOW_PATH_DECL(slow_path_ensure_property_exists);
-LLINT_SLOW_PATH_DECL(slow_path_resolve_with_base);
-LLINT_SLOW_PATH_DECL(slow_path_resolve_with_this);
-LLINT_SLOW_PATH_DECL(slow_path_get_by_id);
-LLINT_SLOW_PATH_DECL(slow_path_get_arguments_length);
-LLINT_SLOW_PATH_DECL(slow_path_put_by_id);
-LLINT_SLOW_PATH_DECL(slow_path_del_by_id);
-LLINT_SLOW_PATH_DECL(slow_path_get_by_val);
-LLINT_SLOW_PATH_DECL(slow_path_get_argument_by_val);
-LLINT_SLOW_PATH_DECL(slow_path_get_by_pname);
-LLINT_SLOW_PATH_DECL(slow_path_put_by_val);
-LLINT_SLOW_PATH_DECL(slow_path_del_by_val);
-LLINT_SLOW_PATH_DECL(slow_path_put_by_index);
-LLINT_SLOW_PATH_DECL(slow_path_put_getter_setter);
-LLINT_SLOW_PATH_DECL(slow_path_jmp_scopes);
-LLINT_SLOW_PATH_DECL(slow_path_jtrue);
-LLINT_SLOW_PATH_DECL(slow_path_jfalse);
-LLINT_SLOW_PATH_DECL(slow_path_jless);
-LLINT_SLOW_PATH_DECL(slow_path_jnless);
-LLINT_SLOW_PATH_DECL(slow_path_jgreater);
-LLINT_SLOW_PATH_DECL(slow_path_jngreater);
-LLINT_SLOW_PATH_DECL(slow_path_jlesseq);
-LLINT_SLOW_PATH_DECL(slow_path_jnlesseq);
-LLINT_SLOW_PATH_DECL(slow_path_jgreatereq);
-LLINT_SLOW_PATH_DECL(slow_path_jngreatereq);
-LLINT_SLOW_PATH_DECL(slow_path_switch_imm);
-LLINT_SLOW_PATH_DECL(slow_path_switch_char);
-LLINT_SLOW_PATH_DECL(slow_path_switch_string);
-LLINT_SLOW_PATH_DECL(slow_path_new_func);
-LLINT_SLOW_PATH_DECL(slow_path_new_func_exp);
-LLINT_SLOW_PATH_DECL(slow_path_call);
-LLINT_SLOW_PATH_DECL(slow_path_construct);
-LLINT_SLOW_PATH_DECL(slow_path_call_varargs);
-LLINT_SLOW_PATH_DECL(slow_path_call_eval);
-LLINT_SLOW_PATH_DECL(slow_path_tear_off_activation);
-LLINT_SLOW_PATH_DECL(slow_path_tear_off_arguments);
-LLINT_SLOW_PATH_DECL(slow_path_strcat);
-LLINT_SLOW_PATH_DECL(slow_path_to_primitive);
-LLINT_SLOW_PATH_DECL(slow_path_get_pnames);
-LLINT_SLOW_PATH_DECL(slow_path_next_pname);
-LLINT_SLOW_PATH_DECL(slow_path_push_scope);
-LLINT_SLOW_PATH_DECL(slow_path_pop_scope);
-LLINT_SLOW_PATH_DECL(slow_path_push_new_scope);
-LLINT_SLOW_PATH_DECL(slow_path_throw);
-LLINT_SLOW_PATH_DECL(slow_path_throw_reference_error);
-LLINT_SLOW_PATH_DECL(slow_path_debug);
-LLINT_SLOW_PATH_DECL(slow_path_profile_will_call);
-LLINT_SLOW_PATH_DECL(slow_path_profile_did_call);
-LLINT_SLOW_PATH_DECL(throw_from_native_call);
+#define LLINT_SLOW_PATH_HIDDEN_DECL(name) \
+ LLINT_SLOW_PATH_DECL(name) WTF_INTERNAL
+
+LLINT_SLOW_PATH_HIDDEN_DECL(trace_prologue);
+LLINT_SLOW_PATH_HIDDEN_DECL(trace_prologue_function_for_call);
+LLINT_SLOW_PATH_HIDDEN_DECL(trace_prologue_function_for_construct);
+LLINT_SLOW_PATH_HIDDEN_DECL(trace_arityCheck_for_call);
+LLINT_SLOW_PATH_HIDDEN_DECL(trace_arityCheck_for_construct);
+LLINT_SLOW_PATH_HIDDEN_DECL(trace);
+LLINT_SLOW_PATH_HIDDEN_DECL(special_trace);
+LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr);
+LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr_function_for_call);
+LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr_function_for_construct);
+LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr_function_for_call_arityCheck);
+LLINT_SLOW_PATH_HIDDEN_DECL(entry_osr_function_for_construct_arityCheck);
+LLINT_SLOW_PATH_HIDDEN_DECL(loop_osr);
+LLINT_SLOW_PATH_HIDDEN_DECL(replace);
+LLINT_SLOW_PATH_HIDDEN_DECL(register_file_check);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_call_arityCheck);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_construct_arityCheck);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_create_activation);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_create_arguments);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_create_this);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_convert_this);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_object);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_array);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_array_buffer);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_regexp);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_not);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_eq);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_neq);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_stricteq);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_nstricteq);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_less);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_lesseq);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_greater);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_greatereq);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_pre_inc);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_pre_dec);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_post_inc);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_post_dec);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_to_jsnumber);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_negate);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_add);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_mul);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_sub);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_div);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_mod);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_lshift);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_rshift);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_urshift);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_bitand);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_bitor);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_bitxor);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_check_has_instance);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_instanceof);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_typeof);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_is_object);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_is_function);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_in);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_skip);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_global);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_global_dynamic);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_for_resolve_global_dynamic);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_base);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_ensure_property_exists);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_with_base);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_resolve_with_this);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_global_var_check);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_by_id);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_arguments_length);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_by_id);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_del_by_id);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_by_val);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_argument_by_val);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_by_pname);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_by_val);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_del_by_val);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_by_index);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_put_getter_setter);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jmp_scopes);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jtrue);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jfalse);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jless);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jnless);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jgreater);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jngreater);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jlesseq);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jnlesseq);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jgreatereq);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_jngreatereq);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_switch_imm);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_switch_char);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_switch_string);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_func);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_new_func_exp);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_call);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_construct);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_call_varargs);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_call_eval);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_tear_off_activation);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_tear_off_arguments);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_strcat);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_to_primitive);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_pnames);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_next_pname);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_push_scope);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_pop_scope);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_push_new_scope);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_throw);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_throw_reference_error);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_debug);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_profile_will_call);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_profile_did_call);
+LLINT_SLOW_PATH_HIDDEN_DECL(throw_from_native_call);
} } // namespace JSC::LLInt
diff --git a/Source/JavaScriptCore/llint/LLIntThunks.cpp b/Source/JavaScriptCore/llint/LLIntThunks.cpp
index b4d026423..6a6a579a3 100644
--- a/Source/JavaScriptCore/llint/LLIntThunks.cpp
+++ b/Source/JavaScriptCore/llint/LLIntThunks.cpp
@@ -36,7 +36,7 @@
namespace JSC { namespace LLInt {
-static MacroAssemblerCodeRef generateThunkWithJumpTo(JSGlobalData* globalData, void (*target)())
+static MacroAssemblerCodeRef generateThunkWithJumpTo(JSGlobalData* globalData, void (*target)(), const char *thunkKind)
{
JSInterfaceJIT jit;
@@ -45,37 +45,37 @@ static MacroAssemblerCodeRef generateThunkWithJumpTo(JSGlobalData* globalData, v
jit.jump(JSInterfaceJIT::regT0);
LinkBuffer patchBuffer(*globalData, &jit, GLOBAL_THUNK_ID);
- return patchBuffer.finalizeCode();
+ return FINALIZE_CODE(patchBuffer, ("LLInt %s prologue thunk", thunkKind));
}
MacroAssemblerCodeRef functionForCallEntryThunkGenerator(JSGlobalData* globalData)
{
- return generateThunkWithJumpTo(globalData, llint_function_for_call_prologue);
+ return generateThunkWithJumpTo(globalData, llint_function_for_call_prologue, "function for call");
}
MacroAssemblerCodeRef functionForConstructEntryThunkGenerator(JSGlobalData* globalData)
{
- return generateThunkWithJumpTo(globalData, llint_function_for_construct_prologue);
+ return generateThunkWithJumpTo(globalData, llint_function_for_construct_prologue, "function for construct");
}
MacroAssemblerCodeRef functionForCallArityCheckThunkGenerator(JSGlobalData* globalData)
{
- return generateThunkWithJumpTo(globalData, llint_function_for_call_arity_check);
+ return generateThunkWithJumpTo(globalData, llint_function_for_call_arity_check, "function for call with arity check");
}
MacroAssemblerCodeRef functionForConstructArityCheckThunkGenerator(JSGlobalData* globalData)
{
- return generateThunkWithJumpTo(globalData, llint_function_for_construct_arity_check);
+ return generateThunkWithJumpTo(globalData, llint_function_for_construct_arity_check, "function for construct with arity check");
}
MacroAssemblerCodeRef evalEntryThunkGenerator(JSGlobalData* globalData)
{
- return generateThunkWithJumpTo(globalData, llint_eval_prologue);
+ return generateThunkWithJumpTo(globalData, llint_eval_prologue, "eval");
}
MacroAssemblerCodeRef programEntryThunkGenerator(JSGlobalData* globalData)
{
- return generateThunkWithJumpTo(globalData, llint_program_prologue);
+ return generateThunkWithJumpTo(globalData, llint_program_prologue, "program");
}
} } // namespace JSC::LLInt
diff --git a/Source/JavaScriptCore/llint/LowLevelInterpreter.asm b/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
index bbfa859f2..e59ddeba4 100644
--- a/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
+++ b/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
@@ -103,7 +103,7 @@ end
# Some common utilities.
macro crash()
- storei 0, 0xbbadbeef[]
+ storei t0, 0xbbadbeef[]
move 0, t0
call t0
end
@@ -727,19 +727,13 @@ _llint_op_throw_reference_error:
_llint_op_profile_will_call:
traceExecution()
- loadp JITStackFrame::enabledProfilerReference[sp], t0
- btpz [t0], .opProfileWillCallDone
callSlowPath(_llint_slow_path_profile_will_call)
-.opProfileWillCallDone:
dispatch(2)
_llint_op_profile_did_call:
traceExecution()
- loadp JITStackFrame::enabledProfilerReference[sp], t0
- btpz [t0], .opProfileWillCallDone
callSlowPath(_llint_slow_path_profile_did_call)
-.opProfileDidCallDone:
dispatch(2)
diff --git a/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm b/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
index 95b26d42f..d27fd8229 100644
--- a/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
+++ b/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
@@ -1039,36 +1039,54 @@ _llint_op_put_scoped_var:
dispatch(4)
-_llint_op_get_global_var:
+macro getGlobalVar(size)
traceExecution()
- loadi 8[PC], t1
+ loadp 8[PC], t0
loadi 4[PC], t3
- loadp CodeBlock[cfr], t0
- loadp CodeBlock::m_globalObject[t0], t0
- loadp JSGlobalObject::m_registers[t0], t0
- loadi TagOffset[t0, t1, 8], t2
- loadi PayloadOffset[t0, t1, 8], t1
+ loadi TagOffset[t0], t2
+ loadi PayloadOffset[t0], t1
storei t2, TagOffset[cfr, t3, 8]
storei t1, PayloadOffset[cfr, t3, 8]
- loadi 12[PC], t3
+ loadi (size - 1) * 4[PC], t3
valueProfile(t2, t1, t3)
- dispatch(4)
+ dispatch(size)
+end
+
+_llint_op_get_global_var:
+ getGlobalVar(4)
+
+
+_llint_op_get_global_var_watchable:
+ getGlobalVar(5)
_llint_op_put_global_var:
traceExecution()
loadi 8[PC], t1
- loadp CodeBlock[cfr], t0
- loadp CodeBlock::m_globalObject[t0], t0
- loadp JSGlobalObject::m_registers[t0], t0
+ loadi 4[PC], t0
loadConstantOrVariable(t1, t2, t3)
- loadi 4[PC], t1
writeBarrier(t2, t3)
- storei t2, TagOffset[t0, t1, 8]
- storei t3, PayloadOffset[t0, t1, 8]
+ storei t2, TagOffset[t0]
+ storei t3, PayloadOffset[t0]
dispatch(3)
+_llint_op_put_global_var_check:
+ traceExecution()
+ loadp 12[PC], t2
+ loadi 8[PC], t1
+ loadi 4[PC], t0
+ btbnz [t2], .opPutGlobalVarCheckSlow
+ loadConstantOrVariable(t1, t2, t3)
+ writeBarrier(t2, t3)
+ storei t2, TagOffset[t0]
+ storei t3, PayloadOffset[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
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