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-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// This file exposes functions that may be used with BuildMI from the
11/// 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 add
14/// entire memory references in a single, typed, function call. M68k memory
15/// references can be very complex expressions (described in the README), so
16/// 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_H
25#define LLVM_LIB_TARGET_M68K_M68KINSTRBUILDER_H
26
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(Val: Offset);
43}
44
45/// addRegIndirectWithDisp - This function is used to add a memory reference
46/// of the form (Offset, Base), i.e., one with no scale or index, but with a
47/// 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(Val: Offset).addReg(RegNo: Reg, flags: getKillRegState(B: IsKill));
52}
53
54/// addFrameReference - This function is used to add a reference to the base of
55/// an abstract object on the stack frame of the current function. This
56/// 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 PtrInfo: MachinePointerInfo::getFixedStack(MF, FI, Offset), F: Flags,
71 Size: MFI.getObjectSize(ObjectIdx: FI), BaseAlignment: MFI.getObjectAlign(ObjectIdx: FI));
72 return MIB.addImm(Val: Offset).addFrameIndex(Idx: 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 PtrInfo: MachinePointerInfo::getFixedStack(MF, FI, Offset), F: Flags,
88 Size: MFI.getObjectSize(ObjectIdx: FI), BaseAlignment: MFI.getObjectAlign(ObjectIdx: FI));
89 return MIB.addMemOperand(MMO);
90}
91} // end namespace M68k
92} // end namespace llvm
93
94#endif // LLVM_LIB_TARGET_M68K_M68KINSTRBUILDER_H
95

source code of llvm/lib/Target/M68k/M68kInstrBuilder.h