38 const int Deoptimizer::table_entry_size_ = 16;
42 const int kCallInstructionSizeInWords = 3;
51 if (!function->IsOptimized())
return;
55 function->shared()->ClearOptimizedCodeMap();
72 for (
int i = 0; i < deopt_data->
DeoptCount(); i++) {
73 if (deopt_data->Pc(i)->value() == -1)
continue;
74 Address call_address = code_start_address + deopt_data->Pc(i)->value();
78 int call_size_in_bytes =
84 CodePatcher patcher(call_address, call_size_in_words);
87 call_address >= prev_call_address +
patch_size());
90 prev_call_address = call_address;
99 node->
set_next(data->deoptimizing_code_list_);
100 data->deoptimizing_code_list_ = node;
109 if (FLAG_trace_deopt) {
110 PrintF(
"[forced deoptimization: ");
111 function->PrintName();
112 PrintF(
" / %x]\n", reinterpret_cast<uint32_t>(
function));
117 static const int32_t kBranchBeforeStackCheck = 0x2a000001;
118 static const int32_t kBranchBeforeInterrupt = 0x5a000004;
124 Code* replacement_code) {
134 if (FLAG_count_based_interrupts) {
157 2 * kInstrSize) & 0xfff;
158 Address stack_check_address_pointer = pc_after + stack_check_address_offset;
160 reinterpret_cast<uint32_t>(check_code->
entry()));
162 reinterpret_cast<uint32_t
>(replacement_code->
entry());
165 unoptimized_code, pc_after - 2 * kInstrSize, replacement_code);
172 Code* replacement_code) {
180 if (FLAG_count_based_interrupts) {
193 2 * kInstrSize) & 0xfff;
194 Address stack_check_address_pointer = pc_after + stack_check_address_offset;
196 reinterpret_cast<uint32_t>(replacement_code->
entry()));
198 reinterpret_cast<uint32_t
>(check_code->
entry());
201 unoptimized_code, pc_after - 2 * kInstrSize, check_code);
206 ByteArray* translations = data->TranslationByteArray();
208 for (
int i = 0; i < length; i++) {
209 if (data->
AstId(i) == ast_id) {
210 TranslationIterator it(translations, data->TranslationIndex(i)->value());
211 int value = it.Next();
212 ASSERT(Translation::BEGIN == static_cast<Translation::Opcode>(value));
215 if (value == 1)
return i;
223 void Deoptimizer::DoComputeOsrOutputFrame() {
225 optimized_code_->deoptimization_data());
226 unsigned ast_id = data->OsrAstId()->value();
228 int bailout_id = LookupBailoutId(data, BailoutId(ast_id));
229 unsigned translation_index = data->TranslationIndex(bailout_id)->value();
230 ByteArray* translations = data->TranslationByteArray();
232 TranslationIterator iterator(translations, translation_index);
235 ASSERT(Translation::BEGIN == opcode);
237 int count = iterator.Next();
244 ASSERT(Translation::JS_FRAME == opcode);
245 unsigned node_id = iterator.Next();
247 ASSERT(node_id == ast_id);
248 int closure_id = iterator.Next();
250 ASSERT_EQ(Translation::kSelfLiteralId, closure_id);
251 unsigned height = iterator.Next();
253 USE(height_in_bytes);
255 unsigned fixed_size = ComputeFixedSize(function_);
257 ASSERT(fixed_size + height_in_bytes == input_frame_size);
260 unsigned outgoing_height = data->ArgumentsStackHeight(bailout_id)->value();
261 unsigned outgoing_size = outgoing_height *
kPointerSize;
262 unsigned output_frame_size = fixed_size + stack_slot_size + outgoing_size;
263 ASSERT(outgoing_size == 0);
265 if (FLAG_trace_osr) {
267 reinterpret_cast<intptr_t>(function_));
269 PrintF(
" => node=%u, frame=%d->%d]\n",
279 output_frame_size, function_);
285 int parameter_count = function_->shared()->formal_parameter_count() + 1;
286 for (
int i = 0; i < parameter_count; ++i) {
295 int limit = input_offset - (parameter_count *
kPointerSize);
296 while (ok && input_offset > limit) {
297 ok = DoOsrTranslateCommand(&iterator, &input_offset);
305 uint32_t input_value = input_->
GetFrameSlot(input_offset);
306 if (FLAG_trace_osr) {
307 const char* name =
"UNKNOWN";
310 name =
"caller's pc";
322 PrintF(
" [sp + %d] <- 0x%08x ; [sp + %d] (fixed part - %s)\n",
335 while (ok && input_offset >= 0) {
336 ok = DoOsrTranslateCommand(&iterator, &input_offset);
343 output_[0]->
SetPc(reinterpret_cast<uint32_t>(from_));
349 unsigned pc_offset = data->OsrPcOffset()->value();
350 uint32_t
pc =
reinterpret_cast<uint32_t
>(
351 optimized_code_->
entry() + pc_offset);
352 output_[0]->
SetPc(pc);
354 Code* continuation = isolate_->
builtins()->
builtin(Builtins::kNotifyOSR);
356 reinterpret_cast<uint32_t>(continuation->entry()));
358 if (FLAG_trace_osr) {
360 ok ?
"finished" :
"aborted",
361 reinterpret_cast<intptr_t>(function_));
363 PrintF(
" => pc=0x%0x]\n", output_[0]->GetPc());
368 void Deoptimizer::DoComputeArgumentsAdaptorFrame(TranslationIterator* iterator,
371 unsigned height = iterator->Next();
373 if (FLAG_trace_deopt) {
374 PrintF(
" translating arguments adaptor => height=%d\n", height_in_bytes);
378 unsigned output_frame_size = height_in_bytes + fixed_frame_size;
386 ASSERT(frame_index > 0 && frame_index < output_count_ - 1);
388 output_[frame_index] = output_frame;
392 uint32_t top_address;
393 top_address = output_[frame_index - 1]->
GetTop() - output_frame_size;
394 output_frame->SetTop(top_address);
397 int parameter_count = height;
398 unsigned output_offset = output_frame_size;
399 for (
int i = 0; i < parameter_count; ++i) {
401 DoTranslateCommand(iterator, frame_index, output_offset);
406 intptr_t callers_pc = output_[frame_index - 1]->
GetPc();
407 output_frame->SetFrameSlot(output_offset, callers_pc);
408 if (FLAG_trace_deopt) {
409 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; caller's pc\n",
410 top_address + output_offset, output_offset, callers_pc);
415 intptr_t value = output_[frame_index - 1]->
GetFp();
416 output_frame->SetFrameSlot(output_offset, value);
418 output_frame->SetFp(fp_value);
419 if (FLAG_trace_deopt) {
420 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; caller's fp\n",
421 fp_value, output_offset, value);
426 intptr_t context =
reinterpret_cast<intptr_t
>(
428 output_frame->SetFrameSlot(output_offset, context);
429 if (FLAG_trace_deopt) {
430 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; context (adaptor sentinel)\n",
431 top_address + output_offset, output_offset, context);
436 value =
reinterpret_cast<intptr_t
>(
function);
437 output_frame->SetFrameSlot(output_offset, value);
438 if (FLAG_trace_deopt) {
439 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; function\n",
440 top_address + output_offset, output_offset, value);
445 value =
reinterpret_cast<uint32_t
>(
Smi::FromInt(height - 1));
446 output_frame->SetFrameSlot(output_offset, value);
447 if (FLAG_trace_deopt) {
448 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; argc (%d)\n",
449 top_address + output_offset, output_offset, value, height - 1);
452 ASSERT(0 == output_offset);
454 Builtins* builtins = isolate_->
builtins();
455 Code* adaptor_trampoline =
456 builtins->
builtin(Builtins::kArgumentsAdaptorTrampoline);
457 uint32_t pc =
reinterpret_cast<uint32_t
>(
458 adaptor_trampoline->instruction_start() +
459 isolate_->
heap()->arguments_adaptor_deopt_pc_offset()->value());
460 output_frame->SetPc(pc);
464 void Deoptimizer::DoComputeConstructStubFrame(TranslationIterator* iterator,
466 Builtins* builtins = isolate_->
builtins();
467 Code* construct_stub = builtins->
builtin(Builtins::kJSConstructStubGeneric);
469 unsigned height = iterator->Next();
471 if (FLAG_trace_deopt) {
472 PrintF(
" translating construct stub => height=%d\n", height_in_bytes);
476 unsigned output_frame_size = height_in_bytes + fixed_frame_size;
481 output_frame->SetFrameType(StackFrame::CONSTRUCT);
484 ASSERT(frame_index > 0 && frame_index < output_count_ - 1);
486 output_[frame_index] = output_frame;
490 uint32_t top_address;
491 top_address = output_[frame_index - 1]->
GetTop() - output_frame_size;
492 output_frame->SetTop(top_address);
495 int parameter_count = height;
496 unsigned output_offset = output_frame_size;
497 for (
int i = 0; i < parameter_count; ++i) {
499 DoTranslateCommand(iterator, frame_index, output_offset);
504 intptr_t callers_pc = output_[frame_index - 1]->
GetPc();
505 output_frame->SetFrameSlot(output_offset, callers_pc);
506 if (FLAG_trace_deopt) {
507 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; caller's pc\n",
508 top_address + output_offset, output_offset, callers_pc);
513 intptr_t value = output_[frame_index - 1]->
GetFp();
514 output_frame->SetFrameSlot(output_offset, value);
516 output_frame->SetFp(fp_value);
517 if (FLAG_trace_deopt) {
518 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; caller's fp\n",
519 fp_value, output_offset, value);
524 value = output_[frame_index - 1]->
GetContext();
525 output_frame->SetFrameSlot(output_offset, value);
526 if (FLAG_trace_deopt) {
527 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; context\n",
528 top_address + output_offset, output_offset, value);
533 value =
reinterpret_cast<intptr_t
>(
Smi::FromInt(StackFrame::CONSTRUCT));
534 output_frame->SetFrameSlot(output_offset, value);
535 if (FLAG_trace_deopt) {
536 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; function (construct sentinel)\n",
537 top_address + output_offset, output_offset, value);
542 value =
reinterpret_cast<intptr_t
>(construct_stub);
543 output_frame->SetFrameSlot(output_offset, value);
544 if (FLAG_trace_deopt) {
545 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; code object\n",
546 top_address + output_offset, output_offset, value);
551 value =
reinterpret_cast<uint32_t
>(
Smi::FromInt(height - 1));
552 output_frame->SetFrameSlot(output_offset, value);
553 if (FLAG_trace_deopt) {
554 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; argc (%d)\n",
555 top_address + output_offset, output_offset, value, height - 1);
560 value =
reinterpret_cast<intptr_t
>(
function);
561 output_frame->SetFrameSlot(output_offset, value);
562 if (FLAG_trace_deopt) {
563 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; constructor function\n",
564 top_address + output_offset, output_offset, value);
570 value = output_frame->GetFrameSlot(output_frame_size - kPointerSize);
571 output_frame->SetFrameSlot(output_offset, value);
572 if (FLAG_trace_deopt) {
573 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; allocated receiver\n",
574 top_address + output_offset, output_offset, value);
577 ASSERT(0 == output_offset);
579 uint32_t pc =
reinterpret_cast<uint32_t
>(
580 construct_stub->instruction_start() +
581 isolate_->
heap()->construct_stub_deopt_pc_offset()->value());
582 output_frame->SetPc(pc);
586 void Deoptimizer::DoComputeAccessorStubFrame(TranslationIterator* iterator,
588 bool is_setter_stub_frame) {
595 const char* kind = is_setter_stub_frame ?
"setter" :
"getter";
596 if (FLAG_trace_deopt) {
597 PrintF(
" translating %s stub => height=%u\n", kind, height_in_bytes);
604 unsigned fixed_frame_entries = 5 + (is_setter_stub_frame ? 1 : 0);
605 unsigned fixed_frame_size = fixed_frame_entries *
kPointerSize;
606 unsigned output_frame_size = height_in_bytes + fixed_frame_size;
614 ASSERT(frame_index > 0 && frame_index < output_count_ - 1);
616 output_[frame_index] = output_frame;
620 uint32_t top_address = output_[frame_index - 1]->
GetTop() - output_frame_size;
621 output_frame->SetTop(top_address);
623 unsigned output_offset = output_frame_size;
627 intptr_t callers_pc = output_[frame_index - 1]->
GetPc();
628 output_frame->SetFrameSlot(output_offset, callers_pc);
629 if (FLAG_trace_deopt) {
632 top_address + output_offset, output_offset, callers_pc);
637 intptr_t value = output_[frame_index - 1]->
GetFp();
638 output_frame->SetFrameSlot(output_offset, value);
640 output_frame->SetFp(fp_value);
641 if (FLAG_trace_deopt) {
644 fp_value, output_offset, value);
649 value = output_[frame_index - 1]->
GetContext();
650 output_frame->SetFrameSlot(output_offset, value);
651 if (FLAG_trace_deopt) {
654 top_address + output_offset, output_offset, value);
660 output_frame->SetFrameSlot(output_offset, value);
661 if (FLAG_trace_deopt) {
663 " ; function (%s sentinel)\n",
664 top_address + output_offset, output_offset, value, kind);
670 Builtins::kStoreIC_Setter_ForDeopt :
671 Builtins::kLoadIC_Getter_ForDeopt;
673 value =
reinterpret_cast<intptr_t
>(accessor_stub);
674 output_frame->SetFrameSlot(output_offset, value);
675 if (FLAG_trace_deopt) {
678 top_address + output_offset, output_offset, value);
684 iterator->Skip(Translation::NumberOfOperandsFor(opcode));
686 if (is_setter_stub_frame) {
690 DoTranslateCommand(iterator, frame_index, output_offset);
693 ASSERT(0 == output_offset);
695 Smi* offset = is_setter_stub_frame ?
696 isolate_->
heap()->setter_stub_deopt_pc_offset() :
697 isolate_->
heap()->getter_stub_deopt_pc_offset();
698 intptr_t pc =
reinterpret_cast<intptr_t
>(
699 accessor_stub->instruction_start() + offset->value());
700 output_frame->SetPc(pc);
706 void Deoptimizer::DoComputeJSFrame(TranslationIterator* iterator,
709 BailoutId node_id = BailoutId(iterator->Next());
710 JSFunction*
function;
711 if (frame_index != 0) {
714 int closure_id = iterator->Next();
716 ASSERT_EQ(Translation::kSelfLiteralId, closure_id);
717 function = function_;
719 unsigned height = iterator->Next();
721 if (FLAG_trace_deopt) {
723 function->PrintName();
724 PrintF(
" => node=%d, height=%d\n", node_id.ToInt(), height_in_bytes);
729 unsigned fixed_frame_size = ComputeFixedSize(
function);
731 unsigned output_frame_size = height_in_bytes + fixed_frame_size;
736 output_frame->SetFrameType(StackFrame::JAVA_SCRIPT);
738 bool is_bottommost = (0 == frame_index);
739 bool is_topmost = (output_count_ - 1 == frame_index);
740 ASSERT(frame_index >= 0 && frame_index < output_count_);
742 output_[frame_index] = output_frame;
748 uint32_t top_address;
754 top_address = output_[frame_index - 1]->
GetTop() - output_frame_size;
756 output_frame->SetTop(top_address);
759 int parameter_count =
function->shared()->formal_parameter_count() + 1;
760 unsigned output_offset = output_frame_size;
761 unsigned input_offset = input_frame_size;
762 for (
int i = 0; i < parameter_count; ++i) {
764 DoTranslateCommand(iterator, frame_index, output_offset);
782 value = output_[frame_index - 1]->
GetPc();
784 output_frame->SetFrameSlot(output_offset, value);
785 if (FLAG_trace_deopt) {
786 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; caller's pc\n",
787 top_address + output_offset, output_offset, value);
799 value = output_[frame_index - 1]->
GetFp();
801 output_frame->SetFrameSlot(output_offset, value);
804 output_frame->SetFp(fp_value);
806 output_frame->SetRegister(
fp.
code(), fp_value);
808 if (FLAG_trace_deopt) {
809 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; caller's fp\n",
810 fp_value, output_offset, value);
821 value =
reinterpret_cast<intptr_t
>(
function->context());
823 output_frame->SetFrameSlot(output_offset, value);
824 output_frame->SetContext(value);
825 if (is_topmost) output_frame->SetRegister(
cp.
code(), value);
826 if (FLAG_trace_deopt) {
827 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; context\n",
828 top_address + output_offset, output_offset, value);
834 value =
reinterpret_cast<uint32_t
>(
function);
838 output_frame->SetFrameSlot(output_offset, value);
839 if (FLAG_trace_deopt) {
840 PrintF(
" 0x%08x: [top + %d] <- 0x%08x ; function\n",
841 top_address + output_offset, output_offset, value);
845 for (
unsigned i = 0; i < height; ++i) {
847 DoTranslateCommand(iterator, frame_index, output_offset);
849 ASSERT(0 == output_offset);
852 Code* non_optimized_code =
function->shared()->code();
853 FixedArray* raw_data = non_optimized_code->deoptimization_data();
855 Address start = non_optimized_code->instruction_start();
856 unsigned pc_and_state =
GetOutputInfo(data, node_id, function->shared());
858 uint32_t pc_value =
reinterpret_cast<uint32_t
>(start + pc_offset);
859 output_frame->SetPc(pc_value);
861 output_frame->SetRegister(pc.code(), pc_value);
870 if (is_topmost && bailout_type_ !=
DEBUGGER) {
871 Builtins* builtins = isolate_->
builtins();
872 Code* continuation = (bailout_type_ ==
EAGER)
873 ? builtins->
builtin(Builtins::kNotifyDeoptimized)
874 : builtins->builtin(Builtins::kNotifyLazyDeoptimized);
875 output_frame->SetContinuation(
876 reinterpret_cast<uint32_t>(continuation->entry()));
881 void Deoptimizer::FillInputFrame(
Address tos, JavaScriptFrame* frame) {
906 void Deoptimizer::EntryGenerator::Generate() {
909 Isolate* isolate = masm()->isolate();
911 CpuFeatures::Scope scope(
VFP3);
918 const int kDoubleRegsSize =
925 DwVfpRegister::kNumAllocatableRegisters - 1);
926 ASSERT(last.code() > first.code());
927 ASSERT((last.code() - first.code()) ==
928 (DwVfpRegister::kNumAllocatableRegisters - 1));
930 for (
int i = 0; i <= (DwVfpRegister::kNumAllocatableRegisters - 1); i++) {
942 const int kSavedRegistersAreaSize =
951 if (type() == EAGER) {
952 __ mov(
r3, Operand(0));
954 __ add(
r4,
sp, Operand(kSavedRegistersAreaSize + (1 * kPointerSize)));
955 }
else if (type() == OSR) {
958 __ add(
r4,
sp, Operand(kSavedRegistersAreaSize + (1 * kPointerSize)));
962 __ add(
r4,
sp, Operand(kSavedRegistersAreaSize + (2 * kPointerSize)));
968 __ PrepareCallCFunction(6,
r5);
970 __ mov(
r1, Operand(type()));
974 __ mov(
r5, Operand(ExternalReference::isolate_address()));
978 AllowExternalCallThatCantCauseGC scope(masm());
979 __ CallCFunction(ExternalReference::new_deoptimizer_function(isolate), 6);
987 ASSERT(Register::kNumRegisters == kNumberOfRegisters);
988 for (
int i = 0; i < kNumberOfRegisters; i++) {
998 int dst_offset = i *
kDoubleSize + double_regs_offset;
1000 __ vldr(
d0,
sp, src_offset);
1001 __ vstr(
d0,
r1, dst_offset);
1006 if (type() == EAGER || type() == OSR) {
1007 __ add(
sp,
sp, Operand(kSavedRegistersAreaSize + (1 * kPointerSize)));
1009 __ add(
sp,
sp, Operand(kSavedRegistersAreaSize + (2 * kPointerSize)));
1025 __ add(
r3,
r3, Operand(
sizeof(uint32_t)));
1027 __ b(
ne, &pop_loop);
1032 __ PrepareCallCFunction(1,
r1);
1035 AllowExternalCallThatCantCauseGC scope(masm());
1037 ExternalReference::compute_output_frames_function(isolate), 1);
1042 Label outer_push_loop, inner_push_loop;
1048 __ bind(&outer_push_loop);
1052 __ bind(&inner_push_loop);
1053 __ sub(
r3,
r3, Operand(
sizeof(uint32_t)));
1057 __ cmp(
r3, Operand(0));
1058 __ b(
ne, &inner_push_loop);
1059 __ add(
r0,
r0, Operand(kPointerSize));
1061 __ b(
lt, &outer_push_loop);
1064 if (type() != OSR) {
1075 for (
int i = kNumberOfRegisters - 1; i >= 0; i--) {
1086 __ InitializeRootRegister();
1092 __ stop(
"Unreachable.");
1100 for (
int i = 0; i < count(); i++) {
1101 int start = masm()->pc_offset();
1103 if (type() ==
EAGER) {
1109 __ mov(
ip, Operand(i));
1112 ASSERT(masm()->pc_offset() - start == table_entry_size_);
static int registers_offset()
static const int kCallerFPOffset
Code * builtin(Name name)
static DeoptimizationOutputData * cast(Object *obj)
void InvalidateRelocation()
void PrintF(const char *format,...)
static Smi * FromInt(int value)
void SetFrameSlot(unsigned offset, intptr_t value)
void b(int branch_offset, Condition cond=al)
static const int kNumAllocatableRegisters
#define ASSERT(condition)
const RegList kJSCallerSaved
static void DeoptimizeFunction(JSFunction *function)
intptr_t GetContext() const
static uint16_t & uint16_at(Address addr)
void RecordCodeTargetPatch(Code *host, Address pc, HeapObject *value)
void SetFrameType(StackFrame::Type type)
static const int kNumRegisters
static int double_registers_offset()
static DwVfpRegister FromAllocationIndex(int index)
static int frame_content_offset()
static int output_offset()
byte * instruction_start()
void InvalidateCode(Code *code)
static int state_offset()
const RegList kCalleeSaved
static int32_t & int32_at(Address addr)
void SetRegister(unsigned n, intptr_t value)
static unsigned decode(uint32_t value)
friend class DeoptimizingCodeListNode
void set_next(DeoptimizingCodeListNode *next)
static int GetOutputInfo(DeoptimizationOutputData *data, BailoutId node_id, SharedFunctionInfo *shared)
static void ReplaceCodeForRelatedFunctions(JSFunction *function, Code *code)
DeoptimizerData * deoptimizer_data()
uint32_t GetFrameSize() const
void SetContinuation(intptr_t pc)
static int frame_size_offset()
static int output_count_offset()
static void RevertStackCheckCodeAt(Code *unoptimized_code, Address pc_after, Code *check_code, Code *replacement_code)
intptr_t GetFrameSlot(unsigned offset)
static Address GetDeoptimizationEntry(int id, BailoutType type)
static const int kContextOffset
IncrementalMarking * incremental_marking()
static const int kFunctionOffset
static const int kCallerPCOffset
#define ASSERT_EQ(v1, v2)
friend class FrameDescription
void Call(Register target, Condition cond=al)
virtual void GeneratePrologue()
static int CallSizeNotPredictableCodeSize(Address target, RelocInfo::Mode rmode, Condition cond=al)
static const int kInstrSize
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination use dead code elimination trace on stack replacement optimize closures cache optimized code for closures functions with arguments object loop weight for representation inference allow uint32 values on optimize frames if they are used only in safe operations track parallel recompilation enable all profiler experiments number of stack frames inspected by the profiler call recompile stub directly when self optimizing trigger profiler ticks based on counting instead of timing weight back edges by jump distance for interrupt triggering percentage of ICs that must have type info to allow optimization watch_ic_patching retry_self_opt interrupt_at_exit extra verbose compilation tracing generate extra emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 and VFP2 enable use of VFP2 instructions if available enable use of SDIV and UDIV instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of MIPS FPU instructions if NULL
static uint32_t & uint32_at(Address addr)
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination use dead code elimination trace on stack replacement optimize closures cache optimized code for closures functions with arguments object loop weight for representation inference allow uint32 values on optimize frames if they are used only in safe operations track parallel recompilation enable all profiler experiments number of stack frames inspected by the profiler call recompile stub directly when self optimizing trigger profiler ticks based on counting instead of timing weight back edges by jump distance for interrupt triggering percentage of ICs that must have type info to allow optimization watch_ic_patching retry_self_opt interrupt_at_exit extra verbose compilation tracing generate extra code(assertions) for debugging") DEFINE_bool(code_comments
static const int kFrameSize
intptr_t GetRegister(unsigned n) const
static const int kMarkerOffset
void SetDoubleRegister(unsigned n, double value)
static void PatchStackCheckCodeAt(Code *unoptimized_code, Address pc_after, Code *check_code, Code *replacement_code)
static int continuation_offset()
MarkCompactCollector * mark_compact_collector()
static bool IsLdrPcImmediateOffset(Instr instr)
static int input_offset()
static JSFunction * cast(Object *obj)