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 | |
38 | namespace llvm { |
39 | namespace M68k { |
40 | static inline const MachineInstrBuilder & |
41 | addOffset(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). |
48 | static inline const MachineInstrBuilder & |
49 | addRegIndirectWithDisp(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... |
58 | static inline const MachineInstrBuilder & |
59 | addFrameReference(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 | |
75 | static inline const MachineInstrBuilder & |
76 | addMemOperand(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 | |