Reviewers: Benedikt Meurer,
Message:
No rush, but please take a look, thanks. Let me know if there is anywhere we
should add tests for this?
Description:
[turbofan]: Add an InterpreterDispatch linkage type.
BUG=v8:4280
LOG=N
Please review this at https://codereview.chromium.org/1234443004/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+85, -4 lines):
M src/compiler/arm/instruction-selector-arm.cc
M src/compiler/arm/linkage-arm.cc
M src/compiler/arm64/instruction-selector-arm64.cc
M src/compiler/arm64/linkage-arm64.cc
M src/compiler/code-generator.cc
M src/compiler/ia32/instruction-selector-ia32.cc
M src/compiler/ia32/linkage-ia32.cc
M src/compiler/instruction-selector.cc
M src/compiler/linkage.h
M src/compiler/linkage.cc
M src/compiler/linkage-impl.h
M src/compiler/mips/instruction-selector-mips.cc
M src/compiler/mips/linkage-mips.cc
M src/compiler/mips64/instruction-selector-mips64.cc
M src/compiler/mips64/linkage-mips64.cc
M src/compiler/x64/instruction-selector-x64.cc
M src/compiler/x64/linkage-x64.cc
Index: src/compiler/arm/instruction-selector-arm.cc
diff --git a/src/compiler/arm/instruction-selector-arm.cc
b/src/compiler/arm/instruction-selector-arm.cc
index
885538804830594c3ab7529a16ee492cd20dc7f4..6c1baa2ba478d77c687e67001290d22daa6244e2
100644
--- a/src/compiler/arm/instruction-selector-arm.cc
+++ b/src/compiler/arm/instruction-selector-arm.cc
@@ -1190,6 +1190,7 @@ void InstructionSelector::VisitTailCall(Node* node) {
InstructionCode opcode;
switch (descriptor->kind()) {
case CallDescriptor::kCallCodeObject:
+ case CallDescriptor::kInterpreterDispatch:
opcode = kArchTailCallCodeObject;
break;
case CallDescriptor::kCallJSFunction:
Index: src/compiler/arm/linkage-arm.cc
diff --git a/src/compiler/arm/linkage-arm.cc
b/src/compiler/arm/linkage-arm.cc
index
a923f1bf8d140f0cc1d0fe1c91f45125973727cf..93cc773e73d319f19ad607a48ae65a3a606e5d8b
100644
--- a/src/compiler/arm/linkage-arm.cc
+++ b/src/compiler/arm/linkage-arm.cc
@@ -69,6 +69,12 @@ CallDescriptor* Linkage::GetSimplifiedCDescriptor(Zone*
zone,
return LH::GetSimplifiedCDescriptor(zone, sig);
}
+
+CallDescriptor* Linkage::GetInterpreterDispatchDescriptor(
+ Zone* zone, const MachineSignature* sig) {
+ return LH::GetInterpreterDispatchDescriptor(zone, sig);
+}
+
} // namespace compiler
} // namespace internal
} // namespace v8
Index: src/compiler/arm64/instruction-selector-arm64.cc
diff --git a/src/compiler/arm64/instruction-selector-arm64.cc
b/src/compiler/arm64/instruction-selector-arm64.cc
index
ca0ec4e40063b31ddd4539a3d2178d511e9556b8..03dfd73a73a76f1111ad8988901f1a77b397f76c
100644
--- a/src/compiler/arm64/instruction-selector-arm64.cc
+++ b/src/compiler/arm64/instruction-selector-arm64.cc
@@ -1492,6 +1492,7 @@ void InstructionSelector::VisitTailCall(Node* node) {
InstructionCode opcode;
switch (descriptor->kind()) {
case CallDescriptor::kCallCodeObject:
+ case CallDescriptor::kInterpreterDispatch:
opcode = kArchTailCallCodeObject;
break;
case CallDescriptor::kCallJSFunction:
Index: src/compiler/arm64/linkage-arm64.cc
diff --git a/src/compiler/arm64/linkage-arm64.cc
b/src/compiler/arm64/linkage-arm64.cc
index
afedefbbd161055b32ba94269bd5b2acf071f785..141d62ab604d466bf579a2e784b36832d4050a2d
100644
--- a/src/compiler/arm64/linkage-arm64.cc
+++ b/src/compiler/arm64/linkage-arm64.cc
@@ -71,6 +71,12 @@ CallDescriptor* Linkage::GetSimplifiedCDescriptor(Zone*
zone,
return LH::GetSimplifiedCDescriptor(zone, sig);
}
+
+CallDescriptor* Linkage::GetInterpreterDispatchDescriptor(
+ Zone* zone, const MachineSignature* sig) {
+ return LH::GetInterpreterDispatchDescriptor(zone, sig);
+}
+
} // namespace compiler
} // namespace internal
} // namespace v8
Index: src/compiler/code-generator.cc
diff --git a/src/compiler/code-generator.cc b/src/compiler/code-generator.cc
index
2903c3d370dd825fd2f864f7d9186fed3d6da891..a70518939aaa5bb5af7a4dc8c57896dcb03fee8e
100644
--- a/src/compiler/code-generator.cc
+++ b/src/compiler/code-generator.cc
@@ -245,7 +245,10 @@ bool
CodeGenerator::IsMaterializableFromFrame(Handle<HeapObject> object,
bool CodeGenerator::IsMaterializableFromRoot(
Handle<HeapObject> object, Heap::RootListIndex* index_return) {
- if (linkage()->GetIncomingDescriptor()->IsJSFunctionCall()) {
+ const CallDescriptor* incoming_descriptor =
+ linkage()->GetIncomingDescriptor();
+ if (incoming_descriptor->IsJSFunctionCall() ||
+ incoming_descriptor->IsInterpreterDispatch()) {
RootIndexMap map(isolate());
int root_index = map.Lookup(*object);
if (root_index != RootIndexMap::kInvalidRootIndex) {
Index: src/compiler/ia32/instruction-selector-ia32.cc
diff --git a/src/compiler/ia32/instruction-selector-ia32.cc
b/src/compiler/ia32/instruction-selector-ia32.cc
index
105ca8287b891088355715deaf1926ecdb2da10a..460384cf56f3964c17e8c2e3be83637242c53993
100644
--- a/src/compiler/ia32/instruction-selector-ia32.cc
+++ b/src/compiler/ia32/instruction-selector-ia32.cc
@@ -921,6 +921,7 @@ void InstructionSelector::VisitTailCall(Node* node) {
InstructionCode opcode;
switch (descriptor->kind()) {
case CallDescriptor::kCallCodeObject:
+ case CallDescriptor::kInterpreterDispatch:
opcode = kArchTailCallCodeObject;
break;
case CallDescriptor::kCallJSFunction:
Index: src/compiler/ia32/linkage-ia32.cc
diff --git a/src/compiler/ia32/linkage-ia32.cc
b/src/compiler/ia32/linkage-ia32.cc
index
930a86c69f9b5b72e8f0344d911fc8556f0290db..7ea80b296203f9e7a7224de8161dda90aafff11f
100644
--- a/src/compiler/ia32/linkage-ia32.cc
+++ b/src/compiler/ia32/linkage-ia32.cc
@@ -60,6 +60,12 @@ CallDescriptor* Linkage::GetSimplifiedCDescriptor(Zone*
zone,
return LH::GetSimplifiedCDescriptor(zone, sig);
}
+
+CallDescriptor* Linkage::GetInterpreterDispatchDescriptor(
+ Zone* zone, const MachineSignature* sig) {
+ return LH::GetInterpreterDispatchDescriptor(zone, sig);
+}
+
} // namespace compiler
} // namespace internal
} // namespace v8
Index: src/compiler/instruction-selector.cc
diff --git a/src/compiler/instruction-selector.cc
b/src/compiler/instruction-selector.cc
index
813da4f132e2e9fb411004ae22b88bb0cb6189cc..4981f6427aaa412efb9146020d900abdee088699
100644
--- a/src/compiler/instruction-selector.cc
+++ b/src/compiler/instruction-selector.cc
@@ -345,6 +345,9 @@ void InstructionSelector::InitializeCallBuffer(Node*
call, CallBuffer* buffer,
g.UseLocation(callee, buffer->descriptor->GetInputLocation(0),
buffer->descriptor->GetInputType(0)));
break;
+ case CallDescriptor::kInterpreterDispatch:
+ buffer->instruction_args.push_back(g.UseRegister(callee));
+ break;
}
DCHECK_EQ(1u, buffer->instruction_args.size());
Index: src/compiler/linkage-impl.h
diff --git a/src/compiler/linkage-impl.h b/src/compiler/linkage-impl.h
index
27b0235b9701e343512072d9b968d1154b11cf46..5b638034c8cbeaf7e141eda55d0d71150ba3bdcf
100644
--- a/src/compiler/linkage-impl.h
+++ b/src/compiler/linkage-impl.h
@@ -233,6 +233,27 @@ class LinkageHelper {
"c-call");
}
+ static CallDescriptor* GetInterpreterDispatchDescriptor(
+ Zone* zone, const MachineSignature* msig) {
+ DCHECK_EQ(0, msig->parameter_count());
+ LocationSignature::Builder locations(zone, msig->return_count(),
+ msig->parameter_count());
+ AddReturnLocations(&locations);
+ LinkageLocation target_loc = LinkageLocation::AnyRegister();
+ return new (zone) CallDescriptor( // --
+ CallDescriptor::kInterpreterDispatch, // kind
+ kMachNone, // target MachineType
+ target_loc, // target location
+ msig, // machine_sig
+ locations.Build(), // location_sig
+ 0, // js_parameter_count
+ Operator::kNoProperties, // properties
+ kNoCalleeSaved, // callee-saved registers
+ kNoCalleeSaved, // callee-saved fp regs
+ CallDescriptor::kSupportsTailCalls, // flags
+ "interpreter-dispatch");
+ }
+
static LinkageLocation regloc(Register reg) {
return LinkageLocation(Register::ToAllocationIndex(reg));
}
Index: src/compiler/linkage.cc
diff --git a/src/compiler/linkage.cc b/src/compiler/linkage.cc
index
6ef014246d95f74dba60a5d0bb079b6a9defdfd8..0c43c2d494fe68ad712597782bc1d1c2201bd28d
100644
--- a/src/compiler/linkage.cc
+++ b/src/compiler/linkage.cc
@@ -26,6 +26,9 @@ std::ostream& operator<<(std::ostream& os, const
CallDescriptor::Kind& k) {
case CallDescriptor::kCallAddress:
os << "Addr";
break;
+ case CallDescriptor::kInterpreterDispatch:
+ os << "InterpreterDispatch";
+ break;
}
return os;
}
Index: src/compiler/linkage.h
diff --git a/src/compiler/linkage.h b/src/compiler/linkage.h
index
31b9faca2a9f15f145141b2160c117b6c24fb3cd..45d15c9eead52a5cdc709f20b4c19fc4261accbf
100644
--- a/src/compiler/linkage.h
+++ b/src/compiler/linkage.h
@@ -63,9 +63,10 @@ class CallDescriptor final : public ZoneObject {
public:
// Describes the kind of this call, which determines the target.
enum Kind {
- kCallCodeObject, // target is a Code object
- kCallJSFunction, // target is a JSFunction object
- kCallAddress // target is a machine pointer
+ kCallCodeObject, // target is a Code object
+ kCallJSFunction, // target is a JSFunction object
+ kCallAddress, // target is a machine pointer
+ kInterpreterDispatch // target is an interpreter bytecode handler
};
enum Flag {
@@ -111,6 +112,8 @@ class CallDescriptor final : public ZoneObject {
// Returns {true} if this descriptor is a call to a JSFunction.
bool IsJSFunctionCall() const { return kind_ == kCallJSFunction; }
+ bool IsInterpreterDispatch() const { return kind_ ==
kInterpreterDispatch; }
+
// The number of return values from this call.
size_t ReturnCount() const { return machine_sig_->return_count(); }
@@ -235,6 +238,12 @@ class Linkage : public ZoneObject {
static CallDescriptor* GetSimplifiedCDescriptor(Zone* zone,
const MachineSignature*
sig);
+ // Creates a call descriptor for interpreter handler code stubs. These
are not
+ // intended to be called directly but are instead dispatched to by the
+ // interpreter.
+ static CallDescriptor* GetInterpreterDispatchDescriptor(
+ Zone* zone, const MachineSignature* sig);
+
// Get the location of an (incoming) parameter to this function.
LinkageLocation GetParameterLocation(int index) const {
return incoming_->GetInputLocation(index + 1); // + 1 to skip target.
Index: src/compiler/mips/instruction-selector-mips.cc
diff --git a/src/compiler/mips/instruction-selector-mips.cc
b/src/compiler/mips/instruction-selector-mips.cc
index
c2420ac0d816cc3b7688658cb79c0bb207b3ec9e..7c0876d537c627dc79db3f7bf95f3140ebd80af1
100644
--- a/src/compiler/mips/instruction-selector-mips.cc
+++ b/src/compiler/mips/instruction-selector-mips.cc
@@ -610,6 +610,7 @@ void InstructionSelector::VisitTailCall(Node* node) {
InstructionCode opcode;
switch (descriptor->kind()) {
case CallDescriptor::kCallCodeObject:
+ case CallDescriptor::kInterpreterDispatch:
opcode = kArchTailCallCodeObject;
break;
case CallDescriptor::kCallJSFunction:
Index: src/compiler/mips/linkage-mips.cc
diff --git a/src/compiler/mips/linkage-mips.cc
b/src/compiler/mips/linkage-mips.cc
index
7b03340a0aa0913fa5489cd65d3c254cc65429d3..839657fc0829cd5e644f015a886e59685b6b35bf
100644
--- a/src/compiler/mips/linkage-mips.cc
+++ b/src/compiler/mips/linkage-mips.cc
@@ -68,6 +68,12 @@ CallDescriptor* Linkage::GetSimplifiedCDescriptor(Zone*
zone,
return LH::GetSimplifiedCDescriptor(zone, sig);
}
+
+CallDescriptor* Linkage::GetInterpreterDispatchDescriptor(
+ Zone* zone, const MachineSignature* sig) {
+ return LH::GetInterpreterDispatchDescriptor(zone, sig);
+}
+
} // namespace compiler
} // namespace internal
} // namespace v8
Index: src/compiler/mips64/instruction-selector-mips64.cc
diff --git a/src/compiler/mips64/instruction-selector-mips64.cc
b/src/compiler/mips64/instruction-selector-mips64.cc
index
e4d8795f1b1716b99dbf385c2c9cb4b5f3d1a794..e25e7d743066b0bda25e77bf071c14171b4f9747
100644
--- a/src/compiler/mips64/instruction-selector-mips64.cc
+++ b/src/compiler/mips64/instruction-selector-mips64.cc
@@ -759,6 +759,7 @@ void InstructionSelector::VisitTailCall(Node* node) {
InstructionCode opcode;
switch (descriptor->kind()) {
case CallDescriptor::kCallCodeObject:
+ case CallDescriptor::kInterpreterDispatch:
opcode = kArchTailCallCodeObject;
break;
case CallDescriptor::kCallJSFunction:
Index: src/compiler/mips64/linkage-mips64.cc
diff --git a/src/compiler/mips64/linkage-mips64.cc
b/src/compiler/mips64/linkage-mips64.cc
index
acfedb715f5bac43b72a9dff2a4beb7bd283ea50..5c8c58c73f7d4ac5dfb1ee3c2aee6a0d5fad0efc
100644
--- a/src/compiler/mips64/linkage-mips64.cc
+++ b/src/compiler/mips64/linkage-mips64.cc
@@ -68,6 +68,12 @@ CallDescriptor* Linkage::GetSimplifiedCDescriptor(Zone*
zone,
return LH::GetSimplifiedCDescriptor(zone, sig);
}
+
+CallDescriptor* Linkage::GetInterpreterDispatchDescriptor(
+ Zone* zone, const MachineSignature* sig) {
+ return LH::GetInterpreterDispatchDescriptor(zone, sig);
+}
+
} // namespace compiler
} // namespace internal
} // namespace v8
Index: src/compiler/x64/instruction-selector-x64.cc
diff --git a/src/compiler/x64/instruction-selector-x64.cc
b/src/compiler/x64/instruction-selector-x64.cc
index
6d7fca472e6c504bc9deb8fd006e3a15008bef39..8a0615c897e8bb12c55a9135f8c5403aafb9ae93
100644
--- a/src/compiler/x64/instruction-selector-x64.cc
+++ b/src/compiler/x64/instruction-selector-x64.cc
@@ -1129,6 +1129,7 @@ void InstructionSelector::VisitTailCall(Node* node) {
InstructionCode opcode;
switch (descriptor->kind()) {
case CallDescriptor::kCallCodeObject:
+ case CallDescriptor::kInterpreterDispatch:
opcode = kArchTailCallCodeObject;
break;
case CallDescriptor::kCallJSFunction:
Index: src/compiler/x64/linkage-x64.cc
diff --git a/src/compiler/x64/linkage-x64.cc
b/src/compiler/x64/linkage-x64.cc
index
b272eb6f7668229a40b886bf292c3ad4320e0572..8bfbce02130c84bf44c01857084c1b50d94e052f
100644
--- a/src/compiler/x64/linkage-x64.cc
+++ b/src/compiler/x64/linkage-x64.cc
@@ -88,6 +88,12 @@ CallDescriptor* Linkage::GetSimplifiedCDescriptor(Zone*
zone,
return LH::GetSimplifiedCDescriptor(zone, sig);
}
+
+CallDescriptor* Linkage::GetInterpreterDispatchDescriptor(
+ Zone* zone, const MachineSignature* sig) {
+ return LH::GetInterpreterDispatchDescriptor(zone, sig);
+}
+
} // namespace compiler
} // namespace internal
} // namespace v8
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.