diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-06-20 13:01:08 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-06-20 13:01:08 +0200 |
commit | 49233e234e5c787396cadb2cea33b31ae0cd65c1 (patch) | |
tree | 5410cb9a8fd53168bb60d62c54b654d86f03c38d /Source/JavaScriptCore/llint | |
parent | b211c645d8ab690f713515dfdc84d80b11c27d2c (diff) | |
download | qtwebkit-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.h | 4 | ||||
-rw-r--r-- | Source/JavaScriptCore/llint/LLIntSlowPaths.cpp | 64 | ||||
-rw-r--r-- | Source/JavaScriptCore/llint/LLIntSlowPaths.h | 228 | ||||
-rw-r--r-- | Source/JavaScriptCore/llint/LLIntThunks.cpp | 16 | ||||
-rw-r--r-- | Source/JavaScriptCore/llint/LowLevelInterpreter.asm | 8 | ||||
-rw-r--r-- | Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm | 48 | ||||
-rw-r--r-- | Source/JavaScriptCore/llint/LowLevelInterpreter64.asm | 47 |
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 |