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