Home | History | Annotate | Download | only in arm64
      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 
     48   bool RdIsZROrSP(Instruction* instr) const {
     49     return (instr->Rd() == kZeroRegCode);
     50   }
     51 
     52   bool RnIsZROrSP(Instruction* instr) const {
     53     return (instr->Rn() == kZeroRegCode);
     54   }
     55 
     56   bool RmIsZROrSP(Instruction* instr) const {
     57     return (instr->Rm() == kZeroRegCode);
     58   }
     59 
     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:
     78   explicit PrintDisassembler(FILE* stream) : stream_(stream) { }
     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