diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2011-07-08 16:40:11 -0700 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2011-07-08 16:40:11 -0700 |
commit | e5564a3f29e0a818832a97c7c3b28d7c8b3b0460 (patch) | |
tree | 4b48a6577080d5e44da4d2cbebb7fe7951660de8 /deps/v8/src/x64/code-stubs-x64.h | |
parent | 0df2f74d364826053641395b01c2fcb1345057a9 (diff) | |
download | node-new-e5564a3f29e0a818832a97c7c3b28d7c8b3b0460.tar.gz |
Upgrade V8 to 3.4.10
Diffstat (limited to 'deps/v8/src/x64/code-stubs-x64.h')
-rw-r--r-- | deps/v8/src/x64/code-stubs-x64.h | 330 |
1 files changed, 152 insertions, 178 deletions
diff --git a/deps/v8/src/x64/code-stubs-x64.h b/deps/v8/src/x64/code-stubs-x64.h index feb4de8187..6a07b3b84d 100644 --- a/deps/v8/src/x64/code-stubs-x64.h +++ b/deps/v8/src/x64/code-stubs-x64.h @@ -59,78 +59,23 @@ class TranscendentalCacheStub: public CodeStub { }; -class ToBooleanStub: public CodeStub { +class UnaryOpStub: public CodeStub { public: - ToBooleanStub() { } - - void Generate(MacroAssembler* masm); - - private: - Major MajorKey() { return ToBoolean; } - int MinorKey() { return 0; } -}; - - -// Flag that indicates how to generate code for the stub GenericBinaryOpStub. -enum GenericBinaryFlags { - NO_GENERIC_BINARY_FLAGS = 0, - NO_SMI_CODE_IN_STUB = 1 << 0 // Omit smi code in stub. -}; - - -class GenericBinaryOpStub: public CodeStub { - public: - GenericBinaryOpStub(Token::Value op, - OverwriteMode mode, - GenericBinaryFlags flags, - TypeInfo operands_type = TypeInfo::Unknown()) + UnaryOpStub(Token::Value op, + UnaryOverwriteMode mode, + UnaryOpIC::TypeInfo operand_type = UnaryOpIC::UNINITIALIZED) : op_(op), mode_(mode), - flags_(flags), - args_in_registers_(false), - args_reversed_(false), - static_operands_type_(operands_type), - runtime_operands_type_(BinaryOpIC::DEFAULT), - name_(NULL) { - ASSERT(OpBits::is_valid(Token::NUM_TOKENS)); - } - - GenericBinaryOpStub(int key, BinaryOpIC::TypeInfo runtime_operands_type) - : op_(OpBits::decode(key)), - mode_(ModeBits::decode(key)), - flags_(FlagBits::decode(key)), - args_in_registers_(ArgsInRegistersBits::decode(key)), - args_reversed_(ArgsReversedBits::decode(key)), - static_operands_type_(TypeInfo::ExpandedRepresentation( - StaticTypeInfoBits::decode(key))), - runtime_operands_type_(runtime_operands_type), + operand_type_(operand_type), name_(NULL) { } - // Generate code to call the stub with the supplied arguments. This will add - // code at the call site to prepare arguments either in registers or on the - // stack together with the actual call. - void GenerateCall(MacroAssembler* masm, Register left, Register right); - void GenerateCall(MacroAssembler* masm, Register left, Smi* right); - void GenerateCall(MacroAssembler* masm, Smi* left, Register right); - - bool ArgsInRegistersSupported() { - return (op_ == Token::ADD) || (op_ == Token::SUB) - || (op_ == Token::MUL) || (op_ == Token::DIV); - } - private: Token::Value op_; - OverwriteMode mode_; - GenericBinaryFlags flags_; - bool args_in_registers_; // Arguments passed in registers not on the stack. - bool args_reversed_; // Left and right argument are swapped. - - // Number type information of operands, determined by code generator. - TypeInfo static_operands_type_; + UnaryOverwriteMode mode_; // Operand type information determined at runtime. - BinaryOpIC::TypeInfo runtime_operands_type_; + UnaryOpIC::TypeInfo operand_type_; char* name_; @@ -138,93 +83,81 @@ class GenericBinaryOpStub: public CodeStub { #ifdef DEBUG void Print() { - PrintF("GenericBinaryOpStub %d (op %s), " - "(mode %d, flags %d, registers %d, reversed %d, type_info %s)\n", + PrintF("UnaryOpStub %d (op %s), (mode %d, runtime_type_info %s)\n", MinorKey(), Token::String(op_), static_cast<int>(mode_), - static_cast<int>(flags_), - static_cast<int>(args_in_registers_), - static_cast<int>(args_reversed_), - static_operands_type_.ToString()); + UnaryOpIC::GetName(operand_type_)); } #endif - // Minor key encoding in 17 bits TTNNNFRAOOOOOOOMM. - class ModeBits: public BitField<OverwriteMode, 0, 2> {}; - class OpBits: public BitField<Token::Value, 2, 7> {}; - class ArgsInRegistersBits: public BitField<bool, 9, 1> {}; - class ArgsReversedBits: public BitField<bool, 10, 1> {}; - class FlagBits: public BitField<GenericBinaryFlags, 11, 1> {}; - class StaticTypeInfoBits: public BitField<int, 12, 3> {}; - class RuntimeTypeInfoBits: public BitField<BinaryOpIC::TypeInfo, 15, 3> {}; + class ModeBits: public BitField<UnaryOverwriteMode, 0, 1> {}; + class OpBits: public BitField<Token::Value, 1, 7> {}; + class OperandTypeInfoBits: public BitField<UnaryOpIC::TypeInfo, 8, 3> {}; - Major MajorKey() { return GenericBinaryOp; } + Major MajorKey() { return UnaryOp; } int MinorKey() { - // Encode the parameters in a unique 18 bit value. - return OpBits::encode(op_) - | ModeBits::encode(mode_) - | FlagBits::encode(flags_) - | ArgsInRegistersBits::encode(args_in_registers_) - | ArgsReversedBits::encode(args_reversed_) - | StaticTypeInfoBits::encode( - static_operands_type_.ThreeBitRepresentation()) - | RuntimeTypeInfoBits::encode(runtime_operands_type_); + return ModeBits::encode(mode_) + | OpBits::encode(op_) + | OperandTypeInfoBits::encode(operand_type_); } + // Note: A lot of the helper functions below will vanish when we use virtual + // function instead of switch more often. void Generate(MacroAssembler* masm); - void GenerateSmiCode(MacroAssembler* masm, Label* slow); - void GenerateLoadArguments(MacroAssembler* masm); - void GenerateReturn(MacroAssembler* masm); - void GenerateRegisterArgsPush(MacroAssembler* masm); - void GenerateTypeTransition(MacroAssembler* masm); - bool IsOperationCommutative() { - return (op_ == Token::ADD) || (op_ == Token::MUL); - } + void GenerateTypeTransition(MacroAssembler* masm); - void SetArgsInRegisters() { args_in_registers_ = true; } - void SetArgsReversed() { args_reversed_ = true; } - bool HasSmiCodeInStub() { return (flags_ & NO_SMI_CODE_IN_STUB) == 0; } - bool HasArgsInRegisters() { return args_in_registers_; } - bool HasArgsReversed() { return args_reversed_; } + void GenerateSmiStub(MacroAssembler* masm); + void GenerateSmiStubSub(MacroAssembler* masm); + void GenerateSmiStubBitNot(MacroAssembler* masm); + void GenerateSmiCodeSub(MacroAssembler* masm, + Label* non_smi, + Label* slow, + Label::Distance non_smi_near = Label::kFar, + Label::Distance slow_near = Label::kFar); + void GenerateSmiCodeBitNot(MacroAssembler* masm, + Label* non_smi, + Label::Distance non_smi_near); - bool ShouldGenerateSmiCode() { - return HasSmiCodeInStub() && - runtime_operands_type_ != BinaryOpIC::HEAP_NUMBERS && - runtime_operands_type_ != BinaryOpIC::STRINGS; - } + void GenerateHeapNumberStub(MacroAssembler* masm); + void GenerateHeapNumberStubSub(MacroAssembler* masm); + void GenerateHeapNumberStubBitNot(MacroAssembler* masm); + void GenerateHeapNumberCodeSub(MacroAssembler* masm, Label* slow); + void GenerateHeapNumberCodeBitNot(MacroAssembler* masm, Label* slow); - bool ShouldGenerateFPCode() { - return runtime_operands_type_ != BinaryOpIC::STRINGS; - } + void GenerateGenericStub(MacroAssembler* masm); + void GenerateGenericStubSub(MacroAssembler* masm); + void GenerateGenericStubBitNot(MacroAssembler* masm); + void GenerateGenericCodeFallback(MacroAssembler* masm); - virtual int GetCodeKind() { return Code::BINARY_OP_IC; } + virtual int GetCodeKind() { return Code::UNARY_OP_IC; } virtual InlineCacheState GetICState() { - return BinaryOpIC::ToState(runtime_operands_type_); + return UnaryOpIC::ToState(operand_type_); } - friend class CodeGenerator; - friend class LCodeGen; + virtual void FinishCode(Code* code) { + code->set_unary_op_type(operand_type_); + } }; -class TypeRecordingBinaryOpStub: public CodeStub { +class BinaryOpStub: public CodeStub { public: - TypeRecordingBinaryOpStub(Token::Value op, OverwriteMode mode) + BinaryOpStub(Token::Value op, OverwriteMode mode) : op_(op), mode_(mode), - operands_type_(TRBinaryOpIC::UNINITIALIZED), - result_type_(TRBinaryOpIC::UNINITIALIZED), + operands_type_(BinaryOpIC::UNINITIALIZED), + result_type_(BinaryOpIC::UNINITIALIZED), name_(NULL) { ASSERT(OpBits::is_valid(Token::NUM_TOKENS)); } - TypeRecordingBinaryOpStub( + BinaryOpStub( int key, - TRBinaryOpIC::TypeInfo operands_type, - TRBinaryOpIC::TypeInfo result_type = TRBinaryOpIC::UNINITIALIZED) + BinaryOpIC::TypeInfo operands_type, + BinaryOpIC::TypeInfo result_type = BinaryOpIC::UNINITIALIZED) : op_(OpBits::decode(key)), mode_(ModeBits::decode(key)), operands_type_(operands_type), @@ -241,8 +174,8 @@ class TypeRecordingBinaryOpStub: public CodeStub { OverwriteMode mode_; // Operand type information determined at runtime. - TRBinaryOpIC::TypeInfo operands_type_; - TRBinaryOpIC::TypeInfo result_type_; + BinaryOpIC::TypeInfo operands_type_; + BinaryOpIC::TypeInfo result_type_; char* name_; @@ -250,22 +183,22 @@ class TypeRecordingBinaryOpStub: public CodeStub { #ifdef DEBUG void Print() { - PrintF("TypeRecordingBinaryOpStub %d (op %s), " + PrintF("BinaryOpStub %d (op %s), " "(mode %d, runtime_type_info %s)\n", MinorKey(), Token::String(op_), static_cast<int>(mode_), - TRBinaryOpIC::GetName(operands_type_)); + BinaryOpIC::GetName(operands_type_)); } #endif // Minor key encoding in 15 bits RRRTTTOOOOOOOMM. class ModeBits: public BitField<OverwriteMode, 0, 2> {}; class OpBits: public BitField<Token::Value, 2, 7> {}; - class OperandTypeInfoBits: public BitField<TRBinaryOpIC::TypeInfo, 9, 3> {}; - class ResultTypeInfoBits: public BitField<TRBinaryOpIC::TypeInfo, 12, 3> {}; + class OperandTypeInfoBits: public BitField<BinaryOpIC::TypeInfo, 9, 3> {}; + class ResultTypeInfoBits: public BitField<BinaryOpIC::TypeInfo, 12, 3> {}; - Major MajorKey() { return TypeRecordingBinaryOp; } + Major MajorKey() { return BinaryOp; } int MinorKey() { return OpBits::encode(op_) | ModeBits::encode(mode_) @@ -291,6 +224,7 @@ class TypeRecordingBinaryOpStub: public CodeStub { void GenerateHeapNumberStub(MacroAssembler* masm); void GenerateOddballStub(MacroAssembler* masm); void GenerateStringStub(MacroAssembler* masm); + void GenerateBothStringStub(MacroAssembler* masm); void GenerateGenericStub(MacroAssembler* masm); void GenerateHeapResultAllocation(MacroAssembler* masm, Label* alloc_failure); @@ -298,15 +232,15 @@ class TypeRecordingBinaryOpStub: public CodeStub { void GenerateTypeTransition(MacroAssembler* masm); void GenerateTypeTransitionWithSavedArgs(MacroAssembler* masm); - virtual int GetCodeKind() { return Code::TYPE_RECORDING_BINARY_OP_IC; } + virtual int GetCodeKind() { return Code::BINARY_OP_IC; } virtual InlineCacheState GetICState() { - return TRBinaryOpIC::ToState(operands_type_); + return BinaryOpIC::ToState(operands_type_); } virtual void FinishCode(Code* code) { - code->set_type_recording_binary_op_type(operands_type_); - code->set_type_recording_binary_op_result_type(result_type_); + code->set_binary_op_type(operands_type_); + code->set_binary_op_result_type(result_type_); } friend class CodeGenerator; @@ -415,10 +349,9 @@ class SubStringStub: public CodeStub { class StringCompareStub: public CodeStub { public: - explicit StringCompareStub() {} + StringCompareStub() {} - // Compare two flat ascii strings and returns result in rax after popping two - // arguments from the stack. + // Compares two flat ASCII strings and returns result in rax. static void GenerateCompareFlatAsciiStrings(MacroAssembler* masm, Register left, Register right, @@ -427,11 +360,27 @@ class StringCompareStub: public CodeStub { Register scratch3, Register scratch4); - private: - Major MajorKey() { return StringCompare; } - int MinorKey() { return 0; } + // Compares two flat ASCII strings for equality and returns result + // in rax. + static void GenerateFlatAsciiStringEquals(MacroAssembler* masm, + Register left, + Register right, + Register scratch1, + Register scratch2); - void Generate(MacroAssembler* masm); + private: + virtual Major MajorKey() { return StringCompare; } + virtual int MinorKey() { return 0; } + virtual void Generate(MacroAssembler* masm); + + static void GenerateAsciiCharsCompareLoop( + MacroAssembler* masm, + Register left, + Register right, + Register length, + Register scratch, + Label* chars_not_equal, + Label::Distance near_jump = Label::kFar); }; @@ -472,48 +421,73 @@ class NumberToStringStub: public CodeStub { }; -// Generate code to load an element from a pixel array. The receiver is assumed -// to not be a smi and to have elements, the caller must guarantee this -// precondition. If key is not a smi, then the generated code branches to -// key_not_smi. Callers can specify NULL for key_not_smi to signal that a smi -// check has already been performed on key so that the smi check is not -// generated. If key is not a valid index within the bounds of the pixel array, -// the generated code jumps to out_of_range. receiver, key and elements are -// unchanged throughout the generated code sequence. -void GenerateFastPixelArrayLoad(MacroAssembler* masm, - Register receiver, - Register key, - Register elements, - Register untagged_key, - Register result, - Label* not_pixel_array, - Label* key_not_smi, - Label* out_of_range); - -// Generate code to store an element into a pixel array, clamping values between -// [0..255]. The receiver is assumed to not be a smi and to have elements, the -// caller must guarantee this precondition. If key is not a smi, then the -// generated code branches to key_not_smi. Callers can specify NULL for -// key_not_smi to signal that a smi check has already been performed on key so -// that the smi check is not generated. If the value is not a smi, the -// generated code will branch to value_not_smi. If the receiver -// doesn't have pixel array elements, the generated code will branch to -// not_pixel_array, unless not_pixel_array is NULL, in which case the caller -// must ensure that the receiver has pixel array elements. If key is not a -// valid index within the bounds of the pixel array, the generated code jumps to -// out_of_range. -void GenerateFastPixelArrayStore(MacroAssembler* masm, - Register receiver, - Register key, - Register value, - Register elements, - Register scratch1, - bool load_elements_from_receiver, - bool key_is_untagged, - Label* key_not_smi, - Label* value_not_smi, - Label* not_pixel_array, - Label* out_of_range); +class StringDictionaryLookupStub: public CodeStub { + public: + enum LookupMode { POSITIVE_LOOKUP, NEGATIVE_LOOKUP }; + + StringDictionaryLookupStub(Register dictionary, + Register result, + Register index, + LookupMode mode) + : dictionary_(dictionary), result_(result), index_(index), mode_(mode) { } + + void Generate(MacroAssembler* masm); + + MUST_USE_RESULT static MaybeObject* GenerateNegativeLookup( + MacroAssembler* masm, + Label* miss, + Label* done, + Register properties, + String* name, + Register r0); + + static void GeneratePositiveLookup(MacroAssembler* masm, + Label* miss, + Label* done, + Register elements, + Register name, + Register r0, + Register r1); + + private: + static const int kInlinedProbes = 4; + static const int kTotalProbes = 20; + + static const int kCapacityOffset = + StringDictionary::kHeaderSize + + StringDictionary::kCapacityIndex * kPointerSize; + + static const int kElementsStartOffset = + StringDictionary::kHeaderSize + + StringDictionary::kElementsStartIndex * kPointerSize; + + +#ifdef DEBUG + void Print() { + PrintF("StringDictionaryLookupStub\n"); + } +#endif + + Major MajorKey() { return StringDictionaryNegativeLookup; } + + int MinorKey() { + return DictionaryBits::encode(dictionary_.code()) | + ResultBits::encode(result_.code()) | + IndexBits::encode(index_.code()) | + LookupModeBits::encode(mode_); + } + + class DictionaryBits: public BitField<int, 0, 4> {}; + class ResultBits: public BitField<int, 4, 4> {}; + class IndexBits: public BitField<int, 8, 4> {}; + class LookupModeBits: public BitField<LookupMode, 12, 1> {}; + + Register dictionary_; + Register result_; + Register index_; + LookupMode mode_; +}; + } } // namespace v8::internal |