1// Copyright 2013 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_ARM64_DISASM_ARM64_H
6#define V8_ARM64_DISASM_ARM64_H
7
8#include "src/v8.h"
9
10#include "src/arm64/decoder-arm64.h"
11#include "src/arm64/instructions-arm64.h"
12#include "src/globals.h"
13#include "src/utils.h"
14
15namespace v8 {
16namespace internal {
17
18
19class Disassembler: public DecoderVisitor {
20 public:
21  Disassembler();
22  Disassembler(char* text_buffer, int buffer_size);
23  virtual ~Disassembler();
24  char* GetOutput();
25
26  // Declare all Visitor functions.
27  #define DECLARE(A)  void Visit##A(Instruction* instr);
28  VISITOR_LIST(DECLARE)
29  #undef DECLARE
30
31 protected:
32  virtual void ProcessOutput(Instruction* instr);
33
34  void Format(Instruction* instr, const char* mnemonic, const char* format);
35  void Substitute(Instruction* instr, const char* string);
36  int SubstituteField(Instruction* instr, const char* format);
37  int SubstituteRegisterField(Instruction* instr, const char* format);
38  int SubstituteImmediateField(Instruction* instr, const char* format);
39  int SubstituteLiteralField(Instruction* instr, const char* format);
40  int SubstituteBitfieldImmediateField(Instruction* instr, const char* format);
41  int SubstituteShiftField(Instruction* instr, const char* format);
42  int SubstituteExtendField(Instruction* instr, const char* format);
43  int SubstituteConditionField(Instruction* instr, const char* format);
44  int SubstitutePCRelAddressField(Instruction* instr, const char* format);
45  int SubstituteBranchTargetField(Instruction* instr, const char* format);
46  int SubstituteLSRegOffsetField(Instruction* instr, const char* format);
47  int SubstitutePrefetchField(Instruction* instr, const char* format);
48  int SubstituteBarrierField(Instruction* instr, const char* format);
49
50  bool RdIsZROrSP(Instruction* instr) const {
51    return (instr->Rd() == kZeroRegCode);
52  }
53
54  bool RnIsZROrSP(Instruction* instr) const {
55    return (instr->Rn() == kZeroRegCode);
56  }
57
58  bool RmIsZROrSP(Instruction* instr) const {
59    return (instr->Rm() == kZeroRegCode);
60  }
61
62  bool RaIsZROrSP(Instruction* instr) const {
63    return (instr->Ra() == kZeroRegCode);
64  }
65
66  bool IsMovzMovnImm(unsigned reg_size, uint64_t value);
67
68  void ResetOutput();
69  void AppendToOutput(const char* string, ...);
70
71  char* buffer_;
72  uint32_t buffer_pos_;
73  uint32_t buffer_size_;
74  bool own_buffer_;
75};
76
77
78class PrintDisassembler: public Disassembler {
79 public:
80  explicit PrintDisassembler(FILE* stream) : stream_(stream) { }
81  ~PrintDisassembler() { }
82
83  virtual void ProcessOutput(Instruction* instr);
84
85 private:
86  FILE *stream_;
87};
88
89
90} }  // namespace v8::internal
91
92#endif  // V8_ARM64_DISASM_ARM64_H
93