8786006022
R=yangguo@chromium.org Review URL: https://codereview.chromium.org/523583002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@23546 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
155 lines
4.5 KiB
C++
155 lines
4.5 KiB
C++
// Copyright 2014 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef V8_CALL_INTERFACE_DESCRIPTOR_H_
|
|
#define V8_CALL_INTERFACE_DESCRIPTOR_H_
|
|
|
|
#include "src/assembler.h"
|
|
#include "src/macro-assembler.h"
|
|
|
|
namespace v8 {
|
|
namespace internal {
|
|
|
|
class PlatformInterfaceDescriptor;
|
|
|
|
class InterfaceDescriptor {
|
|
public:
|
|
bool IsInitialized() const { return register_param_count_ >= 0; }
|
|
|
|
int GetEnvironmentLength() const { return register_param_count_; }
|
|
|
|
int GetRegisterParameterCount() const { return register_param_count_; }
|
|
|
|
Register GetParameterRegister(int index) const {
|
|
return register_params_[index];
|
|
}
|
|
|
|
Representation GetParameterRepresentation(int index) const {
|
|
DCHECK(index < register_param_count_);
|
|
if (register_param_representations_.get() == NULL) {
|
|
return Representation::Tagged();
|
|
}
|
|
|
|
return register_param_representations_[index];
|
|
}
|
|
|
|
// "Environment" versions of parameter functions. The first register
|
|
// parameter (context) is not included.
|
|
int GetEnvironmentParameterCount() const {
|
|
return GetEnvironmentLength() - 1;
|
|
}
|
|
|
|
Register GetEnvironmentParameterRegister(int index) const {
|
|
return GetParameterRegister(index + 1);
|
|
}
|
|
|
|
Representation GetEnvironmentParameterRepresentation(int index) const {
|
|
return GetParameterRepresentation(index + 1);
|
|
}
|
|
|
|
// Some platforms have extra information to associate with the descriptor.
|
|
PlatformInterfaceDescriptor* platform_specific_descriptor() const {
|
|
return platform_specific_descriptor_;
|
|
}
|
|
|
|
static const Register ContextRegister();
|
|
|
|
protected:
|
|
InterfaceDescriptor();
|
|
virtual ~InterfaceDescriptor() {}
|
|
|
|
void Initialize(int register_parameter_count, Register* registers,
|
|
Representation* register_param_representations,
|
|
PlatformInterfaceDescriptor* platform_descriptor = NULL);
|
|
|
|
private:
|
|
int register_param_count_;
|
|
|
|
// The Register params are allocated dynamically by the
|
|
// InterfaceDescriptor, and freed on destruction. This is because static
|
|
// arrays of Registers cause creation of runtime static initializers
|
|
// which we don't want.
|
|
SmartArrayPointer<Register> register_params_;
|
|
// Specifies Representations for the stub's parameter. Points to an array of
|
|
// Representations of the same length of the numbers of parameters to the
|
|
// stub, or if NULL (the default value), Representation of each parameter
|
|
// assumed to be Tagged().
|
|
SmartArrayPointer<Representation> register_param_representations_;
|
|
|
|
PlatformInterfaceDescriptor* platform_specific_descriptor_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(InterfaceDescriptor);
|
|
};
|
|
|
|
|
|
enum CallDescriptorKey {
|
|
LoadICCall,
|
|
StoreICCall,
|
|
ElementTransitionAndStoreCall,
|
|
InstanceofCall,
|
|
VectorLoadICCall,
|
|
FastNewClosureCall,
|
|
FastNewContextCall,
|
|
ToNumberCall,
|
|
NumberToStringCall,
|
|
FastCloneShallowArrayCall,
|
|
FastCloneShallowObjectCall,
|
|
CreateAllocationSiteCall,
|
|
CallFunctionCall,
|
|
CallConstructCall,
|
|
RegExpConstructResultCall,
|
|
TransitionElementsKindCall,
|
|
ArrayConstructorConstantArgCountCall,
|
|
ArrayConstructorCall,
|
|
InternalArrayConstructorConstantArgCountCall,
|
|
InternalArrayConstructorCall,
|
|
CompareNilCall,
|
|
ToBooleanCall,
|
|
BinaryOpCall,
|
|
BinaryOpWithAllocationSiteCall,
|
|
StringAddCall,
|
|
KeyedCall,
|
|
NamedCall,
|
|
CallHandler,
|
|
ArgumentAdaptorCall,
|
|
ApiFunctionCall,
|
|
NUMBER_OF_CALL_DESCRIPTORS
|
|
};
|
|
|
|
|
|
class CallInterfaceDescriptor : public InterfaceDescriptor {
|
|
public:
|
|
CallInterfaceDescriptor() {}
|
|
|
|
// A copy of the passed in registers and param_representations is made
|
|
// and owned by the CallInterfaceDescriptor.
|
|
|
|
// TODO(mvstanton): Instead of taking parallel arrays register and
|
|
// param_representations, how about a struct that puts the representation
|
|
// and register side by side (eg, RegRep(r1, Representation::Tagged()).
|
|
// The same should go for the CodeStubInterfaceDescriptor class.
|
|
void Initialize(int register_parameter_count, Register* registers,
|
|
Representation* param_representations,
|
|
PlatformInterfaceDescriptor* platform_descriptor = NULL);
|
|
};
|
|
|
|
|
|
class CallDescriptors {
|
|
public:
|
|
static void InitializeForIsolate(Isolate* isolate);
|
|
|
|
private:
|
|
static void InitializeForIsolateAllPlatforms(Isolate* isolate);
|
|
};
|
|
}
|
|
} // namespace v8::internal
|
|
|
|
#if V8_TARGET_ARCH_ARM64
|
|
#include "src/arm64/interface-descriptors-arm64.h"
|
|
#elif V8_TARGET_ARCH_ARM
|
|
#include "src/arm/interface-descriptors-arm.h"
|
|
#endif
|
|
|
|
#endif // V8_CALL_INTERFACE_DESCRIPTOR_H_
|