xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/M68k/M68kAsmPrinter.cpp (revision 753f127f3ace09432b2baeffd71a308760641a62)
104eeddc0SDimitry Andric //===-- M68kAsmPrinter.cpp - M68k LLVM Assembly Printer ---------*- C++ -*-===//
2fe6060f1SDimitry Andric //
3fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fe6060f1SDimitry Andric //
7fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
8fe6060f1SDimitry Andric ///
9fe6060f1SDimitry Andric /// \file
10fe6060f1SDimitry Andric /// This file contains a printer that converts from our internal representation
11fe6060f1SDimitry Andric /// of machine-dependent LLVM code to GAS-format M68k assembly language.
12fe6060f1SDimitry Andric ///
13fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
14fe6060f1SDimitry Andric 
15fe6060f1SDimitry Andric // TODO Conform to Motorola ASM syntax
16fe6060f1SDimitry Andric 
17fe6060f1SDimitry Andric #include "M68kAsmPrinter.h"
18fe6060f1SDimitry Andric 
19fe6060f1SDimitry Andric #include "M68k.h"
20fe6060f1SDimitry Andric #include "M68kMachineFunction.h"
21fe6060f1SDimitry Andric #include "MCTargetDesc/M68kInstPrinter.h"
22fe6060f1SDimitry Andric #include "TargetInfo/M68kTargetInfo.h"
23fe6060f1SDimitry Andric 
24349cc55cSDimitry Andric #include "llvm/MC/TargetRegistry.h"
25fe6060f1SDimitry Andric 
26fe6060f1SDimitry Andric using namespace llvm;
27fe6060f1SDimitry Andric 
28fe6060f1SDimitry Andric #define DEBUG_TYPE "m68k-asm-printer"
29fe6060f1SDimitry Andric 
30fe6060f1SDimitry Andric bool M68kAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
31fe6060f1SDimitry Andric   MMFI = MF.getInfo<M68kMachineFunctionInfo>();
32fe6060f1SDimitry Andric   MCInstLowering = std::make_unique<M68kMCInstLower>(MF, *this);
33fe6060f1SDimitry Andric   AsmPrinter::runOnMachineFunction(MF);
34fe6060f1SDimitry Andric   return true;
35fe6060f1SDimitry Andric }
36fe6060f1SDimitry Andric 
37fe6060f1SDimitry Andric void M68kAsmPrinter::printOperand(const MachineInstr *MI, int OpNum,
38fe6060f1SDimitry Andric                                   raw_ostream &OS) {
39fe6060f1SDimitry Andric   const MachineOperand &MO = MI->getOperand(OpNum);
40fe6060f1SDimitry Andric   switch (MO.getType()) {
41fe6060f1SDimitry Andric   case MachineOperand::MO_Register:
42fe6060f1SDimitry Andric     OS << "%" << M68kInstPrinter::getRegisterName(MO.getReg());
43fe6060f1SDimitry Andric     break;
44fe6060f1SDimitry Andric   case MachineOperand::MO_Immediate:
45fe6060f1SDimitry Andric     OS << '#' << MO.getImm();
46fe6060f1SDimitry Andric     break;
47fe6060f1SDimitry Andric   case MachineOperand::MO_MachineBasicBlock:
48fe6060f1SDimitry Andric     MO.getMBB()->getSymbol()->print(OS, MAI);
49fe6060f1SDimitry Andric     break;
50fe6060f1SDimitry Andric   case MachineOperand::MO_GlobalAddress:
51fe6060f1SDimitry Andric     PrintSymbolOperand(MO, OS);
52fe6060f1SDimitry Andric     break;
53fe6060f1SDimitry Andric   case MachineOperand::MO_BlockAddress:
54fe6060f1SDimitry Andric     GetBlockAddressSymbol(MO.getBlockAddress())->print(OS, MAI);
55fe6060f1SDimitry Andric     break;
56fe6060f1SDimitry Andric   case MachineOperand::MO_ConstantPoolIndex: {
57fe6060f1SDimitry Andric     const DataLayout &DL = getDataLayout();
58fe6060f1SDimitry Andric     OS << DL.getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
59fe6060f1SDimitry Andric        << MO.getIndex();
60fe6060f1SDimitry Andric     break;
61fe6060f1SDimitry Andric   }
62fe6060f1SDimitry Andric   default:
63fe6060f1SDimitry Andric     llvm_unreachable("not implemented");
64fe6060f1SDimitry Andric   }
65fe6060f1SDimitry Andric }
66fe6060f1SDimitry Andric 
67fe6060f1SDimitry Andric bool M68kAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
68fe6060f1SDimitry Andric                                      const char *ExtraCode, raw_ostream &OS) {
69fe6060f1SDimitry Andric   // Print the operand if there is no operand modifier.
70fe6060f1SDimitry Andric   if (!ExtraCode || !ExtraCode[0]) {
71fe6060f1SDimitry Andric     printOperand(MI, OpNo, OS);
72fe6060f1SDimitry Andric     return false;
73fe6060f1SDimitry Andric   }
74fe6060f1SDimitry Andric 
75fe6060f1SDimitry Andric   // Fallback to the default implementation.
76fe6060f1SDimitry Andric   return AsmPrinter::PrintAsmOperand(MI, OpNo, ExtraCode, OS);
77fe6060f1SDimitry Andric }
78fe6060f1SDimitry Andric 
79fe6060f1SDimitry Andric void M68kAsmPrinter::emitInstruction(const MachineInstr *MI) {
80*753f127fSDimitry Andric   M68k_MC::verifyInstructionPredicates(MI->getOpcode(),
81*753f127fSDimitry Andric                                        getSubtargetInfo().getFeatureBits());
82*753f127fSDimitry Andric 
83fe6060f1SDimitry Andric   switch (MI->getOpcode()) {
84fe6060f1SDimitry Andric   default: {
85fe6060f1SDimitry Andric     if (MI->isPseudo()) {
86fe6060f1SDimitry Andric       LLVM_DEBUG(dbgs() << "Pseudo opcode(" << MI->getOpcode()
87fe6060f1SDimitry Andric                         << ") found in EmitInstruction()\n");
88fe6060f1SDimitry Andric       llvm_unreachable("Cannot proceed");
89fe6060f1SDimitry Andric     }
90fe6060f1SDimitry Andric     break;
91fe6060f1SDimitry Andric   }
92fe6060f1SDimitry Andric   case M68k::TAILJMPj:
93fe6060f1SDimitry Andric   case M68k::TAILJMPq:
94fe6060f1SDimitry Andric     // Lower these as normal, but add some comments.
95fe6060f1SDimitry Andric     OutStreamer->AddComment("TAILCALL");
96fe6060f1SDimitry Andric     break;
97fe6060f1SDimitry Andric   }
98fe6060f1SDimitry Andric 
99fe6060f1SDimitry Andric   MCInst TmpInst0;
100fe6060f1SDimitry Andric   MCInstLowering->Lower(MI, TmpInst0);
101fe6060f1SDimitry Andric   OutStreamer->emitInstruction(TmpInst0, getSubtargetInfo());
102fe6060f1SDimitry Andric }
103fe6060f1SDimitry Andric 
104fe6060f1SDimitry Andric void M68kAsmPrinter::emitFunctionBodyStart() {}
105fe6060f1SDimitry Andric 
106fe6060f1SDimitry Andric void M68kAsmPrinter::emitFunctionBodyEnd() {}
107fe6060f1SDimitry Andric 
108fe6060f1SDimitry Andric void M68kAsmPrinter::emitStartOfAsmFile(Module &M) {
109fe6060f1SDimitry Andric   OutStreamer->emitSyntaxDirective();
110fe6060f1SDimitry Andric }
111fe6060f1SDimitry Andric 
112fe6060f1SDimitry Andric void M68kAsmPrinter::emitEndOfAsmFile(Module &M) {}
113fe6060f1SDimitry Andric 
114fe6060f1SDimitry Andric extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeM68kAsmPrinter() {
115fe6060f1SDimitry Andric   RegisterAsmPrinter<M68kAsmPrinter> X(getTheM68kTarget());
116fe6060f1SDimitry Andric }
117