98 MachineBasicBlock& mbb,
99 MachineBasicBlock* tbb,
100 MachineBasicBlock* fbb,
101 ArrayRef<MachineOperand> cond,
103 ,
int *BytesAdded)
const {
104 assert(cond.size() == 0 || cond.size() == 2 || cond.size() == 3);
106 if (mbb.size() != 0) {
110 if (mbb.back().getOpcode() == TCE::TCEBR ||
111 mbb.back().getOpcode() == TCE::TCEBRIND) {
115 if (cond.size() != 0) {
116 assert (mbb.back().getOpcode() != TCE::TCEBRCOND &&
"c branch!");
117 assert (mbb.back().getOpcode() != TCE::TCEBRICOND &&
"ic branch!");
118 assert (mbb.back().getOpcode() != TCE::TCEBR &&
"has branch!(1)");
120 assert (mbb.back().getOpcode() != TCE::TCEBR &&
"has branch(2)!");
128 BuildMI(&mbb, dl, get(TCE::TCEBR)).addMBB(tbb);
131 if (cond.size() == 2 && cond[1].getImm() ==
false) {
133 BuildMI(&mbb, dl, get(TCE::TCEBRICOND)).
134 addReg(cond[0].getReg()).addMBB(tbb);
136 }
else if (cond.size() == 2 && cond[1].getImm() ==
true) {
137 BuildMI(&mbb, dl, get(TCE::TCEBRCOND)).addReg(cond[0].getReg())
149 "Two jumps need a condition");
152 if (cond.size() == 2 && cond[1].getImm() ==
false) {
153 BuildMI(&mbb, dl, get(TCE::TCEBRICOND)).
154 addReg(cond[0].getReg()).addMBB(tbb);
155 }
else if (cond.size() == 1 ||
156 (cond.size() == 2 && cond[1].getImm() ==
true)) {
157 BuildMI(&mbb, dl, get(TCE::TCEBRCOND)).
158 addReg(cond[0].getReg()).addMBB(tbb);
162 BuildMI(&mbb, dl, get(TCE::TCEBR)).addMBB(fbb);
210 unsigned SrcReg,
bool isKill,
int FI,
211 #ifdef LLVM_OLDER_THAN_16
212 const TargetRegisterClass *RC)
const {
214 const TargetRegisterClass *RC, Register vReg)
const {
218 if (I != MBB.end()) DL = I->getDebugLoc();
220 BuildMI(MBB, I, DL, get(
plugin_->
getStore(RC))).addFrameIndex(FI).addImm(0)
221 .addReg(SrcReg, getKillRegState(isKill));
223 LLVMContext& context = MBB.getParent()->getFunction().getContext();
224 llvm::Metadata* md = llvm::MDString::get(context,
"AA_CATEGORY_STACK_SLOT");
226 MDNode::get(context, llvm::ArrayRef<llvm::Metadata*>(&md, 1));
227 MachineOperand metaDataOperand = MachineOperand::CreateMetadata(mdNode);
229 I->addOperand(metaDataOperand);
234 unsigned DestReg,
int FI,
235 #ifdef LLVM_OLDER_THAN_16
236 const TargetRegisterClass *RC)
const {
238 const TargetRegisterClass *RC, Register vReg)
const {
242 if (I != MBB.end()) DL = I->getDebugLoc();
243 BuildMI(MBB, I, DL, get(
plugin_->
getLoad(RC)), DestReg).addFrameIndex(FI)
246 LLVMContext& context = MBB.getParent()->getFunction().getContext();
247 llvm::Metadata* md = llvm::MDString::get(context,
"AA_CATEGORY_STACK_SLOT");
249 MDNode::get(context, llvm::ArrayRef<llvm::Metadata*>(&md, 1));
250 MachineOperand metaDataOperand = MachineOperand::CreateMetadata(mdNode);
252 I->addOperand(metaDataOperand);
265 MachineBasicBlock& mbb,
266 MachineBasicBlock::iterator mbbi,
268 MCRegister destReg, MCRegister srcReg,
272 if (mbbi != mbb.end()) dl = mbbi->getDebugLoc();
282 if (TCE::R1RegsRegClass.contains(destReg, srcReg)) {
283 BuildMI(mbb, mbbi, dl, get(TCE::MOVI1rr), destReg)
284 .addReg(srcReg, getKillRegState(killSrc));
285 }
else if (TCE::R32IRegsRegClass.contains(destReg, srcReg)) {
286 BuildMI(mbb, mbbi, dl, get(TCE::MOVI32rr), destReg)
287 .addReg(srcReg, getKillRegState(killSrc));
288 }
else if (TCE::R64RegsRegClass.contains(destReg, srcReg)) {
289 BuildMI(mbb, mbbi, dl, get(TCE::MOV64ss), destReg)
290 .addReg(srcReg, getKillRegState(killSrc));
291 }
else if (TCE::FPRegsRegClass.contains(destReg, srcReg)) {
292 BuildMI(mbb, mbbi, dl, get(TCE::MOVff), destReg)
293 .addReg(srcReg, getKillRegState(killSrc));
294 }
else if (TCE::HFPRegsRegClass.contains(destReg, srcReg)) {
295 BuildMI(mbb, mbbi, dl, get(TCE::MOVhh), destReg)
296 .addReg(srcReg, getKillRegState(killSrc));
297 }
else if (TCE::R1RegsRegClass.contains(destReg) &&
298 TCE::R32IRegsRegClass.contains(srcReg)) {
299 BuildMI(mbb, mbbi, dl, get(TCE::MOVI32I1rr), destReg)
300 .addReg(srcReg, getKillRegState(killSrc));
301 }
else if (TCE::R1RegsRegClass.contains(srcReg) &&
302 TCE::R32IRegsRegClass.contains(destReg)) {
303 BuildMI(mbb, mbbi, dl, get(TCE::MOVI1I32rr), destReg)
304 .addReg(srcReg, getKillRegState(killSrc));
305 }
else if (TCE::GuardRegsRegClass.contains(destReg, srcReg)) {
306 BuildMI(mbb, mbbi, dl, get(TCE::MOVGrr), destReg)
307 .addReg(srcReg, getKillRegState(killSrc));
308 }
else if (TCE::GuardRegsRegClass.contains(srcReg) &&
309 TCE::R32IRegsRegClass.contains(destReg)) {
310 BuildMI(mbb, mbbi, dl, get(TCE::MOVGI32rr), destReg)
311 .addReg(srcReg, getKillRegState(killSrc));
312 }
else if (TCE::R32IRegsRegClass.contains(srcReg) &&
313 TCE::GuardRegsRegClass.contains(destReg)) {
314 BuildMI(mbb, mbbi, dl, get(TCE::MOVI32Grr), destReg)
315 .addReg(srcReg, getKillRegState(killSrc));
316 }
else if (TCE::GuardRegsRegClass.contains(srcReg) &&
317 TCE::R1RegsRegClass.contains(destReg)) {
318 BuildMI(mbb, mbbi, dl, get(TCE::MOVGI1rr), destReg)
319 .addReg(srcReg, getKillRegState(killSrc));
320 }
else if (TCE::R1RegsRegClass.contains(srcReg) &&
321 TCE::GuardRegsRegClass.contains(destReg)) {
322 BuildMI(mbb, mbbi, dl, get(TCE::MOVI1Grr), destReg)
323 .addReg(srcReg, getKillRegState(killSrc));
326 false &&
"TCERegisterInfo::copyPhysReg(): Can't copy register");
458 MachineBasicBlock &mbb, MachineBasicBlock *&tbb,
459 MachineBasicBlock *&fbb,
460 llvm::SmallVectorImpl<llvm::MachineOperand>& cond,
bool allowModify)
466 MachineBasicBlock::iterator i = mbb.end(); i--;
468 MachineInstr& lastIns = *i;
469 switch (lastIns.getOpcode()) {
471 tbb = lastIns.getOperand(1).getMBB();
472 cond.push_back(i->getOperand(0));
473 cond.push_back(MachineOperand::CreateImm(
true));
475 case TCE::TCEBRICOND:
476 tbb = lastIns.getOperand(1).getMBB();
477 cond.push_back(i->getOperand(0));
478 cond.push_back(MachineOperand::CreateImm(
false));
483 if (!lastIns.getOperand(0).isMBB()) {
487 if (i == mbb.begin()) {
488 tbb = lastIns.getOperand(0).getMBB();
492 if (i->getOpcode() == TCE::TCEBRCOND) {
493 tbb = i->getOperand(1).getMBB();
494 fbb = lastIns.getOperand(0).getMBB();
495 cond.push_back(i->getOperand(0));
496 cond.push_back(MachineOperand::CreateImm(
true));
499 if (i->getOpcode() == TCE::TCEBRICOND) {
500 tbb = i->getOperand(1).getMBB();
501 fbb = lastIns.getOperand(0).getMBB();
502 cond.push_back(i->getOperand(0));
503 cond.push_back(MachineOperand::CreateImm(
false));
507 assert(i->getOpcode() != TCE::TCEBR);
509 if (i->getDesc().isBranch()) {
510 tbb = i->getOperand(2).getMBB();
511 fbb = lastIns.getOperand(0).getMBB();
514 tbb = lastIns.getOperand(0).getMBB();
521 if (lastIns.getDesc().isBranch()) {
522 tbb = lastIns.getOperand(2).getMBB();
624 MachineInstr& mi_ref,
625 ArrayRef<MachineOperand> cond
628 MachineInstr *mi = &mi_ref;
630 int opc = mi->getOpcode();
634 bool invertJump = (cond.size() >1 && cond[1].isImm() &&
635 (cond[1].getImm() == 0));
642 mi->addOperand(mi->getOperand(mi->getNumOperands()-1));
645 for (oper = mi->getNumOperands() - 2; oper >= 0; --oper) {
646 MachineOperand mo = mi->getOperand(oper);
648 if ((mo.isReg() && !mo.isUse() && !mo.isImplicit())) {
653 mi->getOperand(oper+1).ChangeToRegister(mo.getReg(), mo.isDef(),
654 mo.isImplicit(), mo.isKill(),
655 mo.isDead(), mo.isUndef(),
657 }
else if (mo.isImm()) {
658 mi->getOperand(oper+1).ChangeToImmediate(mo.getImm());
659 }
else if (mo.isFPImm()) {
660 mi->getOperand(oper+1).ChangeToFPImmediate(mo.getFPImm());
661 }
else if (mo.isGlobal()) {
663 llvm_unreachable(
"Unexpected operand type");
664 mi->getOperand(oper+1).ChangeToImmediate(mo.getImm());
666 llvm_unreachable(
"Unexpected operand type");
670 MachineOperand PredMO = cond[0];
671 mi->getOperand(oper+1).ChangeToRegister(PredMO.getReg(), PredMO.isDef(),
672 PredMO.isImplicit(), PredMO.isKill(),
673 PredMO.isDead(), PredMO.isUndef(),