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

Unified Diff: src/code-stubs.h

Issue 551043005: Added CallInterfaceDescriptors to all code stubs. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: REBASE. Created 6 years, 3 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/arm64/lithium-codegen-arm64.cc ('k') | src/ia32/code-stubs-ia32.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/code-stubs.h
diff --git a/src/code-stubs.h b/src/code-stubs.h
index 626e14e08d4de951aa4bc837172b002b116aa3ba..eb858b0096569d4b1527a18ec51155193d93781c 100644
--- a/src/code-stubs.h
+++ b/src/code-stubs.h
@@ -180,10 +180,7 @@ class CodeStub BASE_EMBEDDED {
// Lookup the code in the (possibly custom) cache.
bool FindCodeInCache(Code** code_out);
- virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() {
- UNREACHABLE(); // Default returns an uninitialized descriptor.
- return CallInterfaceDescriptor();
- }
+ virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() = 0;
virtual void InitializeDescriptor(CodeStubDescriptor* descriptor) {}
@@ -314,6 +311,16 @@ class CodeStub BASE_EMBEDDED {
return NAME##Descriptor(isolate()); \
}
+// There are some code stubs we just can't describe right now with a
+// CallInterfaceDescriptor. Isolate behavior for those cases with this macro.
+// An attempt to retrieve a descriptor will fail.
+#define DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR() \
+ public: \
+ virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE { \
+ UNREACHABLE(); \
+ return CallInterfaceDescriptor(); \
+ }
+
class PlatformCodeStub : public CodeStub {
public:
@@ -670,6 +677,13 @@ class InstanceofStub: public PlatformCodeStub {
static Register left() { return InstanceofDescriptor::left(); }
static Register right() { return InstanceofDescriptor::right(); }
+ virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE {
+ if (HasArgsInRegisters()) {
+ return InstanceofDescriptor(isolate());
+ }
+ return ContextOnlyDescriptor(isolate());
+ }
+
private:
Flags flags() const { return FlagBits::decode(minor_key_); }
@@ -687,7 +701,6 @@ class InstanceofStub: public PlatformCodeStub {
class FlagBits : public BitField<Flags, 0, 3> {};
- DEFINE_CALL_INTERFACE_DESCRIPTOR(Instanceof);
DEFINE_PLATFORM_CODE_STUB(Instanceof, PlatformCodeStub);
};
@@ -719,6 +732,7 @@ class ArrayConstructorStub: public PlatformCodeStub {
class ArgumentCountBits : public BitField<ArgumentCountKey, 0, 2> {};
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(ArrayConstructor);
DEFINE_PLATFORM_CODE_STUB(ArrayConstructor, PlatformCodeStub);
};
@@ -730,6 +744,7 @@ class InternalArrayConstructorStub: public PlatformCodeStub {
private:
void GenerateCase(MacroAssembler* masm, ElementsKind kind);
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(InternalArrayConstructor);
DEFINE_PLATFORM_CODE_STUB(InternalArrayConstructor, PlatformCodeStub);
};
@@ -743,6 +758,16 @@ class MathPowStub: public PlatformCodeStub {
minor_key_ = ExponentTypeBits::encode(exponent_type);
}
+ virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE {
+ if (exponent_type() == TAGGED) {
+ return MathPowTaggedDescriptor(isolate());
+ } else if (exponent_type() == INTEGER) {
+ return MathPowIntegerDescriptor(isolate());
+ }
+ // A CallInterfaceDescriptor doesn't specify double registers (yet).
+ return ContextOnlyDescriptor(isolate());
+ }
+
private:
ExponentType exponent_type() const {
return ExponentTypeBits::decode(minor_key_);
@@ -789,6 +814,7 @@ class CallICStub: public PlatformCodeStub {
private:
virtual void PrintState(OStream& os) const OVERRIDE; // NOLINT
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(CallFunctionWithFeedback);
DEFINE_PLATFORM_CODE_STUB(CallIC, PlatformCodeStub);
};
@@ -817,6 +843,10 @@ class FunctionPrototypeStub : public PlatformCodeStub {
virtual Code::Kind GetCodeKind() const { return Code::HANDLER; }
+ // TODO(mvstanton): only the receiver register is accessed. When this is
+ // translated to a hydrogen code stub, a new CallInterfaceDescriptor
+ // should be created that just uses that register for more efficient code.
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(Load);
DEFINE_PLATFORM_CODE_STUB(FunctionPrototype, PlatformCodeStub);
};
@@ -1009,6 +1039,7 @@ class CallApiFunctionStub : public PlatformCodeStub {
class ArgumentBits: public BitField<int, 2, Code::kArgumentsBits> {};
STATIC_ASSERT(Code::kArgumentsBits + 2 <= kStubMinorKeyBits);
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(ApiFunction);
DEFINE_PLATFORM_CODE_STUB(CallApiFunction, PlatformCodeStub);
};
@@ -1017,6 +1048,7 @@ class CallApiGetterStub : public PlatformCodeStub {
public:
explicit CallApiGetterStub(Isolate* isolate) : PlatformCodeStub(isolate) {}
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(ApiGetter);
DEFINE_PLATFORM_CODE_STUB(CallApiGetter, PlatformCodeStub);
};
@@ -1108,6 +1140,7 @@ class BinaryOpICWithAllocationSiteStub FINAL : public PlatformCodeStub {
static void GenerateAheadOfTime(Isolate* isolate,
const BinaryOpIC::State& state);
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOpWithAllocationSite);
DEFINE_PLATFORM_CODE_STUB(BinaryOpICWithAllocationSite, PlatformCodeStub);
};
@@ -1230,6 +1263,7 @@ class CompareICStub : public PlatformCodeStub {
Handle<Map> known_map_;
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(BinaryOp);
DEFINE_PLATFORM_CODE_STUB(CompareIC, PlatformCodeStub);
};
@@ -1353,6 +1387,7 @@ class CEntryStub : public PlatformCodeStub {
class SaveDoublesBits : public BitField<bool, 0, 1> {};
class ResultSizeBits : public BitField<int, 1, 3> {};
+ DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR();
DEFINE_PLATFORM_CODE_STUB(CEntry, PlatformCodeStub);
};
@@ -1381,6 +1416,7 @@ class JSEntryStub : public PlatformCodeStub {
int handler_offset_;
+ DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR();
DEFINE_PLATFORM_CODE_STUB(JSEntry, PlatformCodeStub);
};
@@ -1398,6 +1434,13 @@ class ArgumentsAccessStub: public PlatformCodeStub {
minor_key_ = TypeBits::encode(type);
}
+ virtual CallInterfaceDescriptor GetCallInterfaceDescriptor() OVERRIDE {
+ if (type() == READ_ELEMENT) {
+ return ArgumentsAccessReadDescriptor(isolate());
+ }
+ return ContextOnlyDescriptor(isolate());
+ }
+
private:
Type type() const { return TypeBits::decode(minor_key_); }
@@ -1418,6 +1461,7 @@ class RegExpExecStub: public PlatformCodeStub {
public:
explicit RegExpExecStub(Isolate* isolate) : PlatformCodeStub(isolate) { }
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(ContextOnly);
DEFINE_PLATFORM_CODE_STUB(RegExpExec, PlatformCodeStub);
};
@@ -1716,6 +1760,7 @@ class LoadICTrampolineStub : public PlatformCodeStub {
return LoadIC::State(static_cast<ExtraICState>(minor_key_));
}
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(VectorLoadICTrampoline);
DEFINE_PLATFORM_CODE_STUB(LoadICTrampoline, PlatformCodeStub);
};
@@ -1836,6 +1881,7 @@ class DoubleToIStub : public PlatformCodeStub {
class SSE3Bits:
public BitField<int, 2 * kBitsPerRegisterNumber + 5, 1> {}; // NOLINT
+ DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR();
DEFINE_PLATFORM_CODE_STUB(DoubleToI, PlatformCodeStub);
};
@@ -2102,6 +2148,7 @@ class StoreElementStub : public PlatformCodeStub {
class ElementsKindBits : public BitField<ElementsKind, 0, 8> {};
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(Store);
DEFINE_PLATFORM_CODE_STUB(StoreElement, PlatformCodeStub);
};
@@ -2252,6 +2299,7 @@ class StoreArrayLiteralElementStub : public PlatformCodeStub {
explicit StoreArrayLiteralElementStub(Isolate* isolate)
: PlatformCodeStub(isolate) { }
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(StoreArrayLiteralElement);
DEFINE_PLATFORM_CODE_STUB(StoreArrayLiteralElement, PlatformCodeStub);
};
@@ -2272,6 +2320,7 @@ class StubFailureTrampolineStub : public PlatformCodeStub {
class FunctionModeField : public BitField<StubFunctionMode, 0, 1> {};
+ DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR();
DEFINE_PLATFORM_CODE_STUB(StubFailureTrampoline, PlatformCodeStub);
};
@@ -2291,6 +2340,9 @@ class ProfileEntryHookStub : public PlatformCodeStub {
intptr_t stack_pointer,
Isolate* isolate);
+ // ProfileEntryHookStub is called at the start of a function, so it has the
+ // same register set.
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(CallFunction)
DEFINE_PLATFORM_CODE_STUB(ProfileEntryHook, PlatformCodeStub);
};
@@ -2310,6 +2362,7 @@ class StoreBufferOverflowStub : public PlatformCodeStub {
class SaveDoublesBits : public BitField<bool, 0, 1> {};
+ DEFINE_NULL_CALL_INTERFACE_DESCRIPTOR();
DEFINE_PLATFORM_CODE_STUB(StoreBufferOverflow, PlatformCodeStub);
};
@@ -2318,6 +2371,7 @@ class SubStringStub : public PlatformCodeStub {
public:
explicit SubStringStub(Isolate* isolate) : PlatformCodeStub(isolate) {}
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(ContextOnly);
DEFINE_PLATFORM_CODE_STUB(SubString, PlatformCodeStub);
};
@@ -2326,6 +2380,7 @@ class StringCompareStub : public PlatformCodeStub {
public:
explicit StringCompareStub(Isolate* isolate) : PlatformCodeStub(isolate) {}
+ DEFINE_CALL_INTERFACE_DESCRIPTOR(ContextOnly);
DEFINE_PLATFORM_CODE_STUB(StringCompare, PlatformCodeStub);
};
« no previous file with comments | « src/arm64/lithium-codegen-arm64.cc ('k') | src/ia32/code-stubs-ia32.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698