Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(247)

Unified Diff: src/fast-accessor-assembler.cc

Issue 1674633002: Move FastAccessorAssembler from RawMachineAssembler to CodeStubAssembler. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Remove CodeStubAssembler::ContextParameter. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/fast-accessor-assembler.h ('k') | tools/gyp/v8.gyp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/fast-accessor-assembler.cc
diff --git a/src/compiler/fast-accessor-assembler.cc b/src/fast-accessor-assembler.cc
similarity index 58%
rename from src/compiler/fast-accessor-assembler.cc
rename to src/fast-accessor-assembler.cc
index 1a97fd5337e6cc6aa9af729cb94a3bdb1f056b8e..0e1d48bb7c48123b20ae4052b9509fb64a342f14 100644
--- a/src/compiler/fast-accessor-assembler.cc
+++ b/src/fast-accessor-assembler.cc
@@ -2,34 +2,29 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "src/compiler/fast-accessor-assembler.h"
+#include "src/fast-accessor-assembler.h"
#include "src/base/logging.h"
#include "src/code-stubs.h" // For CallApiCallbackStub.
-#include "src/compiler/graph.h"
-#include "src/compiler/linkage.h"
-#include "src/compiler/pipeline.h"
-#include "src/compiler/raw-machine-assembler.h"
-#include "src/compiler/schedule.h"
-#include "src/compiler/verifier.h"
+#include "src/compiler/code-stub-assembler.h"
#include "src/handles-inl.h"
-#include "src/objects.h" // For FAA::GetInternalField impl.
+#include "src/objects.h" // For FAA::LoadInternalField impl.
+
+using v8::internal::compiler::CodeStubAssembler;
+using v8::internal::compiler::Node;
namespace v8 {
namespace internal {
-namespace compiler {
FastAccessorAssembler::FastAccessorAssembler(Isolate* isolate)
: zone_(),
- assembler_(new RawMachineAssembler(
- isolate, new (zone()) Graph(zone()),
- Linkage::GetJSCallDescriptor(&zone_, false, 1,
- CallDescriptor::kNoFlags))),
+ isolate_(isolate),
+ assembler_(new CodeStubAssembler(isolate, zone(), 1,
+ Code::ComputeFlags(Code::STUB),
+ "FastAccessorAssembler")),
state_(kBuilding) {}
-
-FastAccessorAssembler::~FastAccessorAssembler() {}
-
+FastAccessorAssembler::~FastAccessorAssembler() { Clear(); }
FastAccessorAssembler::ValueId FastAccessorAssembler::IntegerConstant(
int const_value) {
@@ -37,34 +32,32 @@ FastAccessorAssembler::ValueId FastAccessorAssembler::IntegerConstant(
return FromRaw(assembler_->NumberConstant(const_value));
}
-
FastAccessorAssembler::ValueId FastAccessorAssembler::GetReceiver() {
CHECK_EQ(kBuilding, state_);
- // For JS call descriptor, the receiver is parameter 0. If we use other
- // call descriptors, this may or may not hold. So let's check.
- CHECK(assembler_->call_descriptor()->IsJSFunctionCall());
+ // For JS functions, the receiver is parameter 0.
return FromRaw(assembler_->Parameter(0));
}
-
FastAccessorAssembler::ValueId FastAccessorAssembler::LoadInternalField(
ValueId value, int field_no) {
CHECK_EQ(kBuilding, state_);
+
// Determine the 'value' object's instance type.
- Node* object_map =
- assembler_->Load(MachineType::Pointer(), FromId(value),
- assembler_->IntPtrConstant(
- Internals::kHeapObjectMapOffset - kHeapObjectTag));
+ Node* object_map = assembler_->LoadObjectField(
+ FromId(value), Internals::kHeapObjectMapOffset, MachineType::Pointer());
Node* instance_type = assembler_->WordAnd(
- assembler_->Load(
- MachineType::Uint16(), object_map,
- assembler_->IntPtrConstant(
- Internals::kMapInstanceTypeAndBitFieldOffset - kHeapObjectTag)),
+ assembler_->LoadObjectField(object_map,
+ Internals::kMapInstanceTypeAndBitFieldOffset,
+ MachineType::Uint16()),
assembler_->IntPtrConstant(0xff));
// Check whether we have a proper JSObject.
- RawMachineLabel is_jsobject, is_not_jsobject, merge;
+ CodeStubAssembler::Variable result(assembler_.get(),
+ MachineRepresentation::kTagged);
+ CodeStubAssembler::Label is_jsobject(assembler_.get());
+ CodeStubAssembler::Label is_not_jsobject(assembler_.get());
+ CodeStubAssembler::Label merge(assembler_.get(), &result);
assembler_->Branch(
assembler_->WordEqual(
instance_type, assembler_->IntPtrConstant(Internals::kJSObjectType)),
@@ -72,10 +65,10 @@ FastAccessorAssembler::ValueId FastAccessorAssembler::LoadInternalField(
// JSObject? Then load the internal field field_no.
assembler_->Bind(&is_jsobject);
- Node* internal_field = assembler_->Load(
- MachineType::Pointer(), FromId(value),
- assembler_->IntPtrConstant(JSObject::kHeaderSize - kHeapObjectTag +
- kPointerSize * field_no));
+ Node* internal_field = assembler_->LoadObjectField(
+ FromId(value), JSObject::kHeaderSize + kPointerSize * field_no,
+ MachineType::Pointer());
+ result.Bind(internal_field);
assembler_->Goto(&merge);
// No JSObject? Return undefined.
@@ -83,43 +76,39 @@ FastAccessorAssembler::ValueId FastAccessorAssembler::LoadInternalField(
// the method should take a label instead.
assembler_->Bind(&is_not_jsobject);
Node* fail_value = assembler_->UndefinedConstant();
+ result.Bind(fail_value);
assembler_->Goto(&merge);
// Return.
assembler_->Bind(&merge);
- Node* phi = assembler_->Phi(MachineRepresentation::kTagged, internal_field,
- fail_value);
- return FromRaw(phi);
+ return FromRaw(result.value());
}
-
FastAccessorAssembler::ValueId FastAccessorAssembler::LoadValue(ValueId value,
int offset) {
CHECK_EQ(kBuilding, state_);
- return FromRaw(assembler_->Load(MachineType::IntPtr(), FromId(value),
- assembler_->IntPtrConstant(offset)));
+ return FromRaw(assembler_->LoadBufferObject(FromId(value), offset,
+ MachineType::IntPtr()));
}
-
FastAccessorAssembler::ValueId FastAccessorAssembler::LoadObject(ValueId value,
int offset) {
CHECK_EQ(kBuilding, state_);
- return FromRaw(
- assembler_->Load(MachineType::AnyTagged(),
- assembler_->Load(MachineType::Pointer(), FromId(value),
- assembler_->IntPtrConstant(offset))));
+ return FromRaw(assembler_->LoadBufferObject(
+ assembler_->LoadBufferObject(FromId(value), offset,
+ MachineType::Pointer()),
+ 0, MachineType::AnyTagged()));
}
-
void FastAccessorAssembler::ReturnValue(ValueId value) {
CHECK_EQ(kBuilding, state_);
assembler_->Return(FromId(value));
}
-
void FastAccessorAssembler::CheckFlagSetOrReturnNull(ValueId value, int mask) {
CHECK_EQ(kBuilding, state_);
- RawMachineLabel pass, fail;
+ CodeStubAssembler::Label pass(assembler_.get());
+ CodeStubAssembler::Label fail(assembler_.get());
assembler_->Branch(
assembler_->Word32Equal(
assembler_->Word32And(FromId(value), assembler_->Int32Constant(mask)),
@@ -130,39 +119,34 @@ void FastAccessorAssembler::CheckFlagSetOrReturnNull(ValueId value, int mask) {
assembler_->Bind(&pass);
}
-
void FastAccessorAssembler::CheckNotZeroOrReturnNull(ValueId value) {
CHECK_EQ(kBuilding, state_);
- RawMachineLabel is_null, not_null;
+ CodeStubAssembler::Label is_null(assembler_.get());
+ CodeStubAssembler::Label not_null(assembler_.get());
assembler_->Branch(
- assembler_->IntPtrEqual(FromId(value), assembler_->IntPtrConstant(0)),
+ assembler_->WordEqual(FromId(value), assembler_->IntPtrConstant(0)),
&is_null, &not_null);
assembler_->Bind(&is_null);
assembler_->Return(assembler_->NullConstant());
assembler_->Bind(&not_null);
}
-
FastAccessorAssembler::LabelId FastAccessorAssembler::MakeLabel() {
CHECK_EQ(kBuilding, state_);
- RawMachineLabel* label =
- new (zone()->New(sizeof(RawMachineLabel))) RawMachineLabel;
- return FromRaw(label);
+ return FromRaw(new CodeStubAssembler::Label(assembler_.get()));
}
-
void FastAccessorAssembler::SetLabel(LabelId label_id) {
CHECK_EQ(kBuilding, state_);
assembler_->Bind(FromId(label_id));
}
-
void FastAccessorAssembler::CheckNotZeroOrJump(ValueId value_id,
LabelId label_id) {
CHECK_EQ(kBuilding, state_);
- RawMachineLabel pass;
+ CodeStubAssembler::Label pass(assembler_.get());
assembler_->Branch(
- assembler_->IntPtrEqual(FromId(value_id), assembler_->IntPtrConstant(0)),
+ assembler_->WordEqual(FromId(value_id), assembler_->IntPtrConstant(0)),
&pass, FromId(label_id));
assembler_->Bind(&pass);
}
@@ -171,19 +155,25 @@ FastAccessorAssembler::ValueId FastAccessorAssembler::Call(
FunctionCallback callback_function, ValueId arg) {
CHECK_EQ(kBuilding, state_);
- // Create API function stub.
- CallApiCallbackStub stub(assembler_->isolate(), 1, true);
- DCHECK_EQ(1, stub.GetCallInterfaceDescriptor().GetStackParameterCount());
-
// Wrap the FunctionCallback in an ExternalReference.
ApiFunction callback_api_function(FUNCTION_ADDR(callback_function));
ExternalReference callback(&callback_api_function,
- ExternalReference::DIRECT_API_CALL,
- assembler_->isolate());
+ ExternalReference::DIRECT_API_CALL, isolate());
+
+ // Create & call API callback via stub.
+ CallApiCallbackStub stub(isolate(), 1, true);
+ DCHECK_EQ(5, stub.GetCallInterfaceDescriptor().GetParameterCount());
+ DCHECK_EQ(1, stub.GetCallInterfaceDescriptor().GetStackParameterCount());
+ // TODO(vogelheim): There is currently no clean way to retrieve the context
+ // parameter for a stub and the implementation details are hidden in
+ // compiler/*. The context_paramter is computed as:
+ // Linkage::GetJSCallContextParamIndex(descriptor->JSParameterCount())
+ const int context_parameter = 2;
+ Node* call = assembler_->CallStub(
+ stub.GetCallInterfaceDescriptor(),
+ assembler_->HeapConstant(stub.GetCode()),
+ assembler_->Parameter(context_parameter),
- // The stub has 6 parameters.
- // See: ApiCallbackDescriptorBase::BuildCallInterfaceDescriptorFunctionType
- Node* args[] = {
// Stub/register parameters:
assembler_->Parameter(0), /* receiver (use accessor's) */
assembler_->UndefinedConstant(), /* call_data (undefined) */
@@ -191,70 +181,51 @@ FastAccessorAssembler::ValueId FastAccessorAssembler::Call(
assembler_->ExternalConstant(callback), /* API callback function */
// JS arguments, on stack:
- FromId(arg),
-
- // Context parameter. (See Linkage::GetStubCallDescriptor.)
- assembler_->UndefinedConstant()};
- DCHECK_EQ(arraysize(args),
- 1 + stub.GetCallInterfaceDescriptor().GetParameterCount());
-
- Node* call = assembler_->CallN(
- Linkage::GetStubCallDescriptor(
- assembler_->isolate(), zone(), stub.GetCallInterfaceDescriptor(),
- stub.GetStackParameterCount(), CallDescriptor::kNoFlags),
- assembler_->HeapConstant(stub.GetCode()), args);
+ FromId(arg));
+
return FromRaw(call);
}
MaybeHandle<Code> FastAccessorAssembler::Build() {
CHECK_EQ(kBuilding, state_);
-
- // Cleanup: We no longer need this.
- nodes_.clear();
- labels_.clear();
-
- // Export the schedule and call the compiler.
- Schedule* schedule = assembler_->Export();
- Code::Flags flags = Code::ComputeFlags(Code::STUB);
- MaybeHandle<Code> code = Pipeline::GenerateCodeForCodeStub(
- assembler_->isolate(), assembler_->call_descriptor(), assembler_->graph(),
- schedule, flags, "FastAccessorAssembler");
-
- // Update state & return.
+ Handle<Code> code = assembler_->GenerateCode();
state_ = !code.is_null() ? kBuilt : kError;
+ Clear();
return code;
}
-
FastAccessorAssembler::ValueId FastAccessorAssembler::FromRaw(Node* node) {
nodes_.push_back(node);
ValueId value = {nodes_.size() - 1};
return value;
}
-
FastAccessorAssembler::LabelId FastAccessorAssembler::FromRaw(
- RawMachineLabel* label) {
+ CodeStubAssembler::Label* label) {
labels_.push_back(label);
LabelId label_id = {labels_.size() - 1};
return label_id;
}
-
Node* FastAccessorAssembler::FromId(ValueId value) const {
CHECK_LT(value.value_id, nodes_.size());
CHECK_NOT_NULL(nodes_.at(value.value_id));
return nodes_.at(value.value_id);
}
-
-RawMachineLabel* FastAccessorAssembler::FromId(LabelId label) const {
+CodeStubAssembler::Label* FastAccessorAssembler::FromId(LabelId label) const {
CHECK_LT(label.label_id, labels_.size());
CHECK_NOT_NULL(labels_.at(label.label_id));
return labels_.at(label.label_id);
}
+void FastAccessorAssembler::Clear() {
+ for (auto label : labels_) {
+ delete label;
+ }
+ nodes_.clear();
+ labels_.clear();
+}
-} // namespace compiler
} // namespace internal
} // namespace v8
« no previous file with comments | « src/fast-accessor-assembler.h ('k') | tools/gyp/v8.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698