Index: src/interpreter/interpreter-assembler.cc |
diff --git a/src/interpreter/interpreter-assembler.cc b/src/interpreter/interpreter-assembler.cc |
index a32b4a63eeb8a8772ff4660eb4757789718442c1..5f38ea444bc0cbac0897c472b6280ed5c5f2c2ef 100644 |
--- a/src/interpreter/interpreter-assembler.cc |
+++ b/src/interpreter/interpreter-assembler.cc |
@@ -460,33 +460,32 @@ Node* InterpreterAssembler::CallRuntimeN(Node* function_id, Node* context, |
} |
void InterpreterAssembler::UpdateInterruptBudget(Node* weight) { |
- CodeStubAssembler::Label ok(this); |
- CodeStubAssembler::Label interrupt_check(this); |
- CodeStubAssembler::Label end(this); |
+ Label ok(this), interrupt_check(this, Label::kDeferred), end(this); |
Node* budget_offset = |
IntPtrConstant(BytecodeArray::kInterruptBudgetOffset - kHeapObjectTag); |
// Update budget by |weight| and check if it reaches zero. |
+ Variable new_budget(this, MachineRepresentation::kWord32); |
Node* old_budget = |
Load(MachineType::Int32(), BytecodeArrayTaggedPointer(), budget_offset); |
- Node* new_budget = Int32Add(old_budget, weight); |
- Node* condition = Int32GreaterThanOrEqual(new_budget, Int32Constant(0)); |
+ new_budget.Bind(Int32Add(old_budget, weight)); |
+ Node* condition = |
+ Int32GreaterThanOrEqual(new_budget.value(), Int32Constant(0)); |
Branch(condition, &ok, &interrupt_check); |
// Perform interrupt and reset budget. |
Bind(&interrupt_check); |
- CallRuntime(Runtime::kInterrupt, GetContext()); |
- StoreNoWriteBarrier(MachineRepresentation::kWord32, |
- BytecodeArrayTaggedPointer(), budget_offset, |
- Int32Constant(Interpreter::InterruptBudget())); |
- Goto(&end); |
+ { |
+ CallRuntime(Runtime::kInterrupt, GetContext()); |
+ new_budget.Bind(Int32Constant(Interpreter::InterruptBudget())); |
+ Goto(&ok); |
+ } |
// Update budget. |
Bind(&ok); |
StoreNoWriteBarrier(MachineRepresentation::kWord32, |
- BytecodeArrayTaggedPointer(), budget_offset, new_budget); |
- Goto(&end); |
- Bind(&end); |
+ BytecodeArrayTaggedPointer(), budget_offset, |
+ new_budget.value()); |
} |
Node* InterpreterAssembler::Advance(int delta) { |
@@ -503,10 +502,9 @@ Node* InterpreterAssembler::Jump(Node* delta) { |
} |
void InterpreterAssembler::JumpConditional(Node* condition, Node* delta) { |
- CodeStubAssembler::Label match(this); |
- CodeStubAssembler::Label no_match(this); |
+ Label match(this), no_match(this); |
- Branch(condition, &match, &no_match); |
+ BranchIf(condition, &match, &no_match); |
Bind(&match); |
Jump(delta); |
Bind(&no_match); |
@@ -618,23 +616,12 @@ compiler::Node* InterpreterAssembler::InterpreterReturn() { |
return DispatchToBytecodeHandler(exit_trampoline_code_object); |
} |
-void InterpreterAssembler::StackCheck() { |
- CodeStubAssembler::Label end(this); |
- CodeStubAssembler::Label ok(this); |
- CodeStubAssembler::Label stack_guard(this); |
- |
+Node* InterpreterAssembler::StackCheckTriggeredInterrupt() { |
Node* sp = LoadStackPointer(); |
Node* stack_limit = Load( |
MachineType::Pointer(), |
ExternalConstant(ExternalReference::address_of_stack_limit(isolate()))); |
- Node* condition = UintPtrGreaterThanOrEqual(sp, stack_limit); |
- Branch(condition, &ok, &stack_guard); |
- Bind(&stack_guard); |
- CallRuntime(Runtime::kStackGuard, GetContext()); |
- Goto(&end); |
- Bind(&ok); |
- Goto(&end); |
- Bind(&end); |
+ return UintPtrLessThan(sp, stack_limit); |
} |
void InterpreterAssembler::Abort(BailoutReason bailout_reason) { |
@@ -646,18 +633,14 @@ void InterpreterAssembler::Abort(BailoutReason bailout_reason) { |
void InterpreterAssembler::AbortIfWordNotEqual(Node* lhs, Node* rhs, |
BailoutReason bailout_reason) { |
- CodeStubAssembler::Label match(this); |
- CodeStubAssembler::Label no_match(this); |
- CodeStubAssembler::Label end(this); |
+ Label ok(this), abort(this, Label::kDeferred); |
+ BranchIfWordEqual(lhs, rhs, &ok, &abort); |
- Node* condition = WordEqual(lhs, rhs); |
- Branch(condition, &match, &no_match); |
- Bind(&no_match); |
+ Bind(&abort); |
Abort(bailout_reason); |
- Goto(&end); |
- Bind(&match); |
- Goto(&end); |
- Bind(&end); |
+ Goto(&ok); |
+ |
+ Bind(&ok); |
} |
void InterpreterAssembler::TraceBytecode(Runtime::FunctionId function_id) { |
@@ -677,21 +660,21 @@ void InterpreterAssembler::TraceBytecodeDispatch(Node* target_bytecode) { |
Node* old_counter = |
Load(MachineType::IntPtr(), counters_table, counter_offset); |
- CodeStubAssembler::Label counter_ok(this); |
- CodeStubAssembler::Label counter_saturated(this); |
- CodeStubAssembler::Label end(this); |
+ Label counter_ok(this), counter_saturated(this, Label::kDeferred); |
Node* counter_reached_max = WordEqual( |
old_counter, IntPtrConstant(std::numeric_limits<uintptr_t>::max())); |
- Branch(counter_reached_max, &counter_saturated, &counter_ok); |
+ BranchIf(counter_reached_max, &counter_saturated, &counter_ok); |
+ |
Bind(&counter_ok); |
- Node* new_counter = IntPtrAdd(old_counter, IntPtrConstant(1)); |
- StoreNoWriteBarrier(MachineType::PointerRepresentation(), counters_table, |
- counter_offset, new_counter); |
- Goto(&end); |
+ { |
+ Node* new_counter = IntPtrAdd(old_counter, IntPtrConstant(1)); |
+ StoreNoWriteBarrier(MachineType::PointerRepresentation(), counters_table, |
+ counter_offset, new_counter); |
+ Goto(&counter_saturated); |
+ } |
+ |
Bind(&counter_saturated); |
- Goto(&end); |
- Bind(&end); |
} |
// static |