Index: src/compiler/code-stub-assembler.cc |
diff --git a/src/compiler/code-stub-assembler.cc b/src/compiler/code-stub-assembler.cc |
index 558a09ea09c7764757fc04029b21852541c5715a..34c904ae5408680a25869fcd058ec22f8b4473f3 100644 |
--- a/src/compiler/code-stub-assembler.cc |
+++ b/src/compiler/code-stub-assembler.cc |
@@ -105,6 +105,10 @@ Node* CodeStubAssembler::Float64Constant(double value) { |
return raw_assembler_->Float64Constant(value); |
} |
+Node* CodeStubAssembler::HeapNumberMapConstant() { |
+ return HeapConstant(isolate()->factory()->heap_number_map()); |
+} |
+ |
Node* CodeStubAssembler::Parameter(int value) { |
return raw_assembler_->Parameter(value); |
} |
@@ -139,7 +143,6 @@ Node* CodeStubAssembler::SmiTag(Node* value) { |
return raw_assembler_->WordShl(value, SmiShiftBitsConstant()); |
} |
- |
Node* CodeStubAssembler::SmiUntag(Node* value) { |
return raw_assembler_->WordSar(value, SmiShiftBitsConstant()); |
} |
@@ -152,6 +155,10 @@ Node* CodeStubAssembler::SmiToInt32(Node* value) { |
return result; |
} |
+Node* CodeStubAssembler::SmiToFloat64(Node* value) { |
+ return ChangeInt32ToFloat64(SmiUntag(value)); |
+} |
+ |
Node* CodeStubAssembler::SmiAdd(Node* a, Node* b) { return IntPtrAdd(a, b); } |
Node* CodeStubAssembler::SmiEqual(Node* a, Node* b) { return WordEqual(a, b); } |
@@ -188,9 +195,13 @@ Node* CodeStubAssembler::LoadObjectField(Node* object, int offset) { |
} |
Node* CodeStubAssembler::LoadHeapNumberValue(Node* object) { |
- return raw_assembler_->Load( |
- MachineType::Float64(), object, |
- IntPtrConstant(HeapNumber::kValueOffset - kHeapObjectTag)); |
+ return Load(MachineType::Float64(), object, |
+ IntPtrConstant(HeapNumber::kValueOffset - kHeapObjectTag)); |
+} |
+ |
+Node* CodeStubAssembler::LoadMapInstanceType(Node* map) { |
+ return Load(MachineType::Uint8(), map, |
+ IntPtrConstant(Map::kInstanceTypeOffset - kHeapObjectTag)); |
} |
Node* CodeStubAssembler::LoadFixedArrayElementSmiIndex(Node* object, |
@@ -279,10 +290,7 @@ Node* CodeStubAssembler::Projection(int index, Node* value) { |
} |
Node* CodeStubAssembler::LoadInstanceType(Node* object) { |
- return raw_assembler_->Word32And( |
- LoadObjectField(LoadObjectField(object, HeapObject::kMapOffset), |
- Map::kInstanceTypeOffset), |
- raw_assembler_->Int32Constant(255)); |
+ return LoadMapInstanceType(LoadObjectField(object, HeapObject::kMapOffset)); |
} |
Node* CodeStubAssembler::BitFieldDecode(Node* word32, uint32_t shift, |
@@ -292,6 +300,16 @@ Node* CodeStubAssembler::BitFieldDecode(Node* word32, uint32_t shift, |
raw_assembler_->Int32Constant(shift)); |
} |
+void CodeStubAssembler::BranchIfFloat64Equal(Node* a, Node* b, Label* if_true, |
+ Label* if_false) { |
+ Label if_equal(this), if_notequal(this); |
+ Branch(Float64Equal(a, b), &if_equal, &if_notequal); |
+ Bind(&if_equal); |
+ Goto(if_true); |
+ Bind(&if_notequal); |
+ Goto(if_false); |
+} |
+ |
Node* CodeStubAssembler::CallN(CallDescriptor* descriptor, Node* code_target, |
Node** args) { |
CallPrologue(); |
@@ -468,12 +486,20 @@ Node* CodeStubAssembler::CallStub(const CallInterfaceDescriptor& descriptor, |
return CallN(call_descriptor, target, args); |
} |
-Node* CodeStubAssembler::TailCallStub(CodeStub& stub, Node** args) { |
- Node* code_target = HeapConstant(stub.GetCode()); |
- CallDescriptor* descriptor = Linkage::GetStubCallDescriptor( |
- isolate(), zone(), stub.GetCallInterfaceDescriptor(), |
- stub.GetStackParameterCount(), CallDescriptor::kSupportsTailCalls); |
- return raw_assembler_->TailCallN(descriptor, code_target, args); |
+Node* CodeStubAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor, |
+ Node* target, Node* context, Node* arg1, |
+ Node* arg2, size_t result_size) { |
+ CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( |
+ isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), |
+ CallDescriptor::kSupportsTailCalls, Operator::kNoProperties, |
+ MachineType::AnyTagged(), result_size); |
+ |
+ Node** args = zone()->NewArray<Node*>(3); |
+ args[0] = arg1; |
+ args[1] = arg2; |
+ args[2] = context; |
+ |
+ return raw_assembler_->TailCallN(call_descriptor, target, args); |
} |
Node* CodeStubAssembler::TailCall( |
@@ -517,11 +543,15 @@ void CodeStubAssembler::Switch(Node* index, Label* default_label, |
} |
// RawMachineAssembler delegate helpers: |
-Isolate* CodeStubAssembler::isolate() { return raw_assembler_->isolate(); } |
+Isolate* CodeStubAssembler::isolate() const { |
+ return raw_assembler_->isolate(); |
+} |
+ |
+Factory* CodeStubAssembler::factory() const { return isolate()->factory(); } |
-Graph* CodeStubAssembler::graph() { return raw_assembler_->graph(); } |
+Graph* CodeStubAssembler::graph() const { return raw_assembler_->graph(); } |
-Zone* CodeStubAssembler::zone() { return raw_assembler_->zone(); } |
+Zone* CodeStubAssembler::zone() const { return raw_assembler_->zone(); } |
// The core implementation of Variable is stored through an indirection so |
// that it can outlive the often block-scoped Variable declarations. This is |