SparcInstrInfo.cpp revision d1c321a89ab999b9bb602b0f398ecd4c2022262c
17c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner//===- SparcInstrInfo.cpp - Sparc Instruction Information -------*- C++ -*-===//
2b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
3e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//                     The LLVM Compiler Infrastructure
4e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
8e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//===----------------------------------------------------------------------===//
9e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//
107c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner// This file contains the Sparc implementation of the TargetInstrInfo class.
11e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//
12e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//===----------------------------------------------------------------------===//
13e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke
147c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner#include "SparcInstrInfo.h"
15d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson#include "SparcSubtarget.h"
167c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner#include "Sparc.h"
17718cb665ca6ce2bc4d8e8479f46a45db91b49f86Owen Anderson#include "llvm/ADT/STLExtras.h"
18d68a07650cdb2e18f18f362ba533459aa10e01b6Dan Gohman#include "llvm/ADT/SmallVector.h"
19e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke#include "llvm/CodeGen/MachineInstrBuilder.h"
207c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner#include "SparcGenInstrInfo.inc"
211ddf475b6a3d748427546ab8f65a712c8eea3a0fChris Lattnerusing namespace llvm;
22e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke
237c90f73a1b06040d971a3dd95a491031ae6238d5Chris LattnerSparcInstrInfo::SparcInstrInfo(SparcSubtarget &ST)
24641055225092833197efe8e5bce01d50bcf1daaeChris Lattner  : TargetInstrInfoImpl(SparcInsts, array_lengthof(SparcInsts)),
25d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson    RI(ST, *this), Subtarget(ST) {
26e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke}
27e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke
2869d39091fe2af94d1ceebca526eabede98831a65Chris Lattnerstatic bool isZeroImm(const MachineOperand &op) {
29d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman  return op.isImm() && op.getImm() == 0;
304658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke}
314658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke
321d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner/// Return true if the instruction is a register to register move and
331d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner/// leave the source and dest operands in the passed parameters.
341d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner///
357c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattnerbool SparcInstrInfo::isMoveInstr(const MachineInstr &MI,
3604ee5a1d9267e5e6fab8f088095fcb83c3c5cbd1Evan Cheng                                 unsigned &SrcReg, unsigned &DstReg,
3704ee5a1d9267e5e6fab8f088095fcb83c3c5cbd1Evan Cheng                                 unsigned &SrcSR, unsigned &DstSR) const {
3804ee5a1d9267e5e6fab8f088095fcb83c3c5cbd1Evan Cheng  SrcSR = DstSR = 0; // No sub-registers.
3904ee5a1d9267e5e6fab8f088095fcb83c3c5cbd1Evan Cheng
404658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke  // We look for 3 kinds of patterns here:
414658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke  // or with G0 or 0
424658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke  // add with G0 or 0
434658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke  // fmovs or FpMOVD (pseudo double move).
447c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner  if (MI.getOpcode() == SP::ORrr || MI.getOpcode() == SP::ADDrr) {
457c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner    if (MI.getOperand(1).getReg() == SP::G0) {
464658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke      DstReg = MI.getOperand(0).getReg();
474658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke      SrcReg = MI.getOperand(2).getReg();
484658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke      return true;
497c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner    } else if (MI.getOperand(2).getReg() == SP::G0) {
504658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke      DstReg = MI.getOperand(0).getReg();
514658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke      SrcReg = MI.getOperand(1).getReg();
524658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke      return true;
534658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke    }
547c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner  } else if ((MI.getOpcode() == SP::ORri || MI.getOpcode() == SP::ADDri) &&
55d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman             isZeroImm(MI.getOperand(2)) && MI.getOperand(1).isReg()) {
5669d39091fe2af94d1ceebca526eabede98831a65Chris Lattner    DstReg = MI.getOperand(0).getReg();
5769d39091fe2af94d1ceebca526eabede98831a65Chris Lattner    SrcReg = MI.getOperand(1).getReg();
5869d39091fe2af94d1ceebca526eabede98831a65Chris Lattner    return true;
597c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner  } else if (MI.getOpcode() == SP::FMOVS || MI.getOpcode() == SP::FpMOVD ||
607c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner             MI.getOpcode() == SP::FMOVD) {
611d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner    SrcReg = MI.getOperand(1).getReg();
621d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner    DstReg = MI.getOperand(0).getReg();
631d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner    return true;
641d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner  }
651d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner  return false;
661d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner}
675ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner
685ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// isLoadFromStackSlot - If the specified machine instruction is a direct
695ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// load from a stack slot, return the virtual or physical register number of
705ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// the destination along with the FrameIndex of the loaded stack slot.  If
715ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// not, return 0.  This predicate must return 0 if the instruction has
725ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// any side effects other than loading from the stack slot.
73cbad42cfd1cc93a41ff26ea2e8895bfbc09f54f2Dan Gohmanunsigned SparcInstrInfo::isLoadFromStackSlot(const MachineInstr *MI,
747c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner                                             int &FrameIndex) const {
757c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner  if (MI->getOpcode() == SP::LDri ||
767c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner      MI->getOpcode() == SP::LDFri ||
777c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner      MI->getOpcode() == SP::LDDFri) {
78d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman    if (MI->getOperand(1).isFI() && MI->getOperand(2).isImm() &&
799a1ceaedc282f0cae31f2723f4d6c00c7b88fe90Chris Lattner        MI->getOperand(2).getImm() == 0) {
808aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner      FrameIndex = MI->getOperand(1).getIndex();
815ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner      return MI->getOperand(0).getReg();
825ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner    }
835ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner  }
845ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner  return 0;
855ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner}
865ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner
875ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// isStoreToStackSlot - If the specified machine instruction is a direct
885ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// store to a stack slot, return the virtual or physical register number of
895ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// the source reg along with the FrameIndex of the loaded stack slot.  If
905ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// not, return 0.  This predicate must return 0 if the instruction has
915ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// any side effects other than storing to the stack slot.
92cbad42cfd1cc93a41ff26ea2e8895bfbc09f54f2Dan Gohmanunsigned SparcInstrInfo::isStoreToStackSlot(const MachineInstr *MI,
937c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner                                            int &FrameIndex) const {
947c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner  if (MI->getOpcode() == SP::STri ||
957c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner      MI->getOpcode() == SP::STFri ||
967c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner      MI->getOpcode() == SP::STDFri) {
97d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman    if (MI->getOperand(0).isFI() && MI->getOperand(1).isImm() &&
989a1ceaedc282f0cae31f2723f4d6c00c7b88fe90Chris Lattner        MI->getOperand(1).getImm() == 0) {
998aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner      FrameIndex = MI->getOperand(0).getIndex();
1005ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner      return MI->getOperand(2).getReg();
1015ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner    }
1025ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner  }
1035ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner  return 0;
1045ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner}
105e87146ace88464be4ea4f8869830642c40178f1fChris Lattner
1066ae3626a4fda14e6250ac8d8ff487efb8952cdf7Evan Chengunsigned
1076ae3626a4fda14e6250ac8d8ff487efb8952cdf7Evan ChengSparcInstrInfo::InsertBranch(MachineBasicBlock &MBB,MachineBasicBlock *TBB,
1086ae3626a4fda14e6250ac8d8ff487efb8952cdf7Evan Cheng                             MachineBasicBlock *FBB,
10944eb65cf58e3ab9b5621ce72256d1621a18aeed7Owen Anderson                             const SmallVectorImpl<MachineOperand> &Cond)const{
110e87146ace88464be4ea4f8869830642c40178f1fChris Lattner  // Can only insert uncond branches so far.
111e87146ace88464be4ea4f8869830642c40178f1fChris Lattner  assert(Cond.empty() && !FBB && TBB && "Can only handle uncond branches!");
112c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng  BuildMI(&MBB, get(SP::BA)).addMBB(TBB);
1136ae3626a4fda14e6250ac8d8ff487efb8952cdf7Evan Cheng  return 1;
1143d7d39ab1549f5ab7a929ec18a3e6481862cf247Rafael Espindola}
115d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson
116940f83e772ca2007d62faffc83094bd7e8da6401Owen Andersonbool SparcInstrInfo::copyRegToReg(MachineBasicBlock &MBB,
117d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling                                  MachineBasicBlock::iterator I,
118d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling                                  unsigned DestReg, unsigned SrcReg,
119d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling                                  const TargetRegisterClass *DestRC,
120d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling                                  const TargetRegisterClass *SrcRC) const {
121d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson  if (DestRC != SrcRC) {
122940f83e772ca2007d62faffc83094bd7e8da6401Owen Anderson    // Not yet supported!
123940f83e772ca2007d62faffc83094bd7e8da6401Owen Anderson    return false;
124d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson  }
125d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson
126d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling  DebugLoc DL = DebugLoc::getUnknownLoc();
127d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling  if (I != MBB.end()) DL = I->getDebugLoc();
128d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling
129d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson  if (DestRC == SP::IntRegsRegisterClass)
130d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling    BuildMI(MBB, I, DL, get(SP::ORrr), DestReg).addReg(SP::G0).addReg(SrcReg);
131d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson  else if (DestRC == SP::FPRegsRegisterClass)
132d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling    BuildMI(MBB, I, DL, get(SP::FMOVS), DestReg).addReg(SrcReg);
133d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson  else if (DestRC == SP::DFPRegsRegisterClass)
134d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling    BuildMI(MBB, I, DL, get(Subtarget.isV9() ? SP::FMOVD : SP::FpMOVD),DestReg)
135d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson      .addReg(SrcReg);
136d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson  else
137940f83e772ca2007d62faffc83094bd7e8da6401Owen Anderson    // Can't copy this register
138940f83e772ca2007d62faffc83094bd7e8da6401Owen Anderson    return false;
139940f83e772ca2007d62faffc83094bd7e8da6401Owen Anderson
140940f83e772ca2007d62faffc83094bd7e8da6401Owen Anderson  return true;
141d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson}
142f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson
143f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Andersonvoid SparcInstrInfo::
144f6372aa1cc568df19da7c5023e83c75aa9404a07Owen AndersonstoreRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
145f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson                    unsigned SrcReg, bool isKill, int FI,
146f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson                    const TargetRegisterClass *RC) const {
147d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling  DebugLoc DL = DebugLoc::getUnknownLoc();
148d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling  if (I != MBB.end()) DL = I->getDebugLoc();
149d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling
150f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  // On the order of operands here: think "[FrameIdx + 0] = SrcReg".
151f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  if (RC == SP::IntRegsRegisterClass)
152d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling    BuildMI(MBB, I, DL, get(SP::STri)).addFrameIndex(FI).addImm(0)
153f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson      .addReg(SrcReg, false, false, isKill);
154f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  else if (RC == SP::FPRegsRegisterClass)
155d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling    BuildMI(MBB, I, DL, get(SP::STFri)).addFrameIndex(FI).addImm(0)
156f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson      .addReg(SrcReg, false, false, isKill);
157f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  else if (RC == SP::DFPRegsRegisterClass)
158d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling    BuildMI(MBB, I, DL, get(SP::STDFri)).addFrameIndex(FI).addImm(0)
159f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson      .addReg(SrcReg, false, false, isKill);
160f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  else
161f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson    assert(0 && "Can't store this register to stack slot");
162f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson}
163f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson
164f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Andersonvoid SparcInstrInfo::storeRegToAddr(MachineFunction &MF, unsigned SrcReg,
165d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling                                    bool isKill,
166d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling                                    SmallVectorImpl<MachineOperand> &Addr,
167d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling                                    const TargetRegisterClass *RC,
168f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson                                 SmallVectorImpl<MachineInstr*> &NewMIs) const {
169f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  unsigned Opc = 0;
170f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  if (RC == SP::IntRegsRegisterClass)
171f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson    Opc = SP::STri;
172f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  else if (RC == SP::FPRegsRegisterClass)
173f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson    Opc = SP::STFri;
174f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  else if (RC == SP::DFPRegsRegisterClass)
175f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson    Opc = SP::STDFri;
176f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  else
177f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson    assert(0 && "Can't load this register");
1788e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MachineInstrBuilder MIB = BuildMI(MF, get(Opc));
179f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  for (unsigned i = 0, e = Addr.size(); i != e; ++i) {
180f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson    MachineOperand &MO = Addr[i];
181d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman    if (MO.isReg())
182f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson      MIB.addReg(MO.getReg());
183d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman    else if (MO.isImm())
184f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson      MIB.addImm(MO.getImm());
185f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson    else {
186d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman      assert(MO.isFI());
187f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson      MIB.addFrameIndex(MO.getIndex());
188f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson    }
189f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  }
190f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  MIB.addReg(SrcReg, false, false, isKill);
191f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  NewMIs.push_back(MIB);
192f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  return;
193f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson}
194f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson
195f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Andersonvoid SparcInstrInfo::
196f6372aa1cc568df19da7c5023e83c75aa9404a07Owen AndersonloadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
197f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson                     unsigned DestReg, int FI,
198f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson                     const TargetRegisterClass *RC) const {
199d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling  DebugLoc DL = DebugLoc::getUnknownLoc();
200d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling  if (I != MBB.end()) DL = I->getDebugLoc();
201d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling
202f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  if (RC == SP::IntRegsRegisterClass)
203d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling    BuildMI(MBB, I, DL, get(SP::LDri), DestReg).addFrameIndex(FI).addImm(0);
204f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  else if (RC == SP::FPRegsRegisterClass)
205d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling    BuildMI(MBB, I, DL, get(SP::LDFri), DestReg).addFrameIndex(FI).addImm(0);
206f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  else if (RC == SP::DFPRegsRegisterClass)
207d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling    BuildMI(MBB, I, DL, get(SP::LDDFri), DestReg).addFrameIndex(FI).addImm(0);
208f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  else
209f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson    assert(0 && "Can't load this register from stack slot");
210f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson}
211f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson
212f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Andersonvoid SparcInstrInfo::loadRegFromAddr(MachineFunction &MF, unsigned DestReg,
213d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling                                     SmallVectorImpl<MachineOperand> &Addr,
214d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling                                     const TargetRegisterClass *RC,
215f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson                                 SmallVectorImpl<MachineInstr*> &NewMIs) const {
216f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  unsigned Opc = 0;
217f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  if (RC == SP::IntRegsRegisterClass)
218f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson    Opc = SP::LDri;
219f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  else if (RC == SP::FPRegsRegisterClass)
220f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson    Opc = SP::LDFri;
221f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  else if (RC == SP::DFPRegsRegisterClass)
222f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson    Opc = SP::LDDFri;
223f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  else
224f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson    assert(0 && "Can't load this register");
2258e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MachineInstrBuilder MIB = BuildMI(MF, get(Opc), DestReg);
226f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  for (unsigned i = 0, e = Addr.size(); i != e; ++i) {
227f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson    MachineOperand &MO = Addr[i];
228d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman    if (MO.isReg())
229f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson      MIB.addReg(MO.getReg());
230d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman    else if (MO.isImm())
231f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson      MIB.addImm(MO.getImm());
232f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson    else {
233d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman      assert(MO.isFI());
234f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson      MIB.addFrameIndex(MO.getIndex());
235f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson    }
236f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  }
237f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  NewMIs.push_back(MIB);
238f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson  return;
239f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson}
24043dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson
241c54baa2d43730f1804acfb4f4e738fba72f966bdDan GohmanMachineInstr *SparcInstrInfo::foldMemoryOperandImpl(MachineFunction &MF,
242c54baa2d43730f1804acfb4f4e738fba72f966bdDan Gohman                                                    MachineInstr* MI,
2438e8b8a223c2b0e69f44c0639f846260c8011668fDan Gohman                                          const SmallVectorImpl<unsigned> &Ops,
244c54baa2d43730f1804acfb4f4e738fba72f966bdDan Gohman                                                    int FI) const {
24543dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson  if (Ops.size() != 1) return NULL;
24643dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson
24743dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson  unsigned OpNum = Ops[0];
24843dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson  bool isFloat = false;
24943dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson  MachineInstr *NewMI = NULL;
25043dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson  switch (MI->getOpcode()) {
25143dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson  case SP::ORrr:
252d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman    if (MI->getOperand(1).isReg() && MI->getOperand(1).getReg() == SP::G0&&
253d735b8019b0f297d7c14b55adcd887af24d8e602Dan Gohman        MI->getOperand(0).isReg() && MI->getOperand(2).isReg()) {
25443dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson      if (OpNum == 0)    // COPY -> STORE
255d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling        NewMI = BuildMI(MF, MI->getDebugLoc(), get(SP::STri))
256d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling          .addFrameIndex(FI)
257d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling          .addImm(0)
258d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling          .addReg(MI->getOperand(2).getReg());
25943dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson      else               // COPY -> LOAD
260d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling        NewMI = BuildMI(MF, MI->getDebugLoc(), get(SP::LDri),
261d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling                        MI->getOperand(0).getReg())
262d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling          .addFrameIndex(FI)
263d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling          .addImm(0);
26443dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson    }
26543dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson    break;
26643dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson  case SP::FMOVS:
26743dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson    isFloat = true;
26843dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson    // FALLTHROUGH
26943dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson  case SP::FMOVD:
2709f1c8317a4676945b4961ddb9827ef2412551620Evan Cheng    if (OpNum == 0) { // COPY -> STORE
2719f1c8317a4676945b4961ddb9827ef2412551620Evan Cheng      unsigned SrcReg = MI->getOperand(1).getReg();
2729f1c8317a4676945b4961ddb9827ef2412551620Evan Cheng      bool isKill = MI->getOperand(1).isKill();
273d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling      NewMI = BuildMI(MF, MI->getDebugLoc(),
274d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling                      get(isFloat ? SP::STFri : SP::STDFri))
275d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling        .addFrameIndex(FI)
276d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling        .addImm(0)
277d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling        .addReg(SrcReg, false, false, isKill);
2789f1c8317a4676945b4961ddb9827ef2412551620Evan Cheng    } else {             // COPY -> LOAD
2799f1c8317a4676945b4961ddb9827ef2412551620Evan Cheng      unsigned DstReg = MI->getOperand(0).getReg();
2809f1c8317a4676945b4961ddb9827ef2412551620Evan Cheng      bool isDead = MI->getOperand(0).isDead();
281d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling      NewMI = BuildMI(MF, MI->getDebugLoc(),
282d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling                      get(isFloat ? SP::LDFri : SP::LDDFri))
283d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling        .addReg(DstReg, true, false, false, isDead)
284d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling        .addFrameIndex(FI)
285d1c321a89ab999b9bb602b0f398ecd4c2022262cBill Wendling        .addImm(0);
2869f1c8317a4676945b4961ddb9827ef2412551620Evan Cheng    }
28743dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson    break;
28843dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson  }
28943dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson
29043dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson  return NewMI;
2919c5525f4fa177e20077710c980f08e2f8de06e39Duncan Sands}
292