blob: 916ab06ec305d60e18efc2b55f50b09d40d2d462 [file] [log] [blame]
Jia Liub22310f2012-02-18 12:03:15 +00001//===-- Thumb2InstrInfo.h - Thumb-2 Instruction Information -----*- C++ -*-===//
David Goodwinade05a32009-07-02 22:18:33 +00002//
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-2 implementation of the TargetInstrInfo class.
11//
12//===----------------------------------------------------------------------===//
13
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000014#ifndef LLVM_LIB_TARGET_ARM_THUMB2INSTRINFO_H
15#define LLVM_LIB_TARGET_ARM_THUMB2INSTRINFO_H
David Goodwinade05a32009-07-02 22:18:33 +000016
Craig Topper07720d82012-03-25 23:49:58 +000017#include "ARMBaseInstrInfo.h"
Eric Christopherae326492015-03-12 22:48:50 +000018#include "ThumbRegisterInfo.h"
David Goodwinade05a32009-07-02 22:18:33 +000019
20namespace llvm {
Evan Cheng2d51c7c2010-06-18 23:09:54 +000021class ARMSubtarget;
22class ScheduleHazardRecognizer;
David Goodwinade05a32009-07-02 22:18:33 +000023
24class Thumb2InstrInfo : public ARMBaseInstrInfo {
Eric Christopherae326492015-03-12 22:48:50 +000025 ThumbRegisterInfo RI;
David Goodwinade05a32009-07-02 22:18:33 +000026public:
27 explicit Thumb2InstrInfo(const ARMSubtarget &STI);
28
Jim Grosbach617f84dd2012-02-28 23:53:30 +000029 /// getNoopForMachoTarget - Return the noop instruction to use for a noop.
Craig Topper6bc27bf2014-03-10 02:09:33 +000030 void getNoopForMachoTarget(MCInst &NopInst) const override;
Jim Grosbach617f84dd2012-02-28 23:53:30 +000031
David Goodwinaf7451b2009-07-08 16:09:28 +000032 // Return the non-pre/post incrementing version of 'Opc'. Return 0
33 // if there is not such an opcode.
Craig Topper6bc27bf2014-03-10 02:09:33 +000034 unsigned getUnindexedOpcode(unsigned Opc) const override;
David Goodwinaf7451b2009-07-08 16:09:28 +000035
Evan Cheng2d51c7c2010-06-18 23:09:54 +000036 void ReplaceTailWithBranchTo(MachineBasicBlock::iterator Tail,
Craig Topper6bc27bf2014-03-10 02:09:33 +000037 MachineBasicBlock *NewDest) const override;
Evan Cheng2d51c7c2010-06-18 23:09:54 +000038
Evan Cheng37bb6172010-06-22 01:18:16 +000039 bool isLegalToSplitMBBAt(MachineBasicBlock &MBB,
Craig Topper6bc27bf2014-03-10 02:09:33 +000040 MachineBasicBlock::iterator MBBI) const override;
Evan Cheng37bb6172010-06-22 01:18:16 +000041
Jakob Stoklund Olesend7b33002010-07-11 06:33:54 +000042 void copyPhysReg(MachineBasicBlock &MBB,
43 MachineBasicBlock::iterator I, DebugLoc DL,
44 unsigned DestReg, unsigned SrcReg,
Craig Topper6bc27bf2014-03-10 02:09:33 +000045 bool KillSrc) const override;
Anton Korobeynikovc5df7e22009-07-16 23:26:06 +000046
Evan Chengc47e1092009-07-27 03:14:20 +000047 void storeRegToStackSlot(MachineBasicBlock &MBB,
48 MachineBasicBlock::iterator MBBI,
49 unsigned SrcReg, bool isKill, int FrameIndex,
Evan Chengefb126a2010-05-06 19:06:44 +000050 const TargetRegisterClass *RC,
Craig Topper6bc27bf2014-03-10 02:09:33 +000051 const TargetRegisterInfo *TRI) const override;
Evan Chengc47e1092009-07-27 03:14:20 +000052
53 void loadRegFromStackSlot(MachineBasicBlock &MBB,
54 MachineBasicBlock::iterator MBBI,
55 unsigned DestReg, int FrameIndex,
Evan Chengefb126a2010-05-06 19:06:44 +000056 const TargetRegisterClass *RC,
Craig Topper6bc27bf2014-03-10 02:09:33 +000057 const TargetRegisterInfo *TRI) const override;
Evan Chengc47e1092009-07-27 03:14:20 +000058
David Goodwinade05a32009-07-02 22:18:33 +000059 /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As
60 /// such, whenever a client has an instance of instruction info, it should
61 /// always be able to get register info as well (through this method).
62 ///
Eric Christopherae326492015-03-12 22:48:50 +000063 const ThumbRegisterInfo &getRegisterInfo() const override { return RI; }
Akira Hatanakae5b6e0d2014-07-25 19:31:34 +000064
65private:
66 void expandLoadStackGuard(MachineBasicBlock::iterator MI,
67 Reloc::Model RM) const override;
David Goodwinade05a32009-07-02 22:18:33 +000068};
Evan Cheng37bb6172010-06-22 01:18:16 +000069
70/// getITInstrPredicate - Valid only in Thumb2 mode. This function is identical
71/// to llvm::getInstrPredicate except it returns AL for conditional branch
72/// instructions which are "predicated", but are not in IT blocks.
73ARMCC::CondCodes getITInstrPredicate(const MachineInstr *MI, unsigned &PredReg);
74
75
Alexander Kornienkof00654e2015-06-23 09:49:53 +000076}
David Goodwinade05a32009-07-02 22:18:33 +000077
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000078#endif