| 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_
|
|
|