Movatterモバイル変換


[0]ホーム

URL:


LLVM 20.0.0git
M68kDisassembler.cpp
Go to the documentation of this file.
1//===-- M68kDisassembler.cpp - Disassembler for M68k ------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file is part of the M68k Disassembler.
10//
11//===----------------------------------------------------------------------===//
12
13#include "M68k.h"
14#include "M68kRegisterInfo.h"
15#include "M68kSubtarget.h"
16#include "MCTargetDesc/M68kMCCodeEmitter.h"
17#include "MCTargetDesc/M68kMCTargetDesc.h"
18#include "TargetInfo/M68kTargetInfo.h"
19
20#include "llvm/MC/MCAsmInfo.h"
21#include "llvm/MC/MCContext.h"
22#include "llvm/MC/MCDecoderOps.h"
23#include "llvm/MC/MCDisassembler/MCDisassembler.h"
24#include "llvm/MC/MCInst.h"
25#include "llvm/MC/TargetRegistry.h"
26#include "llvm/Support/Endian.h"
27#include "llvm/Support/ErrorHandling.h"
28
29using namespacellvm;
30
31#define DEBUG_TYPE "m68k-disassembler"
32
33typedefMCDisassembler::DecodeStatusDecodeStatus;
34
35staticconstunsignedRegisterDecode[] = {
36 M68k::D0, M68k::D1, M68k::D2, M68k::D3, M68k::D4, M68k::D5,
37 M68k::D6, M68k::D7, M68k::A0, M68k::A1, M68k::A2, M68k::A3,
38 M68k::A4, M68k::A5, M68k::A6, M68k::SP, M68k::FP0, M68k::FP1,
39 M68k::FP2, M68k::FP3, M68k::FP4, M68k::FP5, M68k::FP6, M68k::FP7,
40 M68k::FPIAR, M68k::FPS, M68k::FPC};
41
42staticDecodeStatusDecodeRegisterClass(MCInst &Inst,uint64_t RegNo,
43uint64_t Address,constvoid *Decoder) {
44if (RegNo >= 24)
45return DecodeStatus::Fail;
46 Inst.addOperand(MCOperand::createReg(RegisterDecode[RegNo]));
47return DecodeStatus::Success;
48}
49
50staticDecodeStatusDecodeDR32RegisterClass(MCInst &Inst,uint64_t RegNo,
51uint64_t Address,
52constvoid *Decoder) {
53returnDecodeRegisterClass(Inst, RegNo,Address, Decoder);
54}
55
56staticDecodeStatusDecodeDR16RegisterClass(MCInst &Inst,uint64_t RegNo,
57uint64_t Address,
58constvoid *Decoder) {
59returnDecodeRegisterClass(Inst, RegNo,Address, Decoder);
60}
61
62staticDecodeStatusDecodeDR8RegisterClass(MCInst &Inst,uint64_t RegNo,
63uint64_t Address,
64constvoid *Decoder) {
65returnDecodeRegisterClass(Inst, RegNo,Address, Decoder);
66}
67
68staticDecodeStatusDecodeAR32RegisterClass(MCInst &Inst,uint64_t RegNo,
69uint64_t Address,
70constvoid *Decoder) {
71returnDecodeRegisterClass(Inst, RegNo | 8ULL,Address, Decoder);
72}
73
74staticDecodeStatusDecodeAR16RegisterClass(MCInst &Inst,uint64_t RegNo,
75uint64_t Address,
76constvoid *Decoder) {
77returnDecodeRegisterClass(Inst, RegNo | 8ULL,Address, Decoder);
78}
79
80staticDecodeStatusDecodeXR32RegisterClass(MCInst &Inst,uint64_t RegNo,
81uint64_t Address,
82constvoid *Decoder) {
83returnDecodeRegisterClass(Inst, RegNo,Address, Decoder);
84}
85
86staticDecodeStatusDecodeXR32RegisterClass(MCInst &Inst,APInt RegNo,
87uint64_t Address,
88constvoid *Decoder) {
89returnDecodeRegisterClass(Inst, RegNo.getZExtValue(),Address, Decoder);
90}
91
92staticDecodeStatusDecodeXR16RegisterClass(MCInst &Inst,uint64_t RegNo,
93uint64_t Address,
94constvoid *Decoder) {
95returnDecodeRegisterClass(Inst, RegNo,Address, Decoder);
96}
97
98staticDecodeStatusDecodeFPDRRegisterClass(MCInst &Inst,uint64_t RegNo,
99uint64_t Address,
100constvoid *Decoder) {
101returnDecodeRegisterClass(Inst, RegNo | 16ULL,Address, Decoder);
102}
103#define DecodeFPDR32RegisterClass DecodeFPDRRegisterClass
104#define DecodeFPDR64RegisterClass DecodeFPDRRegisterClass
105#define DecodeFPDR80RegisterClass DecodeFPDRRegisterClass
106
107staticDecodeStatusDecodeFPCSCRegisterClass(MCInst &Inst,uint64_t RegNo,
108uint64_t Address,
109constvoid *Decoder) {
110returnDecodeRegisterClass(Inst, (RegNo >> 1) + 24,Address, Decoder);
111}
112#define DecodeFPICRegisterClass DecodeFPCSCRegisterClass
113
114staticDecodeStatusDecodeCCRCRegisterClass(MCInst &Inst,APInt &Insn,
115uint64_t Address,
116constvoid *Decoder) {
117llvm_unreachable("unimplemented");
118}
119
120staticDecodeStatusDecodeSRCRegisterClass(MCInst &Inst,APInt &Insn,
121uint64_t Address,
122constvoid *Decoder) {
123llvm_unreachable("unimplemented");
124}
125
126staticDecodeStatusDecodeImm32(MCInst &Inst,uint64_t Imm,uint64_t Address,
127constvoid *Decoder) {
128 Inst.addOperand(MCOperand::createImm(M68k::swapWord<uint32_t>(Imm)));
129return DecodeStatus::Success;
130}
131
132#include "M68kGenDisassemblerTable.inc"
133
134#undef DecodeFPDR32RegisterClass
135#undef DecodeFPDR64RegisterClass
136#undef DecodeFPDR80RegisterClass
137#undef DecodeFPICRegisterClass
138
139/// A disassembler class for M68k.
140structM68kDisassembler :publicMCDisassembler {
141M68kDisassembler(constMCSubtargetInfo &STI,MCContext &Ctx)
142 :MCDisassembler(STI, Ctx) {}
143virtual~M68kDisassembler() {}
144
145DecodeStatusgetInstruction(MCInst &Instr,uint64_t &Size,
146ArrayRef<uint8_t> Bytes,uint64_t Address,
147raw_ostream &CStream)const override;
148};
149
150DecodeStatusM68kDisassembler::getInstruction(MCInst &Instr,uint64_t &Size,
151ArrayRef<uint8_t> Bytes,
152uint64_t Address,
153raw_ostream &CStream) const{
154DecodeStatus Result;
155auto MakeUp = [&](APInt &Insn,unsigned InstrBits) {
156unsignedIdx =Insn.getBitWidth() >> 3;
157unsigned RoundUp =alignTo(InstrBits,Align(16));
158if (RoundUp >Insn.getBitWidth())
159Insn =Insn.zext(RoundUp);
160 RoundUp = RoundUp >> 3;
161for (;Idx < RoundUp;Idx += 2) {
162Insn.insertBits(support::endian::read16be(&Bytes[Idx]),Idx * 8, 16);
163 }
164 };
165APIntInsn(16,support::endian::read16be(Bytes.data()));
166// 2 bytes of data are consumed, so set Size to 2
167// If we don't do this, disassembler may generate result even
168// the encoding is invalid. We need to let it fail correctly.
169Size = 2;
170 Result = decodeInstruction(DecoderTable80, Instr,Insn,Address,this,STI,
171 MakeUp);
172if (Result == DecodeStatus::Success)
173Size = InstrLenTable[Instr.getOpcode()] >> 3;
174return Result;
175}
176
177staticMCDisassembler *createM68kDisassembler(constTarget &T,
178constMCSubtargetInfo &STI,
179MCContext &Ctx) {
180returnnewM68kDisassembler(STI, Ctx);
181}
182
183extern"C"LLVM_EXTERNAL_VISIBILITYvoidLLVMInitializeM68kDisassembler() {
184// Register the disassembler.
185TargetRegistry::RegisterMCDisassembler(getTheM68kTarget(),
186createM68kDisassembler);
187}
Insn
SmallVector< AArch64_IMM::ImmInsnModel, 4 > Insn
Definition:AArch64MIPeepholeOpt.cpp:167
LLVM_EXTERNAL_VISIBILITY
#define LLVM_EXTERNAL_VISIBILITY
Definition:Compiler.h:128
Idx
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
Definition:DeadArgumentElimination.cpp:353
Size
uint64_t Size
Definition:ELFObjHandler.cpp:81
Endian.h
DecodeSRCRegisterClass
static DecodeStatus DecodeSRCRegisterClass(MCInst &Inst, APInt &Insn, uint64_t Address, const void *Decoder)
Definition:M68kDisassembler.cpp:120
RegisterDecode
static const unsigned RegisterDecode[]
Definition:M68kDisassembler.cpp:35
DecodeStatus
MCDisassembler::DecodeStatus DecodeStatus
Definition:M68kDisassembler.cpp:33
DecodeXR32RegisterClass
static DecodeStatus DecodeXR32RegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
Definition:M68kDisassembler.cpp:80
DecodeFPDRRegisterClass
static DecodeStatus DecodeFPDRRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
Definition:M68kDisassembler.cpp:98
DecodeDR32RegisterClass
static DecodeStatus DecodeDR32RegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
Definition:M68kDisassembler.cpp:50
createM68kDisassembler
static MCDisassembler * createM68kDisassembler(const Target &T, const MCSubtargetInfo &STI, MCContext &Ctx)
Definition:M68kDisassembler.cpp:177
LLVMInitializeM68kDisassembler
LLVM_EXTERNAL_VISIBILITY void LLVMInitializeM68kDisassembler()
Definition:M68kDisassembler.cpp:183
DecodeCCRCRegisterClass
static DecodeStatus DecodeCCRCRegisterClass(MCInst &Inst, APInt &Insn, uint64_t Address, const void *Decoder)
Definition:M68kDisassembler.cpp:114
DecodeRegisterClass
static DecodeStatus DecodeRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
Definition:M68kDisassembler.cpp:42
DecodeDR8RegisterClass
static DecodeStatus DecodeDR8RegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
Definition:M68kDisassembler.cpp:62
DecodeAR32RegisterClass
static DecodeStatus DecodeAR32RegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
Definition:M68kDisassembler.cpp:68
DecodeFPCSCRegisterClass
static DecodeStatus DecodeFPCSCRegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
Definition:M68kDisassembler.cpp:107
DecodeXR16RegisterClass
static DecodeStatus DecodeXR16RegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
Definition:M68kDisassembler.cpp:92
DecodeAR16RegisterClass
static DecodeStatus DecodeAR16RegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
Definition:M68kDisassembler.cpp:74
DecodeDR16RegisterClass
static DecodeStatus DecodeDR16RegisterClass(MCInst &Inst, uint64_t RegNo, uint64_t Address, const void *Decoder)
Definition:M68kDisassembler.cpp:56
DecodeImm32
static DecodeStatus DecodeImm32(MCInst &Inst, uint64_t Imm, uint64_t Address, const void *Decoder)
Definition:M68kDisassembler.cpp:126
M68kMCCodeEmitter.h
This file contains the declarations for the code emitter which are useful outside of the emitter itse...
M68kMCTargetDesc.h
This file provides M68k specific target descriptions.
M68kRegisterInfo.h
This file contains the M68k implementation of the TargetRegisterInfo class.
M68kSubtarget.h
This file declares the M68k specific subclass of TargetSubtargetInfo.
M68kTargetInfo.h
M68k.h
This file contains the entry points for global functions defined in the M68k target library,...
MCAsmInfo.h
MCContext.h
MCDecoderOps.h
MCDisassembler.h
MCInst.h
Address
@ Address
Definition:SPIRVEmitNonSemanticDI.cpp:68
TargetRegistry.h
T
llvm::APInt
Class for arbitrary precision integers.
Definition:APInt.h:78
llvm::APInt::getZExtValue
uint64_t getZExtValue() const
Get zero extended value.
Definition:APInt.h:1520
llvm::ArrayRef
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition:ArrayRef.h:41
llvm::ArrayRef::data
const T * data() const
Definition:ArrayRef.h:165
llvm::MCContext
Context object for machine code objects.
Definition:MCContext.h:83
llvm::MCDisassembler
Superclass for all disassemblers.
Definition:MCDisassembler.h:84
llvm::MCDisassembler::STI
const MCSubtargetInfo & STI
Definition:MCDisassembler.h:200
llvm::MCDisassembler::DecodeStatus
DecodeStatus
Ternary decode status.
Definition:MCDisassembler.h:108
llvm::MCInst
Instances of this class represent a single low-level machine instruction.
Definition:MCInst.h:185
llvm::MCInst::addOperand
void addOperand(const MCOperand Op)
Definition:MCInst.h:211
llvm::MCOperand::createReg
static MCOperand createReg(MCRegister Reg)
Definition:MCInst.h:135
llvm::MCOperand::createImm
static MCOperand createImm(int64_t Val)
Definition:MCInst.h:142
llvm::MCSubtargetInfo
Generic base class for all target subtargets.
Definition:MCSubtargetInfo.h:76
llvm::Target
Target - Wrapper for Target specific information.
Definition:TargetRegistry.h:144
llvm::raw_ostream
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition:raw_ostream.h:52
uint64_t
ErrorHandling.h
llvm_unreachable
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Definition:ErrorHandling.h:143
llvm::support::endian::read16be
uint16_t read16be(const void *P)
Definition:Endian.h:431
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition:AddressRanges.h:18
llvm::alignTo
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition:Alignment.h:155
llvm::getTheM68kTarget
Target & getTheM68kTarget()
Definition:M68kTargetInfo.cpp:18
M68kDisassembler
A disassembler class for M68k.
Definition:M68kDisassembler.cpp:140
M68kDisassembler::getInstruction
DecodeStatus getInstruction(MCInst &Instr, uint64_t &Size, ArrayRef< uint8_t > Bytes, uint64_t Address, raw_ostream &CStream) const override
Returns the disassembly of a single instruction.
Definition:M68kDisassembler.cpp:150
M68kDisassembler::M68kDisassembler
M68kDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx)
Definition:M68kDisassembler.cpp:141
M68kDisassembler::~M68kDisassembler
virtual ~M68kDisassembler()
Definition:M68kDisassembler.cpp:143
llvm::Align
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition:Alignment.h:39
llvm::TargetRegistry::RegisterMCDisassembler
static void RegisterMCDisassembler(Target &T, Target::MCDisassemblerCtorTy Fn)
RegisterMCDisassembler - Register a MCDisassembler implementation for the given target.
Definition:TargetRegistry.h:878

Generated on Fri Jul 18 2025 14:05:05 for LLVM by doxygen 1.9.6
[8]ページ先頭

©2009-2025 Movatter.jp