| //===-- MSP430InstrInfo.h - MSP430 Instruction Information ------*- C++ -*-===// | 
 | // | 
 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
 | // See https://llvm.org/LICENSE.txt for license information. | 
 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | // | 
 | // This file contains the MSP430 implementation of the TargetInstrInfo class. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #ifndef LLVM_LIB_TARGET_MSP430_MSP430INSTRINFO_H | 
 | #define LLVM_LIB_TARGET_MSP430_MSP430INSTRINFO_H | 
 |  | 
 | #include "MSP430RegisterInfo.h" | 
 | #include "llvm/CodeGen/TargetInstrInfo.h" | 
 |  | 
 | #define GET_INSTRINFO_HEADER | 
 | #include "MSP430GenInstrInfo.inc" | 
 |  | 
 | namespace llvm { | 
 |  | 
 | class MSP430Subtarget; | 
 |  | 
 | class MSP430InstrInfo : public MSP430GenInstrInfo { | 
 |   const MSP430RegisterInfo RI; | 
 |   virtual void anchor(); | 
 | public: | 
 |   explicit MSP430InstrInfo(MSP430Subtarget &STI); | 
 |  | 
 |   /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info.  As | 
 |   /// such, whenever a client has an instance of instruction info, it should | 
 |   /// always be able to get register info as well (through this method). | 
 |   /// | 
 |   const MSP430RegisterInfo &getRegisterInfo() const { return RI; } | 
 |  | 
 |   void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, | 
 |                    const DebugLoc &DL, Register DestReg, Register SrcReg, | 
 |                    bool KillSrc, bool RenamableDest = false, | 
 |                    bool RenamableSrc = false) const override; | 
 |  | 
 |   void storeRegToStackSlot( | 
 |       MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register SrcReg, | 
 |       bool isKill, int FrameIndex, const TargetRegisterClass *RC, | 
 |       const TargetRegisterInfo *TRI, Register VReg, | 
 |       MachineInstr::MIFlag Flags = MachineInstr::NoFlags) const override; | 
 |   void loadRegFromStackSlot( | 
 |       MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register DestReg, | 
 |       int FrameIdx, const TargetRegisterClass *RC, | 
 |       const TargetRegisterInfo *TRI, Register VReg, | 
 |       MachineInstr::MIFlag Flags = MachineInstr::NoFlags) const override; | 
 |  | 
 |   unsigned getInstSizeInBytes(const MachineInstr &MI) const override; | 
 |  | 
 |   // Branch folding goodness | 
 |   bool | 
 |   reverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const override; | 
 |   bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, | 
 |                      MachineBasicBlock *&FBB, | 
 |                      SmallVectorImpl<MachineOperand> &Cond, | 
 |                      bool AllowModify) const override; | 
 |  | 
 |   unsigned removeBranch(MachineBasicBlock &MBB, | 
 |                         int *BytesRemoved = nullptr) const override; | 
 |   unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, | 
 |                         MachineBasicBlock *FBB, ArrayRef<MachineOperand> Cond, | 
 |                         const DebugLoc &DL, | 
 |                         int *BytesAdded = nullptr) const override; | 
 |  | 
 |   int64_t getFramePoppedByCallee(const MachineInstr &I) const { | 
 |     assert(isFrameInstr(I) && "Not a frame instruction"); | 
 |     assert(I.getOperand(1).getImm() >= 0 && "Size must not be negative"); | 
 |     return I.getOperand(1).getImm(); | 
 |   } | 
 | }; | 
 |  | 
 | } | 
 |  | 
 | #endif |