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