| // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 
 | // for details. All rights reserved. Use of this source code is governed by a | 
 | // BSD-style license that can be found in the LICENSE file. | 
 | // Classes that describe assembly patterns as used by inline caches. | 
 |  | 
 | #ifndef RUNTIME_VM_INSTRUCTIONS_ARM_H_ | 
 | #define RUNTIME_VM_INSTRUCTIONS_ARM_H_ | 
 |  | 
 | #ifndef RUNTIME_VM_INSTRUCTIONS_H_ | 
 | #error Do not include instructions_arm.h directly; use instructions.h instead. | 
 | #endif | 
 |  | 
 | #include "vm/constants_arm.h" | 
 | #include "vm/native_entry.h" | 
 | #include "vm/object.h" | 
 |  | 
 | namespace dart { | 
 |  | 
 | class InstructionPattern : public AllStatic { | 
 |  public: | 
 |   // Decodes a load sequence ending at 'end' (the last instruction of the | 
 |   // load sequence is the instruction before the one at end).  Returns the | 
 |   // address of the first instruction in the sequence.  Returns the register | 
 |   // being loaded and the loaded object in the output parameters 'reg' and | 
 |   // 'obj' respectively. | 
 |   static uword DecodeLoadObject(uword end, | 
 |                                 const ObjectPool& object_pool, | 
 |                                 Register* reg, | 
 |                                 Object* obj); | 
 |  | 
 |   // Decodes a load sequence ending at 'end' (the last instruction of the | 
 |   // load sequence is the instruction before the one at end).  Returns the | 
 |   // address of the first instruction in the sequence.  Returns the register | 
 |   // being loaded and the loaded immediate value in the output parameters | 
 |   // 'reg' and 'value' respectively. | 
 |   static uword DecodeLoadWordImmediate(uword end, | 
 |                                        Register* reg, | 
 |                                        intptr_t* value); | 
 |  | 
 |   // Decodes a load sequence ending at 'end' (the last instruction of the | 
 |   // load sequence is the instruction before the one at end).  Returns the | 
 |   // address of the first instruction in the sequence.  Returns the register | 
 |   // being loaded and the index in the pool being read from in the output | 
 |   // parameters 'reg' and 'index' respectively. | 
 |   static uword DecodeLoadWordFromPool(uword end, | 
 |                                       Register* reg, | 
 |                                       intptr_t* index); | 
 | }; | 
 |  | 
 |  | 
 | class CallPattern : public ValueObject { | 
 |  public: | 
 |   CallPattern(uword pc, const Code& code); | 
 |  | 
 |   RawICData* IcData(); | 
 |  | 
 |   RawCode* TargetCode() const; | 
 |   void SetTargetCode(const Code& code) const; | 
 |  | 
 |  private: | 
 |   const ObjectPool& object_pool_; | 
 |  | 
 |   uword end_; | 
 |   uword ic_data_load_end_; | 
 |  | 
 |   intptr_t target_code_pool_index_; | 
 |   ICData& ic_data_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(CallPattern); | 
 | }; | 
 |  | 
 |  | 
 | class NativeCallPattern : public ValueObject { | 
 |  public: | 
 |   NativeCallPattern(uword pc, const Code& code); | 
 |  | 
 |   RawCode* target() const; | 
 |   void set_target(const Code& target) const; | 
 |  | 
 |   NativeFunction native_function() const; | 
 |   void set_native_function(NativeFunction target) const; | 
 |  | 
 |  private: | 
 |   const ObjectPool& object_pool_; | 
 |  | 
 |   uword end_; | 
 |   intptr_t native_function_pool_index_; | 
 |   intptr_t target_code_pool_index_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(NativeCallPattern); | 
 | }; | 
 |  | 
 |  | 
 | // Instance call that can switch between a direct monomorphic call, an IC call, | 
 | // and a megamorphic call. | 
 | //   load guarded cid            load ICData             load MegamorphicCache | 
 | //   load monomorphic target <-> load ICLookup stub  ->  load MMLookup stub | 
 | //   call target.entry           call stub.entry         call stub.entry | 
 | class SwitchableCallPattern : public ValueObject { | 
 |  public: | 
 |   SwitchableCallPattern(uword pc, const Code& code); | 
 |  | 
 |   RawObject* data() const; | 
 |   RawCode* target() const; | 
 |   void SetData(const Object& data) const; | 
 |   void SetTarget(const Code& target) const; | 
 |  | 
 |  private: | 
 |   const ObjectPool& object_pool_; | 
 |   intptr_t data_pool_index_; | 
 |   intptr_t target_pool_index_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(SwitchableCallPattern); | 
 | }; | 
 |  | 
 |  | 
 | class ReturnPattern : public ValueObject { | 
 |  public: | 
 |   explicit ReturnPattern(uword pc); | 
 |  | 
 |   // bx_lr = 1. | 
 |   static const int kLengthInBytes = 1 * Instr::kInstrSize; | 
 |  | 
 |   int pattern_length_in_bytes() const { return kLengthInBytes; } | 
 |  | 
 |   bool IsValid() const; | 
 |  | 
 |  private: | 
 |   const uword pc_; | 
 | }; | 
 |  | 
 | }  // namespace dart | 
 |  | 
 | #endif  // RUNTIME_VM_INSTRUCTIONS_ARM_H_ |