Index: src/x64/code-stubs-x64.h |
diff --git a/src/x64/code-stubs-x64.h b/src/x64/code-stubs-x64.h |
index 228a82ac9e7adc8c62db692acefb74aac00f6825..f6cfad048e35c725a12bf1c7a9da15b83f8ca095 100644 |
--- a/src/x64/code-stubs-x64.h |
+++ b/src/x64/code-stubs-x64.h |
@@ -81,6 +81,77 @@ class StoreBufferOverflowStub: public PlatformCodeStub { |
}; |
+class UnaryOpStub: public PlatformCodeStub { |
+ public: |
+ UnaryOpStub(Token::Value op, |
+ UnaryOverwriteMode mode, |
+ UnaryOpIC::TypeInfo operand_type = UnaryOpIC::UNINITIALIZED) |
+ : op_(op), |
+ mode_(mode), |
+ operand_type_(operand_type) { |
+ } |
+ |
+ private: |
+ Token::Value op_; |
+ UnaryOverwriteMode mode_; |
+ |
+ // Operand type information determined at runtime. |
+ UnaryOpIC::TypeInfo operand_type_; |
+ |
+ virtual void PrintName(StringStream* stream); |
+ |
+ 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 UnaryOp; } |
+ int MinorKey() { |
+ 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 GenerateTypeTransition(MacroAssembler* masm); |
+ |
+ 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); |
+ |
+ void GenerateNumberStub(MacroAssembler* masm); |
+ void GenerateNumberStubSub(MacroAssembler* masm); |
+ void GenerateNumberStubBitNot(MacroAssembler* masm); |
+ void GenerateHeapNumberCodeSub(MacroAssembler* masm, Label* slow); |
+ void GenerateHeapNumberCodeBitNot(MacroAssembler* masm, Label* slow); |
+ |
+ void GenerateGenericStub(MacroAssembler* masm); |
+ void GenerateGenericStubSub(MacroAssembler* masm); |
+ void GenerateGenericStubBitNot(MacroAssembler* masm); |
+ void GenerateGenericCodeFallback(MacroAssembler* masm); |
+ |
+ virtual Code::Kind GetCodeKind() const { return Code::UNARY_OP_IC; } |
+ |
+ virtual InlineCacheState GetICState() { |
+ return UnaryOpIC::ToState(operand_type_); |
+ } |
+ |
+ virtual void FinishCode(Handle<Code> code) { |
+ code->set_unary_op_type(operand_type_); |
+ } |
+}; |
+ |
+ |
class StringHelper : public AllStatic { |
public: |
// Generate code for copying characters using a simple loop. This should only |