diff options
| author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-05-24 08:28:08 +0000 |
|---|---|---|
| committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-05-24 08:28:08 +0000 |
| commit | a4e969f4965059196ca948db781e52f7cfebf19e (patch) | |
| tree | 6ca352808c8fdc52006a0f33f6ae3c593b23867d /Source/JavaScriptCore/dfg/DFGCapabilities.cpp | |
| parent | 41386e9cb918eed93b3f13648cbef387e371e451 (diff) | |
| download | WebKitGtk-tarball-a4e969f4965059196ca948db781e52f7cfebf19e.tar.gz | |
webkitgtk-2.12.3webkitgtk-2.12.3
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGCapabilities.cpp')
| -rw-r--r-- | Source/JavaScriptCore/dfg/DFGCapabilities.cpp | 124 |
1 files changed, 80 insertions, 44 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGCapabilities.cpp b/Source/JavaScriptCore/dfg/DFGCapabilities.cpp index e6fcd8c11..d100d97d5 100644 --- a/Source/JavaScriptCore/dfg/DFGCapabilities.cpp +++ b/Source/JavaScriptCore/dfg/DFGCapabilities.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011, 2013, 2014 Apple Inc. All rights reserved. + * Copyright (C) 2011, 2013-2015 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -31,44 +31,65 @@ #include "CodeBlock.h" #include "DFGCommon.h" #include "Interpreter.h" +#include "JSCInlines.h" +#include "Options.h" namespace JSC { namespace DFG { -#if ENABLE(DFG_JIT) +bool isSupported() +{ + return Options::useDFGJIT() + && MacroAssembler::supportsFloatingPoint(); +} + +bool isSupportedForInlining(CodeBlock* codeBlock) +{ +#if ENABLE(WEBASSEMBLY) + if (codeBlock->ownerExecutable()->isWebAssemblyExecutable()) + return false; +#endif + return codeBlock->ownerScriptExecutable()->isInliningCandidate(); +} + bool mightCompileEval(CodeBlock* codeBlock) { - return codeBlock->instructionCount() <= Options::maximumOptimizationCandidateInstructionCount(); + return isSupported() + && codeBlock->instructionCount() <= Options::maximumOptimizationCandidateInstructionCount() + && codeBlock->ownerScriptExecutable()->isOkToOptimize(); } bool mightCompileProgram(CodeBlock* codeBlock) { - return codeBlock->instructionCount() <= Options::maximumOptimizationCandidateInstructionCount(); + return isSupported() + && codeBlock->instructionCount() <= Options::maximumOptimizationCandidateInstructionCount() + && codeBlock->ownerScriptExecutable()->isOkToOptimize(); } bool mightCompileFunctionForCall(CodeBlock* codeBlock) { - return codeBlock->instructionCount() <= Options::maximumOptimizationCandidateInstructionCount(); + return isSupported() + && codeBlock->instructionCount() <= Options::maximumOptimizationCandidateInstructionCount() + && codeBlock->ownerScriptExecutable()->isOkToOptimize(); } bool mightCompileFunctionForConstruct(CodeBlock* codeBlock) { - return codeBlock->instructionCount() <= Options::maximumOptimizationCandidateInstructionCount(); + return isSupported() + && codeBlock->instructionCount() <= Options::maximumOptimizationCandidateInstructionCount() + && codeBlock->ownerScriptExecutable()->isOkToOptimize(); } bool mightInlineFunctionForCall(CodeBlock* codeBlock) { return codeBlock->instructionCount() <= Options::maximumFunctionForCallInlineCandidateInstructionCount() - && !codeBlock->ownerExecutable()->needsActivation() - && codeBlock->ownerExecutable()->isInliningCandidate(); + && isSupportedForInlining(codeBlock); } bool mightInlineFunctionForClosureCall(CodeBlock* codeBlock) { return codeBlock->instructionCount() <= Options::maximumFunctionForClosureCallInlineCandidateInstructionCount() - && !codeBlock->ownerExecutable()->needsActivation() - && codeBlock->ownerExecutable()->isInliningCandidate(); + && isSupportedForInlining(codeBlock); } bool mightInlineFunctionForConstruct(CodeBlock* codeBlock) { return codeBlock->instructionCount() <= Options::maximumFunctionForConstructInlineCandidateInstructionCount() - && !codeBlock->ownerExecutable()->needsActivation() - && codeBlock->ownerExecutable()->isInliningCandidate(); + && isSupportedForInlining(codeBlock); } inline void debugFail(CodeBlock* codeBlock, OpcodeID opcodeID, CapabilityLevel result) @@ -79,12 +100,13 @@ inline void debugFail(CodeBlock* codeBlock, OpcodeID opcodeID, CapabilityLevel r CapabilityLevel capabilityLevel(OpcodeID opcodeID, CodeBlock* codeBlock, Instruction* pc) { + UNUSED_PARAM(codeBlock); // This function does some bytecode parsing. Ordinarily bytecode parsing requires the owning CodeBlock. It's sort of strange that we don't use it here right now. + switch (opcodeID) { case op_enter: - case op_touch_entry: case op_to_this: + case op_check_tdz: case op_create_this: - case op_get_callee: case op_bitand: case op_bitor: case op_bitxor: @@ -103,15 +125,18 @@ CapabilityLevel capabilityLevel(OpcodeID opcodeID, CodeBlock* codeBlock, Instruc case op_debug: case op_profile_will_call: case op_profile_did_call: + case op_profile_type: + case op_profile_control_flow: case op_mov: - case op_captured_mov: - case op_check_has_instance: + case op_overrides_has_instance: case op_instanceof: + case op_instanceof_custom: case op_is_undefined: case op_is_boolean: case op_is_number: case op_is_string: case op_is_object: + case op_is_object_or_null: case op_is_function: case op_not: case op_less: @@ -128,16 +153,13 @@ CapabilityLevel capabilityLevel(OpcodeID opcodeID, CodeBlock* codeBlock, Instruc case op_put_by_val: case op_put_by_val_direct: case op_get_by_id: - case op_get_by_id_out_of_line: case op_get_array_length: case op_put_by_id: - case op_put_by_id_out_of_line: - case op_put_by_id_transition_direct: - case op_put_by_id_transition_direct_out_of_line: - case op_put_by_id_transition_normal: - case op_put_by_id_transition_normal_out_of_line: - case op_init_global_const_nop: - case op_init_global_const: + case op_put_getter_by_id: + case op_put_setter_by_id: + case op_put_getter_setter_by_id: + case op_put_getter_by_val: + case op_put_setter_by_val: case op_jmp: case op_jtrue: case op_jfalse: @@ -152,6 +174,7 @@ CapabilityLevel capabilityLevel(OpcodeID opcodeID, CodeBlock* codeBlock, Instruc case op_jngreater: case op_jngreatereq: case op_loop_hint: + case op_watchdog: case op_ret: case op_end: case op_new_object: @@ -163,23 +186,48 @@ CapabilityLevel capabilityLevel(OpcodeID opcodeID, CodeBlock* codeBlock, Instruc case op_throw: case op_throw_static_error: case op_call: + case op_tail_call: case op_construct: - case op_init_lazy_reg: - case op_create_arguments: - case op_tear_off_arguments: - case op_get_argument_by_val: - case op_get_arguments_length: + case op_call_varargs: + case op_tail_call_varargs: + case op_construct_varargs: + case op_create_direct_arguments: + case op_create_scoped_arguments: + case op_create_out_of_band_arguments: + case op_get_from_arguments: + case op_put_to_arguments: case op_jneq_ptr: case op_typeof: case op_to_number: + case op_to_string: case op_switch_imm: case op_switch_char: case op_in: + case op_get_scope: case op_get_from_scope: + case op_get_enumerable_length: + case op_has_generic_property: + case op_has_structure_property: + case op_has_indexed_property: + case op_get_direct_pname: + case op_get_property_enumerator: + case op_enumerator_structure_pname: + case op_enumerator_generic_pname: + case op_to_index_string: + case op_new_func: + case op_new_func_exp: + case op_new_generator_func: + case op_new_generator_func_exp: + case op_new_arrow_func_exp: + case op_create_lexical_environment: + case op_get_parent_scope: + case op_catch: + case op_copy_rest: + case op_get_rest_length: return CanCompileAndInline; case op_put_to_scope: { - ResolveType resolveType = ResolveModeAndType(pc[4].u.operand).type(); + ResolveType resolveType = GetPutInfo(pc[4].u.operand).resolveType(); // If we're writing to a readonly property we emit a Dynamic put that // the DFG can't currently handle. if (resolveType == Dynamic) @@ -189,23 +237,13 @@ CapabilityLevel capabilityLevel(OpcodeID opcodeID, CodeBlock* codeBlock, Instruc case op_resolve_scope: { // We don't compile 'catch' or 'with', so there's no point in compiling variable resolution within them. - ResolveType resolveType = ResolveModeAndType(pc[3].u.operand).type(); + ResolveType resolveType = static_cast<ResolveType>(pc[4].u.operand); if (resolveType == Dynamic) return CannotCompile; return CanCompileAndInline; } - case op_call_varargs: - if (codeBlock->usesArguments() && pc[4].u.operand == codeBlock->argumentsRegister().offset()) - return CanInline; - return CannotCompile; - - case op_new_regexp: - case op_create_activation: - case op_tear_off_activation: - case op_new_func: - case op_new_captured_func: - case op_new_func_exp: + case op_new_regexp: case op_switch_string: // Don't inline because we don't want to copy string tables in the concurrent JIT. return CanCompile; @@ -244,8 +282,6 @@ CapabilityLevel capabilityLevel(CodeBlock* codeBlock) return result; } -#endif - } } // namespace JSC::DFG #endif |
