blob: 1bfa1d0bdc34c876b16901ea765209dda76ab145 [file] [log] [blame]
David Goodwinb50ea5c2009-07-02 22:18:33 +00001//===- Thumb1InstrInfo.h - Thumb-1 Instruction Information ----------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file contains the Thumb-1 implementation of the TargetInstrInfo class.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef THUMB1INSTRUCTIONINFO_H
15#define THUMB1INSTRUCTIONINFO_H
16
17#include "llvm/Target/TargetInstrInfo.h"
18#include "ARM.h"
19#include "ARMInstrInfo.h"
20#include "Thumb1RegisterInfo.h"
21
22namespace llvm {
23 class ARMSubtarget;
24
25class Thumb1InstrInfo : public ARMBaseInstrInfo {
26 Thumb1RegisterInfo RI;
27public:
28 explicit Thumb1InstrInfo(const ARMSubtarget &STI);
29
30 /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As
31 /// such, whenever a client has an instance of instruction info, it should
32 /// always be able to get register info as well (through this method).
33 ///
34 const Thumb1RegisterInfo &getRegisterInfo() const { return RI; }
35
36 bool spillCalleeSavedRegisters(MachineBasicBlock &MBB,
37 MachineBasicBlock::iterator MI,
38 const std::vector<CalleeSavedInfo> &CSI) const;
39 bool restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
40 MachineBasicBlock::iterator MI,
41 const std::vector<CalleeSavedInfo> &CSI) const;
42
43 bool isMoveInstr(const MachineInstr &MI,
44 unsigned &SrcReg, unsigned &DstReg,
45 unsigned &SrcSubIdx, unsigned &DstSubIdx) const;
46 unsigned isLoadFromStackSlot(const MachineInstr *MI,
47 int &FrameIndex) const;
48 unsigned isStoreToStackSlot(const MachineInstr *MI,
49 int &FrameIndex) const;
50
51 bool copyRegToReg(MachineBasicBlock &MBB,
52 MachineBasicBlock::iterator I,
53 unsigned DestReg, unsigned SrcReg,
54 const TargetRegisterClass *DestRC,
55 const TargetRegisterClass *SrcRC) const;
56 void storeRegToStackSlot(MachineBasicBlock &MBB,
57 MachineBasicBlock::iterator MBBI,
58 unsigned SrcReg, bool isKill, int FrameIndex,
59 const TargetRegisterClass *RC) const;
60
61 void storeRegToAddr(MachineFunction &MF, unsigned SrcReg, bool isKill,
62 SmallVectorImpl<MachineOperand> &Addr,
63 const TargetRegisterClass *RC,
64 SmallVectorImpl<MachineInstr*> &NewMIs) const;
65
66 void loadRegFromStackSlot(MachineBasicBlock &MBB,
67 MachineBasicBlock::iterator MBBI,
68 unsigned DestReg, int FrameIndex,
69 const TargetRegisterClass *RC) const;
70
71 void loadRegFromAddr(MachineFunction &MF, unsigned DestReg,
72 SmallVectorImpl<MachineOperand> &Addr,
73 const TargetRegisterClass *RC,
74 SmallVectorImpl<MachineInstr*> &NewMIs) const;
75
76 bool canFoldMemoryOperand(const MachineInstr *MI,
77 const SmallVectorImpl<unsigned> &Ops) const;
78
79 MachineInstr* foldMemoryOperandImpl(MachineFunction &MF,
80 MachineInstr* MI,
81 const SmallVectorImpl<unsigned> &Ops,
82 int FrameIndex) const;
83
84 MachineInstr* foldMemoryOperandImpl(MachineFunction &MF,
85 MachineInstr* MI,
86 const SmallVectorImpl<unsigned> &Ops,
87 MachineInstr* LoadMI) const {
88 return 0;
89 }
90};
91}
92
93#endif // THUMB1INSTRUCTIONINFO_H