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.
5 #ifndef V8_ARM64_DISASM_ARM64_H
6 #define V8_ARM64_DISASM_ARM64_H
12 #include "instructions-arm64.h"
13 #include "decoder-arm64.h"
19 class Disassembler: public DecoderVisitor {
22 Disassembler(char* text_buffer, int buffer_size);
23 virtual ~Disassembler();
26 // Declare all Visitor functions.
27 #define DECLARE(A) void Visit##A(Instruction* instr);
32 virtual void ProcessOutput(Instruction* instr);
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);
50 bool RdIsZROrSP(Instruction* instr) const {
51 return (instr->Rd() == kZeroRegCode);
54 bool RnIsZROrSP(Instruction* instr) const {
55 return (instr->Rn() == kZeroRegCode);
58 bool RmIsZROrSP(Instruction* instr) const {
59 return (instr->Rm() == kZeroRegCode);
62 bool RaIsZROrSP(Instruction* instr) const {
63 return (instr->Ra() == kZeroRegCode);
66 bool IsMovzMovnImm(unsigned reg_size, uint64_t value);
69 void AppendToOutput(const char* string, ...);
73 uint32_t buffer_size_;
78 class PrintDisassembler: public Disassembler {
80 explicit PrintDisassembler(FILE* stream) : stream_(stream) { }
81 ~PrintDisassembler() { }
83 virtual void ProcessOutput(Instruction* instr);
90 } } // namespace v8::internal
92 #endif // V8_ARM64_DISASM_ARM64_H