MipsSubtarget.h revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- MipsSubtarget.h - Define Subtarget for the Mips ---------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file declares the Mips specific subclass of TargetSubtargetInfo.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#ifndef MIPSSUBTARGET_H
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MIPSSUBTARGET_H
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/MC/MCInstrItineraries.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Support/ErrorHandling.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/Target/TargetSubtargetInfo.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string>
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GET_SUBTARGETINFO_HEADER
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "MipsGenSubtargetInfo.inc"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace llvm {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StringRef;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MipsTargetMachine;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass MipsSubtarget : public MipsGenSubtargetInfo {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void anchor();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // NOTE: O64 will not be supported.
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum MipsABIEnum {
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    UnknownABI, O32, N32, N64, EABI
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum MipsArchEnum { Mips32, Mips32r2, Mips4, Mips64, Mips64r2 };
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mips architecture version
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MipsArchEnum MipsArchVersion;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mips supported ABIs
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MipsABIEnum MipsABI;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IsLittle - The target is Little Endian
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsLittle;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IsSingleFloat - The target only supports single precision float
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // point operations. This enable the target to use all 32 32-bit
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // floating point registers instead of only using even ones.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsSingleFloat;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IsFP64bit - The target processor has 64-bit floating point registers.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsFP64bit;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IsFP64bit - General-purpose registers are 64 bits wide
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsGP64bit;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HasVFPU - Processor has a vector floating point unit.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasVFPU;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CPU supports cnMIPS (Cavium Networks Octeon CPU).
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasCnMips;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // isLinux - Target system is Linux. Is false we consider ELFOS for now.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsLinux;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UseSmallSection - Small section is used.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool UseSmallSection;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Features related to the presence of specific instructions.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HasSEInReg - SEB and SEH (signext in register) instructions.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasSEInReg;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HasCondMov - Conditional mov (MOVZ, MOVN) instructions.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasCondMov;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HasSwap - Byte and half swap instructions.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasSwap;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HasBitCount - Count leading '1' and '0' bits.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasBitCount;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HasFPIdx -- Floating point indexed load/store instructions.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasFPIdx;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // InMips16 -- can process Mips16 instructions
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool InMips16Mode;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mips16 hard float
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool InMips16HardFloat;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PreviousInMips16 -- the function we just processed was in Mips 16 Mode
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool PreviousInMips16Mode;
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // InMicroMips -- can process MicroMips instructions
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool InMicroMipsMode;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HasDSP, HasDSPR2 -- supports DSP ASE.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasDSP, HasDSPR2;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allow mixed Mips16 and Mips32 in one source file
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AllowMixed16_32;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Optimize for space by compiling all functions as Mips 16 unless
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it needs floating point. Functions needing floating point are
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // compiled as Mips32
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Os16;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HasMSA -- supports MSA ASE.
1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  bool HasMSA;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstrItineraryData InstrItins;
1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Relocation Model
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Reloc::Model RM;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We can override the determination of whether we are in mips16 mode
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as from the command line
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum {NoOverride, Mips16Override, NoMips16Override} OverrideMode;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MipsTargetMachine *TM;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Triple TargetTriple;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool enablePostRAScheduler(CodeGenOpt::Level OptLevel,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     AntiDepBreakMode& Mode,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     RegClassVector& CriticalPathRCs) const;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Only O32 and EABI supported right now.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool isABI_EABI() const { return MipsABI == EABI; }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool isABI_N64() const { return MipsABI == N64; }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool isABI_N32() const { return MipsABI == N32; }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool isABI_O32() const { return MipsABI == O32; }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned getTargetABI() const { return MipsABI; }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// This constructor initializes the data members to match that
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// of the specified triple.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MipsSubtarget(const std::string &TT, const std::string &CPU,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                const std::string &FS, bool little, Reloc::Model RM,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                MipsTargetMachine *TM);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// ParseSubtargetFeatures - Parses features string setting specified
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// subtarget options.  Definition of function is auto generated by tblgen.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool hasMips32() const { return MipsArchVersion >= Mips32; }
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool hasMips32r2() const { return MipsArchVersion == Mips32r2 ||
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   MipsArchVersion == Mips64r2; }
15490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool hasMips64() const { return MipsArchVersion >= Mips64; }
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool hasMips64r2() const { return MipsArchVersion == Mips64r2; }
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool hasCnMips() const { return HasCnMips; }
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool isLittle() const { return IsLittle; }
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool isFP64bit() const { return IsFP64bit; }
16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool isNotFP64bit() const { return !IsFP64bit; }
16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool isGP64bit() const { return IsGP64bit; }
16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool isGP32bit() const { return !IsGP64bit; }
16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool isSingleFloat() const { return IsSingleFloat; }
16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool isNotSingleFloat() const { return !IsSingleFloat; }
16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool hasVFPU() const { return HasVFPU; }
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool inMips16Mode() const {
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (OverrideMode) {
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case NoOverride:
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return InMips16Mode;
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case Mips16Override:
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return true;
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case NoMips16Override:
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return false;
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    llvm_unreachable("Unexpected mode");
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool inMips16ModeDefault() const {
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return InMips16Mode;
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool inMips16HardFloat() const {
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return inMips16Mode() && InMips16HardFloat;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool inMicroMipsMode() const { return InMicroMipsMode; }
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool hasDSP() const { return HasDSP; }
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool hasDSPR2() const { return HasDSPR2; }
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool hasMSA() const { return HasMSA; }
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool isLinux() const { return IsLinux; }
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool useSmallSection() const { return UseSmallSection; }
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool hasStandardEncoding() const { return !inMips16Mode(); }
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool mipsSEUsesSoftFloat() const;
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool enableLongBranchPass() const {
196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return hasStandardEncoding() || allowMixed16_32();
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  /// Features related to the presence of specific instructions.
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool hasSEInReg()   const { return HasSEInReg; }
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool hasCondMov()   const { return HasCondMov; }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool hasSwap()      const { return HasSwap; }
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool hasBitCount()  const { return HasBitCount; }
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool hasFPIdx()     const { return HasFPIdx; }
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool hasExtractInsert() const { return !inMips16Mode() && hasMips32r2(); }
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const InstrItineraryData &getInstrItineraryData() const { return InstrItins; }
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool allowMixed16_32() const { return inMips16ModeDefault() |
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        AllowMixed16_32;}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool os16() const { return Os16;};
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool isTargetNaCl() const { return TargetTriple.isOSNaCl(); }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool isNotTargetNaCl() const { return !TargetTriple.isOSNaCl(); }
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// for now constant islands are on for the whole compilation unit but we only
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// really use them if in addition we are in mips16 mode
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static bool useConstantIslands();
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned stackAlignment() const { return hasMips64() ? 16 : 8; }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Grab relocation model
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Reloc::Model getRelocationModel() const {return RM;}
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief Reset the subtarget for the Mips target.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void resetSubtarget(MachineFunction *MF);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // End llvm namespace
232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)