xref: /aosp_15_r20/external/llvm/lib/Target/ARM/ThumbRegisterInfo.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- ThumbRegisterInfo.h - Thumb Register Information Impl -*- C++ -*-===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file contains the Thumb implementation of the TargetRegisterInfo
11*9880d681SAndroid Build Coastguard Worker // class. With the exception of emitLoadConstPool Thumb2 tracks
12*9880d681SAndroid Build Coastguard Worker // ARMBaseRegisterInfo, Thumb1 overloads the functions below.
13*9880d681SAndroid Build Coastguard Worker //
14*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
15*9880d681SAndroid Build Coastguard Worker 
16*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_ARM_THUMB1REGISTERINFO_H
17*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_ARM_THUMB1REGISTERINFO_H
18*9880d681SAndroid Build Coastguard Worker 
19*9880d681SAndroid Build Coastguard Worker #include "ARMBaseRegisterInfo.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetRegisterInfo.h"
21*9880d681SAndroid Build Coastguard Worker 
22*9880d681SAndroid Build Coastguard Worker namespace llvm {
23*9880d681SAndroid Build Coastguard Worker   class ARMSubtarget;
24*9880d681SAndroid Build Coastguard Worker   class ARMBaseInstrInfo;
25*9880d681SAndroid Build Coastguard Worker 
26*9880d681SAndroid Build Coastguard Worker struct ThumbRegisterInfo : public ARMBaseRegisterInfo {
27*9880d681SAndroid Build Coastguard Worker public:
28*9880d681SAndroid Build Coastguard Worker   ThumbRegisterInfo();
29*9880d681SAndroid Build Coastguard Worker 
30*9880d681SAndroid Build Coastguard Worker   const TargetRegisterClass *
31*9880d681SAndroid Build Coastguard Worker   getLargestLegalSuperClass(const TargetRegisterClass *RC,
32*9880d681SAndroid Build Coastguard Worker                             const MachineFunction &MF) const override;
33*9880d681SAndroid Build Coastguard Worker 
34*9880d681SAndroid Build Coastguard Worker   const TargetRegisterClass *
35*9880d681SAndroid Build Coastguard Worker   getPointerRegClass(const MachineFunction &MF,
36*9880d681SAndroid Build Coastguard Worker                      unsigned Kind = 0) const override;
37*9880d681SAndroid Build Coastguard Worker 
38*9880d681SAndroid Build Coastguard Worker   /// emitLoadConstPool - Emits a load from constpool to materialize the
39*9880d681SAndroid Build Coastguard Worker   /// specified immediate.
40*9880d681SAndroid Build Coastguard Worker   void
41*9880d681SAndroid Build Coastguard Worker   emitLoadConstPool(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI,
42*9880d681SAndroid Build Coastguard Worker                     const DebugLoc &dl, unsigned DestReg, unsigned SubIdx,
43*9880d681SAndroid Build Coastguard Worker                     int Val, ARMCC::CondCodes Pred = ARMCC::AL,
44*9880d681SAndroid Build Coastguard Worker                     unsigned PredReg = 0,
45*9880d681SAndroid Build Coastguard Worker                     unsigned MIFlags = MachineInstr::NoFlags) const override;
46*9880d681SAndroid Build Coastguard Worker 
47*9880d681SAndroid Build Coastguard Worker   // rewrite MI to access 'Offset' bytes from the FP. Update Offset to be
48*9880d681SAndroid Build Coastguard Worker   // however much remains to be handled. Return 'true' if no further
49*9880d681SAndroid Build Coastguard Worker   // work is required.
50*9880d681SAndroid Build Coastguard Worker   bool rewriteFrameIndex(MachineBasicBlock::iterator II, unsigned FrameRegIdx,
51*9880d681SAndroid Build Coastguard Worker                          unsigned FrameReg, int &Offset,
52*9880d681SAndroid Build Coastguard Worker                          const ARMBaseInstrInfo &TII) const;
53*9880d681SAndroid Build Coastguard Worker   void resolveFrameIndex(MachineInstr &MI, unsigned BaseReg,
54*9880d681SAndroid Build Coastguard Worker                          int64_t Offset) const override;
55*9880d681SAndroid Build Coastguard Worker   bool saveScavengerRegister(MachineBasicBlock &MBB,
56*9880d681SAndroid Build Coastguard Worker                              MachineBasicBlock::iterator I,
57*9880d681SAndroid Build Coastguard Worker                              MachineBasicBlock::iterator &UseMI,
58*9880d681SAndroid Build Coastguard Worker                              const TargetRegisterClass *RC,
59*9880d681SAndroid Build Coastguard Worker                              unsigned Reg) const override;
60*9880d681SAndroid Build Coastguard Worker   void eliminateFrameIndex(MachineBasicBlock::iterator II,
61*9880d681SAndroid Build Coastguard Worker                            int SPAdj, unsigned FIOperandNum,
62*9880d681SAndroid Build Coastguard Worker                            RegScavenger *RS = nullptr) const override;
63*9880d681SAndroid Build Coastguard Worker };
64*9880d681SAndroid Build Coastguard Worker }
65*9880d681SAndroid Build Coastguard Worker 
66*9880d681SAndroid Build Coastguard Worker #endif
67