SystemZInstrInfo.cpp revision ba249e41f3ffa9e947b9173e3965385ec6324ffb
1//===- SystemZInstrInfo.cpp - SystemZ Instruction Information --------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains the SystemZ implementation of the TargetInstrInfo class.
11//
12//===----------------------------------------------------------------------===//
13
14#include "SystemZ.h"
15#include "SystemZInstrInfo.h"
16#include "SystemZMachineFunctionInfo.h"
17#include "SystemZTargetMachine.h"
18#include "SystemZGenInstrInfo.inc"
19#include "llvm/Function.h"
20#include "llvm/CodeGen/MachineFrameInfo.h"
21#include "llvm/CodeGen/MachineInstrBuilder.h"
22#include "llvm/CodeGen/MachineRegisterInfo.h"
23#include "llvm/CodeGen/PseudoSourceValue.h"
24
25using namespace llvm;
26
27SystemZInstrInfo::SystemZInstrInfo(SystemZTargetMachine &tm)
28  : TargetInstrInfoImpl(SystemZInsts, array_lengthof(SystemZInsts)),
29    RI(tm, *this), TM(tm) {}
30
31void SystemZInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
32                                          MachineBasicBlock::iterator MI,
33                                    unsigned SrcReg, bool isKill, int FrameIdx,
34                                    const TargetRegisterClass *RC) const {
35  assert(0 && "Cannot store this register to stack slot!");
36}
37
38void SystemZInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
39                                           MachineBasicBlock::iterator MI,
40                                           unsigned DestReg, int FrameIdx,
41                                           const TargetRegisterClass *RC) const{
42  assert(0 && "Cannot store this register to stack slot!");
43}
44
45bool SystemZInstrInfo::copyRegToReg(MachineBasicBlock &MBB,
46                                    MachineBasicBlock::iterator I,
47                                    unsigned DestReg, unsigned SrcReg,
48                                    const TargetRegisterClass *DestRC,
49                                    const TargetRegisterClass *SrcRC) const {
50  DebugLoc DL = DebugLoc::getUnknownLoc();
51  if (I != MBB.end()) DL = I->getDebugLoc();
52
53  // Determine if DstRC and SrcRC have a common superclass.
54  const TargetRegisterClass *CommonRC = DestRC;
55  if (DestRC == SrcRC)
56    /* Same regclass for source and dest */;
57  else if (CommonRC->hasSuperClass(SrcRC))
58    CommonRC = SrcRC;
59  else if (!CommonRC->hasSubClass(SrcRC))
60    CommonRC = 0;
61
62  if (CommonRC) {
63    unsigned Opc;
64    if (CommonRC == &SystemZ::GR64RegClass ||
65        CommonRC == &SystemZ::ADDR64RegClass) {
66      Opc = SystemZ::MOV64rr;
67    } else if (CommonRC == &SystemZ::GR32RegClass ||
68               CommonRC == &SystemZ::ADDR32RegClass) {
69      Opc = SystemZ::MOV32rr;
70    } else {
71      return false;
72    }
73
74    BuildMI(MBB, I, DL, get(Opc), DestReg).addReg(SrcReg);
75    return true;
76  }
77
78  if ((SrcRC == &SystemZ::GR64RegClass &&
79       DestRC == &SystemZ::ADDR64RegClass) ||
80      (DestRC == &SystemZ::GR64RegClass &&
81       SrcRC == &SystemZ::ADDR64RegClass)) {
82    BuildMI(MBB, I, DL, get(SystemZ::MOV64rr), DestReg).addReg(SrcReg);
83    return true;
84  } else if ((SrcRC == &SystemZ::GR32RegClass &&
85              DestRC == &SystemZ::ADDR32RegClass) ||
86             (DestRC == &SystemZ::GR32RegClass &&
87              SrcRC == &SystemZ::ADDR32RegClass)) {
88    BuildMI(MBB, I, DL, get(SystemZ::MOV32rr), DestReg).addReg(SrcReg);
89    return true;
90  }
91
92  return false;
93}
94
95bool
96SystemZInstrInfo::isMoveInstr(const MachineInstr& MI,
97                              unsigned &SrcReg, unsigned &DstReg,
98                              unsigned &SrcSubIdx, unsigned &DstSubIdx) const {
99  SrcSubIdx = DstSubIdx = 0; // No sub-registers yet.
100
101  switch (MI.getOpcode()) {
102  default:
103    return false;
104  case SystemZ::MOV32rr:
105  case SystemZ::MOV64rr:
106    assert(MI.getNumOperands() >= 2 &&
107           MI.getOperand(0).isReg() &&
108           MI.getOperand(1).isReg() &&
109           "invalid register-register move instruction");
110    SrcReg = MI.getOperand(1).getReg();
111    DstReg = MI.getOperand(0).getReg();
112    return true;
113  }
114}
115
116bool
117SystemZInstrInfo::spillCalleeSavedRegisters(MachineBasicBlock &MBB,
118                                           MachineBasicBlock::iterator MI,
119                                const std::vector<CalleeSavedInfo> &CSI) const {
120  if (CSI.empty())
121    return false;
122
123  MachineFunction &MF = *MBB.getParent();
124  SystemZMachineFunctionInfo *MFI = MF.getInfo<SystemZMachineFunctionInfo>();
125  MFI->setCalleeSavedFrameSize(CSI.size() * 8);
126
127  return true;
128}
129
130bool
131SystemZInstrInfo::restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
132                                             MachineBasicBlock::iterator MI,
133                                const std::vector<CalleeSavedInfo> &CSI) const {
134  return true;
135}
136
137unsigned
138SystemZInstrInfo::InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
139                              MachineBasicBlock *FBB,
140                            const SmallVectorImpl<MachineOperand> &Cond) const {
141  assert(0 && "Implement branches!");
142
143  return 0;
144}
145