Index: src/compiler/code-stub-assembler.cc |
diff --git a/src/compiler/code-stub-assembler.cc b/src/compiler/code-stub-assembler.cc |
index 0813cbed91029a093e77a173e27ea5033c339a29..9fcd2ad74b849f5114ebc7d057d52393b56850a7 100644 |
--- a/src/compiler/code-stub-assembler.cc |
+++ b/src/compiler/code-stub-assembler.cc |
@@ -163,6 +163,14 @@ Node* CodeStubAssembler::SmiAdd(Node* a, Node* b) { return IntPtrAdd(a, b); } |
Node* CodeStubAssembler::SmiEqual(Node* a, Node* b) { return WordEqual(a, b); } |
+Node* CodeStubAssembler::SmiLessThan(Node* a, Node* b) { |
+ return IntPtrLessThan(a, b); |
+} |
+ |
+Node* CodeStubAssembler::SmiLessThanOrEqual(Node* a, Node* b) { |
+ return IntPtrLessThanOrEqual(a, b); |
+} |
+ |
#define DEFINE_CODE_STUB_ASSEMBER_BINARY_OP(name) \ |
Node* CodeStubAssembler::name(Node* a, Node* b) { \ |
return raw_assembler_->name(a, b); \ |
@@ -416,6 +424,27 @@ Node* CodeStubAssembler::BitFieldDecode(Node* word32, uint32_t shift, |
raw_assembler_->Int32Constant(shift)); |
} |
+void CodeStubAssembler::BranchIfSmiLessThan(Node* a, Node* b, Label* if_true, |
+ Label* if_false) { |
+ Label if_lessthan(this), if_notlessthan(this); |
+ Branch(SmiLessThan(a, b), &if_lessthan, &if_notlessthan); |
+ Bind(&if_lessthan); |
+ Goto(if_true); |
+ Bind(&if_notlessthan); |
+ Goto(if_false); |
+} |
+ |
+void CodeStubAssembler::BranchIfSmiLessThanOrEqual(Node* a, Node* b, |
+ Label* if_true, |
+ Label* if_false) { |
+ Label if_lessthanorequal(this), if_notlessthanorequal(this); |
+ Branch(SmiLessThanOrEqual(a, b), &if_lessthanorequal, &if_notlessthanorequal); |
+ Bind(&if_lessthanorequal); |
+ Goto(if_true); |
+ Bind(&if_notlessthanorequal); |
+ Goto(if_false); |
+} |
+ |
void CodeStubAssembler::BranchIfFloat64Equal(Node* a, Node* b, Label* if_true, |
Label* if_false) { |
Label if_equal(this), if_notequal(this); |
@@ -426,6 +455,52 @@ void CodeStubAssembler::BranchIfFloat64Equal(Node* a, Node* b, Label* if_true, |
Goto(if_false); |
} |
+void CodeStubAssembler::BranchIfFloat64LessThan(Node* a, Node* b, |
+ Label* if_true, |
+ Label* if_false) { |
+ Label if_lessthan(this), if_notlessthan(this); |
+ Branch(Float64LessThan(a, b), &if_lessthan, &if_notlessthan); |
+ Bind(&if_lessthan); |
+ Goto(if_true); |
+ Bind(&if_notlessthan); |
+ Goto(if_false); |
+} |
+ |
+void CodeStubAssembler::BranchIfFloat64LessThanOrEqual(Node* a, Node* b, |
+ Label* if_true, |
+ Label* if_false) { |
+ Label if_lessthanorequal(this), if_notlessthanorequal(this); |
+ Branch(Float64LessThanOrEqual(a, b), &if_lessthanorequal, |
+ &if_notlessthanorequal); |
+ Bind(&if_lessthanorequal); |
+ Goto(if_true); |
+ Bind(&if_notlessthanorequal); |
+ Goto(if_false); |
+} |
+ |
+void CodeStubAssembler::BranchIfFloat64GreaterThan(Node* a, Node* b, |
+ Label* if_true, |
+ Label* if_false) { |
+ Label if_greaterthan(this), if_notgreaterthan(this); |
+ Branch(Float64GreaterThan(a, b), &if_greaterthan, &if_notgreaterthan); |
+ Bind(&if_greaterthan); |
+ Goto(if_true); |
+ Bind(&if_notgreaterthan); |
+ Goto(if_false); |
+} |
+ |
+void CodeStubAssembler::BranchIfFloat64GreaterThanOrEqual(Node* a, Node* b, |
+ Label* if_true, |
+ Label* if_false) { |
+ Label if_greaterthanorequal(this), if_notgreaterthanorequal(this); |
+ Branch(Float64GreaterThanOrEqual(a, b), &if_greaterthanorequal, |
+ &if_notgreaterthanorequal); |
+ Bind(&if_greaterthanorequal); |
+ Goto(if_true); |
+ Bind(&if_notgreaterthanorequal); |
+ Goto(if_false); |
+} |
+ |
Node* CodeStubAssembler::CallN(CallDescriptor* descriptor, Node* code_target, |
Node** args) { |
CallPrologue(); |
@@ -515,6 +590,12 @@ Node* CodeStubAssembler::TailCallRuntime(Runtime::FunctionId function_id, |
context); |
} |
+Node* CodeStubAssembler::CallStub(Callable const& callable, Node* context, |
+ Node* arg1, size_t result_size) { |
+ Node* target = HeapConstant(callable.code()); |
+ return CallStub(callable.descriptor(), target, context, arg1, result_size); |
+} |
+ |
Node* CodeStubAssembler::CallStub(const CallInterfaceDescriptor& descriptor, |
Node* target, Node* context, Node* arg1, |
size_t result_size) { |
@@ -709,27 +790,20 @@ bool CodeStubAssembler::Variable::IsBound() const { |
return impl_->value_ != nullptr; |
} |
-CodeStubAssembler::Label::Label(CodeStubAssembler* assembler) |
- : bound_(false), merge_count_(0), assembler_(assembler), label_(nullptr) { |
- void* buffer = assembler->zone()->New(sizeof(RawMachineLabel)); |
- label_ = new (buffer) RawMachineLabel(); |
-} |
- |
CodeStubAssembler::Label::Label(CodeStubAssembler* assembler, |
int merged_value_count, |
- CodeStubAssembler::Variable** merged_variables) |
+ CodeStubAssembler::Variable** merged_variables, |
+ CodeStubAssembler::Label::Type type) |
: bound_(false), merge_count_(0), assembler_(assembler), label_(nullptr) { |
void* buffer = assembler->zone()->New(sizeof(RawMachineLabel)); |
- label_ = new (buffer) RawMachineLabel(); |
+ label_ = new (buffer) |
+ RawMachineLabel(type == kDeferred ? RawMachineLabel::kDeferred |
+ : RawMachineLabel::kNonDeferred); |
for (int i = 0; i < merged_value_count; ++i) { |
variable_phis_[merged_variables[i]->impl_] = nullptr; |
} |
} |
-CodeStubAssembler::Label::Label(CodeStubAssembler* assembler, |
- CodeStubAssembler::Variable* merged_variable) |
- : CodeStubAssembler::Label(assembler, 1, &merged_variable) {} |
- |
void CodeStubAssembler::Label::MergeVariables() { |
++merge_count_; |
for (auto var : assembler_->variables_) { |
@@ -760,16 +834,17 @@ void CodeStubAssembler::Label::MergeVariables() { |
assembler_->raw_assembler_->AppendPhiInput(phi->second, node); |
} else { |
auto i = variable_merges_.find(var); |
- USE(i); |
- // If the following assert fires, then you've declared a variable that |
- // has the same bound value along all paths up until the point you bound |
- // this label, but then later merged a path with a new value for the |
- // variable after the label bind (it's not possible to add phis to the |
- // bound label after the fact, just make sure to list the variable in |
- // the label's constructor's list of merged variables). |
- DCHECK(find_if(i->second.begin(), i->second.end(), |
- [node](Node* e) -> bool { return node != e; }) == |
- i->second.end()); |
+ if (i != variable_merges_.end()) { |
+ // If the following assert fires, then you've declared a variable that |
+ // has the same bound value along all paths up until the point you |
+ // bound this label, but then later merged a path with a new value for |
+ // the variable after the label bind (it's not possible to add phis to |
+ // the bound label after the fact, just make sure to list the variable |
+ // in the label's constructor's list of merged variables). |
+ DCHECK(find_if(i->second.begin(), i->second.end(), |
+ [node](Node* e) -> bool { return node != e; }) == |
+ i->second.end()); |
+ } |
} |
} |
} |