131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- XCoreMachineFuctionInfo.cpp - XCore machine function info ---------===// 22d24e2a396a1d211baaeedf32148a3b657240170David Blaikie// 32d24e2a396a1d211baaeedf32148a3b657240170David Blaikie// The LLVM Compiler Infrastructure 42d24e2a396a1d211baaeedf32148a3b657240170David Blaikie// 52d24e2a396a1d211baaeedf32148a3b657240170David Blaikie// This file is distributed under the University of Illinois Open Source 62d24e2a396a1d211baaeedf32148a3b657240170David Blaikie// License. See LICENSE.TXT for details. 72d24e2a396a1d211baaeedf32148a3b657240170David Blaikie// 82d24e2a396a1d211baaeedf32148a3b657240170David Blaikie//===----------------------------------------------------------------------===// 92d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 102d24e2a396a1d211baaeedf32148a3b657240170David Blaikie#include "XCoreMachineFunctionInfo.h" 1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "XCoreInstrInfo.h" 1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Function.h" 132d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 142d24e2a396a1d211baaeedf32148a3b657240170David Blaikieusing namespace llvm; 152d24e2a396a1d211baaeedf32148a3b657240170David Blaikie 162d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid XCoreFunctionInfo::anchor() { } 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesbool XCoreFunctionInfo::isLargeFrame(const MachineFunction &MF) const { 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (CachedEStackSize == -1) { 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines CachedEStackSize = MF.getFrameInfo()->estimateStackSize(MF); 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // isLargeFrame() is used when deciding if spill slots should be added to 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // allow eliminateFrameIndex() to scavenge registers. 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // This is only required when there is no FP and offsets are greater than 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // ~256KB (~64Kwords). Thus only for code run on the emulator! 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // The arbitrary value of 0xf000 allows frames of up to ~240KB before spill 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // slots are added for the use of eliminateFrameIndex() register scavenging. 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // For frames less than 240KB, it is assumed that there will be less than 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // 16KB of function arguments. 3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return CachedEStackSize > 0xf000; 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesint XCoreFunctionInfo::createLRSpillSlot(MachineFunction &MF) { 3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (LRSpillSlotSet) { 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return LRSpillSlot; 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const TargetRegisterClass *RC = &XCore::GRRegsRegClass; 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineFrameInfo *MFI = MF.getFrameInfo(); 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (! MF.getFunction()->isVarArg()) { 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // A fixed offset of 0 allows us to save / restore LR using entsp / retsp. 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines LRSpillSlot = MFI->CreateFixedObject(RC->getSize(), 0, true); 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } else { 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines LRSpillSlot = MFI->CreateStackObject(RC->getSize(), RC->getAlignment(), true); 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines LRSpillSlotSet = true; 4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return LRSpillSlot; 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesint XCoreFunctionInfo::createFPSpillSlot(MachineFunction &MF) { 5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (FPSpillSlotSet) { 5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return FPSpillSlot; 5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const TargetRegisterClass *RC = &XCore::GRRegsRegClass; 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineFrameInfo *MFI = MF.getFrameInfo(); 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FPSpillSlot = MFI->CreateStackObject(RC->getSize(), RC->getAlignment(), true); 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FPSpillSlotSet = true; 5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return FPSpillSlot; 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst int* XCoreFunctionInfo::createEHSpillSlot(MachineFunction &MF) { 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (EHSpillSlotSet) { 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return EHSpillSlot; 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const TargetRegisterClass *RC = &XCore::GRRegsRegClass; 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MachineFrameInfo *MFI = MF.getFrameInfo(); 6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EHSpillSlot[0] = MFI->CreateStackObject(RC->getSize(), RC->getAlignment(), true); 6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EHSpillSlot[1] = MFI->CreateStackObject(RC->getSize(), RC->getAlignment(), true); 6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EHSpillSlotSet = true; 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return EHSpillSlot; 7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 73