1*06c3fb27SDimitry Andric //===-- M68kMemOperandPrinter.h - Memory operands printing ------*- C++ -*-===// 2*06c3fb27SDimitry Andric // 3*06c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*06c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*06c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*06c3fb27SDimitry Andric // 7*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===// 8*06c3fb27SDimitry Andric /// 9*06c3fb27SDimitry Andric /// \file 10*06c3fb27SDimitry Andric /// This file contains memory operand printing logics shared between AsmPrinter 11*06c3fb27SDimitry Andric // and MCInstPrinter. 12*06c3fb27SDimitry Andric /// 13*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===// 14*06c3fb27SDimitry Andric 15*06c3fb27SDimitry Andric #ifndef LLVM_LIB_TARGET_M68K_MEMOPERANDPRINTER_M68KINSTPRINTER_H 16*06c3fb27SDimitry Andric #define LLVM_LIB_TARGET_M68K_MEMOPERANDPRINTER_M68KINSTPRINTER_H 17*06c3fb27SDimitry Andric 18*06c3fb27SDimitry Andric #include "M68kBaseInfo.h" 19*06c3fb27SDimitry Andric 20*06c3fb27SDimitry Andric #include "llvm/Support/raw_ostream.h" 21*06c3fb27SDimitry Andric 22*06c3fb27SDimitry Andric namespace llvm { 23*06c3fb27SDimitry Andric template <class Derived, typename InstTy> class M68kMemOperandPrinter { impl()24*06c3fb27SDimitry Andric Derived &impl() { return *static_cast<Derived *>(this); } 25*06c3fb27SDimitry Andric 26*06c3fb27SDimitry Andric protected: printARIMem(const InstTy * MI,unsigned OpNum,raw_ostream & O)27*06c3fb27SDimitry Andric void printARIMem(const InstTy *MI, unsigned OpNum, raw_ostream &O) { 28*06c3fb27SDimitry Andric O << '('; 29*06c3fb27SDimitry Andric impl().printOperand(MI, OpNum, O); 30*06c3fb27SDimitry Andric O << ')'; 31*06c3fb27SDimitry Andric } 32*06c3fb27SDimitry Andric printARIPIMem(const InstTy * MI,unsigned OpNum,raw_ostream & O)33*06c3fb27SDimitry Andric void printARIPIMem(const InstTy *MI, unsigned OpNum, raw_ostream &O) { 34*06c3fb27SDimitry Andric O << "("; 35*06c3fb27SDimitry Andric impl().printOperand(MI, OpNum, O); 36*06c3fb27SDimitry Andric O << ")+"; 37*06c3fb27SDimitry Andric } 38*06c3fb27SDimitry Andric printARIPDMem(const InstTy * MI,unsigned OpNum,raw_ostream & O)39*06c3fb27SDimitry Andric void printARIPDMem(const InstTy *MI, unsigned OpNum, raw_ostream &O) { 40*06c3fb27SDimitry Andric O << "-("; 41*06c3fb27SDimitry Andric impl().printOperand(MI, OpNum, O); 42*06c3fb27SDimitry Andric O << ")"; 43*06c3fb27SDimitry Andric } 44*06c3fb27SDimitry Andric printARIDMem(const InstTy * MI,unsigned OpNum,raw_ostream & O)45*06c3fb27SDimitry Andric void printARIDMem(const InstTy *MI, unsigned OpNum, raw_ostream &O) { 46*06c3fb27SDimitry Andric O << '('; 47*06c3fb27SDimitry Andric impl().printDisp(MI, OpNum + M68k::MemDisp, O); 48*06c3fb27SDimitry Andric O << ','; 49*06c3fb27SDimitry Andric impl().printOperand(MI, OpNum + M68k::MemBase, O); 50*06c3fb27SDimitry Andric O << ')'; 51*06c3fb27SDimitry Andric } 52*06c3fb27SDimitry Andric printARIIMem(const InstTy * MI,unsigned OpNum,raw_ostream & O)53*06c3fb27SDimitry Andric void printARIIMem(const InstTy *MI, unsigned OpNum, raw_ostream &O) { 54*06c3fb27SDimitry Andric O << '('; 55*06c3fb27SDimitry Andric impl().printDisp(MI, OpNum + M68k::MemDisp, O); 56*06c3fb27SDimitry Andric O << ','; 57*06c3fb27SDimitry Andric impl().printOperand(MI, OpNum + M68k::MemBase, O); 58*06c3fb27SDimitry Andric O << ','; 59*06c3fb27SDimitry Andric impl().printOperand(MI, OpNum + M68k::MemIndex, O); 60*06c3fb27SDimitry Andric O << ')'; 61*06c3fb27SDimitry Andric } 62*06c3fb27SDimitry Andric printPCDMem(const InstTy * MI,uint64_t Address,unsigned OpNum,raw_ostream & O)63*06c3fb27SDimitry Andric void printPCDMem(const InstTy *MI, uint64_t Address, unsigned OpNum, 64*06c3fb27SDimitry Andric raw_ostream &O) { 65*06c3fb27SDimitry Andric O << '('; 66*06c3fb27SDimitry Andric impl().printDisp(MI, OpNum + M68k::PCRelDisp, O); 67*06c3fb27SDimitry Andric O << ",%pc)"; 68*06c3fb27SDimitry Andric } 69*06c3fb27SDimitry Andric printPCIMem(const InstTy * MI,uint64_t Address,unsigned OpNum,raw_ostream & O)70*06c3fb27SDimitry Andric void printPCIMem(const InstTy *MI, uint64_t Address, unsigned OpNum, 71*06c3fb27SDimitry Andric raw_ostream &O) { 72*06c3fb27SDimitry Andric O << '('; 73*06c3fb27SDimitry Andric impl().printDisp(MI, OpNum + M68k::PCRelDisp, O); 74*06c3fb27SDimitry Andric O << ",%pc,"; 75*06c3fb27SDimitry Andric impl().printOperand(MI, OpNum + M68k::PCRelIndex, O); 76*06c3fb27SDimitry Andric O << ')'; 77*06c3fb27SDimitry Andric } 78*06c3fb27SDimitry Andric }; 79*06c3fb27SDimitry Andric } // end namespace llvm 80*06c3fb27SDimitry Andric #endif 81