| Index: src/x64/codegen-x64.h
|
| ===================================================================
|
| --- src/x64/codegen-x64.h (revision 5337)
|
| +++ src/x64/codegen-x64.h (working copy)
|
| @@ -752,357 +752,6 @@
|
| };
|
|
|
|
|
| -// Compute a transcendental math function natively, or call the
|
| -// TranscendentalCache runtime function.
|
| -class TranscendentalCacheStub: public CodeStub {
|
| - public:
|
| - explicit TranscendentalCacheStub(TranscendentalCache::Type type)
|
| - : type_(type) {}
|
| - void Generate(MacroAssembler* masm);
|
| - private:
|
| - TranscendentalCache::Type type_;
|
| - Major MajorKey() { return TranscendentalCache; }
|
| - int MinorKey() { return type_; }
|
| - Runtime::FunctionId RuntimeFunction();
|
| - void GenerateOperation(MacroAssembler* masm, Label* on_nan_result);
|
| -};
|
| -
|
| -
|
| -class ToBooleanStub: 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())
|
| - : 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 type_info)
|
| - : 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_(type_info),
|
| - 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);
|
| -
|
| - Result GenerateCall(MacroAssembler* masm,
|
| - VirtualFrame* frame,
|
| - Result* left,
|
| - Result* right);
|
| -
|
| - 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_;
|
| -
|
| - // Operand type information determined at runtime.
|
| - BinaryOpIC::TypeInfo runtime_operands_type_;
|
| -
|
| - char* name_;
|
| -
|
| - const char* GetName();
|
| -
|
| -#ifdef DEBUG
|
| - void Print() {
|
| - PrintF("GenericBinaryOpStub %d (op %s), "
|
| - "(mode %d, flags %d, registers %d, reversed %d, only_numbers %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());
|
| - }
|
| -#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, 2> {};
|
| -
|
| - Major MajorKey() { return GenericBinaryOp; }
|
| - 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_);
|
| - }
|
| -
|
| - 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 ArgsInRegistersSupported() {
|
| - return (op_ == Token::ADD) || (op_ == Token::SUB)
|
| - || (op_ == Token::MUL) || (op_ == Token::DIV);
|
| - }
|
| - bool IsOperationCommutative() {
|
| - return (op_ == Token::ADD) || (op_ == Token::MUL);
|
| - }
|
| -
|
| - 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_; }
|
| -
|
| - bool ShouldGenerateSmiCode() {
|
| - return HasSmiCodeInStub() &&
|
| - runtime_operands_type_ != BinaryOpIC::HEAP_NUMBERS &&
|
| - runtime_operands_type_ != BinaryOpIC::STRINGS;
|
| - }
|
| -
|
| - bool ShouldGenerateFPCode() {
|
| - return runtime_operands_type_ != BinaryOpIC::STRINGS;
|
| - }
|
| -
|
| - virtual int GetCodeKind() { return Code::BINARY_OP_IC; }
|
| -
|
| - virtual InlineCacheState GetICState() {
|
| - return BinaryOpIC::ToState(runtime_operands_type_);
|
| - }
|
| -};
|
| -
|
| -class StringHelper : public AllStatic {
|
| - public:
|
| - // Generate code for copying characters using a simple loop. This should only
|
| - // be used in places where the number of characters is small and the
|
| - // additional setup and checking in GenerateCopyCharactersREP adds too much
|
| - // overhead. Copying of overlapping regions is not supported.
|
| - static void GenerateCopyCharacters(MacroAssembler* masm,
|
| - Register dest,
|
| - Register src,
|
| - Register count,
|
| - bool ascii);
|
| -
|
| - // Generate code for copying characters using the rep movs instruction.
|
| - // Copies rcx characters from rsi to rdi. Copying of overlapping regions is
|
| - // not supported.
|
| - static void GenerateCopyCharactersREP(MacroAssembler* masm,
|
| - Register dest, // Must be rdi.
|
| - Register src, // Must be rsi.
|
| - Register count, // Must be rcx.
|
| - bool ascii);
|
| -
|
| -
|
| - // Probe the symbol table for a two character string. If the string is
|
| - // not found by probing a jump to the label not_found is performed. This jump
|
| - // does not guarantee that the string is not in the symbol table. If the
|
| - // string is found the code falls through with the string in register rax.
|
| - static void GenerateTwoCharacterSymbolTableProbe(MacroAssembler* masm,
|
| - Register c1,
|
| - Register c2,
|
| - Register scratch1,
|
| - Register scratch2,
|
| - Register scratch3,
|
| - Register scratch4,
|
| - Label* not_found);
|
| -
|
| - // Generate string hash.
|
| - static void GenerateHashInit(MacroAssembler* masm,
|
| - Register hash,
|
| - Register character,
|
| - Register scratch);
|
| - static void GenerateHashAddCharacter(MacroAssembler* masm,
|
| - Register hash,
|
| - Register character,
|
| - Register scratch);
|
| - static void GenerateHashGetHash(MacroAssembler* masm,
|
| - Register hash,
|
| - Register scratch);
|
| -
|
| - private:
|
| - DISALLOW_IMPLICIT_CONSTRUCTORS(StringHelper);
|
| -};
|
| -
|
| -
|
| -// Flag that indicates how to generate code for the stub StringAddStub.
|
| -enum StringAddFlags {
|
| - NO_STRING_ADD_FLAGS = 0,
|
| - NO_STRING_CHECK_IN_STUB = 1 << 0 // Omit string check in stub.
|
| -};
|
| -
|
| -
|
| -class StringAddStub: public CodeStub {
|
| - public:
|
| - explicit StringAddStub(StringAddFlags flags) {
|
| - string_check_ = ((flags & NO_STRING_CHECK_IN_STUB) == 0);
|
| - }
|
| -
|
| - private:
|
| - Major MajorKey() { return StringAdd; }
|
| - int MinorKey() { return string_check_ ? 0 : 1; }
|
| -
|
| - void Generate(MacroAssembler* masm);
|
| -
|
| - // Should the stub check whether arguments are strings?
|
| - bool string_check_;
|
| -};
|
| -
|
| -
|
| -class SubStringStub: public CodeStub {
|
| - public:
|
| - SubStringStub() {}
|
| -
|
| - private:
|
| - Major MajorKey() { return SubString; }
|
| - int MinorKey() { return 0; }
|
| -
|
| - void Generate(MacroAssembler* masm);
|
| -};
|
| -
|
| -
|
| -class StringCompareStub: public CodeStub {
|
| - public:
|
| - explicit StringCompareStub() {}
|
| -
|
| - // Compare two flat ascii strings and returns result in rax after popping two
|
| - // arguments from the stack.
|
| - static void GenerateCompareFlatAsciiStrings(MacroAssembler* masm,
|
| - Register left,
|
| - Register right,
|
| - Register scratch1,
|
| - Register scratch2,
|
| - Register scratch3,
|
| - Register scratch4);
|
| -
|
| - private:
|
| - Major MajorKey() { return StringCompare; }
|
| - int MinorKey() { return 0; }
|
| -
|
| - void Generate(MacroAssembler* masm);
|
| -};
|
| -
|
| -
|
| -class NumberToStringStub: public CodeStub {
|
| - public:
|
| - NumberToStringStub() { }
|
| -
|
| - // Generate code to do a lookup in the number string cache. If the number in
|
| - // the register object is found in the cache the generated code falls through
|
| - // with the result in the result register. The object and the result register
|
| - // can be the same. If the number is not found in the cache the code jumps to
|
| - // the label not_found with only the content of register object unchanged.
|
| - static void GenerateLookupNumberStringCache(MacroAssembler* masm,
|
| - Register object,
|
| - Register result,
|
| - Register scratch1,
|
| - Register scratch2,
|
| - bool object_is_smi,
|
| - Label* not_found);
|
| -
|
| - private:
|
| - static void GenerateConvertHashCodeToIndex(MacroAssembler* masm,
|
| - Register hash,
|
| - Register mask);
|
| -
|
| - Major MajorKey() { return NumberToString; }
|
| - int MinorKey() { return 0; }
|
| -
|
| - void Generate(MacroAssembler* masm);
|
| -
|
| - const char* GetName() { return "NumberToStringStub"; }
|
| -
|
| -#ifdef DEBUG
|
| - void Print() {
|
| - PrintF("NumberToStringStub\n");
|
| - }
|
| -#endif
|
| -};
|
| -
|
| -
|
| -class RecordWriteStub : public CodeStub {
|
| - public:
|
| - RecordWriteStub(Register object, Register addr, Register scratch)
|
| - : object_(object), addr_(addr), scratch_(scratch) { }
|
| -
|
| - void Generate(MacroAssembler* masm);
|
| -
|
| - private:
|
| - Register object_;
|
| - Register addr_;
|
| - Register scratch_;
|
| -
|
| -#ifdef DEBUG
|
| - void Print() {
|
| - PrintF("RecordWriteStub (object reg %d), (addr reg %d), (scratch reg %d)\n",
|
| - object_.code(), addr_.code(), scratch_.code());
|
| - }
|
| -#endif
|
| -
|
| - // Minor key encoding in 12 bits. 4 bits for each of the three
|
| - // registers (object, address and scratch) OOOOAAAASSSS.
|
| - class ScratchBits : public BitField<uint32_t, 0, 4> {};
|
| - class AddressBits : public BitField<uint32_t, 4, 4> {};
|
| - class ObjectBits : public BitField<uint32_t, 8, 4> {};
|
| -
|
| - Major MajorKey() { return RecordWrite; }
|
| -
|
| - int MinorKey() {
|
| - // Encode the registers.
|
| - return ObjectBits::encode(object_.code()) |
|
| - AddressBits::encode(addr_.code()) |
|
| - ScratchBits::encode(scratch_.code());
|
| - }
|
| -};
|
| -
|
| -
|
| } } // namespace v8::internal
|
|
|
| #endif // V8_X64_CODEGEN_X64_H_
|
|
|