Index: src/compiler/code-stub-assembler.h |
diff --git a/src/compiler/code-stub-assembler.h b/src/compiler/code-stub-assembler.h |
deleted file mode 100644 |
index b73c723eaa4fcd4fd01d21611443d0edd1dc7469..0000000000000000000000000000000000000000 |
--- a/src/compiler/code-stub-assembler.h |
+++ /dev/null |
@@ -1,516 +0,0 @@ |
-// Copyright 2015 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_COMPILER_CODE_STUB_ASSEMBLER_H_ |
-#define V8_COMPILER_CODE_STUB_ASSEMBLER_H_ |
- |
-#include <map> |
- |
-// Clients of this interface shouldn't depend on lots of compiler internals. |
-// Do not include anything from src/compiler here! |
-#include "src/allocation.h" |
-#include "src/builtins.h" |
-#include "src/heap/heap.h" |
-#include "src/machine-type.h" |
-#include "src/runtime/runtime.h" |
-#include "src/zone-containers.h" |
- |
-namespace v8 { |
-namespace internal { |
- |
-class Callable; |
-class CallInterfaceDescriptor; |
-class Isolate; |
-class Factory; |
-class Zone; |
- |
-namespace compiler { |
- |
-class CallDescriptor; |
-class Graph; |
-class Node; |
-class Operator; |
-class RawMachineAssembler; |
-class RawMachineLabel; |
-class Schedule; |
- |
-#define CODE_STUB_ASSEMBLER_COMPARE_BINARY_OP_LIST(V) \ |
- V(Float32Equal) \ |
- V(Float32LessThan) \ |
- V(Float32LessThanOrEqual) \ |
- V(Float32GreaterThan) \ |
- V(Float32GreaterThanOrEqual) \ |
- V(Float64Equal) \ |
- V(Float64LessThan) \ |
- V(Float64LessThanOrEqual) \ |
- V(Float64GreaterThan) \ |
- V(Float64GreaterThanOrEqual) \ |
- V(Int32GreaterThan) \ |
- V(Int32GreaterThanOrEqual) \ |
- V(Int32LessThan) \ |
- V(Int32LessThanOrEqual) \ |
- V(IntPtrLessThan) \ |
- V(IntPtrLessThanOrEqual) \ |
- V(Uint32LessThan) \ |
- V(UintPtrGreaterThanOrEqual) \ |
- V(WordEqual) \ |
- V(WordNotEqual) \ |
- V(Word32Equal) \ |
- V(Word32NotEqual) \ |
- V(Word64Equal) \ |
- V(Word64NotEqual) |
- |
-#define CODE_STUB_ASSEMBLER_BINARY_OP_LIST(V) \ |
- CODE_STUB_ASSEMBLER_COMPARE_BINARY_OP_LIST(V) \ |
- V(Float64Add) \ |
- V(Float64Sub) \ |
- V(Float64Mul) \ |
- V(Float64Div) \ |
- V(Float64Mod) \ |
- V(Float64InsertLowWord32) \ |
- V(Float64InsertHighWord32) \ |
- V(IntPtrAdd) \ |
- V(IntPtrAddWithOverflow) \ |
- V(IntPtrSub) \ |
- V(IntPtrSubWithOverflow) \ |
- V(IntPtrMul) \ |
- V(Int32Add) \ |
- V(Int32AddWithOverflow) \ |
- V(Int32Sub) \ |
- V(Int32Mul) \ |
- V(Int32Div) \ |
- V(WordOr) \ |
- V(WordAnd) \ |
- V(WordXor) \ |
- V(WordShl) \ |
- V(WordShr) \ |
- V(WordSar) \ |
- V(WordRor) \ |
- V(Word32Or) \ |
- V(Word32And) \ |
- V(Word32Xor) \ |
- V(Word32Shl) \ |
- V(Word32Shr) \ |
- V(Word32Sar) \ |
- V(Word32Ror) \ |
- V(Word64Or) \ |
- V(Word64And) \ |
- V(Word64Xor) \ |
- V(Word64Shr) \ |
- V(Word64Sar) \ |
- V(Word64Ror) |
- |
-#define CODE_STUB_ASSEMBLER_UNARY_OP_LIST(V) \ |
- V(Float64Neg) \ |
- V(Float64Sqrt) \ |
- V(ChangeFloat64ToUint32) \ |
- V(ChangeInt32ToFloat64) \ |
- V(ChangeInt32ToInt64) \ |
- V(ChangeUint32ToFloat64) \ |
- V(ChangeUint32ToUint64) \ |
- V(Word32Clz) |
- |
-class CodeStubAssembler { |
- public: |
- // Create with CallStub linkage. |
- // |result_size| specifies the number of results returned by the stub. |
- // TODO(rmcilroy): move result_size to the CallInterfaceDescriptor. |
- CodeStubAssembler(Isolate* isolate, Zone* zone, |
- const CallInterfaceDescriptor& descriptor, |
- Code::Flags flags, const char* name, |
- size_t result_size = 1); |
- |
- // Create with JSCall linkage. |
- CodeStubAssembler(Isolate* isolate, Zone* zone, int parameter_count, |
- Code::Flags flags, const char* name); |
- |
- virtual ~CodeStubAssembler(); |
- |
- Handle<Code> GenerateCode(); |
- |
- class Label; |
- class Variable { |
- public: |
- explicit Variable(CodeStubAssembler* assembler, MachineRepresentation rep); |
- void Bind(Node* value); |
- Node* value() const; |
- MachineRepresentation rep() const; |
- bool IsBound() const; |
- |
- private: |
- friend class CodeStubAssembler; |
- class Impl; |
- Impl* impl_; |
- }; |
- |
- enum AllocationFlag : uint8_t { |
- kNone = 0, |
- kDoubleAlignment = 1, |
- kPretenured = 1 << 1 |
- }; |
- |
- typedef base::Flags<AllocationFlag> AllocationFlags; |
- |
- // =========================================================================== |
- // Base Assembler |
- // =========================================================================== |
- |
- // Constants. |
- Node* Int32Constant(int value); |
- Node* IntPtrConstant(intptr_t value); |
- Node* NumberConstant(double value); |
- Node* SmiConstant(Smi* value); |
- Node* HeapConstant(Handle<HeapObject> object); |
- Node* BooleanConstant(bool value); |
- Node* ExternalConstant(ExternalReference address); |
- Node* Float64Constant(double value); |
- Node* BooleanMapConstant(); |
- Node* EmptyStringConstant(); |
- Node* HeapNumberMapConstant(); |
- Node* NaNConstant(); |
- Node* NoContextConstant(); |
- Node* NullConstant(); |
- Node* UndefinedConstant(); |
- |
- Node* Parameter(int value); |
- void Return(Node* value); |
- |
- void Bind(Label* label); |
- void Goto(Label* label); |
- void GotoIf(Node* condition, Label* true_label); |
- void GotoUnless(Node* condition, Label* false_label); |
- void Branch(Node* condition, Label* true_label, Label* false_label); |
- |
- void Switch(Node* index, Label* default_label, int32_t* case_values, |
- Label** case_labels, size_t case_count); |
- |
- // Access to the frame pointer |
- Node* LoadFramePointer(); |
- Node* LoadParentFramePointer(); |
- |
- // Access to the stack pointer |
- Node* LoadStackPointer(); |
- |
- // Load raw memory location. |
- Node* Load(MachineType rep, Node* base); |
- Node* Load(MachineType rep, Node* base, Node* index); |
- |
- // Store value to raw memory location. |
- Node* Store(MachineRepresentation rep, Node* base, Node* value); |
- Node* Store(MachineRepresentation rep, Node* base, Node* index, Node* value); |
- Node* StoreNoWriteBarrier(MachineRepresentation rep, Node* base, Node* value); |
- Node* StoreNoWriteBarrier(MachineRepresentation rep, Node* base, Node* index, |
- Node* value); |
- |
-// Basic arithmetic operations. |
-#define DECLARE_CODE_STUB_ASSEMBER_BINARY_OP(name) Node* name(Node* a, Node* b); |
- CODE_STUB_ASSEMBLER_BINARY_OP_LIST(DECLARE_CODE_STUB_ASSEMBER_BINARY_OP) |
-#undef DECLARE_CODE_STUB_ASSEMBER_BINARY_OP |
- |
- Node* WordShl(Node* value, int shift); |
- |
-// Unary |
-#define DECLARE_CODE_STUB_ASSEMBER_UNARY_OP(name) Node* name(Node* a); |
- CODE_STUB_ASSEMBLER_UNARY_OP_LIST(DECLARE_CODE_STUB_ASSEMBER_UNARY_OP) |
-#undef DECLARE_CODE_STUB_ASSEMBER_UNARY_OP |
- |
- // Projections |
- Node* Projection(int index, Node* value); |
- |
- // Calls |
- Node* CallRuntime(Runtime::FunctionId function_id, Node* context); |
- Node* CallRuntime(Runtime::FunctionId function_id, Node* context, Node* arg1); |
- Node* CallRuntime(Runtime::FunctionId function_id, Node* context, Node* arg1, |
- Node* arg2); |
- Node* CallRuntime(Runtime::FunctionId function_id, Node* context, Node* arg1, |
- Node* arg2, Node* arg3); |
- Node* CallRuntime(Runtime::FunctionId function_id, Node* context, Node* arg1, |
- Node* arg2, Node* arg3, Node* arg4); |
- Node* CallRuntime(Runtime::FunctionId function_id, Node* context, Node* arg1, |
- Node* arg2, Node* arg3, Node* arg4, Node* arg5); |
- |
- Node* TailCallRuntime(Runtime::FunctionId function_id, Node* context); |
- Node* TailCallRuntime(Runtime::FunctionId function_id, Node* context, |
- Node* arg1); |
- Node* TailCallRuntime(Runtime::FunctionId function_id, Node* context, |
- Node* arg1, Node* arg2); |
- Node* TailCallRuntime(Runtime::FunctionId function_id, Node* context, |
- Node* arg1, Node* arg2, Node* arg3); |
- Node* TailCallRuntime(Runtime::FunctionId function_id, Node* context, |
- Node* arg1, Node* arg2, Node* arg3, Node* arg4); |
- |
- Node* CallStub(Callable const& callable, Node* context, Node* arg1, |
- size_t result_size = 1); |
- Node* CallStub(Callable const& callable, Node* context, Node* arg1, |
- Node* arg2, size_t result_size = 1); |
- Node* CallStub(Callable const& callable, Node* context, Node* arg1, |
- Node* arg2, Node* arg3, size_t result_size = 1); |
- |
- Node* CallStub(const CallInterfaceDescriptor& descriptor, Node* target, |
- Node* context, Node* arg1, size_t result_size = 1); |
- Node* CallStub(const CallInterfaceDescriptor& descriptor, Node* target, |
- Node* context, Node* arg1, Node* arg2, size_t result_size = 1); |
- Node* CallStub(const CallInterfaceDescriptor& descriptor, Node* target, |
- Node* context, Node* arg1, Node* arg2, Node* arg3, |
- size_t result_size = 1); |
- Node* CallStub(const CallInterfaceDescriptor& descriptor, Node* target, |
- Node* context, Node* arg1, Node* arg2, Node* arg3, Node* arg4, |
- size_t result_size = 1); |
- Node* CallStub(const CallInterfaceDescriptor& descriptor, Node* target, |
- Node* context, Node* arg1, Node* arg2, Node* arg3, Node* arg4, |
- Node* arg5, size_t result_size = 1); |
- |
- Node* TailCallStub(Callable const& callable, Node* context, Node* arg1, |
- Node* arg2, size_t result_size = 1); |
- Node* TailCallStub(const CallInterfaceDescriptor& descriptor, Node* target, |
- Node* context, Node* arg1, Node* arg2, |
- size_t result_size = 1); |
- |
- Node* TailCallBytecodeDispatch(const CallInterfaceDescriptor& descriptor, |
- Node* code_target_address, Node** args); |
- |
- // =========================================================================== |
- // Macros |
- // =========================================================================== |
- |
- // Float64 operations. |
- Node* Float64Ceil(Node* x); |
- Node* Float64Floor(Node* x); |
- Node* Float64Round(Node* x); |
- Node* Float64Trunc(Node* x); |
- |
- // Tag a Word as a Smi value. |
- Node* SmiTag(Node* value); |
- // Untag a Smi value as a Word. |
- Node* SmiUntag(Node* value); |
- Node* SmiToWord(Node* value) { return SmiUntag(value); } |
- |
- // Smi conversions. |
- Node* SmiToFloat64(Node* value); |
- Node* SmiFromWord32(Node* value); |
- Node* SmiToWord32(Node* value); |
- |
- // Smi operations. |
- Node* SmiAdd(Node* a, Node* b); |
- Node* SmiAddWithOverflow(Node* a, Node* b); |
- Node* SmiSub(Node* a, Node* b); |
- Node* SmiSubWithOverflow(Node* a, Node* b); |
- Node* SmiEqual(Node* a, Node* b); |
- Node* SmiAboveOrEqual(Node* a, Node* b); |
- Node* SmiLessThan(Node* a, Node* b); |
- Node* SmiLessThanOrEqual(Node* a, Node* b); |
- Node* SmiMin(Node* a, Node* b); |
- |
- // Load a value from the root array. |
- Node* LoadRoot(Heap::RootListIndex root_index); |
- |
- // Check a value for smi-ness |
- Node* WordIsSmi(Node* a); |
- |
- // Check that the value is a positive smi. |
- Node* WordIsPositiveSmi(Node* a); |
- |
- // Load an object pointer from a buffer that isn't in the heap. |
- Node* LoadBufferObject(Node* buffer, int offset, |
- MachineType rep = MachineType::AnyTagged()); |
- // Load a field from an object on the heap. |
- Node* LoadObjectField(Node* object, int offset, |
- MachineType rep = MachineType::AnyTagged()); |
- // Store a field to an object on the heap. |
- Node* StoreObjectFieldNoWriteBarrier( |
- Node* object, int offset, Node* value, |
- MachineRepresentation rep = MachineRepresentation::kTagged); |
- // Load the floating point value of a HeapNumber. |
- Node* LoadHeapNumberValue(Node* object); |
- // Store the floating point value of a HeapNumber. |
- Node* StoreHeapNumberValue(Node* object, Node* value); |
- // Truncate the floating point value of a HeapNumber to an Int32. |
- Node* TruncateHeapNumberValueToWord32(Node* object); |
- // Load the bit field of a Map. |
- Node* LoadMapBitField(Node* map); |
- // Load bit field 2 of a map. |
- Node* LoadMapBitField2(Node* map); |
- // Load bit field 3 of a map. |
- Node* LoadMapBitField3(Node* map); |
- // Load the instance type of a map. |
- Node* LoadMapInstanceType(Node* map); |
- // Load the instance descriptors of a map. |
- Node* LoadMapDescriptors(Node* map); |
- |
- // Load the hash field of a name. |
- Node* LoadNameHash(Node* name); |
- // Load the instance size of a Map. |
- Node* LoadMapInstanceSize(Node* map); |
- |
- // Load an array element from a FixedArray. |
- Node* LoadFixedArrayElementInt32Index(Node* object, Node* int32_index, |
- int additional_offset = 0); |
- Node* LoadFixedArrayElementSmiIndex(Node* object, Node* smi_index, |
- int additional_offset = 0); |
- Node* LoadFixedArrayElementConstantIndex(Node* object, int index); |
- |
- // Allocate an object of the given size. |
- Node* Allocate(int size, AllocationFlags flags = kNone); |
- Node* InnerAllocate(Node* previous, int offset); |
- // Allocate a HeapNumber without initializing its value. |
- Node* AllocateHeapNumber(); |
- // Allocate a HeapNumber with a specific value. |
- Node* AllocateHeapNumberWithValue(Node* value); |
- // Allocate a SeqOneByteString with the given length. |
- Node* AllocateSeqOneByteString(int length); |
- // Allocate a SeqTwoByteString with the given length. |
- Node* AllocateSeqTwoByteString(int length); |
- |
- // Store an array element to a FixedArray. |
- Node* StoreFixedArrayElementInt32Index(Node* object, Node* index, |
- Node* value); |
- Node* StoreFixedArrayElementNoWriteBarrier(Node* object, Node* index, |
- Node* value); |
- // Load the Map of an HeapObject. |
- Node* LoadMap(Node* object); |
- // Store the Map of an HeapObject. |
- Node* StoreMapNoWriteBarrier(Node* object, Node* map); |
- // Load the instance type of an HeapObject. |
- Node* LoadInstanceType(Node* object); |
- |
- // Load the elements backing store of a JSObject. |
- Node* LoadElements(Node* object); |
- // Load the length of a fixed array base instance. |
- Node* LoadFixedArrayBaseLength(Node* array); |
- |
- // Returns a node that is true if the given bit is set in |word32|. |
- template <typename T> |
- Node* BitFieldDecode(Node* word32) { |
- return BitFieldDecode(word32, T::kShift, T::kMask); |
- } |
- |
- Node* BitFieldDecode(Node* word32, uint32_t shift, uint32_t mask); |
- |
- // Conversions. |
- Node* ChangeFloat64ToTagged(Node* value); |
- Node* ChangeInt32ToTagged(Node* value); |
- Node* ChangeUint32ToTagged(Node* value); |
- Node* TruncateTaggedToFloat64(Node* context, Node* value); |
- Node* TruncateTaggedToWord32(Node* context, Node* value); |
- // Truncate to int32 using JavaScript truncation mode. |
- Node* TruncateFloat64ToInt32(Node* value); |
- |
- // Type conversions. |
- // Throws a TypeError for {method_name} if {value} is not coercible to Object, |
- // or returns the {value} converted to a String otherwise. |
- Node* ToThisString(Node* context, Node* value, char const* method_name); |
- |
- // String helpers. |
- // Load a character from a String (might flatten a ConsString). |
- Node* StringCharCodeAt(Node* string, Node* smi_index); |
- // Return the single character string with only {code}. |
- Node* StringFromCharCode(Node* code); |
- |
- // Branching helpers. |
- // TODO(danno): Can we be more cleverish wrt. edge-split? |
- void BranchIf(Node* condition, Label* if_true, Label* if_false); |
- |
-#define BRANCH_HELPER(name) \ |
- void BranchIf##name(Node* a, Node* b, Label* if_true, Label* if_false) { \ |
- BranchIf(name(a, b), if_true, if_false); \ |
- } |
- CODE_STUB_ASSEMBLER_COMPARE_BINARY_OP_LIST(BRANCH_HELPER) |
-#undef BRANCH_HELPER |
- |
- void BranchIfSmiLessThan(Node* a, Node* b, Label* if_true, Label* if_false) { |
- BranchIf(SmiLessThan(a, b), if_true, if_false); |
- } |
- |
- void BranchIfSmiLessThanOrEqual(Node* a, Node* b, Label* if_true, |
- Label* if_false) { |
- BranchIf(SmiLessThanOrEqual(a, b), if_true, if_false); |
- } |
- |
- void BranchIfFloat64IsNaN(Node* value, Label* if_true, Label* if_false) { |
- BranchIfFloat64Equal(value, value, if_false, if_true); |
- } |
- |
- // Helpers which delegate to RawMachineAssembler. |
- Factory* factory() const; |
- Isolate* isolate() const; |
- Zone* zone() const; |
- |
- protected: |
- // Protected helpers which delegate to RawMachineAssembler. |
- Graph* graph() const; |
- |
- // Enables subclasses to perform operations before and after a call. |
- virtual void CallPrologue(); |
- virtual void CallEpilogue(); |
- |
- private: |
- friend class CodeStubAssemblerTester; |
- |
- CodeStubAssembler(Isolate* isolate, Zone* zone, |
- CallDescriptor* call_descriptor, Code::Flags flags, |
- const char* name); |
- |
- Node* CallN(CallDescriptor* descriptor, Node* code_target, Node** args); |
- Node* TailCallN(CallDescriptor* descriptor, Node* code_target, Node** args); |
- |
- Node* SmiShiftBitsConstant(); |
- |
- Node* AllocateRawAligned(Node* size_in_bytes, AllocationFlags flags, |
- Node* top_address, Node* limit_address); |
- Node* AllocateRawUnaligned(Node* size_in_bytes, AllocationFlags flags, |
- Node* top_adddress, Node* limit_address); |
- |
- base::SmartPointer<RawMachineAssembler> raw_assembler_; |
- Code::Flags flags_; |
- const char* name_; |
- bool code_generated_; |
- ZoneVector<Variable::Impl*> variables_; |
- |
- DISALLOW_COPY_AND_ASSIGN(CodeStubAssembler); |
-}; |
- |
-DEFINE_OPERATORS_FOR_FLAGS(CodeStubAssembler::AllocationFlags); |
- |
-class CodeStubAssembler::Label { |
- public: |
- enum Type { kDeferred, kNonDeferred }; |
- |
- explicit Label(CodeStubAssembler* assembler, |
- CodeStubAssembler::Label::Type type = |
- CodeStubAssembler::Label::kNonDeferred) |
- : CodeStubAssembler::Label(assembler, 0, nullptr, type) {} |
- Label(CodeStubAssembler* assembler, |
- CodeStubAssembler::Variable* merged_variable, |
- CodeStubAssembler::Label::Type type = |
- CodeStubAssembler::Label::kNonDeferred) |
- : CodeStubAssembler::Label(assembler, 1, &merged_variable, type) {} |
- Label(CodeStubAssembler* assembler, int merged_variable_count, |
- CodeStubAssembler::Variable** merged_variables, |
- CodeStubAssembler::Label::Type type = |
- CodeStubAssembler::Label::kNonDeferred); |
- ~Label() {} |
- |
- private: |
- friend class CodeStubAssembler; |
- |
- void Bind(); |
- void MergeVariables(); |
- |
- bool bound_; |
- size_t merge_count_; |
- CodeStubAssembler* assembler_; |
- RawMachineLabel* label_; |
- // Map of variables that need to be merged to their phi nodes (or placeholders |
- // for those phis). |
- std::map<Variable::Impl*, Node*> variable_phis_; |
- // Map of variables to the list of value nodes that have been added from each |
- // merge path in their order of merging. |
- std::map<Variable::Impl*, std::vector<Node*>> variable_merges_; |
-}; |
- |
-} // namespace compiler |
-} // namespace internal |
-} // namespace v8 |
- |
-#endif // V8_COMPILER_CODE_STUB_ASSEMBLER_H_ |