llvm-project/llvm/lib/Target/M68k/MCTargetDesc/M68kMemOperandPrinter.h
Min-Yih Hsu aaa2503ad9 [M68k] Factoring out memory operand printer into a separate file
In order to support inline asm with memory constraints,
AsmPrinter::PrintAsmMemOperand needs to be implemented, which has lots
of overlaps with MCInstPrinter especially on the format of complex
addressing modes. This patch factors out the common printing logics from
MCInstPrinter into a separate class inherited by both AsmPrinter and
MCInstPrinter, in which the derived classes only need to provide
primitives like printOperand and printDisp.

This change is basically NFC. See D143529 for changes on AsmPrinter.

Differential Revision: https://reviews.llvm.org/D143528
2023-03-08 13:51:53 -08:00

81 lines
2.3 KiB
C++

//===-- M68kMemOperandPrinter.h - Memory operands printing ------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
///
/// \file
/// This file contains memory operand printing logics shared between AsmPrinter
// and MCInstPrinter.
///
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIB_TARGET_M68K_MEMOPERANDPRINTER_M68KINSTPRINTER_H
#define LLVM_LIB_TARGET_M68K_MEMOPERANDPRINTER_M68KINSTPRINTER_H
#include "M68kBaseInfo.h"
#include "llvm/Support/raw_ostream.h"
namespace llvm {
template <class Derived, typename InstTy> class M68kMemOperandPrinter {
Derived &impl() { return *static_cast<Derived *>(this); }
protected:
void printARIMem(const InstTy *MI, unsigned OpNum, raw_ostream &O) {
O << '(';
impl().printOperand(MI, OpNum, O);
O << ')';
}
void printARIPIMem(const InstTy *MI, unsigned OpNum, raw_ostream &O) {
O << "(";
impl().printOperand(MI, OpNum, O);
O << ")+";
}
void printARIPDMem(const InstTy *MI, unsigned OpNum, raw_ostream &O) {
O << "-(";
impl().printOperand(MI, OpNum, O);
O << ")";
}
void printARIDMem(const InstTy *MI, unsigned OpNum, raw_ostream &O) {
O << '(';
impl().printDisp(MI, OpNum + M68k::MemDisp, O);
O << ',';
impl().printOperand(MI, OpNum + M68k::MemBase, O);
O << ')';
}
void printARIIMem(const InstTy *MI, unsigned OpNum, raw_ostream &O) {
O << '(';
impl().printDisp(MI, OpNum + M68k::MemDisp, O);
O << ',';
impl().printOperand(MI, OpNum + M68k::MemBase, O);
O << ',';
impl().printOperand(MI, OpNum + M68k::MemIndex, O);
O << ')';
}
void printPCDMem(const InstTy *MI, uint64_t Address, unsigned OpNum,
raw_ostream &O) {
O << '(';
impl().printDisp(MI, OpNum + M68k::PCRelDisp, O);
O << ",%pc)";
}
void printPCIMem(const InstTy *MI, uint64_t Address, unsigned OpNum,
raw_ostream &O) {
O << '(';
impl().printDisp(MI, OpNum + M68k::PCRelDisp, O);
O << ",%pc,";
impl().printOperand(MI, OpNum + M68k::PCRelIndex, O);
O << ')';
}
};
} // end namespace llvm
#endif