OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/interpreter/interpreter-assembler.h" | 5 #include "src/interpreter/interpreter-assembler.h" |
6 | 6 |
7 #include <ostream> | 7 #include <ostream> |
8 | 8 |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/frames.h" | 10 #include "src/frames.h" |
(...skipping 23 matching lines...) Expand all Loading... |
34 disable_stack_check_across_call_(false), | 34 disable_stack_check_across_call_(false), |
35 stack_pointer_before_call_(nullptr) { | 35 stack_pointer_before_call_(nullptr) { |
36 accumulator_.Bind( | 36 accumulator_.Bind( |
37 Parameter(InterpreterDispatchDescriptor::kAccumulatorParameter)); | 37 Parameter(InterpreterDispatchDescriptor::kAccumulatorParameter)); |
38 context_.Bind(Parameter(InterpreterDispatchDescriptor::kContextParameter)); | 38 context_.Bind(Parameter(InterpreterDispatchDescriptor::kContextParameter)); |
39 bytecode_array_.Bind( | 39 bytecode_array_.Bind( |
40 Parameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter)); | 40 Parameter(InterpreterDispatchDescriptor::kBytecodeArrayParameter)); |
41 if (FLAG_trace_ignition) { | 41 if (FLAG_trace_ignition) { |
42 TraceBytecode(Runtime::kInterpreterTraceBytecodeEntry); | 42 TraceBytecode(Runtime::kInterpreterTraceBytecodeEntry); |
43 } | 43 } |
| 44 if (FLAG_ignition_count_handler_dispatches) { |
| 45 IncrementDispatchCounter(); |
| 46 } |
44 } | 47 } |
45 | 48 |
46 InterpreterAssembler::~InterpreterAssembler() {} | 49 InterpreterAssembler::~InterpreterAssembler() {} |
47 | 50 |
48 Node* InterpreterAssembler::GetAccumulator() { return accumulator_.value(); } | 51 Node* InterpreterAssembler::GetAccumulator() { return accumulator_.value(); } |
49 | 52 |
50 void InterpreterAssembler::SetAccumulator(Node* value) { | 53 void InterpreterAssembler::SetAccumulator(Node* value) { |
51 accumulator_.Bind(value); | 54 accumulator_.Bind(value); |
52 } | 55 } |
53 | 56 |
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 Node* profiling_weight = | 476 Node* profiling_weight = |
474 Int32Sub(Int32Constant(kHeapObjectTag + BytecodeArray::kHeaderSize), | 477 Int32Sub(Int32Constant(kHeapObjectTag + BytecodeArray::kHeaderSize), |
475 BytecodeOffset()); | 478 BytecodeOffset()); |
476 UpdateInterruptBudget(profiling_weight); | 479 UpdateInterruptBudget(profiling_weight); |
477 | 480 |
478 Node* exit_trampoline_code_object = | 481 Node* exit_trampoline_code_object = |
479 HeapConstant(isolate()->builtins()->InterpreterExitTrampoline()); | 482 HeapConstant(isolate()->builtins()->InterpreterExitTrampoline()); |
480 DispatchToBytecodeHandler(exit_trampoline_code_object); | 483 DispatchToBytecodeHandler(exit_trampoline_code_object); |
481 } | 484 } |
482 | 485 |
| 486 void InterpreterAssembler::IncrementDispatchCounter() { |
| 487 Node* counters = ExternalConstant( |
| 488 ExternalReference::interpreter_handlers_dispatch_counters(isolate())); |
| 489 Node* counter_offset = |
| 490 IntPtrConstant(static_cast<int>(bytecode_) * sizeof(uint32_t)); |
| 491 Node* old_counter = Load(MachineType::Uint32(), counters, counter_offset); |
| 492 Node* new_counter = Int32Add(old_counter, Int32Constant(1)); |
| 493 |
| 494 if (FLAG_debug_code) { // overflow checking on counters |
| 495 CodeStubAssembler::Label after_overflow_detection(this); |
| 496 CodeStubAssembler::Label overflow_detected(this); |
| 497 CodeStubAssembler::Label end(this); |
| 498 |
| 499 Node* new_counter_is_zero = Word32Equal(new_counter, Int32Constant(0)); |
| 500 Branch(new_counter_is_zero, &overflow_detected, &after_overflow_detection); |
| 501 Bind(&overflow_detected); |
| 502 Abort(BailoutReason::kInterpreterHandlersDispatchCounterOverflow); |
| 503 Goto(&end); |
| 504 Bind(&after_overflow_detection); |
| 505 Goto(&end); |
| 506 Bind(&end); |
| 507 } |
| 508 |
| 509 StoreNoWriteBarrier(MachineRepresentation::kWord32, counters, counter_offset, |
| 510 new_counter); |
| 511 } |
| 512 |
483 void InterpreterAssembler::StackCheck() { | 513 void InterpreterAssembler::StackCheck() { |
484 CodeStubAssembler::Label end(this); | 514 CodeStubAssembler::Label end(this); |
485 CodeStubAssembler::Label ok(this); | 515 CodeStubAssembler::Label ok(this); |
486 CodeStubAssembler::Label stack_guard(this); | 516 CodeStubAssembler::Label stack_guard(this); |
487 | 517 |
488 Node* sp = LoadStackPointer(); | 518 Node* sp = LoadStackPointer(); |
489 Node* stack_limit = Load( | 519 Node* stack_limit = Load( |
490 MachineType::Pointer(), | 520 MachineType::Pointer(), |
491 ExternalConstant(ExternalReference::address_of_stack_limit(isolate()))); | 521 ExternalConstant(ExternalReference::address_of_stack_limit(isolate()))); |
492 Node* condition = UintPtrGreaterThanOrEqual(sp, stack_limit); | 522 Node* condition = UintPtrGreaterThanOrEqual(sp, stack_limit); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
537 V8_TARGET_ARCH_S390 | 567 V8_TARGET_ARCH_S390 |
538 return true; | 568 return true; |
539 #else | 569 #else |
540 #error "Unknown Architecture" | 570 #error "Unknown Architecture" |
541 #endif | 571 #endif |
542 } | 572 } |
543 | 573 |
544 } // namespace interpreter | 574 } // namespace interpreter |
545 } // namespace internal | 575 } // namespace internal |
546 } // namespace v8 | 576 } // namespace v8 |
OLD | NEW |