1 | //===-- SparcInstrInfo.h - Sparc Instruction Information --------*- 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 | // This file contains the Sparc implementation of the TargetInstrInfo class. |
10 | // |
11 | //===----------------------------------------------------------------------===// |
12 | |
13 | #ifndef LLVM_LIB_TARGET_SPARC_SPARCINSTRINFO_H |
14 | #define LLVM_LIB_TARGET_SPARC_SPARCINSTRINFO_H |
15 | |
16 | #include "SparcRegisterInfo.h" |
17 | #include "llvm/CodeGen/TargetInstrInfo.h" |
18 | |
19 | #define |
20 | #include "SparcGenInstrInfo.inc" |
21 | |
22 | namespace llvm { |
23 | |
24 | class SparcSubtarget; |
25 | |
26 | /// SPII - This namespace holds all of the target specific flags that |
27 | /// instruction info tracks. |
28 | /// |
29 | namespace SPII { |
30 | enum { |
31 | Pseudo = (1<<0), |
32 | Load = (1<<1), |
33 | Store = (1<<2), |
34 | DelaySlot = (1<<3) |
35 | }; |
36 | } |
37 | |
38 | class SparcInstrInfo : public SparcGenInstrInfo { |
39 | const SparcRegisterInfo RI; |
40 | const SparcSubtarget& Subtarget; |
41 | virtual void anchor(); |
42 | public: |
43 | explicit SparcInstrInfo(SparcSubtarget &ST); |
44 | |
45 | /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As |
46 | /// such, whenever a client has an instance of instruction info, it should |
47 | /// always be able to get register info as well (through this method). |
48 | /// |
49 | const SparcRegisterInfo &getRegisterInfo() const { return RI; } |
50 | |
51 | /// isLoadFromStackSlot - If the specified machine instruction is a direct |
52 | /// load from a stack slot, return the virtual or physical register number of |
53 | /// the destination along with the FrameIndex of the loaded stack slot. If |
54 | /// not, return 0. This predicate must return 0 if the instruction has |
55 | /// any side effects other than loading from the stack slot. |
56 | Register isLoadFromStackSlot(const MachineInstr &MI, |
57 | int &FrameIndex) const override; |
58 | |
59 | /// isStoreToStackSlot - If the specified machine instruction is a direct |
60 | /// store to a stack slot, return the virtual or physical register number of |
61 | /// the source reg along with the FrameIndex of the loaded stack slot. If |
62 | /// not, return 0. This predicate must return 0 if the instruction has |
63 | /// any side effects other than storing to the stack slot. |
64 | Register isStoreToStackSlot(const MachineInstr &MI, |
65 | int &FrameIndex) const override; |
66 | |
67 | MachineBasicBlock *getBranchDestBlock(const MachineInstr &MI) const override; |
68 | |
69 | bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, |
70 | MachineBasicBlock *&FBB, |
71 | SmallVectorImpl<MachineOperand> &Cond, |
72 | bool AllowModify = false) const override; |
73 | |
74 | unsigned removeBranch(MachineBasicBlock &MBB, |
75 | int *BytesRemoved = nullptr) const override; |
76 | |
77 | unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, |
78 | MachineBasicBlock *FBB, ArrayRef<MachineOperand> Cond, |
79 | const DebugLoc &DL, |
80 | int *BytesAdded = nullptr) const override; |
81 | |
82 | bool |
83 | reverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const override; |
84 | |
85 | /// Determine if the branch target is in range. |
86 | bool isBranchOffsetInRange(unsigned BranchOpc, int64_t Offset) const override; |
87 | |
88 | void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, |
89 | const DebugLoc &DL, MCRegister DestReg, MCRegister SrcReg, |
90 | bool KillSrc) const override; |
91 | |
92 | void storeRegToStackSlot(MachineBasicBlock &MBB, |
93 | MachineBasicBlock::iterator MBBI, Register SrcReg, |
94 | bool isKill, int FrameIndex, |
95 | const TargetRegisterClass *RC, |
96 | const TargetRegisterInfo *TRI, |
97 | Register VReg) const override; |
98 | |
99 | void loadRegFromStackSlot(MachineBasicBlock &MBB, |
100 | MachineBasicBlock::iterator MBBI, Register DestReg, |
101 | int FrameIndex, const TargetRegisterClass *RC, |
102 | const TargetRegisterInfo *TRI, |
103 | Register VReg) const override; |
104 | |
105 | Register getGlobalBaseReg(MachineFunction *MF) const; |
106 | |
107 | /// GetInstSize - Return the number of bytes of code the specified |
108 | /// instruction may be. This returns the maximum number of bytes. |
109 | unsigned getInstSizeInBytes(const MachineInstr &MI) const override; |
110 | |
111 | // Lower pseudo instructions after register allocation. |
112 | bool expandPostRAPseudo(MachineInstr &MI) const override; |
113 | }; |
114 | |
115 | } |
116 | |
117 | #endif |
118 | |