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