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