|
13 | 13 | //===----------------------------------------------------------------------===// |
14 | 14 |
|
15 | 15 | #include "XtensaInstrInfo.h" |
16 | | -#include "XtensaConstantPoolValue.h" |
17 | 16 | #include "XtensaTargetMachine.h" |
18 | 17 | #include "llvm/CodeGen/MachineConstantPool.h" |
19 | 18 | #include "llvm/CodeGen/MachineFrameInfo.h" |
20 | 19 | #include "llvm/CodeGen/MachineInstrBuilder.h" |
21 | 20 | #include "llvm/CodeGen/MachineRegisterInfo.h" |
22 | | -#include "llvm/CodeGen/RegisterScavenging.h" |
23 | 21 |
|
24 | 22 | #define GET_INSTRINFO_CTOR_DTOR |
25 | 23 | #include "XtensaGenInstrInfo.inc" |
@@ -188,18 +186,6 @@ void XtensaInstrInfo::loadImmediate(MachineBasicBlock &MBB, |
188 | 186 | } |
189 | 187 | } |
190 | 188 |
|
191 | | -unsigned XtensaInstrInfo::getInstSizeInBytes(const MachineInstr &MI) const { |
192 | | - switch (MI.getOpcode()) { |
193 | | - case TargetOpcode::INLINEASM: { // Inline Asm: Variable size. |
194 | | - const MachineFunction *MF = MI.getParent()->getParent(); |
195 | | - const char *AsmStr = MI.getOperand(0).getSymbolName(); |
196 | | - return getInlineAsmLength(AsmStr, *MF->getTarget().getMCAsmInfo()); |
197 | | - } |
198 | | - default: |
199 | | - return MI.getDesc().getSize(); |
200 | | - } |
201 | | -} |
202 | | - |
203 | 189 | bool XtensaInstrInfo::reverseBranchCondition( |
204 | 190 | SmallVectorImpl<MachineOperand> &Cond) const { |
205 | 191 | assert(Cond.size() <= 4 && "Invalid branch condition!"); |
@@ -261,77 +247,6 @@ bool XtensaInstrInfo::reverseBranchCondition( |
261 | 247 | } |
262 | 248 | } |
263 | 249 |
|
264 | | -MachineBasicBlock * |
265 | | -XtensaInstrInfo::getBranchDestBlock(const MachineInstr &MI) const { |
266 | | - unsigned OpCode = MI.getOpcode(); |
267 | | - switch (OpCode) { |
268 | | - case Xtensa::BR_JT: |
269 | | - case Xtensa::JX: |
270 | | - return nullptr; |
271 | | - case Xtensa::J: |
272 | | - return MI.getOperand(0).getMBB(); |
273 | | - case Xtensa::BEQ: |
274 | | - case Xtensa::BNE: |
275 | | - case Xtensa::BLT: |
276 | | - case Xtensa::BLTU: |
277 | | - case Xtensa::BGE: |
278 | | - case Xtensa::BGEU: |
279 | | - return MI.getOperand(2).getMBB(); |
280 | | - |
281 | | - case Xtensa::BEQI: |
282 | | - case Xtensa::BNEI: |
283 | | - case Xtensa::BLTI: |
284 | | - case Xtensa::BLTUI: |
285 | | - case Xtensa::BGEI: |
286 | | - case Xtensa::BGEUI: |
287 | | - return MI.getOperand(2).getMBB(); |
288 | | - |
289 | | - case Xtensa::BEQZ: |
290 | | - case Xtensa::BNEZ: |
291 | | - case Xtensa::BLTZ: |
292 | | - case Xtensa::BGEZ: |
293 | | - return MI.getOperand(1).getMBB(); |
294 | | - |
295 | | - default: |
296 | | - llvm_unreachable("Unknown branch opcode"); |
297 | | - } |
298 | | -} |
299 | | - |
300 | | -bool XtensaInstrInfo::isBranchOffsetInRange(unsigned BranchOp, |
301 | | - int64_t BrOffset) const { |
302 | | - switch (BranchOp) { |
303 | | - case Xtensa::J: |
304 | | - BrOffset -= 4; |
305 | | - return isIntN(18, BrOffset); |
306 | | - case Xtensa::JX: |
307 | | - return true; |
308 | | - case Xtensa::BR_JT: |
309 | | - return true; |
310 | | - case Xtensa::BEQ: |
311 | | - case Xtensa::BNE: |
312 | | - case Xtensa::BLT: |
313 | | - case Xtensa::BLTU: |
314 | | - case Xtensa::BGE: |
315 | | - case Xtensa::BGEU: |
316 | | - case Xtensa::BEQI: |
317 | | - case Xtensa::BNEI: |
318 | | - case Xtensa::BLTI: |
319 | | - case Xtensa::BLTUI: |
320 | | - case Xtensa::BGEI: |
321 | | - case Xtensa::BGEUI: |
322 | | - BrOffset -= 4; |
323 | | - return isIntN(8, BrOffset); |
324 | | - case Xtensa::BEQZ: |
325 | | - case Xtensa::BNEZ: |
326 | | - case Xtensa::BLTZ: |
327 | | - case Xtensa::BGEZ: |
328 | | - BrOffset -= 4; |
329 | | - return isIntN(12, BrOffset); |
330 | | - default: |
331 | | - llvm_unreachable("Unknown branch opcode"); |
332 | | - } |
333 | | -} |
334 | | - |
335 | 250 | bool XtensaInstrInfo::analyzeBranch(MachineBasicBlock &MBB, |
336 | 251 | MachineBasicBlock *&TBB, |
337 | 252 | MachineBasicBlock *&FBB, |
@@ -464,101 +379,6 @@ unsigned XtensaInstrInfo::insertBranch( |
464 | 379 | return Count; |
465 | 380 | } |
466 | 381 |
|
467 | | -void XtensaInstrInfo::insertIndirectBranch(MachineBasicBlock &MBB, |
468 | | - MachineBasicBlock &DestBB, |
469 | | - MachineBasicBlock &RestoreBB, |
470 | | - const DebugLoc &DL, int64_t BrOffset, |
471 | | - RegScavenger *RS) const { |
472 | | - assert(RS && "RegScavenger required for long branching"); |
473 | | - assert(MBB.empty() && |
474 | | - "new block should be inserted for expanding unconditional branch"); |
475 | | - assert(MBB.pred_size() == 1); |
476 | | - |
477 | | - MachineFunction *MF = MBB.getParent(); |
478 | | - MachineRegisterInfo &MRI = MF->getRegInfo(); |
479 | | - MachineConstantPool *ConstantPool = MF->getConstantPool(); |
480 | | - |
481 | | - if (!isInt<32>(BrOffset)) |
482 | | - report_fatal_error( |
483 | | - "Branch offsets outside of the signed 32-bit range not supported"); |
484 | | - XtensaConstantPoolValue *C = |
485 | | - XtensaConstantPoolMBB::Create(MF->getFunction().getContext(), &DestBB, 0); |
486 | | - unsigned Idx = ConstantPool->getConstantPoolIndex(C, Align(4)); |
487 | | - |
488 | | - // FIXME: A virtual register must be used initially, as the register |
489 | | - // scavenger won't work with empty blocks (SIInstrInfo::insertIndirectBranch |
490 | | - // uses the same workaround). |
491 | | - Register ScratchReg = MRI.createVirtualRegister(&Xtensa::ARRegClass); |
492 | | - auto II = MBB.end(); |
493 | | - |
494 | | - MachineInstr &L32R = *BuildMI(MBB, II, DL, get(Xtensa::L32R), ScratchReg) |
495 | | - .addConstantPoolIndex(Idx); |
496 | | - BuildMI(MBB, II, DL, get(Xtensa::JX)).addReg(ScratchReg, RegState::Kill); |
497 | | - RS->enterBasicBlockEnd(MBB); |
498 | | - unsigned Scav = RS->scavengeRegisterBackwards(Xtensa::ARRegClass, |
499 | | - L32R.getIterator(), false, 0); |
500 | | - MRI.replaceRegWith(ScratchReg, Scav); |
501 | | - MRI.clearVirtRegs(); |
502 | | - RS->setRegUsed(Scav); |
503 | | -} |
504 | | - |
505 | | -unsigned XtensaInstrInfo::InsertConstBranchAtInst( |
506 | | - MachineBasicBlock &MBB, MachineInstr *I, int64_t offset, |
507 | | - ArrayRef<MachineOperand> Cond, DebugLoc DL, int *BytesAdded) const { |
508 | | - // Shouldn't be a fall through. |
509 | | - assert(&MBB && "InsertBranch must not be told to insert a fallthrough"); |
510 | | - assert(Cond.size() <= 4 && |
511 | | - "Xtensa branch conditions have less than four components!"); |
512 | | - |
513 | | - if (Cond.empty() || (Cond[0].getImm() == Xtensa::J)) { |
514 | | - // Unconditional branch |
515 | | - MachineInstr *MI = BuildMI(MBB, I, DL, get(Xtensa::J)).addImm(offset); |
516 | | - if (BytesAdded && MI) |
517 | | - *BytesAdded += getInstSizeInBytes(*MI); |
518 | | - return 1; |
519 | | - } |
520 | | - |
521 | | - unsigned Count = 0; |
522 | | - unsigned BR_C = Cond[0].getImm(); |
523 | | - MachineInstr *MI = nullptr; |
524 | | - switch (BR_C) { |
525 | | - case Xtensa::BEQ: |
526 | | - case Xtensa::BNE: |
527 | | - case Xtensa::BLT: |
528 | | - case Xtensa::BLTU: |
529 | | - case Xtensa::BGE: |
530 | | - case Xtensa::BGEU: |
531 | | - MI = BuildMI(MBB, I, DL, get(BR_C)) |
532 | | - .addImm(offset) |
533 | | - .addReg(Cond[1].getReg()) |
534 | | - .addReg(Cond[2].getReg()); |
535 | | - break; |
536 | | - case Xtensa::BEQI: |
537 | | - case Xtensa::BNEI: |
538 | | - case Xtensa::BLTI: |
539 | | - case Xtensa::BLTUI: |
540 | | - case Xtensa::BGEI: |
541 | | - case Xtensa::BGEUI: |
542 | | - MI = BuildMI(MBB, I, DL, get(BR_C)) |
543 | | - .addImm(offset) |
544 | | - .addReg(Cond[1].getReg()) |
545 | | - .addImm(Cond[2].getImm()); |
546 | | - break; |
547 | | - case Xtensa::BEQZ: |
548 | | - case Xtensa::BNEZ: |
549 | | - case Xtensa::BLTZ: |
550 | | - case Xtensa::BGEZ: |
551 | | - MI = BuildMI(MBB, I, DL, get(BR_C)).addImm(offset).addReg(Cond[1].getReg()); |
552 | | - break; |
553 | | - default: |
554 | | - llvm_unreachable("Invalid branch type!"); |
555 | | - } |
556 | | - if (BytesAdded && MI) |
557 | | - *BytesAdded += getInstSizeInBytes(*MI); |
558 | | - ++Count; |
559 | | - return Count; |
560 | | -} |
561 | | - |
562 | 382 | unsigned XtensaInstrInfo::InsertBranchAtInst(MachineBasicBlock &MBB, |
563 | 383 | MachineBasicBlock::iterator I, |
564 | 384 | MachineBasicBlock *TBB, |
|
0 commit comments