Index: runtime/vm/instructions_arm64.h |
=================================================================== |
--- runtime/vm/instructions_arm64.h (revision 0) |
+++ runtime/vm/instructions_arm64.h (revision 0) |
@@ -0,0 +1,101 @@ |
+// Copyright (c) 2014, 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 VM_INSTRUCTIONS_ARM64_H_ |
+#define VM_INSTRUCTIONS_ARM64_H_ |
+ |
+#ifndef VM_INSTRUCTIONS_H_ |
+#error Do not include instructions_arm64.h directly; use instructions.h instead. |
+#endif |
+ |
+#include "vm/constants_arm64.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 Array& 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(); |
+ RawArray* ClosureArgumentsDescriptor(); |
+ |
+ uword TargetAddress() const; |
+ void SetTargetAddress(uword target_address) const; |
+ |
+ // This constant length is only valid for inserted call patterns used for |
+ // lazy deoptimization. Regular call pattern may vary in length. |
+ static int LengthInBytes(); |
+ |
+ static void InsertAt(uword pc, uword target_address); |
+ |
+ private: |
+ const Array& object_pool_; |
+ |
+ uword end_; |
+ uword args_desc_load_end_; |
+ uword ic_data_load_end_; |
+ |
+ intptr_t target_address_pool_index_; |
+ Array& args_desc_; |
+ ICData& ic_data_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(CallPattern); |
+}; |
+ |
+ |
+class JumpPattern : public ValueObject { |
+ public: |
+ JumpPattern(uword pc, const Code& code); |
+ |
+ static const int kLengthInBytes = 3 * Instr::kInstrSize; |
+ |
+ static int pattern_length_in_bytes(); |
+ |
+ bool IsValid() const; |
+ uword TargetAddress() const; |
+ void SetTargetAddress(uword target_address) const; |
+ |
+ private: |
+ const uword pc_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(JumpPattern); |
+}; |
+ |
+} // namespace dart |
+ |
+#endif // VM_INSTRUCTIONS_ARM64_H_ |