MSP430InstrInfo.h revision cd81d94322a39503e4a3e87b6ee03d4fcb3465fb
1765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//===-- MSP430InstrInfo.h - MSP430 Instruction Information ------*- C++ -*-===//
2765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//
3765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//                     The LLVM Compiler Infrastructure
4765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//
5765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye// This file is distributed under the University of Illinois Open Source
6765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye// License. See LICENSE.TXT for details.
7765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//
8765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//===----------------------------------------------------------------------===//
9765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//
10765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye// This file contains the MSP430 implementation of the TargetInstrInfo class.
11765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//
12765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye//===----------------------------------------------------------------------===//
13765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
14765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye#ifndef LLVM_TARGET_MSP430INSTRINFO_H
15765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye#define LLVM_TARGET_MSP430INSTRINFO_H
16765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
17765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye#include "MSP430RegisterInfo.h"
18765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye#include "llvm/Target/TargetInstrInfo.h"
19765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
20765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye#define GET_INSTRINFO_HEADER
21765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye#include "MSP430GenInstrInfo.inc"
22765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
23765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyenamespace llvm {
24765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
25765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeclass MSP430Subtarget;
26765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
27765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye/// MSP430II - This namespace holds all of the target specific flags that
28765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye/// instruction info tracks.
29765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye///
30765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyenamespace MSP430II {
31765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  enum {
32765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    SizeShift   = 2,
33765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    SizeMask    = 7 << SizeShift,
34765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
35765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    SizeUnknown = 0 << SizeShift,
36765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    SizeSpecial = 1 << SizeShift,
37765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    Size2Bytes  = 2 << SizeShift,
38765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    Size4Bytes  = 3 << SizeShift,
39765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    Size6Bytes  = 4 << SizeShift
40765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  };
41765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye}
42765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
43765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeclass MSP430InstrInfo : public MSP430GenInstrInfo {
44765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  const MSP430RegisterInfo RI;
45765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  virtual void anchor();
46765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyepublic:
47765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  explicit MSP430InstrInfo(MSP430Subtarget &STI);
48765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
49765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info.  As
50765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /// such, whenever a client has an instance of instruction info, it should
51765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  /// always be able to get register info as well (through this method).
52765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ///
53765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  const TargetRegisterInfo &getRegisterInfo() const { return RI; }
54765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
55765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  void copyPhysReg(MachineBasicBlock &MBB,
56765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                   MachineBasicBlock::iterator I, DebugLoc DL,
57765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                   unsigned DestReg, unsigned SrcReg,
58765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                   bool KillSrc) const override;
59765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
60765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  void storeRegToStackSlot(MachineBasicBlock &MBB,
61765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                           MachineBasicBlock::iterator MI,
62765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                           unsigned SrcReg, bool isKill,
63765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                           int FrameIndex,
64765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                           const TargetRegisterClass *RC,
65765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                           const TargetRegisterInfo *TRI) const override;
66765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  void loadRegFromStackSlot(MachineBasicBlock &MBB,
67765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                            MachineBasicBlock::iterator MI,
68765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                            unsigned DestReg, int FrameIdx,
69765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                            const TargetRegisterClass *RC,
70765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                            const TargetRegisterInfo *TRI) const override;
71765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
72765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  unsigned GetInstSizeInBytes(const MachineInstr *MI) const;
73765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
74765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Branch folding goodness
75765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  bool
76765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const override;
77765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  bool isUnpredicatedTerminator(const MachineInstr *MI) const override;
78765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  bool AnalyzeBranch(MachineBasicBlock &MBB,
79765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                     MachineBasicBlock *&TBB, MachineBasicBlock *&FBB,
80765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye                     SmallVectorImpl<MachineOperand> &Cond,
81                     bool AllowModify) const override;
82
83  unsigned RemoveBranch(MachineBasicBlock &MBB) const override;
84  unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
85                        MachineBasicBlock *FBB,
86                        const SmallVectorImpl<MachineOperand> &Cond,
87                        DebugLoc DL) const override;
88
89};
90
91}
92
93#endif
94