blob: d04bde9afb5a3fbe5335636ad30d858f1811ec2e [file] [log] [blame]
Eugene Zelenko79220eae2017-08-03 22:12:30 +00001//===- MipsInstrInfo.h - Mips Instruction Information -----------*- C++ -*-===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +00007//
Akira Hatanakae2489122011-04-15 21:51:11 +00008//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +00009//
10// This file contains the Mips implementation of the TargetInstrInfo class.
11//
Sasa Stankovic7b061a42014-04-30 15:06:25 +000012// FIXME: We need to override TargetInstrInfo::getInlineAsmLength method in
13// order for MipsLongBranch pass to work correctly when the code has inline
14// assembly. The returned value doesn't have to be the asm instruction's exact
15// size in bytes; MipsLongBranch only expects it to be the correct upper bound.
Akira Hatanakae2489122011-04-15 21:51:11 +000016//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000017
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000018#ifndef LLVM_LIB_TARGET_MIPS_MIPSINSTRINFO_H
19#define LLVM_LIB_TARGET_MIPS_MIPSINSTRINFO_H
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000020
Eugene Zelenko79220eae2017-08-03 22:12:30 +000021#include "MCTargetDesc/MipsMCTargetDesc.h"
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000022#include "Mips.h"
Craig Topperb25fda92012-03-17 18:46:09 +000023#include "MipsRegisterInfo.h"
Eugene Zelenko79220eae2017-08-03 22:12:30 +000024#include "llvm/ADT/ArrayRef.h"
25#include "llvm/CodeGen/MachineBasicBlock.h"
Akira Hatanaka310e26a2013-05-13 17:57:42 +000026#include "llvm/CodeGen/MachineInstrBuilder.h"
Eugene Zelenko79220eae2017-08-03 22:12:30 +000027#include "llvm/CodeGen/MachineMemOperand.h"
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000028#include "llvm/Target/TargetInstrInfo.h"
Eugene Zelenko79220eae2017-08-03 22:12:30 +000029#include <cstdint>
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000030
Evan Cheng703a0fb2011-07-01 17:57:27 +000031#define GET_INSTRINFO_HEADER
32#include "MipsGenInstrInfo.inc"
33
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000034namespace llvm {
Eugene Zelenko79220eae2017-08-03 22:12:30 +000035
36class MachineInstr;
37class MachineOperand;
Eric Christophera20c3cf2015-03-12 05:43:57 +000038class MipsSubtarget;
Eugene Zelenko79220eae2017-08-03 22:12:30 +000039class TargetRegisterClass;
40class TargetRegisterInfo;
41
Evan Cheng703a0fb2011-07-01 17:57:27 +000042class MipsInstrInfo : public MipsGenInstrInfo {
Juergen Ributzkad12ccbd2013-11-19 00:57:56 +000043 virtual void anchor();
Eugene Zelenko79220eae2017-08-03 22:12:30 +000044
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000045protected:
Eric Christopher675cb4d2014-07-18 23:25:00 +000046 const MipsSubtarget &Subtarget;
Akira Hatanaka5d5e0d82011-12-12 22:39:35 +000047 unsigned UncondBrOpc;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000048
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000049public:
Akira Hatanaka7320b232013-03-01 01:10:17 +000050 enum BranchType {
51 BT_None, // Couldn't analyze branch.
52 BT_NoBranch, // No branches found.
53 BT_Uncond, // One unconditional branch.
54 BT_Cond, // One conditional branch.
55 BT_CondUncond, // A conditional branch followed by an unconditional branch.
56 BT_Indirect // One indirct branch.
57 };
58
Eric Christopher675cb4d2014-07-18 23:25:00 +000059 explicit MipsInstrInfo(const MipsSubtarget &STI, unsigned UncondBrOpc);
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000060
Eric Christopher675cb4d2014-07-18 23:25:00 +000061 static const MipsInstrInfo *create(MipsSubtarget &STI);
Akira Hatanakafab89292012-08-02 18:21:47 +000062
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000063 /// Branch Analysis
Jacques Pienaar71c30a12016-07-15 14:41:04 +000064 bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,
Craig Topper56c590a2014-04-29 07:58:02 +000065 MachineBasicBlock *&FBB,
66 SmallVectorImpl<MachineOperand> &Cond,
67 bool AllowModify) const override;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000068
Matt Arsenault1b9fc8e2016-09-14 20:43:16 +000069 unsigned removeBranch(MachineBasicBlock &MBB,
Matt Arsenaulta2b036e2016-09-14 17:23:48 +000070 int *BytesRemoved = nullptr) const override;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000071
Matt Arsenaulte8e0f5c2016-09-14 17:24:15 +000072 unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
Ahmed Bougachac88bf542015-06-11 19:30:37 +000073 MachineBasicBlock *FBB, ArrayRef<MachineOperand> Cond,
Matt Arsenaulta2b036e2016-09-14 17:23:48 +000074 const DebugLoc &DL,
75 int *BytesAdded = nullptr) const override;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000076
Craig Topper56c590a2014-04-29 07:58:02 +000077 bool
Matt Arsenault1b9fc8e2016-09-14 20:43:16 +000078 reverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const override;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000079
Jacques Pienaar71c30a12016-07-15 14:41:04 +000080 BranchType analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,
Akira Hatanaka7320b232013-03-01 01:10:17 +000081 MachineBasicBlock *&FBB,
82 SmallVectorImpl<MachineOperand> &Cond,
83 bool AllowModify,
Jacques Pienaar71c30a12016-07-15 14:41:04 +000084 SmallVectorImpl<MachineInstr *> &BranchInstrs) const;
Akira Hatanaka7320b232013-03-01 01:10:17 +000085
Daniel Sanderse8efff32016-03-14 16:24:05 +000086 /// Determine the opcode of a non-delay slot form for a branch if one exists.
87 unsigned getEquivalentCompactForm(const MachineBasicBlock::iterator I) const;
88
89 /// Predicate to determine if an instruction can go in a forbidden slot.
90 bool SafeInForbiddenSlot(const MachineInstr &MI) const;
91
92 /// Predicate to determine if an instruction has a forbidden slot.
93 bool HasForbiddenSlot(const MachineInstr &MI) const;
94
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000095 /// Insert nop instruction when hazard condition is found
Craig Topper56c590a2014-04-29 07:58:02 +000096 void insertNoop(MachineBasicBlock &MBB,
97 MachineBasicBlock::iterator MI) const override;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000098
99 /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As
100 /// such, whenever a client has an instance of instruction info, it should
101 /// always be able to get register info as well (through this method).
Akira Hatanakacb37e132012-07-31 23:41:32 +0000102 virtual const MipsRegisterInfo &getRegisterInfo() const = 0;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000103
Akira Hatanaka067d8152013-05-13 17:43:19 +0000104 virtual unsigned getOppositeBranchOpc(unsigned Opc) const = 0;
Akira Hatanakaacd1a7d2012-06-14 01:16:45 +0000105
106 /// Return the number of bytes of code the specified instruction may be.
Sjoerd Meijer0eb96ed2016-07-29 08:16:16 +0000107 unsigned getInstSizeInBytes(const MachineInstr &MI) const override;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000108
Craig Topper56c590a2014-04-29 07:58:02 +0000109 void storeRegToStackSlot(MachineBasicBlock &MBB,
110 MachineBasicBlock::iterator MBBI,
111 unsigned SrcReg, bool isKill, int FrameIndex,
112 const TargetRegisterClass *RC,
113 const TargetRegisterInfo *TRI) const override {
Akira Hatanaka465facca2013-03-29 02:14:12 +0000114 storeRegToStack(MBB, MBBI, SrcReg, isKill, FrameIndex, RC, TRI, 0);
115 }
116
Craig Topper56c590a2014-04-29 07:58:02 +0000117 void loadRegFromStackSlot(MachineBasicBlock &MBB,
118 MachineBasicBlock::iterator MBBI,
119 unsigned DestReg, int FrameIndex,
120 const TargetRegisterClass *RC,
121 const TargetRegisterInfo *TRI) const override {
Akira Hatanaka465facca2013-03-29 02:14:12 +0000122 loadRegFromStack(MBB, MBBI, DestReg, FrameIndex, RC, TRI, 0);
123 }
124
125 virtual void storeRegToStack(MachineBasicBlock &MBB,
126 MachineBasicBlock::iterator MI,
127 unsigned SrcReg, bool isKill, int FrameIndex,
128 const TargetRegisterClass *RC,
129 const TargetRegisterInfo *TRI,
130 int64_t Offset) const = 0;
131
132 virtual void loadRegFromStack(MachineBasicBlock &MBB,
133 MachineBasicBlock::iterator MI,
134 unsigned DestReg, int FrameIndex,
135 const TargetRegisterClass *RC,
136 const TargetRegisterInfo *TRI,
137 int64_t Offset) const = 0;
138
Vasileios Kalintiris6d687782015-04-02 10:42:44 +0000139 virtual void adjustStackPtr(unsigned SP, int64_t Amount,
140 MachineBasicBlock &MBB,
141 MachineBasicBlock::iterator I) const = 0;
142
Akira Hatanaka310e26a2013-05-13 17:57:42 +0000143 /// Create an instruction which has the same operands and memory operands
144 /// as MI but has a new opcode.
145 MachineInstrBuilder genInstrWithNewOpc(unsigned NewOpc,
146 MachineBasicBlock::iterator I) const;
147
Petar Jovanovic9bff3b72017-03-31 14:31:55 +0000148 bool findCommutedOpIndices(MachineInstr &MI, unsigned &SrcOpIdx1,
149 unsigned &SrcOpIdx2) const override;
150
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000151protected:
152 bool isZeroImm(const MachineOperand &op) const;
153
154 MachineMemOperand *GetMemOperand(MachineBasicBlock &MBB, int FI,
Justin Lebar0af80cd2016-07-15 18:26:59 +0000155 MachineMemOperand::Flags Flags) const;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000156
157private:
Akira Hatanaka067d8152013-05-13 17:43:19 +0000158 virtual unsigned getAnalyzableBrOpc(unsigned Opc) const = 0;
Akira Hatanakab7fa3c92012-07-31 21:49:49 +0000159
160 void AnalyzeCondBr(const MachineInstr *Inst, unsigned Opc,
161 MachineBasicBlock *&BB,
162 SmallVectorImpl<MachineOperand> &Cond) const;
163
Benjamin Kramerbdc49562016-06-12 15:39:02 +0000164 void BuildCondBr(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
165 const DebugLoc &DL, ArrayRef<MachineOperand> Cond) const;
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000166};
167
Akira Hatanakafab89292012-08-02 18:21:47 +0000168/// Create MipsInstrInfo objects.
Eric Christopher675cb4d2014-07-18 23:25:00 +0000169const MipsInstrInfo *createMips16InstrInfo(const MipsSubtarget &STI);
170const MipsInstrInfo *createMipsSEInstrInfo(const MipsSubtarget &STI);
Akira Hatanakafab89292012-08-02 18:21:47 +0000171
Eugene Zelenko79220eae2017-08-03 22:12:30 +0000172} // end namespace llvm
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +0000173
Eugene Zelenko79220eae2017-08-03 22:12:30 +0000174#endif // LLVM_LIB_TARGET_MIPS_MIPSINSTRINFO_H