11d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===-- SystemZInstrBuilder.h - Functions to aid building insts -*- C++ -*-===//
21d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
31d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//                     The LLVM Compiler Infrastructure
41d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
51d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// This file is distributed under the University of Illinois Open Source
61d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// License. See LICENSE.TXT for details.
71d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
81d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===----------------------------------------------------------------------===//
91d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
101d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// This file exposes functions that may be used with BuildMI from the
111d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// MachineInstrBuilder.h file to handle SystemZ'isms in a clean way.
121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===----------------------------------------------------------------------===//
141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
151d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#ifndef SYSTEMZINSTRBUILDER_H
161d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#define SYSTEMZINSTRBUILDER_H
171d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
181d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/CodeGen/MachineFrameInfo.h"
191d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/CodeGen/MachineInstrBuilder.h"
201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/CodeGen/MachineMemOperand.h"
211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/CodeGen/PseudoSourceValue.h"
221d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
231d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandnamespace llvm {
241d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand/// Add a BDX memory reference for frame object FI to MIB.
261d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandstatic inline const MachineInstrBuilder &
271d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich WeigandaddFrameReference(const MachineInstrBuilder &MIB, int FI) {
281d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  MachineInstr *MI = MIB;
291d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  MachineFunction &MF = *MI->getParent()->getParent();
301d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  MachineFrameInfo *MFFrame = MF.getFrameInfo();
311d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  const MCInstrDesc &MCID = MI->getDesc();
321d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  unsigned Flags = 0;
331d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  if (MCID.mayLoad())
341d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    Flags |= MachineMemOperand::MOLoad;
351d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  if (MCID.mayStore())
361d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    Flags |= MachineMemOperand::MOStore;
371d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  int64_t Offset = 0;
381d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  MachineMemOperand *MMO =
391d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    MF.getMachineMemOperand(MachinePointerInfo(
401d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                              PseudoSourceValue::getFixedStack(FI), Offset),
411d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                            Flags, MFFrame->getObjectSize(FI),
421d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                            MFFrame->getObjectAlignment(FI));
431d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  return MIB.addFrameIndex(FI).addImm(Offset).addReg(0).addMemOperand(MMO);
441d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
451d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} // end namespace llvm
471d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
481d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#endif
49