SparcRegisterInfo.cpp revision e76c903bd2233159910ee6ed236390955714e07d
10ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//===-- SparcRegisterInfo.cpp - SPARC Register Information ----------------===// 20ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 30ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// The LLVM Compiler Infrastructure 40ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 50ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This file is distributed under the University of Illinois Open Source 60ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// License. See LICENSE.TXT for details. 70ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 80ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//===----------------------------------------------------------------------===// 90ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// This file contains the SPARC implementation of the TargetRegisterInfo class. 110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong// 120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong//===----------------------------------------------------------------------===// 130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "SparcRegisterInfo.h" 150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "Sparc.h" 160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "SparcSubtarget.h" 170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "llvm/Type.h" 180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "llvm/CodeGen/MachineInstrBuilder.h" 190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "llvm/CodeGen/MachineFunction.h" 200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "llvm/CodeGen/MachineFrameInfo.h" 210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "llvm/Support/ErrorHandling.h" 220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "llvm/Target/TargetInstrInfo.h" 230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "llvm/ADT/BitVector.h" 240ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "llvm/ADT/STLExtras.h" 250ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 260ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#define GET_REGINFO_TARGET_DESC 270ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong#include "SparcGenRegisterInfo.inc" 280ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 290ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongusing namespace llvm; 300ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 310ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongSparcRegisterInfo::SparcRegisterInfo(SparcSubtarget &st, 320ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const TargetInstrInfo &tii) 330ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong : SparcGenRegisterInfo(SP::I7), Subtarget(st), TII(tii) { 340ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 350ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 360ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongconst uint16_t* SparcRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) 370ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong const { 380ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong static const uint16_t CalleeSavedRegs[] = { 0 }; 390ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return CalleeSavedRegs; 400ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 410ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 420ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongBitVector SparcRegisterInfo::getReservedRegs(const MachineFunction &MF) const { 430ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong BitVector Reserved(getNumRegs()); 440ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // FIXME: G1 reserved for now for large imm generation by frame code. 450ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Reserved.set(SP::G1); 460ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Reserved.set(SP::G2); 470ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Reserved.set(SP::G3); 480ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Reserved.set(SP::G4); 490ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Reserved.set(SP::O6); 500ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Reserved.set(SP::I6); 510ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Reserved.set(SP::I7); 520ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Reserved.set(SP::G0); 530ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Reserved.set(SP::G5); 540ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Reserved.set(SP::G6); 550ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Reserved.set(SP::G7); 560ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return Reserved; 570ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 580ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 590ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid SparcRegisterInfo:: 600ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongeliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, 610ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MachineBasicBlock::iterator I) const { 620ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MachineInstr &MI = *I; 630ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DebugLoc dl = MI.getDebugLoc(); 640ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int Size = MI.getOperand(0).getImm(); 650ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (MI.getOpcode() == SP::ADJCALLSTACKDOWN) 660ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong Size = -Size; 670ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (Size) 680ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong BuildMI(MBB, I, dl, TII.get(SP::ADDri), SP::O6).addReg(SP::O6).addImm(Size); 690ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MBB.erase(I); 700ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 710ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 720ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongvoid 730ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus KongSparcRegisterInfo::eliminateFrameIndex(MachineBasicBlock::iterator II, 740ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int SPAdj, RegScavenger *RS) const { 750ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong assert(SPAdj == 0 && "Unexpected"); 760ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 770ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong unsigned i = 0; 780ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MachineInstr &MI = *II; 790ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong DebugLoc dl = MI.getDebugLoc(); 800ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong while (!MI.getOperand(i).isFI()) { 810ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong ++i; 820ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong assert(i < MI.getNumOperands() && "Instr doesn't have FrameIndex operand!"); 830ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 840ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 850ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int FrameIndex = MI.getOperand(i).getIndex(); 860ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 870ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Addressable stack objects are accessed using neg. offsets from %fp 880ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MachineFunction &MF = *MI.getParent()->getParent(); 890ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong int Offset = MF.getFrameInfo()->getObjectOffset(FrameIndex) + 900ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MI.getOperand(i+1).getImm(); 910ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 920ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Replace frame index with a frame pointer reference. 930ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong if (Offset >= -4096 && Offset <= 4095) { 940ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // If the offset is small enough to fit in the immediate field, directly 950ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // encode it. 960ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MI.getOperand(i).ChangeToRegister(SP::I6, false); 970ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MI.getOperand(i+1).ChangeToImmediate(Offset); 980ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } else { 990ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Otherwise, emit a G1 = SETHI %hi(offset). FIXME: it would be better to 1000ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // scavenge a register here instead of reserving G1 all of the time. 1010ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong unsigned OffHi = (unsigned)Offset >> 10U; 1020ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong BuildMI(*MI.getParent(), II, dl, TII.get(SP::SETHIi), SP::G1).addImm(OffHi); 1030ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Emit G1 = G1 + I6 1040ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong BuildMI(*MI.getParent(), II, dl, TII.get(SP::ADDrr), SP::G1).addReg(SP::G1) 1050ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong .addReg(SP::I6); 1060ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong // Insert: G1+%lo(offset) into the user. 1070ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MI.getOperand(i).ChangeToRegister(SP::G1, false); 1080ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong MI.getOperand(i+1).ChangeToImmediate(Offset & ((1 << 10)-1)); 1090ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong } 1100ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 1110ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1120ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongunsigned SparcRegisterInfo::getFrameRegister(const MachineFunction &MF) const { 1130ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong return SP::I6; 1140ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 1150ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1160ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongunsigned SparcRegisterInfo::getEHExceptionRegister() const { 1170ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong llvm_unreachable("What is the exception register"); 1180ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 1190ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong 1200ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kongunsigned SparcRegisterInfo::getEHHandlerRegister() const { 1210ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong llvm_unreachable("What is the exception handler register"); 1220ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong} 1230ae28bd5885b5daa526898fcf7c323dc2c3e1963Angus Kong