xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/M68k/MCTargetDesc/M68kMemOperandPrinter.h (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
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