Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / v8 / src / arm64 / disasm-arm64.h
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
15 namespace v8 {
16 namespace internal {
17
18
19 class 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
78 class 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