131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- MSP430InstrInfo.h - MSP430 Instruction Information ------*- C++ -*-===//
2f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//
3f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//                     The LLVM Compiler Infrastructure
4f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//
5f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov// This file is distributed under the University of Illinois Open Source
6f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov// License. See LICENSE.TXT for details.
7f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//
8f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//===----------------------------------------------------------------------===//
9f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//
10f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov// This file contains the MSP430 implementation of the TargetInstrInfo class.
11f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//
12f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov//===----------------------------------------------------------------------===//
13f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
14f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov#ifndef LLVM_TARGET_MSP430INSTRINFO_H
15f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov#define LLVM_TARGET_MSP430INSTRINFO_H
16f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
17f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov#include "MSP430RegisterInfo.h"
1879aa3417eb6f58d668aadfedf075240a41d35a26Craig Topper#include "llvm/Target/TargetInstrInfo.h"
19f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
204db3cffe94a5285239cc0056f939c6b74a5ca0b6Evan Cheng#define GET_INSTRINFO_HEADER
214db3cffe94a5285239cc0056f939c6b74a5ca0b6Evan Cheng#include "MSP430GenInstrInfo.inc"
224db3cffe94a5285239cc0056f939c6b74a5ca0b6Evan Cheng
23f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikovnamespace llvm {
24f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
25f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikovclass MSP430TargetMachine;
26f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
27702adaba6d7442f180c6bc0bec3a2b19e1169ed9Anton Korobeynikov/// MSP430II - This namespace holds all of the target specific flags that
28702adaba6d7442f180c6bc0bec3a2b19e1169ed9Anton Korobeynikov/// instruction info tracks.
29702adaba6d7442f180c6bc0bec3a2b19e1169ed9Anton Korobeynikov///
30702adaba6d7442f180c6bc0bec3a2b19e1169ed9Anton Korobeynikovnamespace MSP430II {
31702adaba6d7442f180c6bc0bec3a2b19e1169ed9Anton Korobeynikov  enum {
32702adaba6d7442f180c6bc0bec3a2b19e1169ed9Anton Korobeynikov    SizeShift   = 2,
33702adaba6d7442f180c6bc0bec3a2b19e1169ed9Anton Korobeynikov    SizeMask    = 7 << SizeShift,
34702adaba6d7442f180c6bc0bec3a2b19e1169ed9Anton Korobeynikov
35702adaba6d7442f180c6bc0bec3a2b19e1169ed9Anton Korobeynikov    SizeUnknown = 0 << SizeShift,
36702adaba6d7442f180c6bc0bec3a2b19e1169ed9Anton Korobeynikov    SizeSpecial = 1 << SizeShift,
37702adaba6d7442f180c6bc0bec3a2b19e1169ed9Anton Korobeynikov    Size2Bytes  = 2 << SizeShift,
38702adaba6d7442f180c6bc0bec3a2b19e1169ed9Anton Korobeynikov    Size4Bytes  = 3 << SizeShift,
39702adaba6d7442f180c6bc0bec3a2b19e1169ed9Anton Korobeynikov    Size6Bytes  = 4 << SizeShift
40702adaba6d7442f180c6bc0bec3a2b19e1169ed9Anton Korobeynikov  };
41702adaba6d7442f180c6bc0bec3a2b19e1169ed9Anton Korobeynikov}
42702adaba6d7442f180c6bc0bec3a2b19e1169ed9Anton Korobeynikov
434db3cffe94a5285239cc0056f939c6b74a5ca0b6Evan Chengclass MSP430InstrInfo : public MSP430GenInstrInfo {
44f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov  const MSP430RegisterInfo RI;
45f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikovpublic:
46f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov  explicit MSP430InstrInfo(MSP430TargetMachine &TM);
47f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
48f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov  /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info.  As
49f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov  /// such, whenever a client has an instance of instruction info, it should
50f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov  /// always be able to get register info as well (through this method).
51f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov  ///
52f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov  virtual const TargetRegisterInfo &getRegisterInfo() const { return RI; }
531df221f2bb8e8380e255d1bec73ab07b388d01a2Anton Korobeynikov
5441ce3cfd1b726979d09401d7f030be94c7b33f66Jakob Stoklund Olesen  void copyPhysReg(MachineBasicBlock &MBB,
5541ce3cfd1b726979d09401d7f030be94c7b33f66Jakob Stoklund Olesen                   MachineBasicBlock::iterator I, DebugLoc DL,
5641ce3cfd1b726979d09401d7f030be94c7b33f66Jakob Stoklund Olesen                   unsigned DestReg, unsigned SrcReg,
5741ce3cfd1b726979d09401d7f030be94c7b33f66Jakob Stoklund Olesen                   bool KillSrc) const;
581df221f2bb8e8380e255d1bec73ab07b388d01a2Anton Korobeynikov
59aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov  virtual void storeRegToStackSlot(MachineBasicBlock &MBB,
60aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov                                   MachineBasicBlock::iterator MI,
61d5047cb9f7f207798e1729911daa6d3752b668e3Anton Korobeynikov                                   unsigned SrcReg, bool isKill,
62d5047cb9f7f207798e1729911daa6d3752b668e3Anton Korobeynikov                                   int FrameIndex,
63746ad69e088176819981b4b2c5ac8dcd49f5e60eEvan Cheng                                   const TargetRegisterClass *RC,
64746ad69e088176819981b4b2c5ac8dcd49f5e60eEvan Cheng                                   const TargetRegisterInfo *TRI) const;
65aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov  virtual void loadRegFromStackSlot(MachineBasicBlock &MBB,
66aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov                                    MachineBasicBlock::iterator MI,
67aa29915b5822bd9af2a2b80eb95be59368743935Anton Korobeynikov                                    unsigned DestReg, int FrameIdx,
68746ad69e088176819981b4b2c5ac8dcd49f5e60eEvan Cheng                                    const TargetRegisterClass *RC,
69746ad69e088176819981b4b2c5ac8dcd49f5e60eEvan Cheng                                    const TargetRegisterInfo *TRI) const;
70d5047cb9f7f207798e1729911daa6d3752b668e3Anton Korobeynikov
71702adaba6d7442f180c6bc0bec3a2b19e1169ed9Anton Korobeynikov  unsigned GetInstSizeInBytes(const MachineInstr *MI) const;
72702adaba6d7442f180c6bc0bec3a2b19e1169ed9Anton Korobeynikov
7390593d2e1f31fd1c3be353b836b50280c3a6d243Anton Korobeynikov  // Branch folding goodness
7490593d2e1f31fd1c3be353b836b50280c3a6d243Anton Korobeynikov  bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
7590593d2e1f31fd1c3be353b836b50280c3a6d243Anton Korobeynikov  bool isUnpredicatedTerminator(const MachineInstr *MI) const;
7690593d2e1f31fd1c3be353b836b50280c3a6d243Anton Korobeynikov  bool AnalyzeBranch(MachineBasicBlock &MBB,
7790593d2e1f31fd1c3be353b836b50280c3a6d243Anton Korobeynikov                     MachineBasicBlock *&TBB, MachineBasicBlock *&FBB,
7890593d2e1f31fd1c3be353b836b50280c3a6d243Anton Korobeynikov                     SmallVectorImpl<MachineOperand> &Cond,
7990593d2e1f31fd1c3be353b836b50280c3a6d243Anton Korobeynikov                     bool AllowModify) const;
8090593d2e1f31fd1c3be353b836b50280c3a6d243Anton Korobeynikov
8190593d2e1f31fd1c3be353b836b50280c3a6d243Anton Korobeynikov  unsigned RemoveBranch(MachineBasicBlock &MBB) const;
8290593d2e1f31fd1c3be353b836b50280c3a6d243Anton Korobeynikov  unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
8390593d2e1f31fd1c3be353b836b50280c3a6d243Anton Korobeynikov                        MachineBasicBlock *FBB,
843bf912593301152b65accb9d9c37a95172f1df5aStuart Hastings                        const SmallVectorImpl<MachineOperand> &Cond,
853bf912593301152b65accb9d9c37a95172f1df5aStuart Hastings                        DebugLoc DL) const;
868644af36903d933b6f9ae80d2d51b9e340c48452Anton Korobeynikov
87f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov};
88f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
89f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov}
90f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov
91f2c3e179ecc2a6ebc259382828a5e5dc5a61d2f8Anton Korobeynikov#endif
92