1 //===-- M68kMemOperandPrinter.h - Memory operands printing ------*- 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 /// \file
10 /// This file contains memory operand printing logics shared between AsmPrinter
11 //  and MCInstPrinter.
12 ///
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_LIB_TARGET_M68K_MEMOPERANDPRINTER_M68KINSTPRINTER_H
16 #define LLVM_LIB_TARGET_M68K_MEMOPERANDPRINTER_M68KINSTPRINTER_H
17 
18 #include "M68kBaseInfo.h"
19 
20 #include "llvm/Support/raw_ostream.h"
21 
22 namespace llvm {
23 template <class Derived, typename InstTy> class M68kMemOperandPrinter {
impl()24   Derived &impl() { return *static_cast<Derived *>(this); }
25 
26 protected:
printARIMem(const InstTy * MI,unsigned OpNum,raw_ostream & O)27   void printARIMem(const InstTy *MI, unsigned OpNum, raw_ostream &O) {
28     O << '(';
29     impl().printOperand(MI, OpNum, O);
30     O << ')';
31   }
32 
printARIPIMem(const InstTy * MI,unsigned OpNum,raw_ostream & O)33   void printARIPIMem(const InstTy *MI, unsigned OpNum, raw_ostream &O) {
34     O << "(";
35     impl().printOperand(MI, OpNum, O);
36     O << ")+";
37   }
38 
printARIPDMem(const InstTy * MI,unsigned OpNum,raw_ostream & O)39   void printARIPDMem(const InstTy *MI, unsigned OpNum, raw_ostream &O) {
40     O << "-(";
41     impl().printOperand(MI, OpNum, O);
42     O << ")";
43   }
44 
printARIDMem(const InstTy * MI,unsigned OpNum,raw_ostream & O)45   void printARIDMem(const InstTy *MI, unsigned OpNum, raw_ostream &O) {
46     O << '(';
47     impl().printDisp(MI, OpNum + M68k::MemDisp, O);
48     O << ',';
49     impl().printOperand(MI, OpNum + M68k::MemBase, O);
50     O << ')';
51   }
52 
printARIIMem(const InstTy * MI,unsigned OpNum,raw_ostream & O)53   void printARIIMem(const InstTy *MI, unsigned OpNum, raw_ostream &O) {
54     O << '(';
55     impl().printDisp(MI, OpNum + M68k::MemDisp, O);
56     O << ',';
57     impl().printOperand(MI, OpNum + M68k::MemBase, O);
58     O << ',';
59     impl().printOperand(MI, OpNum + M68k::MemIndex, O);
60     O << ')';
61   }
62 
printPCDMem(const InstTy * MI,uint64_t Address,unsigned OpNum,raw_ostream & O)63   void printPCDMem(const InstTy *MI, uint64_t Address, unsigned OpNum,
64                    raw_ostream &O) {
65     O << '(';
66     impl().printDisp(MI, OpNum + M68k::PCRelDisp, O);
67     O << ",%pc)";
68   }
69 
printPCIMem(const InstTy * MI,uint64_t Address,unsigned OpNum,raw_ostream & O)70   void printPCIMem(const InstTy *MI, uint64_t Address, unsigned OpNum,
71                    raw_ostream &O) {
72     O << '(';
73     impl().printDisp(MI, OpNum + M68k::PCRelDisp, O);
74     O << ",%pc,";
75     impl().printOperand(MI, OpNum + M68k::PCRelIndex, O);
76     O << ')';
77   }
78 };
79 } // end namespace llvm
80 #endif
81