• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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/arm64/decoder-arm64.h"
9 #include "src/arm64/instructions-arm64.h"
10 #include "src/globals.h"
11 #include "src/utils.h"
12 
13 namespace v8 {
14 namespace internal {
15 
16 
17 class DisassemblingDecoder : public DecoderVisitor {
18  public:
19   DisassemblingDecoder();
20   DisassemblingDecoder(char* text_buffer, int buffer_size);
21   virtual ~DisassemblingDecoder();
22   char* GetOutput();
23 
24   // Declare all Visitor functions.
25   #define DECLARE(A)  void Visit##A(Instruction* instr);
26   VISITOR_LIST(DECLARE)
27   #undef DECLARE
28 
29  protected:
30   virtual void ProcessOutput(Instruction* instr);
31 
32   void Format(Instruction* instr, const char* mnemonic, const char* format);
33   void Substitute(Instruction* instr, const char* string);
34   int SubstituteField(Instruction* instr, const char* format);
35   int SubstituteRegisterField(Instruction* instr, const char* format);
36   int SubstituteImmediateField(Instruction* instr, const char* format);
37   int SubstituteLiteralField(Instruction* instr, const char* format);
38   int SubstituteBitfieldImmediateField(Instruction* instr, const char* format);
39   int SubstituteShiftField(Instruction* instr, const char* format);
40   int SubstituteExtendField(Instruction* instr, const char* format);
41   int SubstituteConditionField(Instruction* instr, const char* format);
42   int SubstitutePCRelAddressField(Instruction* instr, const char* format);
43   int SubstituteBranchTargetField(Instruction* instr, const char* format);
44   int SubstituteLSRegOffsetField(Instruction* instr, const char* format);
45   int SubstitutePrefetchField(Instruction* instr, const char* format);
46   int SubstituteBarrierField(Instruction* instr, const char* format);
47 
RdIsZROrSP(Instruction * instr)48   bool RdIsZROrSP(Instruction* instr) const {
49     return (instr->Rd() == kZeroRegCode);
50   }
51 
RnIsZROrSP(Instruction * instr)52   bool RnIsZROrSP(Instruction* instr) const {
53     return (instr->Rn() == kZeroRegCode);
54   }
55 
RmIsZROrSP(Instruction * instr)56   bool RmIsZROrSP(Instruction* instr) const {
57     return (instr->Rm() == kZeroRegCode);
58   }
59 
RaIsZROrSP(Instruction * instr)60   bool RaIsZROrSP(Instruction* instr) const {
61     return (instr->Ra() == kZeroRegCode);
62   }
63 
64   bool IsMovzMovnImm(unsigned reg_size, uint64_t value);
65 
66   void ResetOutput();
67   void AppendToOutput(const char* string, ...);
68 
69   char* buffer_;
70   uint32_t buffer_pos_;
71   uint32_t buffer_size_;
72   bool own_buffer_;
73 };
74 
75 
76 class PrintDisassembler : public DisassemblingDecoder {
77  public:
PrintDisassembler(FILE * stream)78   explicit PrintDisassembler(FILE* stream) : stream_(stream) { }
~PrintDisassembler()79   ~PrintDisassembler() { }
80 
81   virtual void ProcessOutput(Instruction* instr);
82 
83  private:
84   FILE *stream_;
85 };
86 
87 
88 }  // namespace internal
89 }  // namespace v8
90 
91 #endif  // V8_ARM64_DISASM_ARM64_H
92