133 MachineBasicBlock::iterator II,
int SPAdj,
134 unsigned FIOperandNum,
135 RegScavenger *RS)
const {
137 MachineInstr &MI = *II;
140 MI.getParent()->getParent()->getTarget());
144 && osalOpName.find(
"MOVE") == std::string::npos) {
146 "Error: Stack address space is not reachable with operation '"
148 +
"Forgot to add the operation to the stack LSU?");
150 static int lastBypassReg = 0;
152 assert(SPAdj == 0 &&
"Unexpected");
154 DebugLoc dl = MI.getDebugLoc();
155 int FrameIndex = MI.getOperand(FIOperandNum).getIndex();
158 MachineFunction &MF = *MI.getParent()->getParent();
160 auto& frameinfo = MF.getFrameInfo();
162 if (frameinfo.isSpillSlotObjectIndex(FrameIndex)) {
163 for (MachineInstr::mmo_iterator i = MI.memoperands_begin();
164 i != MI.memoperands_end(); i++) {
165 const PseudoSourceValue* psv = (*i)->getPseudoValue();
167 #ifdef LLVM_OLDER_THAN_15
168 (*i)->setValue(
new FixedStackPseudoSourceValue(FrameIndex, TII));
170 (*i)->setValue(
new FixedStackPseudoSourceValue(FrameIndex, tm));
174 if (MI.memoperands_begin() == MI.memoperands_end()) {
176 auto flags =
static_cast<MachineMemOperand::Flags
>(
177 MI.mayLoad() * MachineMemOperand::MOLoad
178 | MI.mayStore() * MachineMemOperand::MOStore);
179 auto mmo =
new MachineMemOperand(
180 MachinePointerInfo(), flags, 0, Align(tfi_->stackAlignment()));
181 #ifdef LLVM_OLDER_THAN_15
182 mmo->setValue(
new FixedStackPseudoSourceValue(FrameIndex, TII));
184 mmo->setValue(
new FixedStackPseudoSourceValue(FrameIndex, tm));
186 MI.addMemOperand(MF, mmo);
190 if (tfi_->hasFP(MF)) {
191 int Offset = frameinfo.getObjectOffset(FrameIndex);
192 int stackAlign = tfi_->stackAlignment();
196 if (FrameIndex < 0 && frameinfo.hasCalls()
197 && tfi_->containsCall(MF)) {
212 if (originalOp ==
"LDW" || originalOp ==
"LDHU" ||
213 originalOp ==
"LDH" || originalOp ==
"LDQU" ||
214 originalOp ==
"LDQ" || originalOp ==
"STW" ||
215 originalOp ==
"STH" || originalOp ==
"STQ" ||
216 originalOp ==
"LD32" || originalOp ==
"LDU16" ||
217 originalOp ==
"LD16" || originalOp ==
"LDU8" ||
218 originalOp ==
"LD8" || originalOp ==
"ST32" ||
219 originalOp ==
"ST16" || originalOp ==
"ST8") {
220 baseOffsetOp =
TCEString(
"A") + originalOp;
222 if (baseOffsetOp !=
"" && tm.
hasOperation(baseOffsetOp)) {
223 const bool isStore = MI.getDesc().mayStore();
224 unsigned storeDataReg = 0;
225 uint64_t storeDataImm = 0;
231 int storeDataOp = FIOperandNum + 2;
232 if (MI.getOperand(storeDataOp).isReg()) {
233 storeDataReg = MI.getOperand(storeDataOp).getReg();
235 assert(MI.getOperand(storeDataOp).isImm());
236 storeDataImm = MI.getOperand(storeDataOp).getImm();
240 MI.setDesc(TII.get(tm.
opcode(baseOffsetOp)));
243 MI.getOperand(FIOperandNum).ChangeToRegister(TCE::FP,
false);
244 MI.getOperand(FIOperandNum + 1).setImm(Offset);
250 MI.getOperand(FIOperandNum + 2).ChangeToRegister(
251 storeDataReg,
false);
253 MI.getOperand(FIOperandNum + 2).ChangeToImmediate(
258 MI.getOperand(FIOperandNum).ChangeToRegister(
259 TCE::KLUDGE_REGISTER,
false,
false,
true);
263 *MI.getParent(), II, MI.getDebugLoc(),
264 TII.get(
ADDIMM), TCE::KLUDGE_REGISTER)
265 .addReg(TCE::FP).addImm(Offset);
269 *MI.getParent(), II, MI.getDebugLoc(),
270 TII.get(std::get<0>(spOpcAndOffset)),
271 TCE::KLUDGE_REGISTER)
273 .addImm(std::get<1>(spOpcAndOffset));
277 MI.getOperand(FIOperandNum).ChangeToRegister(TCE::FP,
false);
280 int Offset = frameinfo.getObjectOffset(FrameIndex) +
281 frameinfo.getStackSize();
284 MI.getOperand(FIOperandNum).ChangeToRegister(TCE::SP,
false);
285 #ifdef LLVM_OLDER_THAN_16
298 MI.getParent()->getParent()->getTarget());
305 if (originalOp ==
"LDW" || originalOp ==
"LDHU" ||
306 originalOp ==
"LDH" || originalOp ==
"LDQU" ||
307 originalOp ==
"LDQ" || originalOp ==
"STW" ||
308 originalOp ==
"STH" || originalOp ==
"STQ" ||
309 originalOp ==
"LD32" || originalOp ==
"LDU16" ||
310 originalOp ==
"LD16" || originalOp ==
"LDU8" ||
311 originalOp ==
"LD8" || originalOp ==
"ST32" ||
312 originalOp ==
"ST16" || originalOp ==
"ST8") {
313 baseOffsetOp =
TCEString(
"A") + originalOp;
315 if (baseOffsetOp !=
"" && tm.
hasOperation(baseOffsetOp)) {
316 const bool isStore = MI.getDesc().mayStore();
317 unsigned storeDataReg = 0;
318 uint64_t storeDataImm = 0;
324 int storeDataOp = FIOperandNum + 2;
325 if (MI.getOperand(storeDataOp).isReg()) {
326 storeDataReg = MI.getOperand(storeDataOp).getReg();
328 assert(MI.getOperand(storeDataOp).isImm());
329 storeDataImm = MI.getOperand(storeDataOp).getImm();
333 MI.setDesc(TII.get(tm.
opcode(baseOffsetOp)));
336 MI.getOperand(FIOperandNum).ChangeToRegister(TCE::SP,
false);
337 MI.getOperand(FIOperandNum + 1).setImm(Offset);
343 MI.getOperand(FIOperandNum + 2).ChangeToRegister(
344 storeDataReg,
false);
346 MI.getOperand(FIOperandNum + 2).ChangeToImmediate(
352 unsigned int tmp = 0;
362 MI.getOperand(FIOperandNum).ChangeToRegister(
363 tmp,
false,
false,
true);
365 *MI.getParent(), II, MI.getDebugLoc(), TII.get(
ADDIMM),
366 tmp).addReg(TCE::SP).addImm(Offset);
368 MI.getOperand(FIOperandNum).ChangeToRegister(
369 TCE::KLUDGE_REGISTER,
false);
371 *MI.getParent(), II, MI.getDebugLoc(), TII.get(
ADDIMM),
372 TCE::KLUDGE_REGISTER).addReg(TCE::SP).addImm(Offset);
376 #ifdef LLVM_OLDER_THAN_16