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 |