1 //===- SystemZInstrInfo.cpp - SystemZ Instruction Information --------------===//
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 SystemZ implementation of the TargetInstrInfo class.
12 //===----------------------------------------------------------------------===//
15 #include "SystemZInstrBuilder.h"
16 #include "SystemZInstrInfo.h"
17 #include "SystemZMachineFunctionInfo.h"
18 #include "SystemZTargetMachine.h"
19 #include "SystemZGenInstrInfo.inc"
20 #include "llvm/Function.h"
21 #include "llvm/CodeGen/MachineFrameInfo.h"
22 #include "llvm/CodeGen/MachineInstrBuilder.h"
23 #include "llvm/CodeGen/MachineRegisterInfo.h"
24 #include "llvm/CodeGen/PseudoSourceValue.h"
28 SystemZInstrInfo::SystemZInstrInfo(SystemZTargetMachine
&tm
)
29 : TargetInstrInfoImpl(SystemZInsts
, array_lengthof(SystemZInsts
)),
30 RI(tm
, *this), TM(tm
) {
31 // Fill the spill offsets map
32 static const unsigned SpillOffsTab
[][2] = {
33 { SystemZ::R2D
, 0x10 },
34 { SystemZ::R3D
, 0x18 },
35 { SystemZ::R4D
, 0x20 },
36 { SystemZ::R5D
, 0x28 },
37 { SystemZ::R6D
, 0x30 },
38 { SystemZ::R7D
, 0x38 },
39 { SystemZ::R8D
, 0x40 },
40 { SystemZ::R9D
, 0x48 },
41 { SystemZ::R10D
, 0x50 },
42 { SystemZ::R11D
, 0x58 },
43 { SystemZ::R12D
, 0x60 },
44 { SystemZ::R13D
, 0x68 },
45 { SystemZ::R14D
, 0x70 },
46 { SystemZ::R15D
, 0x78 }
49 RegSpillOffsets
.grow(SystemZ::NUM_TARGET_REGS
);
51 for (unsigned i
= 0, e
= array_lengthof(SpillOffsTab
); i
!= e
; ++i
)
52 RegSpillOffsets
[SpillOffsTab
[i
][0]] = SpillOffsTab
[i
][1];
55 /// isGVStub - Return true if the GV requires an extra load to get the
57 static inline bool isGVStub(GlobalValue
*GV
, SystemZTargetMachine
&TM
) {
58 return TM
.getSubtarget
<SystemZSubtarget
>().GVRequiresExtraLoad(GV
, TM
, false);
61 void SystemZInstrInfo::storeRegToStackSlot(MachineBasicBlock
&MBB
,
62 MachineBasicBlock::iterator MI
,
63 unsigned SrcReg
, bool isKill
, int FrameIdx
,
64 const TargetRegisterClass
*RC
) const {
65 DebugLoc DL
= DebugLoc::getUnknownLoc();
66 if (MI
!= MBB
.end()) DL
= MI
->getDebugLoc();
69 if (RC
== &SystemZ::GR32RegClass
||
70 RC
== &SystemZ::ADDR32RegClass
)
71 Opc
= SystemZ::MOV32mr
;
72 else if (RC
== &SystemZ::GR64RegClass
||
73 RC
== &SystemZ::ADDR64RegClass
) {
74 Opc
= SystemZ::MOV64mr
;
75 } else if (RC
== &SystemZ::FP32RegClass
) {
76 Opc
= SystemZ::FMOV32mr
;
77 } else if (RC
== &SystemZ::FP64RegClass
) {
78 Opc
= SystemZ::FMOV64mr
;
79 } else if (RC
== &SystemZ::GR64PRegClass
) {
80 Opc
= SystemZ::MOV64Pmr
;
81 } else if (RC
== &SystemZ::GR128RegClass
) {
82 Opc
= SystemZ::MOV128mr
;
84 llvm_unreachable("Unsupported regclass to store");
86 addFrameReference(BuildMI(MBB
, MI
, DL
, get(Opc
)), FrameIdx
)
87 .addReg(SrcReg
, getKillRegState(isKill
));
90 void SystemZInstrInfo::loadRegFromStackSlot(MachineBasicBlock
&MBB
,
91 MachineBasicBlock::iterator MI
,
92 unsigned DestReg
, int FrameIdx
,
93 const TargetRegisterClass
*RC
) const{
94 DebugLoc DL
= DebugLoc::getUnknownLoc();
95 if (MI
!= MBB
.end()) DL
= MI
->getDebugLoc();
98 if (RC
== &SystemZ::GR32RegClass
||
99 RC
== &SystemZ::ADDR32RegClass
)
100 Opc
= SystemZ::MOV32rm
;
101 else if (RC
== &SystemZ::GR64RegClass
||
102 RC
== &SystemZ::ADDR64RegClass
) {
103 Opc
= SystemZ::MOV64rm
;
104 } else if (RC
== &SystemZ::FP32RegClass
) {
105 Opc
= SystemZ::FMOV32rm
;
106 } else if (RC
== &SystemZ::FP64RegClass
) {
107 Opc
= SystemZ::FMOV64rm
;
108 } else if (RC
== &SystemZ::GR64PRegClass
) {
109 Opc
= SystemZ::MOV64Prm
;
110 } else if (RC
== &SystemZ::GR128RegClass
) {
111 Opc
= SystemZ::MOV128rm
;
113 llvm_unreachable("Unsupported regclass to load");
115 addFrameReference(BuildMI(MBB
, MI
, DL
, get(Opc
), DestReg
), FrameIdx
);
118 bool SystemZInstrInfo::copyRegToReg(MachineBasicBlock
&MBB
,
119 MachineBasicBlock::iterator I
,
120 unsigned DestReg
, unsigned SrcReg
,
121 const TargetRegisterClass
*DestRC
,
122 const TargetRegisterClass
*SrcRC
) const {
123 DebugLoc DL
= DebugLoc::getUnknownLoc();
124 if (I
!= MBB
.end()) DL
= I
->getDebugLoc();
126 // Determine if DstRC and SrcRC have a common superclass.
127 const TargetRegisterClass
*CommonRC
= DestRC
;
129 /* Same regclass for source and dest */;
130 else if (CommonRC
->hasSuperClass(SrcRC
))
132 else if (!CommonRC
->hasSubClass(SrcRC
))
136 if (CommonRC
== &SystemZ::GR64RegClass
||
137 CommonRC
== &SystemZ::ADDR64RegClass
) {
138 BuildMI(MBB
, I
, DL
, get(SystemZ::MOV64rr
), DestReg
).addReg(SrcReg
);
139 } else if (CommonRC
== &SystemZ::GR32RegClass
||
140 CommonRC
== &SystemZ::ADDR32RegClass
) {
141 BuildMI(MBB
, I
, DL
, get(SystemZ::MOV32rr
), DestReg
).addReg(SrcReg
);
142 } else if (CommonRC
== &SystemZ::GR64PRegClass
) {
143 BuildMI(MBB
, I
, DL
, get(SystemZ::MOV64rrP
), DestReg
).addReg(SrcReg
);
144 } else if (CommonRC
== &SystemZ::GR128RegClass
) {
145 BuildMI(MBB
, I
, DL
, get(SystemZ::MOV128rr
), DestReg
).addReg(SrcReg
);
146 } else if (CommonRC
== &SystemZ::FP32RegClass
) {
147 BuildMI(MBB
, I
, DL
, get(SystemZ::FMOV32rr
), DestReg
).addReg(SrcReg
);
148 } else if (CommonRC
== &SystemZ::FP64RegClass
) {
149 BuildMI(MBB
, I
, DL
, get(SystemZ::FMOV64rr
), DestReg
).addReg(SrcReg
);
157 if ((SrcRC
== &SystemZ::GR64RegClass
&&
158 DestRC
== &SystemZ::ADDR64RegClass
) ||
159 (DestRC
== &SystemZ::GR64RegClass
&&
160 SrcRC
== &SystemZ::ADDR64RegClass
)) {
161 BuildMI(MBB
, I
, DL
, get(SystemZ::MOV64rr
), DestReg
).addReg(SrcReg
);
163 } else if ((SrcRC
== &SystemZ::GR32RegClass
&&
164 DestRC
== &SystemZ::ADDR32RegClass
) ||
165 (DestRC
== &SystemZ::GR32RegClass
&&
166 SrcRC
== &SystemZ::ADDR32RegClass
)) {
167 BuildMI(MBB
, I
, DL
, get(SystemZ::MOV32rr
), DestReg
).addReg(SrcReg
);
175 SystemZInstrInfo::isMoveInstr(const MachineInstr
& MI
,
176 unsigned &SrcReg
, unsigned &DstReg
,
177 unsigned &SrcSubIdx
, unsigned &DstSubIdx
) const {
178 switch (MI
.getOpcode()) {
181 case SystemZ::MOV32rr
:
182 case SystemZ::MOV64rr
:
183 case SystemZ::MOV64rrP
:
184 case SystemZ::MOV128rr
:
185 case SystemZ::FMOV32rr
:
186 case SystemZ::FMOV64rr
:
187 assert(MI
.getNumOperands() >= 2 &&
188 MI
.getOperand(0).isReg() &&
189 MI
.getOperand(1).isReg() &&
190 "invalid register-register move instruction");
191 SrcReg
= MI
.getOperand(1).getReg();
192 DstReg
= MI
.getOperand(0).getReg();
193 SrcSubIdx
= MI
.getOperand(1).getSubReg();
194 DstSubIdx
= MI
.getOperand(0).getSubReg();
199 unsigned SystemZInstrInfo::isLoadFromStackSlot(const MachineInstr
*MI
,
200 int &FrameIndex
) const {
201 switch (MI
->getOpcode()) {
203 case SystemZ::MOV32rm
:
204 case SystemZ::MOV32rmy
:
205 case SystemZ::MOV64rm
:
206 case SystemZ::MOVSX32rm8
:
207 case SystemZ::MOVSX32rm16y
:
208 case SystemZ::MOVSX64rm8
:
209 case SystemZ::MOVSX64rm16
:
210 case SystemZ::MOVSX64rm32
:
211 case SystemZ::MOVZX32rm8
:
212 case SystemZ::MOVZX32rm16
:
213 case SystemZ::MOVZX64rm8
:
214 case SystemZ::MOVZX64rm16
:
215 case SystemZ::MOVZX64rm32
:
216 case SystemZ::FMOV32rm
:
217 case SystemZ::FMOV32rmy
:
218 case SystemZ::FMOV64rm
:
219 case SystemZ::FMOV64rmy
:
220 case SystemZ::MOV64Prm
:
221 case SystemZ::MOV64Prmy
:
222 case SystemZ::MOV128rm
:
223 if (MI
->getOperand(1).isFI() &&
224 MI
->getOperand(2).isImm() && MI
->getOperand(3).isReg() &&
225 MI
->getOperand(2).getImm() == 0 && MI
->getOperand(3).getReg() == 0) {
226 FrameIndex
= MI
->getOperand(1).getIndex();
227 return MI
->getOperand(0).getReg();
234 unsigned SystemZInstrInfo::isStoreToStackSlot(const MachineInstr
*MI
,
235 int &FrameIndex
) const {
236 switch (MI
->getOpcode()) {
238 case SystemZ::MOV32mr
:
239 case SystemZ::MOV32mry
:
240 case SystemZ::MOV64mr
:
241 case SystemZ::MOV32m8r
:
242 case SystemZ::MOV32m8ry
:
243 case SystemZ::MOV32m16r
:
244 case SystemZ::MOV32m16ry
:
245 case SystemZ::MOV64m8r
:
246 case SystemZ::MOV64m8ry
:
247 case SystemZ::MOV64m16r
:
248 case SystemZ::MOV64m16ry
:
249 case SystemZ::MOV64m32r
:
250 case SystemZ::MOV64m32ry
:
251 case SystemZ::FMOV32mr
:
252 case SystemZ::FMOV32mry
:
253 case SystemZ::FMOV64mr
:
254 case SystemZ::FMOV64mry
:
255 case SystemZ::MOV64Pmr
:
256 case SystemZ::MOV64Pmry
:
257 case SystemZ::MOV128mr
:
258 if (MI
->getOperand(0).isFI() &&
259 MI
->getOperand(1).isImm() && MI
->getOperand(2).isReg() &&
260 MI
->getOperand(1).getImm() == 0 && MI
->getOperand(2).getReg() == 0) {
261 FrameIndex
= MI
->getOperand(0).getIndex();
262 return MI
->getOperand(3).getReg();
269 bool SystemZInstrInfo::isInvariantLoad(const MachineInstr
*MI
) const {
270 for (unsigned i
= 0, e
= MI
->getNumOperands(); i
!= e
; ++i
) {
271 const MachineOperand
&MO
= MI
->getOperand(i
);
272 // Loads from constant pools are trivially invariant.
277 return isGVStub(MO
.getGlobal(), TM
);
279 // If this is a load from an invariant stack slot, the load is a constant.
281 const MachineFrameInfo
&MFI
=
282 *MI
->getParent()->getParent()->getFrameInfo();
283 int Idx
= MO
.getIndex();
284 return MFI
.isFixedObjectIndex(Idx
) && MFI
.isImmutableObjectIndex(Idx
);
288 // All other instances of these instructions are presumed to have other
294 SystemZInstrInfo::spillCalleeSavedRegisters(MachineBasicBlock
&MBB
,
295 MachineBasicBlock::iterator MI
,
296 const std::vector
<CalleeSavedInfo
> &CSI
) const {
300 DebugLoc DL
= DebugLoc::getUnknownLoc();
301 if (MI
!= MBB
.end()) DL
= MI
->getDebugLoc();
303 MachineFunction
&MF
= *MBB
.getParent();
304 SystemZMachineFunctionInfo
*MFI
= MF
.getInfo
<SystemZMachineFunctionInfo
>();
305 unsigned CalleeFrameSize
= 0;
307 // Scan the callee-saved and find the bounds of register spill area.
308 unsigned LowReg
= 0, HighReg
= 0, StartOffset
= -1U, EndOffset
= 0;
309 for (unsigned i
= 0, e
= CSI
.size(); i
!= e
; ++i
) {
310 unsigned Reg
= CSI
[i
].getReg();
311 const TargetRegisterClass
*RegClass
= CSI
[i
].getRegClass();
312 if (RegClass
!= &SystemZ::FP64RegClass
) {
313 unsigned Offset
= RegSpillOffsets
[Reg
];
314 CalleeFrameSize
+= 8;
315 if (StartOffset
> Offset
) {
316 LowReg
= Reg
; StartOffset
= Offset
;
318 if (EndOffset
< Offset
) {
319 HighReg
= Reg
; EndOffset
= RegSpillOffsets
[Reg
];
324 // Save information for epilogue inserter.
325 MFI
->setCalleeSavedFrameSize(CalleeFrameSize
);
326 MFI
->setLowReg(LowReg
); MFI
->setHighReg(HighReg
);
330 // Build a store instruction. Use STORE MULTIPLE instruction if there are many
331 // registers to store, otherwise - just STORE.
332 MachineInstrBuilder MIB
=
333 BuildMI(MBB
, MI
, DL
, get((LowReg
== HighReg
?
334 SystemZ::MOV64mr
: SystemZ::MOV64mrm
)));
336 // Add store operands.
337 MIB
.addReg(SystemZ::R15D
).addImm(StartOffset
);
338 if (LowReg
== HighReg
)
340 MIB
.addReg(LowReg
, RegState::Kill
);
341 if (LowReg
!= HighReg
)
342 MIB
.addReg(HighReg
, RegState::Kill
);
344 // Do a second scan adding regs as being killed by instruction
345 for (unsigned i
= 0, e
= CSI
.size(); i
!= e
; ++i
) {
346 unsigned Reg
= CSI
[i
].getReg();
347 // Add the callee-saved register as live-in. It's killed at the spill.
349 if (Reg
!= LowReg
&& Reg
!= HighReg
)
350 MIB
.addReg(Reg
, RegState::ImplicitKill
);
355 for (unsigned i
= 0, e
= CSI
.size(); i
!= e
; ++i
) {
356 unsigned Reg
= CSI
[i
].getReg();
357 const TargetRegisterClass
*RegClass
= CSI
[i
].getRegClass();
358 if (RegClass
== &SystemZ::FP64RegClass
) {
360 storeRegToStackSlot(MBB
, MI
, Reg
, true, CSI
[i
].getFrameIdx(), RegClass
);
368 SystemZInstrInfo::restoreCalleeSavedRegisters(MachineBasicBlock
&MBB
,
369 MachineBasicBlock::iterator MI
,
370 const std::vector
<CalleeSavedInfo
> &CSI
) const {
374 DebugLoc DL
= DebugLoc::getUnknownLoc();
375 if (MI
!= MBB
.end()) DL
= MI
->getDebugLoc();
377 MachineFunction
&MF
= *MBB
.getParent();
378 const TargetRegisterInfo
*RegInfo
= MF
.getTarget().getRegisterInfo();
379 SystemZMachineFunctionInfo
*MFI
= MF
.getInfo
<SystemZMachineFunctionInfo
>();
381 // Restore FP registers
382 for (unsigned i
= 0, e
= CSI
.size(); i
!= e
; ++i
) {
383 unsigned Reg
= CSI
[i
].getReg();
384 const TargetRegisterClass
*RegClass
= CSI
[i
].getRegClass();
385 if (RegClass
== &SystemZ::FP64RegClass
)
386 loadRegFromStackSlot(MBB
, MI
, Reg
, CSI
[i
].getFrameIdx(), RegClass
);
389 // Restore GP registers
390 unsigned LowReg
= MFI
->getLowReg(), HighReg
= MFI
->getHighReg();
391 unsigned StartOffset
= RegSpillOffsets
[LowReg
];
394 // Build a load instruction. Use LOAD MULTIPLE instruction if there are many
395 // registers to load, otherwise - just LOAD.
396 MachineInstrBuilder MIB
=
397 BuildMI(MBB
, MI
, DL
, get((LowReg
== HighReg
?
398 SystemZ::MOV64rm
: SystemZ::MOV64rmm
)));
399 // Add store operands.
400 MIB
.addReg(LowReg
, RegState::Define
);
401 if (LowReg
!= HighReg
)
402 MIB
.addReg(HighReg
, RegState::Define
);
404 MIB
.addReg((RegInfo
->hasFP(MF
) ? SystemZ::R11D
: SystemZ::R15D
));
405 MIB
.addImm(StartOffset
);
406 if (LowReg
== HighReg
)
409 // Do a second scan adding regs as being defined by instruction
410 for (unsigned i
= 0, e
= CSI
.size(); i
!= e
; ++i
) {
411 unsigned Reg
= CSI
[i
].getReg();
412 if (Reg
!= LowReg
&& Reg
!= HighReg
)
413 MIB
.addReg(Reg
, RegState::ImplicitDefine
);
420 bool SystemZInstrInfo::
421 ReverseBranchCondition(SmallVectorImpl
<MachineOperand
> &Cond
) const {
422 assert(Cond
.size() == 1 && "Invalid Xbranch condition!");
424 SystemZCC::CondCodes CC
= static_cast<SystemZCC::CondCodes
>(Cond
[0].getImm());
425 Cond
[0].setImm(getOppositeCondition(CC
));
429 bool SystemZInstrInfo::BlockHasNoFallThrough(const MachineBasicBlock
&MBB
)const{
430 if (MBB
.empty()) return false;
432 switch (MBB
.back().getOpcode()) {
433 case SystemZ::RET
: // Return.
434 case SystemZ::JMP
: // Uncond branch.
435 case SystemZ::JMPr
: // Indirect branch.
437 default: return false;
441 bool SystemZInstrInfo::isUnpredicatedTerminator(const MachineInstr
*MI
) const {
442 const TargetInstrDesc
&TID
= MI
->getDesc();
443 if (!TID
.isTerminator()) return false;
445 // Conditional branch is a special case.
446 if (TID
.isBranch() && !TID
.isBarrier())
448 if (!TID
.isPredicable())
450 return !isPredicated(MI
);
453 bool SystemZInstrInfo::AnalyzeBranch(MachineBasicBlock
&MBB
,
454 MachineBasicBlock
*&TBB
,
455 MachineBasicBlock
*&FBB
,
456 SmallVectorImpl
<MachineOperand
> &Cond
,
457 bool AllowModify
) const {
458 // Start from the bottom of the block and work up, examining the
459 // terminator instructions.
460 MachineBasicBlock::iterator I
= MBB
.end();
461 while (I
!= MBB
.begin()) {
463 // Working from the bottom, when we see a non-terminator
464 // instruction, we're done.
465 if (!isUnpredicatedTerminator(I
))
468 // A terminator that isn't a branch can't easily be handled
470 if (!I
->getDesc().isBranch())
473 // Handle unconditional branches.
474 if (I
->getOpcode() == SystemZ::JMP
) {
476 TBB
= I
->getOperand(0).getMBB();
480 // If the block has any instructions after a JMP, delete them.
481 while (next(I
) != MBB
.end())
482 next(I
)->eraseFromParent();
486 // Delete the JMP if it's equivalent to a fall-through.
487 if (MBB
.isLayoutSuccessor(I
->getOperand(0).getMBB())) {
489 I
->eraseFromParent();
494 // TBB is used to indicate the unconditinal destination.
495 TBB
= I
->getOperand(0).getMBB();
499 // Handle conditional branches.
500 SystemZCC::CondCodes BranchCode
= getCondFromBranchOpc(I
->getOpcode());
501 if (BranchCode
== SystemZCC::INVALID
)
502 return true; // Can't handle indirect branch.
504 // Working from the bottom, handle the first conditional branch.
507 TBB
= I
->getOperand(0).getMBB();
508 Cond
.push_back(MachineOperand::CreateImm(BranchCode
));
512 // Handle subsequent conditional branches. Only handle the case where all
513 // conditional branches branch to the same destination.
514 assert(Cond
.size() == 1);
517 // Only handle the case where all conditional branches branch to
518 // the same destination.
519 if (TBB
!= I
->getOperand(0).getMBB())
522 SystemZCC::CondCodes OldBranchCode
= (SystemZCC::CondCodes
)Cond
[0].getImm();
523 // If the conditions are the same, we can leave them alone.
524 if (OldBranchCode
== BranchCode
)
533 unsigned SystemZInstrInfo::RemoveBranch(MachineBasicBlock
&MBB
) const {
534 MachineBasicBlock::iterator I
= MBB
.end();
537 while (I
!= MBB
.begin()) {
539 if (I
->getOpcode() != SystemZ::JMP
&&
540 getCondFromBranchOpc(I
->getOpcode()) == SystemZCC::INVALID
)
542 // Remove the branch.
543 I
->eraseFromParent();
552 SystemZInstrInfo::InsertBranch(MachineBasicBlock
&MBB
, MachineBasicBlock
*TBB
,
553 MachineBasicBlock
*FBB
,
554 const SmallVectorImpl
<MachineOperand
> &Cond
) const {
555 // FIXME: this should probably have a DebugLoc operand
556 DebugLoc dl
= DebugLoc::getUnknownLoc();
557 // Shouldn't be a fall through.
558 assert(TBB
&& "InsertBranch must not be told to insert a fallthrough");
559 assert((Cond
.size() == 1 || Cond
.size() == 0) &&
560 "SystemZ branch conditions have one component!");
563 // Unconditional branch?
564 assert(!FBB
&& "Unconditional branch with multiple successors!");
565 BuildMI(&MBB
, dl
, get(SystemZ::JMP
)).addMBB(TBB
);
569 // Conditional branch.
571 SystemZCC::CondCodes CC
= (SystemZCC::CondCodes
)Cond
[0].getImm();
572 BuildMI(&MBB
, dl
, getBrCond(CC
)).addMBB(TBB
);
576 // Two-way Conditional branch. Insert the second branch.
577 BuildMI(&MBB
, dl
, get(SystemZ::JMP
)).addMBB(FBB
);
583 const TargetInstrDesc
&
584 SystemZInstrInfo::getBrCond(SystemZCC::CondCodes CC
) const {
587 llvm_unreachable("Unknown condition code!");
588 case SystemZCC::O
: return get(SystemZ::JO
);
589 case SystemZCC::H
: return get(SystemZ::JH
);
590 case SystemZCC::NLE
: return get(SystemZ::JNLE
);
591 case SystemZCC::L
: return get(SystemZ::JL
);
592 case SystemZCC::NHE
: return get(SystemZ::JNHE
);
593 case SystemZCC::LH
: return get(SystemZ::JLH
);
594 case SystemZCC::NE
: return get(SystemZ::JNE
);
595 case SystemZCC::E
: return get(SystemZ::JE
);
596 case SystemZCC::NLH
: return get(SystemZ::JNLH
);
597 case SystemZCC::HE
: return get(SystemZ::JHE
);
598 case SystemZCC::NL
: return get(SystemZ::JNL
);
599 case SystemZCC::LE
: return get(SystemZ::JLE
);
600 case SystemZCC::NH
: return get(SystemZ::JNH
);
601 case SystemZCC::NO
: return get(SystemZ::JNO
);
606 SystemZInstrInfo::getCondFromBranchOpc(unsigned Opc
) const {
608 default: return SystemZCC::INVALID
;
609 case SystemZ::JO
: return SystemZCC::O
;
610 case SystemZ::JH
: return SystemZCC::H
;
611 case SystemZ::JNLE
: return SystemZCC::NLE
;
612 case SystemZ::JL
: return SystemZCC::L
;
613 case SystemZ::JNHE
: return SystemZCC::NHE
;
614 case SystemZ::JLH
: return SystemZCC::LH
;
615 case SystemZ::JNE
: return SystemZCC::NE
;
616 case SystemZ::JE
: return SystemZCC::E
;
617 case SystemZ::JNLH
: return SystemZCC::NLH
;
618 case SystemZ::JHE
: return SystemZCC::HE
;
619 case SystemZ::JNL
: return SystemZCC::NL
;
620 case SystemZ::JLE
: return SystemZCC::LE
;
621 case SystemZ::JNH
: return SystemZCC::NH
;
622 case SystemZ::JNO
: return SystemZCC::NO
;
627 SystemZInstrInfo::getOppositeCondition(SystemZCC::CondCodes CC
) const {
630 llvm_unreachable("Invalid condition!");
631 case SystemZCC::O
: return SystemZCC::NO
;
632 case SystemZCC::H
: return SystemZCC::NH
;
633 case SystemZCC::NLE
: return SystemZCC::LE
;
634 case SystemZCC::L
: return SystemZCC::NL
;
635 case SystemZCC::NHE
: return SystemZCC::HE
;
636 case SystemZCC::LH
: return SystemZCC::NLH
;
637 case SystemZCC::NE
: return SystemZCC::E
;
638 case SystemZCC::E
: return SystemZCC::NE
;
639 case SystemZCC::NLH
: return SystemZCC::LH
;
640 case SystemZCC::HE
: return SystemZCC::NHE
;
641 case SystemZCC::NL
: return SystemZCC::L
;
642 case SystemZCC::LE
: return SystemZCC::NLE
;
643 case SystemZCC::NH
: return SystemZCC::H
;
644 case SystemZCC::NO
: return SystemZCC::O
;
648 const TargetInstrDesc
&
649 SystemZInstrInfo::getLongDispOpc(unsigned Opc
) const {
652 llvm_unreachable("Don't have long disp version of this instruction");
653 case SystemZ::MOV32mr
: return get(SystemZ::MOV32mry
);
654 case SystemZ::MOV32rm
: return get(SystemZ::MOV32rmy
);
655 case SystemZ::MOVSX32rm16
: return get(SystemZ::MOVSX32rm16y
);
656 case SystemZ::MOV32m8r
: return get(SystemZ::MOV32m8ry
);
657 case SystemZ::MOV32m16r
: return get(SystemZ::MOV32m16ry
);
658 case SystemZ::MOV64m8r
: return get(SystemZ::MOV64m8ry
);
659 case SystemZ::MOV64m16r
: return get(SystemZ::MOV64m16ry
);
660 case SystemZ::MOV64m32r
: return get(SystemZ::MOV64m32ry
);
661 case SystemZ::MOV8mi
: return get(SystemZ::MOV8miy
);
662 case SystemZ::MUL32rm
: return get(SystemZ::MUL32rmy
);
663 case SystemZ::CMP32rm
: return get(SystemZ::CMP32rmy
);
664 case SystemZ::UCMP32rm
: return get(SystemZ::UCMP32rmy
);
665 case SystemZ::FMOV32mr
: return get(SystemZ::FMOV32mry
);
666 case SystemZ::FMOV64mr
: return get(SystemZ::FMOV64mry
);
667 case SystemZ::FMOV32rm
: return get(SystemZ::FMOV32rmy
);
668 case SystemZ::FMOV64rm
: return get(SystemZ::FMOV64rmy
);
669 case SystemZ::MOV64Pmr
: return get(SystemZ::MOV64Pmry
);
670 case SystemZ::MOV64Prm
: return get(SystemZ::MOV64Prmy
);