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