Index: src/x64/code-stubs-x64.h |
=================================================================== |
--- src/x64/code-stubs-x64.h (revision 6167) |
+++ 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,104 @@ |
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) { } |
+ |
+ 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); |
+ |
+ 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 |