brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · e85bd27 Raw
95 lines · c
1//===-- M68kInstrBuilder.h - Functions to build M68k insts ------*- 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-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// This file exposes functions that may be used with BuildMI from the11/// MachineInstrBuilder.h file to handle M68k'isms in a clean way.12///13/// TODO The BuildMem function may be used with the BuildMI function to add14/// entire memory references in a single, typed, function call.  M68k memory15/// references can be very complex expressions (described in the README), so16/// wrapping them up behind an easier to use interface makes sense.17/// Descriptions of the functions are included below.18///19/// For reference, the order of operands for memory references is:20/// (Operand), Base, Scale, Index, Displacement.21///22//===----------------------------------------------------------------------===//23//24#ifndef LLVM_LIB_TARGET_M68K_M68KINSTRBUILDER_H25#define LLVM_LIB_TARGET_M68K_M68KINSTRBUILDER_H26 27#include "llvm/ADT/SmallVector.h"28#include "llvm/CodeGen/MachineFrameInfo.h"29#include "llvm/CodeGen/MachineFunction.h"30#include "llvm/CodeGen/MachineInstr.h"31#include "llvm/CodeGen/MachineInstrBuilder.h"32#include "llvm/CodeGen/MachineMemOperand.h"33#include "llvm/CodeGen/MachineOperand.h"34#include "llvm/MC/MCInstrDesc.h"35 36#include <cassert>37 38namespace llvm {39namespace M68k {40static inline const MachineInstrBuilder &41addOffset(const MachineInstrBuilder &MIB, int Offset) {42  return MIB.addImm(Offset);43}44 45/// addRegIndirectWithDisp - This function is used to add a memory reference46/// of the form (Offset, Base), i.e., one with no scale or index, but with a47/// displacement. An example is: (4,D0).48static inline const MachineInstrBuilder &49addRegIndirectWithDisp(const MachineInstrBuilder &MIB, Register Reg,50                       bool IsKill, int Offset) {51  return MIB.addImm(Offset).addReg(Reg, getKillRegState(IsKill));52}53 54/// addFrameReference - This function is used to add a reference to the base of55/// an abstract object on the stack frame of the current function.  This56/// reference has base register as the FrameIndex offset until it is resolved.57/// This allows a constant offset to be specified as well...58static inline const MachineInstrBuilder &59addFrameReference(const MachineInstrBuilder &MIB, int FI, int Offset = 0) {60  MachineInstr *MI = MIB;61  MachineFunction &MF = *MI->getParent()->getParent();62  MachineFrameInfo &MFI = MF.getFrameInfo();63  const MCInstrDesc &MCID = MI->getDesc();64  auto Flags = MachineMemOperand::MONone;65  if (MCID.mayLoad())66    Flags |= MachineMemOperand::MOLoad;67  if (MCID.mayStore())68    Flags |= MachineMemOperand::MOStore;69  MachineMemOperand *MMO = MF.getMachineMemOperand(70      MachinePointerInfo::getFixedStack(MF, FI, Offset), Flags,71      MFI.getObjectSize(FI), MFI.getObjectAlign(FI));72  return MIB.addImm(Offset).addFrameIndex(FI).addMemOperand(MMO);73}74 75static inline const MachineInstrBuilder &76addMemOperand(const MachineInstrBuilder &MIB, int FI, int Offset = 0) {77  MachineInstr *MI = MIB;78  MachineFunction &MF = *MI->getParent()->getParent();79  MachineFrameInfo &MFI = MF.getFrameInfo();80  const MCInstrDesc &MCID = MI->getDesc();81  auto Flags = MachineMemOperand::MONone;82  if (MCID.mayLoad())83    Flags |= MachineMemOperand::MOLoad;84  if (MCID.mayStore())85    Flags |= MachineMemOperand::MOStore;86  MachineMemOperand *MMO = MF.getMachineMemOperand(87      MachinePointerInfo::getFixedStack(MF, FI, Offset), Flags,88      MFI.getObjectSize(FI), MFI.getObjectAlign(FI));89  return MIB.addMemOperand(MMO);90}91} // end namespace M68k92} // end namespace llvm93 94#endif // LLVM_LIB_TARGET_M68K_M68KINSTRBUILDER_H95