1 //===- PPCInstrInfo.cpp - PowerPC32 Instruction Information -----*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains the PowerPC implementation of the TargetInstrInfo class.
12 //===----------------------------------------------------------------------===//
14 #include "PPCInstrInfo.h"
15 #include "PPCInstrBuilder.h"
16 #include "PPCMachineFunctionInfo.h"
17 #include "PPCPredicates.h"
18 #include "PPCGenInstrInfo.inc"
19 #include "PPCTargetMachine.h"
20 #include "llvm/ADT/STLExtras.h"
21 #include "llvm/CodeGen/MachineInstrBuilder.h"
22 #include "llvm/Support/CommandLine.h"
23 #include "llvm/Support/ErrorHandling.h"
24 #include "llvm/Support/raw_ostream.h"
25 #include "llvm/MC/MCAsmInfo.h"
28 extern cl::opt
<bool> EnablePPC32RS
; // FIXME (64-bit): See PPCRegisterInfo.cpp.
29 extern cl::opt
<bool> EnablePPC64RS
; // FIXME (64-bit): See PPCRegisterInfo.cpp.
31 PPCInstrInfo::PPCInstrInfo(PPCTargetMachine
&tm
)
32 : TargetInstrInfoImpl(PPCInsts
, array_lengthof(PPCInsts
)), TM(tm
),
33 RI(*TM
.getSubtargetImpl(), *this) {}
35 bool PPCInstrInfo::isMoveInstr(const MachineInstr
& MI
,
38 unsigned& sourceSubIdx
,
39 unsigned& destSubIdx
) const {
40 sourceSubIdx
= destSubIdx
= 0; // No sub-registers.
42 unsigned oc
= MI
.getOpcode();
43 if (oc
== PPC::OR
|| oc
== PPC::OR8
|| oc
== PPC::VOR
||
44 oc
== PPC::OR4To8
|| oc
== PPC::OR8To4
) { // or r1, r2, r2
45 assert(MI
.getNumOperands() >= 3 &&
46 MI
.getOperand(0).isReg() &&
47 MI
.getOperand(1).isReg() &&
48 MI
.getOperand(2).isReg() &&
49 "invalid PPC OR instruction!");
50 if (MI
.getOperand(1).getReg() == MI
.getOperand(2).getReg()) {
51 sourceReg
= MI
.getOperand(1).getReg();
52 destReg
= MI
.getOperand(0).getReg();
55 } else if (oc
== PPC::ADDI
) { // addi r1, r2, 0
56 assert(MI
.getNumOperands() >= 3 &&
57 MI
.getOperand(0).isReg() &&
58 MI
.getOperand(2).isImm() &&
59 "invalid PPC ADDI instruction!");
60 if (MI
.getOperand(1).isReg() && MI
.getOperand(2).getImm() == 0) {
61 sourceReg
= MI
.getOperand(1).getReg();
62 destReg
= MI
.getOperand(0).getReg();
65 } else if (oc
== PPC::ORI
) { // ori r1, r2, 0
66 assert(MI
.getNumOperands() >= 3 &&
67 MI
.getOperand(0).isReg() &&
68 MI
.getOperand(1).isReg() &&
69 MI
.getOperand(2).isImm() &&
70 "invalid PPC ORI instruction!");
71 if (MI
.getOperand(2).getImm() == 0) {
72 sourceReg
= MI
.getOperand(1).getReg();
73 destReg
= MI
.getOperand(0).getReg();
76 } else if (oc
== PPC::FMRS
|| oc
== PPC::FMRD
||
77 oc
== PPC::FMRSD
) { // fmr r1, r2
78 assert(MI
.getNumOperands() >= 2 &&
79 MI
.getOperand(0).isReg() &&
80 MI
.getOperand(1).isReg() &&
81 "invalid PPC FMR instruction");
82 sourceReg
= MI
.getOperand(1).getReg();
83 destReg
= MI
.getOperand(0).getReg();
85 } else if (oc
== PPC::MCRF
) { // mcrf cr1, cr2
86 assert(MI
.getNumOperands() >= 2 &&
87 MI
.getOperand(0).isReg() &&
88 MI
.getOperand(1).isReg() &&
89 "invalid PPC MCRF instruction");
90 sourceReg
= MI
.getOperand(1).getReg();
91 destReg
= MI
.getOperand(0).getReg();
97 unsigned PPCInstrInfo::isLoadFromStackSlot(const MachineInstr
*MI
,
98 int &FrameIndex
) const {
99 switch (MI
->getOpcode()) {
105 if (MI
->getOperand(1).isImm() && !MI
->getOperand(1).getImm() &&
106 MI
->getOperand(2).isFI()) {
107 FrameIndex
= MI
->getOperand(2).getIndex();
108 return MI
->getOperand(0).getReg();
115 unsigned PPCInstrInfo::isStoreToStackSlot(const MachineInstr
*MI
,
116 int &FrameIndex
) const {
117 switch (MI
->getOpcode()) {
123 if (MI
->getOperand(1).isImm() && !MI
->getOperand(1).getImm() &&
124 MI
->getOperand(2).isFI()) {
125 FrameIndex
= MI
->getOperand(2).getIndex();
126 return MI
->getOperand(0).getReg();
133 // commuteInstruction - We can commute rlwimi instructions, but only if the
134 // rotate amt is zero. We also have to munge the immediates a bit.
136 PPCInstrInfo::commuteInstruction(MachineInstr
*MI
, bool NewMI
) const {
137 MachineFunction
&MF
= *MI
->getParent()->getParent();
139 // Normal instructions can be commuted the obvious way.
140 if (MI
->getOpcode() != PPC::RLWIMI
)
141 return TargetInstrInfoImpl::commuteInstruction(MI
, NewMI
);
143 // Cannot commute if it has a non-zero rotate count.
144 if (MI
->getOperand(3).getImm() != 0)
147 // If we have a zero rotate count, we have:
149 // Op0 = (Op1 & ~M) | (Op2 & M)
151 // M = mask((ME+1)&31, (MB-1)&31)
152 // Op0 = (Op2 & ~M) | (Op1 & M)
155 unsigned Reg0
= MI
->getOperand(0).getReg();
156 unsigned Reg1
= MI
->getOperand(1).getReg();
157 unsigned Reg2
= MI
->getOperand(2).getReg();
158 bool Reg1IsKill
= MI
->getOperand(1).isKill();
159 bool Reg2IsKill
= MI
->getOperand(2).isKill();
160 bool ChangeReg0
= false;
161 // If machine instrs are no longer in two-address forms, update
162 // destination register as well.
164 // Must be two address instruction!
165 assert(MI
->getDesc().getOperandConstraint(0, TOI::TIED_TO
) &&
166 "Expecting a two-address instruction!");
172 unsigned MB
= MI
->getOperand(4).getImm();
173 unsigned ME
= MI
->getOperand(5).getImm();
176 // Create a new instruction.
177 unsigned Reg0
= ChangeReg0
? Reg2
: MI
->getOperand(0).getReg();
178 bool Reg0IsDead
= MI
->getOperand(0).isDead();
179 return BuildMI(MF
, MI
->getDebugLoc(), MI
->getDesc())
180 .addReg(Reg0
, RegState::Define
| getDeadRegState(Reg0IsDead
))
181 .addReg(Reg2
, getKillRegState(Reg2IsKill
))
182 .addReg(Reg1
, getKillRegState(Reg1IsKill
))
184 .addImm((MB
-1) & 31);
188 MI
->getOperand(0).setReg(Reg2
);
189 MI
->getOperand(2).setReg(Reg1
);
190 MI
->getOperand(1).setReg(Reg2
);
191 MI
->getOperand(2).setIsKill(Reg1IsKill
);
192 MI
->getOperand(1).setIsKill(Reg2IsKill
);
194 // Swap the mask around.
195 MI
->getOperand(4).setImm((ME
+1) & 31);
196 MI
->getOperand(5).setImm((MB
-1) & 31);
200 void PPCInstrInfo::insertNoop(MachineBasicBlock
&MBB
,
201 MachineBasicBlock::iterator MI
) const {
202 DebugLoc DL
= DebugLoc::getUnknownLoc();
203 if (MI
!= MBB
.end()) DL
= MI
->getDebugLoc();
205 BuildMI(MBB
, MI
, DL
, get(PPC::NOP
));
210 bool PPCInstrInfo::AnalyzeBranch(MachineBasicBlock
&MBB
,MachineBasicBlock
*&TBB
,
211 MachineBasicBlock
*&FBB
,
212 SmallVectorImpl
<MachineOperand
> &Cond
,
213 bool AllowModify
) const {
214 // If the block has no terminators, it just falls into the block after it.
215 MachineBasicBlock::iterator I
= MBB
.end();
216 if (I
== MBB
.begin() || !isUnpredicatedTerminator(--I
))
219 // Get the last instruction in the block.
220 MachineInstr
*LastInst
= I
;
222 // If there is only one terminator instruction, process it.
223 if (I
== MBB
.begin() || !isUnpredicatedTerminator(--I
)) {
224 if (LastInst
->getOpcode() == PPC::B
) {
225 if (!LastInst
->getOperand(0).isMBB())
227 TBB
= LastInst
->getOperand(0).getMBB();
229 } else if (LastInst
->getOpcode() == PPC::BCC
) {
230 if (!LastInst
->getOperand(2).isMBB())
232 // Block ends with fall-through condbranch.
233 TBB
= LastInst
->getOperand(2).getMBB();
234 Cond
.push_back(LastInst
->getOperand(0));
235 Cond
.push_back(LastInst
->getOperand(1));
238 // Otherwise, don't know what this is.
242 // Get the instruction before it if it's a terminator.
243 MachineInstr
*SecondLastInst
= I
;
245 // If there are three terminators, we don't know what sort of block this is.
246 if (SecondLastInst
&& I
!= MBB
.begin() &&
247 isUnpredicatedTerminator(--I
))
250 // If the block ends with PPC::B and PPC:BCC, handle it.
251 if (SecondLastInst
->getOpcode() == PPC::BCC
&&
252 LastInst
->getOpcode() == PPC::B
) {
253 if (!SecondLastInst
->getOperand(2).isMBB() ||
254 !LastInst
->getOperand(0).isMBB())
256 TBB
= SecondLastInst
->getOperand(2).getMBB();
257 Cond
.push_back(SecondLastInst
->getOperand(0));
258 Cond
.push_back(SecondLastInst
->getOperand(1));
259 FBB
= LastInst
->getOperand(0).getMBB();
263 // If the block ends with two PPC:Bs, handle it. The second one is not
264 // executed, so remove it.
265 if (SecondLastInst
->getOpcode() == PPC::B
&&
266 LastInst
->getOpcode() == PPC::B
) {
267 if (!SecondLastInst
->getOperand(0).isMBB())
269 TBB
= SecondLastInst
->getOperand(0).getMBB();
272 I
->eraseFromParent();
276 // Otherwise, can't handle this.
280 unsigned PPCInstrInfo::RemoveBranch(MachineBasicBlock
&MBB
) const {
281 MachineBasicBlock::iterator I
= MBB
.end();
282 if (I
== MBB
.begin()) return 0;
284 if (I
->getOpcode() != PPC::B
&& I
->getOpcode() != PPC::BCC
)
287 // Remove the branch.
288 I
->eraseFromParent();
292 if (I
== MBB
.begin()) return 1;
294 if (I
->getOpcode() != PPC::BCC
)
297 // Remove the branch.
298 I
->eraseFromParent();
303 PPCInstrInfo::InsertBranch(MachineBasicBlock
&MBB
, MachineBasicBlock
*TBB
,
304 MachineBasicBlock
*FBB
,
305 const SmallVectorImpl
<MachineOperand
> &Cond
) const {
306 // FIXME this should probably have a DebugLoc argument
307 DebugLoc dl
= DebugLoc::getUnknownLoc();
308 // Shouldn't be a fall through.
309 assert(TBB
&& "InsertBranch must not be told to insert a fallthrough");
310 assert((Cond
.size() == 2 || Cond
.size() == 0) &&
311 "PPC branch conditions have two components!");
315 if (Cond
.empty()) // Unconditional branch
316 BuildMI(&MBB
, dl
, get(PPC::B
)).addMBB(TBB
);
317 else // Conditional branch
318 BuildMI(&MBB
, dl
, get(PPC::BCC
))
319 .addImm(Cond
[0].getImm()).addReg(Cond
[1].getReg()).addMBB(TBB
);
323 // Two-way Conditional Branch.
324 BuildMI(&MBB
, dl
, get(PPC::BCC
))
325 .addImm(Cond
[0].getImm()).addReg(Cond
[1].getReg()).addMBB(TBB
);
326 BuildMI(&MBB
, dl
, get(PPC::B
)).addMBB(FBB
);
330 bool PPCInstrInfo::copyRegToReg(MachineBasicBlock
&MBB
,
331 MachineBasicBlock::iterator MI
,
332 unsigned DestReg
, unsigned SrcReg
,
333 const TargetRegisterClass
*DestRC
,
334 const TargetRegisterClass
*SrcRC
) const {
335 if (DestRC
!= SrcRC
) {
336 // Not yet supported!
340 DebugLoc DL
= DebugLoc::getUnknownLoc();
341 if (MI
!= MBB
.end()) DL
= MI
->getDebugLoc();
343 if (DestRC
== PPC::GPRCRegisterClass
) {
344 BuildMI(MBB
, MI
, DL
, get(PPC::OR
), DestReg
).addReg(SrcReg
).addReg(SrcReg
);
345 } else if (DestRC
== PPC::G8RCRegisterClass
) {
346 BuildMI(MBB
, MI
, DL
, get(PPC::OR8
), DestReg
).addReg(SrcReg
).addReg(SrcReg
);
347 } else if (DestRC
== PPC::F4RCRegisterClass
) {
348 BuildMI(MBB
, MI
, DL
, get(PPC::FMRS
), DestReg
).addReg(SrcReg
);
349 } else if (DestRC
== PPC::F8RCRegisterClass
) {
350 BuildMI(MBB
, MI
, DL
, get(PPC::FMRD
), DestReg
).addReg(SrcReg
);
351 } else if (DestRC
== PPC::CRRCRegisterClass
) {
352 BuildMI(MBB
, MI
, DL
, get(PPC::MCRF
), DestReg
).addReg(SrcReg
);
353 } else if (DestRC
== PPC::VRRCRegisterClass
) {
354 BuildMI(MBB
, MI
, DL
, get(PPC::VOR
), DestReg
).addReg(SrcReg
).addReg(SrcReg
);
355 } else if (DestRC
== PPC::CRBITRCRegisterClass
) {
356 BuildMI(MBB
, MI
, DL
, get(PPC::CROR
), DestReg
).addReg(SrcReg
).addReg(SrcReg
);
358 // Attempt to copy register that is not GPR or FPR
366 PPCInstrInfo::StoreRegToStackSlot(MachineFunction
&MF
,
367 unsigned SrcReg
, bool isKill
,
369 const TargetRegisterClass
*RC
,
370 SmallVectorImpl
<MachineInstr
*> &NewMIs
) const{
371 DebugLoc DL
= DebugLoc::getUnknownLoc();
372 if (RC
== PPC::GPRCRegisterClass
) {
373 if (SrcReg
!= PPC::LR
) {
374 NewMIs
.push_back(addFrameReference(BuildMI(MF
, DL
, get(PPC::STW
))
376 getKillRegState(isKill
)),
379 // FIXME: this spills LR immediately to memory in one step. To do this,
380 // we use R11, which we know cannot be used in the prolog/epilog. This is
382 NewMIs
.push_back(BuildMI(MF
, DL
, get(PPC::MFLR
), PPC::R11
));
383 NewMIs
.push_back(addFrameReference(BuildMI(MF
, DL
, get(PPC::STW
))
385 getKillRegState(isKill
)),
388 } else if (RC
== PPC::G8RCRegisterClass
) {
389 if (SrcReg
!= PPC::LR8
) {
390 NewMIs
.push_back(addFrameReference(BuildMI(MF
, DL
, get(PPC::STD
))
392 getKillRegState(isKill
)),
395 // FIXME: this spills LR immediately to memory in one step. To do this,
396 // we use R11, which we know cannot be used in the prolog/epilog. This is
398 NewMIs
.push_back(BuildMI(MF
, DL
, get(PPC::MFLR8
), PPC::X11
));
399 NewMIs
.push_back(addFrameReference(BuildMI(MF
, DL
, get(PPC::STD
))
401 getKillRegState(isKill
)),
404 } else if (RC
== PPC::F8RCRegisterClass
) {
405 NewMIs
.push_back(addFrameReference(BuildMI(MF
, DL
, get(PPC::STFD
))
407 getKillRegState(isKill
)),
409 } else if (RC
== PPC::F4RCRegisterClass
) {
410 NewMIs
.push_back(addFrameReference(BuildMI(MF
, DL
, get(PPC::STFS
))
412 getKillRegState(isKill
)),
414 } else if (RC
== PPC::CRRCRegisterClass
) {
415 if ((EnablePPC32RS
&& !TM
.getSubtargetImpl()->isPPC64()) ||
416 (EnablePPC64RS
&& TM
.getSubtargetImpl()->isPPC64())) {
417 // FIXME (64-bit): Enable
418 NewMIs
.push_back(addFrameReference(BuildMI(MF
, DL
, get(PPC::SPILL_CR
))
420 getKillRegState(isKill
)),
424 // FIXME: We use R0 here, because it isn't available for RA. We need to
425 // store the CR in the low 4-bits of the saved value. First, issue a MFCR
426 // to save all of the CRBits.
427 NewMIs
.push_back(BuildMI(MF
, DL
, get(PPC::MFCR
), PPC::R0
));
429 // If the saved register wasn't CR0, shift the bits left so that they are
431 if (SrcReg
!= PPC::CR0
) {
432 unsigned ShiftBits
= PPCRegisterInfo::getRegisterNumbering(SrcReg
)*4;
433 // rlwinm r0, r0, ShiftBits, 0, 31.
434 NewMIs
.push_back(BuildMI(MF
, DL
, get(PPC::RLWINM
), PPC::R0
)
435 .addReg(PPC::R0
).addImm(ShiftBits
).addImm(0).addImm(31));
438 NewMIs
.push_back(addFrameReference(BuildMI(MF
, DL
, get(PPC::STW
))
440 getKillRegState(isKill
)),
443 } else if (RC
== PPC::CRBITRCRegisterClass
) {
444 // FIXME: We use CRi here because there is no mtcrf on a bit. Since the
445 // backend currently only uses CR1EQ as an individual bit, this should
446 // not cause any bug. If we need other uses of CR bits, the following
447 // code may be invalid.
449 if (SrcReg
== PPC::CR0LT
|| SrcReg
== PPC::CR0GT
||
450 SrcReg
== PPC::CR0EQ
|| SrcReg
== PPC::CR0UN
)
452 else if (SrcReg
== PPC::CR1LT
|| SrcReg
== PPC::CR1GT
||
453 SrcReg
== PPC::CR1EQ
|| SrcReg
== PPC::CR1UN
)
455 else if (SrcReg
== PPC::CR2LT
|| SrcReg
== PPC::CR2GT
||
456 SrcReg
== PPC::CR2EQ
|| SrcReg
== PPC::CR2UN
)
458 else if (SrcReg
== PPC::CR3LT
|| SrcReg
== PPC::CR3GT
||
459 SrcReg
== PPC::CR3EQ
|| SrcReg
== PPC::CR3UN
)
461 else if (SrcReg
== PPC::CR4LT
|| SrcReg
== PPC::CR4GT
||
462 SrcReg
== PPC::CR4EQ
|| SrcReg
== PPC::CR4UN
)
464 else if (SrcReg
== PPC::CR5LT
|| SrcReg
== PPC::CR5GT
||
465 SrcReg
== PPC::CR5EQ
|| SrcReg
== PPC::CR5UN
)
467 else if (SrcReg
== PPC::CR6LT
|| SrcReg
== PPC::CR6GT
||
468 SrcReg
== PPC::CR6EQ
|| SrcReg
== PPC::CR6UN
)
470 else if (SrcReg
== PPC::CR7LT
|| SrcReg
== PPC::CR7GT
||
471 SrcReg
== PPC::CR7EQ
|| SrcReg
== PPC::CR7UN
)
474 return StoreRegToStackSlot(MF
, Reg
, isKill
, FrameIdx
,
475 PPC::CRRCRegisterClass
, NewMIs
);
477 } else if (RC
== PPC::VRRCRegisterClass
) {
478 // We don't have indexed addressing for vector loads. Emit:
482 // FIXME: We use R0 here, because it isn't available for RA.
483 NewMIs
.push_back(addFrameReference(BuildMI(MF
, DL
, get(PPC::ADDI
), PPC::R0
),
485 NewMIs
.push_back(BuildMI(MF
, DL
, get(PPC::STVX
))
486 .addReg(SrcReg
, getKillRegState(isKill
))
490 llvm_unreachable("Unknown regclass!");
497 PPCInstrInfo::storeRegToStackSlot(MachineBasicBlock
&MBB
,
498 MachineBasicBlock::iterator MI
,
499 unsigned SrcReg
, bool isKill
, int FrameIdx
,
500 const TargetRegisterClass
*RC
) const {
501 MachineFunction
&MF
= *MBB
.getParent();
502 SmallVector
<MachineInstr
*, 4> NewMIs
;
504 if (StoreRegToStackSlot(MF
, SrcReg
, isKill
, FrameIdx
, RC
, NewMIs
)) {
505 PPCFunctionInfo
*FuncInfo
= MF
.getInfo
<PPCFunctionInfo
>();
506 FuncInfo
->setSpillsCR();
509 for (unsigned i
= 0, e
= NewMIs
.size(); i
!= e
; ++i
)
510 MBB
.insert(MI
, NewMIs
[i
]);
514 PPCInstrInfo::LoadRegFromStackSlot(MachineFunction
&MF
, DebugLoc DL
,
515 unsigned DestReg
, int FrameIdx
,
516 const TargetRegisterClass
*RC
,
517 SmallVectorImpl
<MachineInstr
*> &NewMIs
)const{
518 if (RC
== PPC::GPRCRegisterClass
) {
519 if (DestReg
!= PPC::LR
) {
520 NewMIs
.push_back(addFrameReference(BuildMI(MF
, DL
, get(PPC::LWZ
),
521 DestReg
), FrameIdx
));
523 NewMIs
.push_back(addFrameReference(BuildMI(MF
, DL
, get(PPC::LWZ
),
524 PPC::R11
), FrameIdx
));
525 NewMIs
.push_back(BuildMI(MF
, DL
, get(PPC::MTLR
)).addReg(PPC::R11
));
527 } else if (RC
== PPC::G8RCRegisterClass
) {
528 if (DestReg
!= PPC::LR8
) {
529 NewMIs
.push_back(addFrameReference(BuildMI(MF
, DL
, get(PPC::LD
), DestReg
),
532 NewMIs
.push_back(addFrameReference(BuildMI(MF
, DL
, get(PPC::LD
),
533 PPC::R11
), FrameIdx
));
534 NewMIs
.push_back(BuildMI(MF
, DL
, get(PPC::MTLR8
)).addReg(PPC::R11
));
536 } else if (RC
== PPC::F8RCRegisterClass
) {
537 NewMIs
.push_back(addFrameReference(BuildMI(MF
, DL
, get(PPC::LFD
), DestReg
),
539 } else if (RC
== PPC::F4RCRegisterClass
) {
540 NewMIs
.push_back(addFrameReference(BuildMI(MF
, DL
, get(PPC::LFS
), DestReg
),
542 } else if (RC
== PPC::CRRCRegisterClass
) {
543 // FIXME: We use R0 here, because it isn't available for RA.
544 NewMIs
.push_back(addFrameReference(BuildMI(MF
, DL
, get(PPC::LWZ
), PPC::R0
),
547 // If the reloaded register isn't CR0, shift the bits right so that they are
548 // in the right CR's slot.
549 if (DestReg
!= PPC::CR0
) {
550 unsigned ShiftBits
= PPCRegisterInfo::getRegisterNumbering(DestReg
)*4;
551 // rlwinm r11, r11, 32-ShiftBits, 0, 31.
552 NewMIs
.push_back(BuildMI(MF
, DL
, get(PPC::RLWINM
), PPC::R0
)
553 .addReg(PPC::R0
).addImm(32-ShiftBits
).addImm(0).addImm(31));
556 NewMIs
.push_back(BuildMI(MF
, DL
, get(PPC::MTCRF
), DestReg
).addReg(PPC::R0
));
557 } else if (RC
== PPC::CRBITRCRegisterClass
) {
560 if (DestReg
== PPC::CR0LT
|| DestReg
== PPC::CR0GT
||
561 DestReg
== PPC::CR0EQ
|| DestReg
== PPC::CR0UN
)
563 else if (DestReg
== PPC::CR1LT
|| DestReg
== PPC::CR1GT
||
564 DestReg
== PPC::CR1EQ
|| DestReg
== PPC::CR1UN
)
566 else if (DestReg
== PPC::CR2LT
|| DestReg
== PPC::CR2GT
||
567 DestReg
== PPC::CR2EQ
|| DestReg
== PPC::CR2UN
)
569 else if (DestReg
== PPC::CR3LT
|| DestReg
== PPC::CR3GT
||
570 DestReg
== PPC::CR3EQ
|| DestReg
== PPC::CR3UN
)
572 else if (DestReg
== PPC::CR4LT
|| DestReg
== PPC::CR4GT
||
573 DestReg
== PPC::CR4EQ
|| DestReg
== PPC::CR4UN
)
575 else if (DestReg
== PPC::CR5LT
|| DestReg
== PPC::CR5GT
||
576 DestReg
== PPC::CR5EQ
|| DestReg
== PPC::CR5UN
)
578 else if (DestReg
== PPC::CR6LT
|| DestReg
== PPC::CR6GT
||
579 DestReg
== PPC::CR6EQ
|| DestReg
== PPC::CR6UN
)
581 else if (DestReg
== PPC::CR7LT
|| DestReg
== PPC::CR7GT
||
582 DestReg
== PPC::CR7EQ
|| DestReg
== PPC::CR7UN
)
585 return LoadRegFromStackSlot(MF
, DL
, Reg
, FrameIdx
,
586 PPC::CRRCRegisterClass
, NewMIs
);
588 } else if (RC
== PPC::VRRCRegisterClass
) {
589 // We don't have indexed addressing for vector loads. Emit:
593 // FIXME: We use R0 here, because it isn't available for RA.
594 NewMIs
.push_back(addFrameReference(BuildMI(MF
, DL
, get(PPC::ADDI
), PPC::R0
),
596 NewMIs
.push_back(BuildMI(MF
, DL
, get(PPC::LVX
),DestReg
).addReg(PPC::R0
)
599 llvm_unreachable("Unknown regclass!");
604 PPCInstrInfo::loadRegFromStackSlot(MachineBasicBlock
&MBB
,
605 MachineBasicBlock::iterator MI
,
606 unsigned DestReg
, int FrameIdx
,
607 const TargetRegisterClass
*RC
) const {
608 MachineFunction
&MF
= *MBB
.getParent();
609 SmallVector
<MachineInstr
*, 4> NewMIs
;
610 DebugLoc DL
= DebugLoc::getUnknownLoc();
611 if (MI
!= MBB
.end()) DL
= MI
->getDebugLoc();
612 LoadRegFromStackSlot(MF
, DL
, DestReg
, FrameIdx
, RC
, NewMIs
);
613 for (unsigned i
= 0, e
= NewMIs
.size(); i
!= e
; ++i
)
614 MBB
.insert(MI
, NewMIs
[i
]);
617 /// foldMemoryOperand - PowerPC (like most RISC's) can only fold spills into
618 /// copy instructions, turning them into load/store instructions.
619 MachineInstr
*PPCInstrInfo::foldMemoryOperandImpl(MachineFunction
&MF
,
621 const SmallVectorImpl
<unsigned> &Ops
,
622 int FrameIndex
) const {
623 if (Ops
.size() != 1) return NULL
;
625 // Make sure this is a reg-reg copy. Note that we can't handle MCRF, because
626 // it takes more than one instruction to store it.
627 unsigned Opc
= MI
->getOpcode();
628 unsigned OpNum
= Ops
[0];
630 MachineInstr
*NewMI
= NULL
;
631 if ((Opc
== PPC::OR
&&
632 MI
->getOperand(1).getReg() == MI
->getOperand(2).getReg())) {
633 if (OpNum
== 0) { // move -> store
634 unsigned InReg
= MI
->getOperand(1).getReg();
635 bool isKill
= MI
->getOperand(1).isKill();
636 bool isUndef
= MI
->getOperand(1).isUndef();
637 NewMI
= addFrameReference(BuildMI(MF
, MI
->getDebugLoc(), get(PPC::STW
))
639 getKillRegState(isKill
) |
640 getUndefRegState(isUndef
)),
642 } else { // move -> load
643 unsigned OutReg
= MI
->getOperand(0).getReg();
644 bool isDead
= MI
->getOperand(0).isDead();
645 bool isUndef
= MI
->getOperand(0).isUndef();
646 NewMI
= addFrameReference(BuildMI(MF
, MI
->getDebugLoc(), get(PPC::LWZ
))
649 getDeadRegState(isDead
) |
650 getUndefRegState(isUndef
)),
653 } else if ((Opc
== PPC::OR8
&&
654 MI
->getOperand(1).getReg() == MI
->getOperand(2).getReg())) {
655 if (OpNum
== 0) { // move -> store
656 unsigned InReg
= MI
->getOperand(1).getReg();
657 bool isKill
= MI
->getOperand(1).isKill();
658 bool isUndef
= MI
->getOperand(1).isUndef();
659 NewMI
= addFrameReference(BuildMI(MF
, MI
->getDebugLoc(), get(PPC::STD
))
661 getKillRegState(isKill
) |
662 getUndefRegState(isUndef
)),
664 } else { // move -> load
665 unsigned OutReg
= MI
->getOperand(0).getReg();
666 bool isDead
= MI
->getOperand(0).isDead();
667 bool isUndef
= MI
->getOperand(0).isUndef();
668 NewMI
= addFrameReference(BuildMI(MF
, MI
->getDebugLoc(), get(PPC::LD
))
671 getDeadRegState(isDead
) |
672 getUndefRegState(isUndef
)),
675 } else if (Opc
== PPC::FMRD
) {
676 if (OpNum
== 0) { // move -> store
677 unsigned InReg
= MI
->getOperand(1).getReg();
678 bool isKill
= MI
->getOperand(1).isKill();
679 bool isUndef
= MI
->getOperand(1).isUndef();
680 NewMI
= addFrameReference(BuildMI(MF
, MI
->getDebugLoc(), get(PPC::STFD
))
682 getKillRegState(isKill
) |
683 getUndefRegState(isUndef
)),
685 } else { // move -> load
686 unsigned OutReg
= MI
->getOperand(0).getReg();
687 bool isDead
= MI
->getOperand(0).isDead();
688 bool isUndef
= MI
->getOperand(0).isUndef();
689 NewMI
= addFrameReference(BuildMI(MF
, MI
->getDebugLoc(), get(PPC::LFD
))
692 getDeadRegState(isDead
) |
693 getUndefRegState(isUndef
)),
696 } else if (Opc
== PPC::FMRS
) {
697 if (OpNum
== 0) { // move -> store
698 unsigned InReg
= MI
->getOperand(1).getReg();
699 bool isKill
= MI
->getOperand(1).isKill();
700 bool isUndef
= MI
->getOperand(1).isUndef();
701 NewMI
= addFrameReference(BuildMI(MF
, MI
->getDebugLoc(), get(PPC::STFS
))
703 getKillRegState(isKill
) |
704 getUndefRegState(isUndef
)),
706 } else { // move -> load
707 unsigned OutReg
= MI
->getOperand(0).getReg();
708 bool isDead
= MI
->getOperand(0).isDead();
709 bool isUndef
= MI
->getOperand(0).isUndef();
710 NewMI
= addFrameReference(BuildMI(MF
, MI
->getDebugLoc(), get(PPC::LFS
))
713 getDeadRegState(isDead
) |
714 getUndefRegState(isUndef
)),
722 bool PPCInstrInfo::canFoldMemoryOperand(const MachineInstr
*MI
,
723 const SmallVectorImpl
<unsigned> &Ops
) const {
724 if (Ops
.size() != 1) return false;
726 // Make sure this is a reg-reg copy. Note that we can't handle MCRF, because
727 // it takes more than one instruction to store it.
728 unsigned Opc
= MI
->getOpcode();
730 if ((Opc
== PPC::OR
&&
731 MI
->getOperand(1).getReg() == MI
->getOperand(2).getReg()))
733 else if ((Opc
== PPC::OR8
&&
734 MI
->getOperand(1).getReg() == MI
->getOperand(2).getReg()))
736 else if (Opc
== PPC::FMRD
|| Opc
== PPC::FMRS
)
743 bool PPCInstrInfo::BlockHasNoFallThrough(const MachineBasicBlock
&MBB
) const {
744 if (MBB
.empty()) return false;
746 switch (MBB
.back().getOpcode()) {
747 case PPC::BLR
: // Return.
748 case PPC::B
: // Uncond branch.
749 case PPC::BCTR
: // Indirect branch.
751 default: return false;
756 ReverseBranchCondition(SmallVectorImpl
<MachineOperand
> &Cond
) const {
757 assert(Cond
.size() == 2 && "Invalid PPC branch opcode!");
758 // Leave the CR# the same, but invert the condition.
759 Cond
[0].setImm(PPC::InvertPredicate((PPC::Predicate
)Cond
[0].getImm()));
763 /// GetInstSize - Return the number of bytes of code the specified
764 /// instruction may be. This returns the maximum number of bytes.
766 unsigned PPCInstrInfo::GetInstSizeInBytes(const MachineInstr
*MI
) const {
767 switch (MI
->getOpcode()) {
768 case PPC::INLINEASM
: { // Inline Asm: Variable size.
769 const MachineFunction
*MF
= MI
->getParent()->getParent();
770 const char *AsmStr
= MI
->getOperand(0).getSymbolName();
771 return getInlineAsmLength(AsmStr
, *MF
->getTarget().getMCAsmInfo());
778 return 4; // PowerPC instructions are all 4 bytes