LLVM 20.0.0git
Functions | Variables
XCoreFrameLowering.cpp File Reference
#include "XCoreFrameLowering.h"
#include "XCoreInstrInfo.h"
#include "XCoreMachineFunctionInfo.h"
#include "XCoreSubtarget.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/RegisterScavenging.h"
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/IR/Function.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Target/TargetOptions.h"
#include <algorithm>

Go to the source code of this file.

Functions

static bool isImmU6 (unsigned val)
 
static bool isImmU16 (unsigned val)
 
static bool CompareSSIOffset (const StackSlotInfo &a, const StackSlotInfo &b)
 
static void EmitDefCfaRegister (MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &dl, const TargetInstrInfo &TII, MachineFunction &MF, unsigned DRegNum)
 
static void EmitDefCfaOffset (MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &dl, const TargetInstrInfo &TII, int Offset)
 
static void EmitCfiOffset (MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &dl, const TargetInstrInfo &TII, unsigned DRegNum, int Offset)
 
static void IfNeededExtSP (MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &dl, const TargetInstrInfo &TII, int OffsetFromTop, int &Adjusted, int FrameSize, bool emitFrameMoves)
 The SP register is moved in steps of 'MaxImmU16' towards the bottom of the frame.
 
static void IfNeededLDAWSP (MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &dl, const TargetInstrInfo &TII, int OffsetFromTop, int &RemainingAdj)
 The SP register is moved in steps of 'MaxImmU16' towards the top of the frame.
 
static void GetSpillList (SmallVectorImpl< StackSlotInfo > &SpillList, MachineFrameInfo &MFI, XCoreFunctionInfo *XFI, bool fetchLR, bool fetchFP)
 Creates an ordered list of registers that are spilled during the emitPrologue/emitEpilogue.
 
static void GetEHSpillList (SmallVectorImpl< StackSlotInfo > &SpillList, MachineFrameInfo &MFI, XCoreFunctionInfo *XFI, const Constant *PersonalityFn, const TargetLowering *TL)
 Creates an ordered list of EH info register 'spills'.
 
static MachineMemOperandgetFrameIndexMMO (MachineBasicBlock &MBB, int FrameIndex, MachineMemOperand::Flags flags)
 
static void RestoreSpillList (MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &dl, const TargetInstrInfo &TII, int &RemainingAdj, SmallVectorImpl< StackSlotInfo > &SpillList)
 Restore clobbered registers with their spill slot value.
 

Variables

static const unsigned FramePtr = XCore::R10
 
static const int MaxImmU16 = (1<<16) - 1
 

Function Documentation

◆ CompareSSIOffset()

static bool CompareSSIOffset ( const StackSlotInfo &  a,
const StackSlotInfo &  b 
)
static

Definition at line 54 of file XCoreFrameLowering.cpp.

Referenced by GetEHSpillList(), and GetSpillList().

◆ EmitCfiOffset()

static void EmitCfiOffset ( MachineBasicBlock MBB,
MachineBasicBlock::iterator  MBBI,
const DebugLoc dl,
const TargetInstrInfo TII,
unsigned  DRegNum,
int  Offset 
)
static

◆ EmitDefCfaOffset()

static void EmitDefCfaOffset ( MachineBasicBlock MBB,
MachineBasicBlock::iterator  MBBI,
const DebugLoc dl,
const TargetInstrInfo TII,
int  Offset 
)
static

◆ EmitDefCfaRegister()

static void EmitDefCfaRegister ( MachineBasicBlock MBB,
MachineBasicBlock::iterator  MBBI,
const DebugLoc dl,
const TargetInstrInfo TII,
MachineFunction MF,
unsigned  DRegNum 
)
static

◆ GetEHSpillList()

static void GetEHSpillList ( SmallVectorImpl< StackSlotInfo > &  SpillList,
MachineFrameInfo MFI,
XCoreFunctionInfo XFI,
const Constant PersonalityFn,
const TargetLowering TL 
)
static

Creates an ordered list of EH info register 'spills'.

These slots are only used by the unwinder and calls to llvm.eh.return(). Registers are ordered according to their frame offset. As offsets are negative, the largest offsets will be first.

Definition at line 158 of file XCoreFrameLowering.cpp.

References assert(), CompareSSIOffset(), llvm::XCoreFunctionInfo::getEHSpillSlot(), llvm::TargetLoweringBase::getExceptionPointerRegister(), llvm::TargetLoweringBase::getExceptionSelectorRegister(), llvm::MachineFrameInfo::getObjectOffset(), llvm::XCoreFunctionInfo::hasEHSpillSlot(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::sort().

Referenced by llvm::XCoreFrameLowering::emitEpilogue(), and llvm::XCoreFrameLowering::emitPrologue().

◆ getFrameIndexMMO()

static MachineMemOperand * getFrameIndexMMO ( MachineBasicBlock MBB,
int  FrameIndex,
MachineMemOperand::Flags  flags 
)
static

◆ GetSpillList()

static void GetSpillList ( SmallVectorImpl< StackSlotInfo > &  SpillList,
MachineFrameInfo MFI,
XCoreFunctionInfo XFI,
bool  fetchLR,
bool  fetchFP 
)
static

Creates an ordered list of registers that are spilled during the emitPrologue/emitEpilogue.

Registers are ordered according to their frame offset. As offsets are negative, the largest offsets will be first.

Definition at line 136 of file XCoreFrameLowering.cpp.

References CompareSSIOffset(), FramePtr, llvm::XCoreFunctionInfo::getFPSpillSlot(), llvm::XCoreFunctionInfo::getLRSpillSlot(), llvm::MachineFrameInfo::getObjectOffset(), llvm::Offset, llvm::SmallVectorTemplateBase< T, bool >::push_back(), and llvm::sort().

Referenced by llvm::XCoreFrameLowering::emitEpilogue(), and llvm::XCoreFrameLowering::emitPrologue().

◆ IfNeededExtSP()

static void IfNeededExtSP ( MachineBasicBlock MBB,
MachineBasicBlock::iterator  MBBI,
const DebugLoc dl,
const TargetInstrInfo TII,
int  OffsetFromTop,
int &  Adjusted,
int  FrameSize,
bool  emitFrameMoves 
)
static

The SP register is moved in steps of 'MaxImmU16' towards the bottom of the frame.

During these steps, it may be necessary to spill registers. IfNeededExtSP emits the necessary EXTSP instructions to move the SP only as far as to make 'OffsetFromBottom' reachable using an STWSP_lru6.

Parameters
OffsetFromTopthe spill offset from the top of the frame.
[in,out]Adjustedthe current SP offset from the top of the frame.

Definition at line 96 of file XCoreFrameLowering.cpp.

References llvm::MachineInstrBuilder::addImm(), assert(), llvm::BuildMI(), EmitDefCfaOffset(), isImmU6(), MaxImmU16, MBB, MBBI, and TII.

Referenced by llvm::XCoreFrameLowering::emitPrologue().

◆ IfNeededLDAWSP()

static void IfNeededLDAWSP ( MachineBasicBlock MBB,
MachineBasicBlock::iterator  MBBI,
const DebugLoc dl,
const TargetInstrInfo TII,
int  OffsetFromTop,
int &  RemainingAdj 
)
static

The SP register is moved in steps of 'MaxImmU16' towards the top of the frame.

During these steps, it may be necessary to re-load registers. IfNeededLDAWSP emits the necessary LDAWSP instructions to move the SP only as far as to make 'OffsetFromTop' reachable using an LDAWSP_lru6.

Parameters
OffsetFromTopthe spill offset from the top of the frame.
[in,out]RemainingAdjthe current SP offset from the top of the frame.

Definition at line 119 of file XCoreFrameLowering.cpp.

References llvm::MachineInstrBuilder::addImm(), assert(), llvm::BuildMI(), isImmU6(), MaxImmU16, MBB, MBBI, and TII.

Referenced by llvm::XCoreFrameLowering::emitEpilogue(), and RestoreSpillList().

◆ isImmU16()

static bool isImmU16 ( unsigned  val)
inlinestatic

◆ isImmU6()

static bool isImmU6 ( unsigned  val)
inlinestatic

◆ RestoreSpillList()

static void RestoreSpillList ( MachineBasicBlock MBB,
MachineBasicBlock::iterator  MBBI,
const DebugLoc dl,
const TargetInstrInfo TII,
int &  RemainingAdj,
SmallVectorImpl< StackSlotInfo > &  SpillList 
)
static

Restore clobbered registers with their spill slot value.

The SP will be adjusted at the same time, thus the SpillList must be ordered with the largest (negative) offsets first.

Definition at line 188 of file XCoreFrameLowering.cpp.

References llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addMemOperand(), assert(), llvm::BuildMI(), getFrameIndexMMO(), IfNeededLDAWSP(), isImmU6(), MBB, MBBI, llvm::MachineMemOperand::MOLoad, llvm::Offset, llvm::SmallVectorBase< Size_T >::size(), and TII.

Referenced by llvm::XCoreFrameLowering::emitEpilogue().

Variable Documentation

◆ FramePtr

const unsigned FramePtr = XCore::R10
static

◆ MaxImmU16

const int MaxImmU16 = (1<<16) - 1
static