LLVM 19.0.0git
Macros | Functions | Variables
ARMExpandPseudoInsts.cpp File Reference
#include "ARM.h"
#include "ARMBaseInstrInfo.h"
#include "ARMBaseRegisterInfo.h"
#include "ARMConstantPoolValue.h"
#include "ARMMachineFunctionInfo.h"
#include "ARMSubtarget.h"
#include "MCTargetDesc/ARMAddressingModes.h"
#include "llvm/CodeGen/LivePhysRegs.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineJumpTableInfo.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/Support/Debug.h"

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "arm-pseudo"
 
#define ARM_EXPAND_PSEUDO_NAME   "ARM pseudo instruction expansion pass"
 

Functions

 INITIALIZE_PASS (ARMExpandPseudo, DEBUG_TYPE, ARM_EXPAND_PSEUDO_NAME, false, false) namespace
 
static const NEONLdStTableEntry * LookupNEONLdSt (unsigned Opcode)
 LookupNEONLdSt - Search the NEONLdStTable for information about a NEON load or store pseudo instruction.
 
static void GetDSubRegs (unsigned Reg, NEONRegSpacing RegSpc, const TargetRegisterInfo *TRI, unsigned &D0, unsigned &D1, unsigned &D2, unsigned &D3)
 GetDSubRegs - Get 4 D subregisters of a Q, QQ, or QQQQ register, corresponding to the specified register spacing.
 
static bool IsAnAddressOperand (const MachineOperand &MO)
 
static MachineOperand makeImplicit (const MachineOperand &MO)
 
static MachineOperand getMovOperand (const MachineOperand &MO, unsigned TargetFlag)
 
static void determineGPRegsToClear (const MachineInstr &MI, const std::initializer_list< unsigned > &Regs, SmallVectorImpl< unsigned > &ClearRegs)
 
static bool determineFPRegsToClear (const MachineInstr &MI, BitVector &ClearRegs)
 
static bool definesOrUsesFPReg (const MachineInstr &MI)
 
static void addExclusiveRegPair (MachineInstrBuilder &MIB, MachineOperand &Reg, unsigned Flags, bool IsThumb, const TargetRegisterInfo *TRI)
 ARM's ldrexd/strexd take a consecutive register pair (represented as a single GPRPair register), Thumb's take two separate registers so we need to extract the subregs from the pair.
 
static void CMSEPushCalleeSaves (const TargetInstrInfo &TII, MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, int JumpReg, const LivePhysRegs &LiveRegs, bool Thumb1Only)
 
static void CMSEPopCalleeSaves (const TargetInstrInfo &TII, MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, int JumpReg, bool Thumb1Only)
 

Variables

static cl::opt< boolVerifyARMPseudo ("verify-arm-pseudo-expand", cl::Hidden, cl::desc("Verify machine code after expanding ARM pseudos"))
 
static const NEONLdStTableEntry NEONLdStTable []
 
static const int CMSE_FP_SAVE_SIZE = 136
 

Macro Definition Documentation

◆ ARM_EXPAND_PSEUDO_NAME

#define ARM_EXPAND_PSEUDO_NAME   "ARM pseudo instruction expansion pass"

Definition at line 38 of file ARMExpandPseudoInsts.cpp.

◆ DEBUG_TYPE

#define DEBUG_TYPE   "arm-pseudo"

Definition at line 32 of file ARMExpandPseudoInsts.cpp.

Function Documentation

◆ addExclusiveRegPair()

static void addExclusiveRegPair ( MachineInstrBuilder MIB,
MachineOperand Reg,
unsigned  Flags,
bool  IsThumb,
const TargetRegisterInfo TRI 
)
static

ARM's ldrexd/strexd take a consecutive register pair (represented as a single GPRPair register), Thumb's take two separate registers so we need to extract the subregs from the pair.

Definition at line 1924 of file ARMExpandPseudoInsts.cpp.

References llvm::MachineInstrBuilder::addReg(), and TRI.

◆ CMSEPopCalleeSaves()

static void CMSEPopCalleeSaves ( const TargetInstrInfo TII,
MachineBasicBlock MBB,
MachineBasicBlock::iterator  MBBI,
int  JumpReg,
bool  Thumb1Only 
)
static

◆ CMSEPushCalleeSaves()

static void CMSEPushCalleeSaves ( const TargetInstrInfo TII,
MachineBasicBlock MBB,
MachineBasicBlock::iterator  MBBI,
int  JumpReg,
const LivePhysRegs LiveRegs,
bool  Thumb1Only 
)
static

◆ definesOrUsesFPReg()

static bool definesOrUsesFPReg ( const MachineInstr MI)
static

Definition at line 1749 of file ARMExpandPseudoInsts.cpp.

References MI.

◆ determineFPRegsToClear()

static bool determineFPRegsToClear ( const MachineInstr MI,
BitVector ClearRegs 
)
static

Definition at line 1212 of file ARMExpandPseudoInsts.cpp.

References MI, and llvm::BitVector::reset().

◆ determineGPRegsToClear()

static void determineGPRegsToClear ( const MachineInstr MI,
const std::initializer_list< unsigned > &  Regs,
SmallVectorImpl< unsigned > &  ClearRegs 
)
static

◆ GetDSubRegs()

static void GetDSubRegs ( unsigned  Reg,
NEONRegSpacing  RegSpc,
const TargetRegisterInfo TRI,
unsigned D0,
unsigned D1,
unsigned D2,
unsigned D3 
)
static

GetDSubRegs - Get 4 D subregisters of a Q, QQ, or QQQQ register, corresponding to the specified register spacing.

Not all of the results are necessarily valid, e.g., a Q register only has 2 D subregisters.

Definition at line 518 of file ARMExpandPseudoInsts.cpp.

References assert(), and TRI.

◆ getMovOperand()

static MachineOperand getMovOperand ( const MachineOperand MO,
unsigned  TargetFlag 
)
static

◆ INITIALIZE_PASS()

INITIALIZE_PASS ( ARMExpandPseudo  ,
DEBUG_TYPE  ,
ARM_EXPAND_PSEUDO_NAME  ,
false  ,
false   
)

Definition at line 121 of file ARMExpandPseudoInsts.cpp.

References LLVM_ATTRIBUTE_UNUSED, and llvm::operator<().

◆ IsAnAddressOperand()

static bool IsAnAddressOperand ( const MachineOperand MO)
static

◆ LookupNEONLdSt()

static const NEONLdStTableEntry * LookupNEONLdSt ( unsigned  Opcode)
static

LookupNEONLdSt - Search the NEONLdStTable for information about a NEON load or store pseudo instruction.

Definition at line 499 of file ARMExpandPseudoInsts.cpp.

References assert(), I, llvm::is_sorted(), llvm::lower_bound(), and NEONLdStTable.

◆ makeImplicit()

static MachineOperand makeImplicit ( const MachineOperand MO)
static

Definition at line 948 of file ARMExpandPseudoInsts.cpp.

References llvm::MachineOperand::setImplicit().

Variable Documentation

◆ CMSE_FP_SAVE_SIZE

const int CMSE_FP_SAVE_SIZE = 136
static

Definition at line 1160 of file ARMExpandPseudoInsts.cpp.

◆ NEONLdStTable

const NEONLdStTableEntry NEONLdStTable[]
static

Definition at line 170 of file ARMExpandPseudoInsts.cpp.

Referenced by LookupNEONLdSt().

◆ VerifyARMPseudo

cl::opt< bool > VerifyARMPseudo("verify-arm-pseudo-expand", cl::Hidden, cl::desc("Verify machine code after expanding ARM pseudos")) ( "verify-arm-pseudo-expand"  ,
cl::Hidden  ,
cl::desc("Verify machine code after expanding ARM pseudos")   
)
static