31#define DEBUG_TYPE "m68k-expand-pseudo"
32#define PASS_NAME "M68k pseudo instruction expansion pass"
63char M68kExpandPseudo::ID = 0;
75 unsigned Opcode =
MI.getOpcode();
83 return TII->ExpandMOVI(MIB, MVT::i8);
85 return TII->ExpandMOVI(MIB, MVT::i16);
87 return TII->ExpandMOVI(MIB, MVT::i32);
90 return TII->ExpandMOVX_RR(MIB, MVT::i16, MVT::i8);
92 return TII->ExpandMOVX_RR(MIB, MVT::i32, MVT::i8);
93 case M68k::MOVXd32d16:
94 return TII->ExpandMOVX_RR(MIB, MVT::i32, MVT::i16);
96 case M68k::MOVSXd16d8:
97 return TII->ExpandMOVSZX_RR(MIB,
true, MVT::i16, MVT::i8);
98 case M68k::MOVSXd32d8:
99 return TII->ExpandMOVSZX_RR(MIB,
true, MVT::i32, MVT::i8);
100 case M68k::MOVSXd32d16:
101 return TII->ExpandMOVSZX_RR(MIB,
true, MVT::i32, MVT::i16);
103 case M68k::MOVZXd16d8:
104 return TII->ExpandMOVSZX_RR(MIB,
false, MVT::i16, MVT::i8);
105 case M68k::MOVZXd32d8:
106 return TII->ExpandMOVSZX_RR(MIB,
false, MVT::i32, MVT::i8);
107 case M68k::MOVZXd32d16:
108 return TII->ExpandMOVSZX_RR(MIB,
false, MVT::i32, MVT::i16);
110 case M68k::MOVSXd16j8:
111 return TII->ExpandMOVSZX_RM(MIB,
true,
TII->get(M68k::MOV8dj), MVT::i16,
113 case M68k::MOVSXd32j8:
114 return TII->ExpandMOVSZX_RM(MIB,
true,
TII->get(M68k::MOV8dj), MVT::i32,
116 case M68k::MOVSXd32j16:
117 return TII->ExpandMOVSZX_RM(MIB,
true,
TII->get(M68k::MOV16rj), MVT::i32,
120 case M68k::MOVZXd16j8:
121 return TII->ExpandMOVSZX_RM(MIB,
false,
TII->get(M68k::MOV8dj), MVT::i16,
123 case M68k::MOVZXd32j8:
124 return TII->ExpandMOVSZX_RM(MIB,
false,
TII->get(M68k::MOV8dj), MVT::i32,
126 case M68k::MOVZXd32j16:
127 return TII->ExpandMOVSZX_RM(MIB,
false,
TII->get(M68k::MOV16rj), MVT::i32,
130 case M68k::MOVSXd16p8:
131 return TII->ExpandMOVSZX_RM(MIB,
true,
TII->get(M68k::MOV8dp), MVT::i16,
133 case M68k::MOVSXd32p8:
134 return TII->ExpandMOVSZX_RM(MIB,
true,
TII->get(M68k::MOV8dp), MVT::i32,
136 case M68k::MOVSXd32p16:
137 return TII->ExpandMOVSZX_RM(MIB,
true,
TII->get(M68k::MOV16rp), MVT::i32,
140 case M68k::MOVZXd16p8:
141 return TII->ExpandMOVSZX_RM(MIB,
false,
TII->get(M68k::MOV8dp), MVT::i16,
143 case M68k::MOVZXd32p8:
144 return TII->ExpandMOVSZX_RM(MIB,
false,
TII->get(M68k::MOV8dp), MVT::i32,
146 case M68k::MOVZXd32p16:
147 return TII->ExpandMOVSZX_RM(MIB,
false,
TII->get(M68k::MOV16rp), MVT::i32,
150 case M68k::MOVSXd16f8:
151 return TII->ExpandMOVSZX_RM(MIB,
true,
TII->get(M68k::MOV8df), MVT::i16,
153 case M68k::MOVSXd32f8:
154 return TII->ExpandMOVSZX_RM(MIB,
true,
TII->get(M68k::MOV8df), MVT::i32,
156 case M68k::MOVSXd32f16:
157 return TII->ExpandMOVSZX_RM(MIB,
true,
TII->get(M68k::MOV16rf), MVT::i32,
160 case M68k::MOVZXd16f8:
161 return TII->ExpandMOVSZX_RM(MIB,
false,
TII->get(M68k::MOV8df), MVT::i16,
163 case M68k::MOVZXd32f8:
164 return TII->ExpandMOVSZX_RM(MIB,
false,
TII->get(M68k::MOV8df), MVT::i32,
166 case M68k::MOVZXd32f16:
167 return TII->ExpandMOVSZX_RM(MIB,
false,
TII->get(M68k::MOV16rf), MVT::i32,
170 case M68k::MOVSXd16q8:
171 return TII->ExpandMOVSZX_RM(MIB,
true,
TII->get(M68k::MOV8dq), MVT::i16,
173 case M68k::MOVSXd32q8:
174 return TII->ExpandMOVSZX_RM(MIB,
true,
TII->get(M68k::MOV8dq), MVT::i32,
176 case M68k::MOVSXd32q16:
177 return TII->ExpandMOVSZX_RM(MIB,
true,
TII->get(M68k::MOV16dq), MVT::i32,
180 case M68k::MOVZXd16q8:
181 return TII->ExpandMOVSZX_RM(MIB,
false,
TII->get(M68k::MOV8dq), MVT::i16,
183 case M68k::MOVZXd32q8:
184 return TII->ExpandMOVSZX_RM(MIB,
false,
TII->get(M68k::MOV8dq), MVT::i32,
186 case M68k::MOVZXd32q16:
187 return TII->ExpandMOVSZX_RM(MIB,
false,
TII->get(M68k::MOV16dq), MVT::i32,
191 return TII->ExpandCCR(MIB,
true);
193 return TII->ExpandCCR(MIB,
false);
195 case M68k::MOVM16jm_P:
196 return TII->ExpandMOVEM(MIB,
TII->get(M68k::MOVM16jm),
false);
197 case M68k::MOVM32jm_P:
198 return TII->ExpandMOVEM(MIB,
TII->get(M68k::MOVM32jm),
false);
200 case M68k::MOVM16pm_P:
201 return TII->ExpandMOVEM(MIB,
TII->get(M68k::MOVM16pm),
false);
202 case M68k::MOVM32pm_P:
203 return TII->ExpandMOVEM(MIB,
TII->get(M68k::MOVM32pm),
false);
205 case M68k::MOVM16mj_P:
206 return TII->ExpandMOVEM(MIB,
TII->get(M68k::MOVM16mj),
true);
207 case M68k::MOVM32mj_P:
208 return TII->ExpandMOVEM(MIB,
TII->get(M68k::MOVM32mj),
true);
210 case M68k::MOVM16mp_P:
211 return TII->ExpandMOVEM(MIB,
TII->get(M68k::MOVM16mp),
true);
212 case M68k::MOVM32mp_P:
213 return TII->ExpandMOVEM(MIB,
TII->get(M68k::MOVM32mp),
true);
215 case M68k::TCRETURNq:
216 case M68k::TCRETURNj: {
219 assert(StackAdjust.
isImm() &&
"Expecting immediate value.");
222 int StackAdj = StackAdjust.
getImm();
223 int MaxTCDelta = MFI->getTCReturnAddrDelta();
225 assert(MaxTCDelta <= 0 &&
"MaxTCDelta should never be positive");
228 Offset = StackAdj - MaxTCDelta;
229 assert(
Offset >= 0 &&
"Offset should never be negative");
238 if (Opcode == M68k::TCRETURNq) {
266 }
else if (int64_t StackAdj =
MBBI->getOperand(0).getImm(); StackAdj == 0) {
275 FL->emitSPUpdate(
MBB,
MBBI, StackAdj,
true);
312 TII = STI->getInstrInfo();
313 TRI = STI->getRegisterInfo();
315 FL = STI->getFrameLowering();
325 return new M68kExpandPseudo();
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
const HexagonInstrInfo * TII
This file contains the M68k declaration of TargetFrameLowering class.
This file contains the M68k implementation of the TargetInstrInfo class.
This file declares the M68k specific subclass of MachineFunctionInfo.
This file declares the M68k specific subclass of TargetSubtargetInfo.
This file contains the entry points for global functions defined in the M68k target library,...
Register const TargetRegisterInfo * TRI
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Represent the analysis usage information of a pass.
AnalysisUsage & addPreservedID(const void *ID)
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
FunctionPass class - This class is used to implement most global optimizations.
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
LLVM_ABI instr_iterator erase(instr_iterator I)
Remove an instruction from the instruction list and delete it.
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
virtual bool runOnMachineFunction(MachineFunction &MF)=0
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
virtual MachineFunctionProperties getRequiredProperties() const
Properties which a MachineFunction may have at a given point in time.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Function & getFunction()
Return the LLVM function that this machine code represents.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
const MachineInstrBuilder & addExternalSymbol(const char *FnName, unsigned TargetFlags=0) const
const MachineInstrBuilder & addGlobalAddress(const GlobalValue *GV, int64_t Offset=0, unsigned TargetFlags=0) const
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
Representation of each machine instruction.
LLVM_ABI void copyImplicitOps(MachineFunction &MF, const MachineInstr &MI)
Copy implicit register operands from specified instruction to this instruction.
MachineOperand class - Representation of each machine instruction operand.
const GlobalValue * getGlobal() const
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
bool isSymbol() const
isSymbol - Tests if this is a MO_ExternalSymbol operand.
unsigned getTargetFlags() const
bool isGlobal() const
isGlobal - Tests if this is a MO_GlobalAddress operand.
const char * getSymbolName() const
Register getReg() const
getReg - Returns the register number.
int64_t getOffset() const
Return the offset from the symbol in this operand.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ M68k_INTR
Used for M68k interrupt routines.
@ Kill
The last use of a register.
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
LLVM_ABI char & MachineDominatorsID
MachineDominators - This pass is a machine dominators analysis pass.
LLVM_ABI char & MachineLoopInfoID
MachineLoopInfo - This pass is a loop analysis pass.
FunctionPass * createM68kExpandPseudoPass()
Return a Machine IR pass that expands M68k-specific pseudo instructions into a sequence of actual ins...