Chromium Code Reviews| Index: src/x64/code-stubs-x64.h |
| =================================================================== |
| --- src/x64/code-stubs-x64.h (revision 6153) |
| +++ src/x64/code-stubs-x64.h (working copy) |
| @@ -131,7 +131,7 @@ |
| #ifdef DEBUG |
| void Print() { |
| PrintF("GenericBinaryOpStub %d (op %s), " |
| - "(mode %d, flags %d, registers %d, reversed %d, only_numbers %s)\n", |
| + "(mode %d, flags %d, registers %d, reversed %d, type_info %s)\n", |
| MinorKey(), |
| Token::String(op_), |
| static_cast<int>(mode_), |
| @@ -200,6 +200,115 @@ |
| friend class CodeGenerator; |
| }; |
| + |
| +class TypeRecordingBinaryOpStub: public CodeStub { |
| + public: |
| + TypeRecordingBinaryOpStub(Token::Value op, OverwriteMode mode) |
| + : op_(op), |
| + mode_(mode), |
| + operands_type_(TRBinaryOpIC::UNINITIALIZED), |
| + result_type_(TRBinaryOpIC::UNINITIALIZED), |
| + name_(NULL) { |
| + ASSERT(OpBits::is_valid(Token::NUM_TOKENS)); |
| + } |
| + |
| + TypeRecordingBinaryOpStub( |
| + int key, |
| + TRBinaryOpIC::TypeInfo operands_type, |
| + TRBinaryOpIC::TypeInfo result_type = TRBinaryOpIC::UNINITIALIZED) |
| + : op_(OpBits::decode(key)), |
| + mode_(ModeBits::decode(key)), |
| + operands_type_(operands_type), |
| + result_type_(result_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); |
| + |
| + private: |
| + enum SmiCodeGenerateHeapNumberResults { |
| + ALLOW_HEAPNUMBER_RESULTS, |
| + NO_HEAPNUMBER_RESULTS |
| + }; |
| + |
| + Token::Value op_; |
| + OverwriteMode mode_; |
| + |
| + // Operand type information determined at runtime. |
| + TRBinaryOpIC::TypeInfo operands_type_; |
| + TRBinaryOpIC::TypeInfo result_type_; |
| + |
| + char* name_; |
| + |
| + const char* GetName(); |
| + |
| +#ifdef DEBUG |
| + void Print() { |
| + PrintF("TypeRecordingBinaryOpStub %d (op %s), " |
| + "(mode %d, runtime_type_info %s)\n", |
| + MinorKey(), |
| + Token::String(op_), |
| + static_cast<int>(mode_), |
| + TRBinaryOpIC::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> {}; |
| + |
| + Major MajorKey() { return TypeRecordingBinaryOp; } |
| + int MinorKey() { |
| + return OpBits::encode(op_) |
| + | ModeBits::encode(mode_) |
| + | OperandTypeInfoBits::encode(operands_type_) |
| + | ResultTypeInfoBits::encode(result_type_); |
| + } |
| + |
| + void Generate(MacroAssembler* masm); |
| + void GenerateGeneric(MacroAssembler* masm); |
| + void GenerateSmiCode(MacroAssembler* masm, |
| + Label* slow, |
| + SmiCodeGenerateHeapNumberResults heapnumber_results); |
| + void GenerateLoadArguments(MacroAssembler* masm); |
| + void GenerateReturn(MacroAssembler* masm); |
| + void GenerateUninitializedStub(MacroAssembler* masm); |
| + void GenerateSmiStub(MacroAssembler* masm); |
| + void GenerateInt32Stub(MacroAssembler* masm); |
| + void GenerateHeapNumberStub(MacroAssembler* masm); |
| + void GenerateStringStub(MacroAssembler* masm); |
| + void GenerateGenericStub(MacroAssembler* masm); |
| + |
| + void GenerateHeapResultAllocation(MacroAssembler* masm, Label* alloc_failure); |
| + void GenerateRegisterArgsPush(MacroAssembler* masm); |
| + void GenerateTypeTransition(MacroAssembler* masm); |
| + void GenerateTypeTransitionWithSavedArgs(MacroAssembler* masm); |
| + |
| + bool IsOperationCommutative() { |
| + return (op_ == Token::ADD) || (op_ == Token::MUL); |
|
Lasse Reichstein
2011/01/05 11:48:46
Are bit-ops not handled by this stub?
William Hesse
2011/01/05 12:29:06
This function is never used, and the functions Gen
|
| + } |
| + |
| + virtual int GetCodeKind() { return Code::TYPE_RECORDING_BINARY_OP_IC; } |
| + |
| + virtual InlineCacheState GetICState() { |
| + return TRBinaryOpIC::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_); |
| + } |
| + |
| + friend class CodeGenerator; |
| +}; |
| + |
| + |
| class StringHelper : public AllStatic { |
| public: |
| // Generate code for copying characters using a simple loop. This should only |