Index: src/arm/code-stubs-arm.h |
diff --git a/src/arm/code-stubs-arm.h b/src/arm/code-stubs-arm.h |
index 0202a8a82414e7a34abac921998b66aeae445d1b..1f663f52e9acf7a357b60485a39c45be2ee0b905 100644 |
--- a/src/arm/code-stubs-arm.h |
+++ b/src/arm/code-stubs-arm.h |
@@ -80,6 +80,71 @@ 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); |
+ void GenerateSmiCodeBitNot(MacroAssembler* masm, Label* slow); |
+ |
+ 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 |