SparcInstrInfo.cpp revision 43dbe05279b753aabda571d9c83eaeb36987001a
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" 18e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke#include "llvm/CodeGen/MachineInstrBuilder.h" 197c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner#include "SparcGenInstrInfo.inc" 201ddf475b6a3d748427546ab8f65a712c8eea3a0fChris Lattnerusing namespace llvm; 21e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke 227c90f73a1b06040d971a3dd95a491031ae6238d5Chris LattnerSparcInstrInfo::SparcInstrInfo(SparcSubtarget &ST) 23641055225092833197efe8e5bce01d50bcf1daaeChris Lattner : TargetInstrInfoImpl(SparcInsts, array_lengthof(SparcInsts)), 24d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson RI(ST, *this), Subtarget(ST) { 25e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke} 26e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke 2769d39091fe2af94d1ceebca526eabede98831a65Chris Lattnerstatic bool isZeroImm(const MachineOperand &op) { 289a1ceaedc282f0cae31f2723f4d6c00c7b88fe90Chris Lattner return op.isImmediate() && op.getImm() == 0; 294658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke} 304658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke 311d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner/// Return true if the instruction is a register to register move and 321d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner/// leave the source and dest operands in the passed parameters. 331d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner/// 347c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattnerbool SparcInstrInfo::isMoveInstr(const MachineInstr &MI, 357c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner unsigned &SrcReg, unsigned &DstReg) const { 364658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke // We look for 3 kinds of patterns here: 374658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke // or with G0 or 0 384658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke // add with G0 or 0 394658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke // fmovs or FpMOVD (pseudo double move). 407c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner if (MI.getOpcode() == SP::ORrr || MI.getOpcode() == SP::ADDrr) { 417c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner if (MI.getOperand(1).getReg() == SP::G0) { 424658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke DstReg = MI.getOperand(0).getReg(); 434658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke SrcReg = MI.getOperand(2).getReg(); 444658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke return true; 457c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner } else if (MI.getOperand(2).getReg() == SP::G0) { 464658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke DstReg = MI.getOperand(0).getReg(); 474658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke SrcReg = MI.getOperand(1).getReg(); 484658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke return true; 494658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke } 507c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner } else if ((MI.getOpcode() == SP::ORri || MI.getOpcode() == SP::ADDri) && 5169d39091fe2af94d1ceebca526eabede98831a65Chris Lattner isZeroImm(MI.getOperand(2)) && MI.getOperand(1).isRegister()) { 5269d39091fe2af94d1ceebca526eabede98831a65Chris Lattner DstReg = MI.getOperand(0).getReg(); 5369d39091fe2af94d1ceebca526eabede98831a65Chris Lattner SrcReg = MI.getOperand(1).getReg(); 5469d39091fe2af94d1ceebca526eabede98831a65Chris Lattner return true; 557c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner } else if (MI.getOpcode() == SP::FMOVS || MI.getOpcode() == SP::FpMOVD || 567c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner MI.getOpcode() == SP::FMOVD) { 571d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner SrcReg = MI.getOperand(1).getReg(); 581d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner DstReg = MI.getOperand(0).getReg(); 591d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner return true; 601d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner } 611d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner return false; 621d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner} 635ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner 645ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// isLoadFromStackSlot - If the specified machine instruction is a direct 655ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// load from a stack slot, return the virtual or physical register number of 665ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// the destination along with the FrameIndex of the loaded stack slot. If 675ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// not, return 0. This predicate must return 0 if the instruction has 685ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// any side effects other than loading from the stack slot. 697c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattnerunsigned SparcInstrInfo::isLoadFromStackSlot(MachineInstr *MI, 707c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner int &FrameIndex) const { 717c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner if (MI->getOpcode() == SP::LDri || 727c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner MI->getOpcode() == SP::LDFri || 737c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner MI->getOpcode() == SP::LDDFri) { 745ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner if (MI->getOperand(1).isFrameIndex() && MI->getOperand(2).isImmediate() && 759a1ceaedc282f0cae31f2723f4d6c00c7b88fe90Chris Lattner MI->getOperand(2).getImm() == 0) { 768aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner FrameIndex = MI->getOperand(1).getIndex(); 775ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner return MI->getOperand(0).getReg(); 785ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner } 795ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner } 805ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner return 0; 815ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner} 825ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner 835ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// isStoreToStackSlot - If the specified machine instruction is a direct 845ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// store to a stack slot, return the virtual or physical register number of 855ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// the source reg along with the FrameIndex of the loaded stack slot. If 865ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// not, return 0. This predicate must return 0 if the instruction has 875ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner/// any side effects other than storing to the stack slot. 887c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattnerunsigned SparcInstrInfo::isStoreToStackSlot(MachineInstr *MI, 897c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner int &FrameIndex) const { 907c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner if (MI->getOpcode() == SP::STri || 917c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner MI->getOpcode() == SP::STFri || 927c90f73a1b06040d971a3dd95a491031ae6238d5Chris Lattner MI->getOpcode() == SP::STDFri) { 935ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner if (MI->getOperand(0).isFrameIndex() && MI->getOperand(1).isImmediate() && 949a1ceaedc282f0cae31f2723f4d6c00c7b88fe90Chris Lattner MI->getOperand(1).getImm() == 0) { 958aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner FrameIndex = MI->getOperand(0).getIndex(); 965ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner return MI->getOperand(2).getReg(); 975ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner } 985ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner } 995ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner return 0; 1005ccc7225db0cb4d738045ade8e8c38d5345ac08aChris Lattner} 101e87146ace88464be4ea4f8869830642c40178f1fChris Lattner 1026ae3626a4fda14e6250ac8d8ff487efb8952cdf7Evan Chengunsigned 1036ae3626a4fda14e6250ac8d8ff487efb8952cdf7Evan ChengSparcInstrInfo::InsertBranch(MachineBasicBlock &MBB,MachineBasicBlock *TBB, 1046ae3626a4fda14e6250ac8d8ff487efb8952cdf7Evan Cheng MachineBasicBlock *FBB, 1056ae3626a4fda14e6250ac8d8ff487efb8952cdf7Evan Cheng const std::vector<MachineOperand> &Cond)const{ 106e87146ace88464be4ea4f8869830642c40178f1fChris Lattner // Can only insert uncond branches so far. 107e87146ace88464be4ea4f8869830642c40178f1fChris Lattner assert(Cond.empty() && !FBB && TBB && "Can only handle uncond branches!"); 108c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng BuildMI(&MBB, get(SP::BA)).addMBB(TBB); 1096ae3626a4fda14e6250ac8d8ff487efb8952cdf7Evan Cheng return 1; 1103d7d39ab1549f5ab7a929ec18a3e6481862cf247Rafael Espindola} 111d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson 112d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Andersonvoid SparcInstrInfo::copyRegToReg(MachineBasicBlock &MBB, 113d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson MachineBasicBlock::iterator I, 114d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson unsigned DestReg, unsigned SrcReg, 115d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson const TargetRegisterClass *DestRC, 116d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson const TargetRegisterClass *SrcRC) const { 117d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson if (DestRC != SrcRC) { 118d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson cerr << "Not yet supported!"; 119d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson abort(); 120d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson } 121d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson 122d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson if (DestRC == SP::IntRegsRegisterClass) 123d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson BuildMI(MBB, I, get(SP::ORrr), DestReg).addReg(SP::G0).addReg(SrcReg); 124d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson else if (DestRC == SP::FPRegsRegisterClass) 125d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson BuildMI(MBB, I, get(SP::FMOVS), DestReg).addReg(SrcReg); 126d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson else if (DestRC == SP::DFPRegsRegisterClass) 127d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson BuildMI(MBB, I, get(Subtarget.isV9() ? SP::FMOVD : SP::FpMOVD),DestReg) 128d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson .addReg(SrcReg); 129d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson else 130d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson assert (0 && "Can't copy this register"); 131d10fd9791c20fd8368fa0ce94b626b769c6c8ba0Owen Anderson} 132f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson 133f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Andersonvoid SparcInstrInfo:: 134f6372aa1cc568df19da7c5023e83c75aa9404a07Owen AndersonstoreRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, 135f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson unsigned SrcReg, bool isKill, int FI, 136f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson const TargetRegisterClass *RC) const { 137f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson // On the order of operands here: think "[FrameIdx + 0] = SrcReg". 138f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson if (RC == SP::IntRegsRegisterClass) 139f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson BuildMI(MBB, I, get(SP::STri)).addFrameIndex(FI).addImm(0) 140f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson .addReg(SrcReg, false, false, isKill); 141f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson else if (RC == SP::FPRegsRegisterClass) 142f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson BuildMI(MBB, I, get(SP::STFri)).addFrameIndex(FI).addImm(0) 143f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson .addReg(SrcReg, false, false, isKill); 144f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson else if (RC == SP::DFPRegsRegisterClass) 145f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson BuildMI(MBB, I, get(SP::STDFri)).addFrameIndex(FI).addImm(0) 146f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson .addReg(SrcReg, false, false, isKill); 147f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson else 148f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson assert(0 && "Can't store this register to stack slot"); 149f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson} 150f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson 151f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Andersonvoid SparcInstrInfo::storeRegToAddr(MachineFunction &MF, unsigned SrcReg, 152f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson bool isKill, 153f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson SmallVectorImpl<MachineOperand> &Addr, 154f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson const TargetRegisterClass *RC, 155f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson SmallVectorImpl<MachineInstr*> &NewMIs) const { 156f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson unsigned Opc = 0; 157f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson if (RC == SP::IntRegsRegisterClass) 158f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson Opc = SP::STri; 159f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson else if (RC == SP::FPRegsRegisterClass) 160f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson Opc = SP::STFri; 161f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson else if (RC == SP::DFPRegsRegisterClass) 162f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson Opc = SP::STDFri; 163f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson else 164f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson assert(0 && "Can't load this register"); 165f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson MachineInstrBuilder MIB = BuildMI(get(Opc)); 166f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson for (unsigned i = 0, e = Addr.size(); i != e; ++i) { 167f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson MachineOperand &MO = Addr[i]; 168f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson if (MO.isRegister()) 169f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson MIB.addReg(MO.getReg()); 170f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson else if (MO.isImmediate()) 171f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson MIB.addImm(MO.getImm()); 172f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson else { 173f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson assert(MO.isFI()); 174f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson MIB.addFrameIndex(MO.getIndex()); 175f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson } 176f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson } 177f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson MIB.addReg(SrcReg, false, false, isKill); 178f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson NewMIs.push_back(MIB); 179f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson return; 180f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson} 181f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson 182f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Andersonvoid SparcInstrInfo:: 183f6372aa1cc568df19da7c5023e83c75aa9404a07Owen AndersonloadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, 184f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson unsigned DestReg, int FI, 185f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson const TargetRegisterClass *RC) const { 186f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson if (RC == SP::IntRegsRegisterClass) 187f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson BuildMI(MBB, I, get(SP::LDri), DestReg).addFrameIndex(FI).addImm(0); 188f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson else if (RC == SP::FPRegsRegisterClass) 189f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson BuildMI(MBB, I, get(SP::LDFri), DestReg).addFrameIndex(FI).addImm(0); 190f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson else if (RC == SP::DFPRegsRegisterClass) 191f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson BuildMI(MBB, I, get(SP::LDDFri), DestReg).addFrameIndex(FI).addImm(0); 192f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson else 193f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson assert(0 && "Can't load this register from stack slot"); 194f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson} 195f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson 196f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Andersonvoid SparcInstrInfo::loadRegFromAddr(MachineFunction &MF, unsigned DestReg, 197f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson SmallVectorImpl<MachineOperand> &Addr, 198f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson const TargetRegisterClass *RC, 199f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson SmallVectorImpl<MachineInstr*> &NewMIs) const { 200f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson unsigned Opc = 0; 201f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson if (RC == SP::IntRegsRegisterClass) 202f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson Opc = SP::LDri; 203f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson else if (RC == SP::FPRegsRegisterClass) 204f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson Opc = SP::LDFri; 205f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson else if (RC == SP::DFPRegsRegisterClass) 206f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson Opc = SP::LDDFri; 207f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson else 208f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson assert(0 && "Can't load this register"); 209f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson MachineInstrBuilder MIB = BuildMI(get(Opc), DestReg); 210f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson for (unsigned i = 0, e = Addr.size(); i != e; ++i) { 211f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson MachineOperand &MO = Addr[i]; 212f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson if (MO.isReg()) 213f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson MIB.addReg(MO.getReg()); 214f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson else if (MO.isImm()) 215f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson MIB.addImm(MO.getImm()); 216f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson else { 217f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson assert(MO.isFI()); 218f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson MIB.addFrameIndex(MO.getIndex()); 219f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson } 220f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson } 221f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson NewMIs.push_back(MIB); 222f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson return; 223f6372aa1cc568df19da7c5023e83c75aa9404a07Owen Anderson} 22443dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson 22543dbe05279b753aabda571d9c83eaeb36987001aOwen AndersonMachineInstr *SparcInstrInfo::foldMemoryOperand(MachineInstr* MI, 22643dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson SmallVectorImpl<unsigned> &Ops, 22743dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson int FI) const { 22843dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson if (Ops.size() != 1) return NULL; 22943dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson 23043dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson unsigned OpNum = Ops[0]; 23143dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson bool isFloat = false; 23243dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson MachineInstr *NewMI = NULL; 23343dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson switch (MI->getOpcode()) { 23443dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson case SP::ORrr: 23543dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson if (MI->getOperand(1).isRegister() && MI->getOperand(1).getReg() == SP::G0&& 23643dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson MI->getOperand(0).isRegister() && MI->getOperand(2).isRegister()) { 23743dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson if (OpNum == 0) // COPY -> STORE 23843dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson NewMI = BuildMI(get(SP::STri)).addFrameIndex(FI).addImm(0) 23943dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson .addReg(MI->getOperand(2).getReg()); 24043dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson else // COPY -> LOAD 24143dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson NewMI = BuildMI(get(SP::LDri), MI->getOperand(0).getReg()) 24243dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson .addFrameIndex(FI).addImm(0); 24343dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson } 24443dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson break; 24543dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson case SP::FMOVS: 24643dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson isFloat = true; 24743dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson // FALLTHROUGH 24843dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson case SP::FMOVD: 24943dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson if (OpNum == 0) // COPY -> STORE 25043dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson NewMI = BuildMI(get(isFloat ? SP::STFri : SP::STDFri)) 25143dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson .addFrameIndex(FI).addImm(0).addReg(MI->getOperand(1).getReg()); 25243dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson else // COPY -> LOAD 25343dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson NewMI = BuildMI(get(isFloat ? SP::LDFri : SP::LDDFri), 25443dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson MI->getOperand(0).getReg()).addFrameIndex(FI).addImm(0); 25543dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson break; 25643dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson } 25743dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson 25843dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson if (NewMI) 25943dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson NewMI->copyKillDeadInfo(MI); 26043dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson return NewMI; 26143dbe05279b753aabda571d9c83eaeb36987001aOwen Anderson}