1c5707112e7635d1dd2f2cc9c4f42e79a51302ccaJia Liu//===-- MipsSubtarget.cpp - Mips Subtarget Information --------------------===//
2972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes//
3972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes//                     The LLVM Compiler Infrastructure
4972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes//
84552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===//
9972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes//
105b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng// This file implements the Mips specific subclass of TargetSubtargetInfo.
11972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes//
124552c9a3b34ad9b2085635266348d0d9b95514a6Akira Hatanaka//===----------------------------------------------------------------------===//
13972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes
14972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "MipsSubtarget.h"
15972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes#include "Mips.h"
1681a424b3c5e7be03d66d5c7fd241f2aac47d1a2cAkira Hatanaka#include "MipsRegisterInfo.h"
173e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h"
1894214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
1994214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng#define GET_SUBTARGETINFO_TARGET_DESC
20ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng#define GET_SUBTARGETINFO_CTOR
21385e930d55f3ecd3c9538823dfa5896a12461845Evan Cheng#include "MipsGenSubtargetInfo.inc"
2294214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
23972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopesusing namespace llvm;
24972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes
252d24e2a396a1d211baaeedf32148a3b657240170David Blaikievoid MipsSubtarget::anchor() { }
262d24e2a396a1d211baaeedf32148a3b657240170David Blaikie
27276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan ChengMipsSubtarget::MipsSubtarget(const std::string &TT, const std::string &CPU,
28e7338cd550a4ccde6796d2987b482ea9f0e239efAkira Hatanaka                             const std::string &FS, bool little,
29e7338cd550a4ccde6796d2987b482ea9f0e239efAkira Hatanaka                             Reloc::Model RM) :
300ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng  MipsGenSubtargetInfo(TT, CPU, FS),
31bb481f882093fb738d2bb15610c79364bada5496Jia Liu  MipsArchVersion(Mips32), MipsABI(UnknownABI), IsLittle(little),
320e64f810a521806838bf90d77f081d3a1da98b5eAkira Hatanaka  IsSingleFloat(false), IsFP64bit(false), IsGP64bit(false), HasVFPU(false),
330e64f810a521806838bf90d77f081d3a1da98b5eAkira Hatanaka  IsLinux(true), HasSEInReg(false), HasCondMov(false), HasMulDivAdd(false),
3466e19c3e9db6e2727be21074a52f5c9fa187050fAkira Hatanaka  HasMinMax(false), HasSwap(false), HasBitCount(false), InMips16Mode(false)
35972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes{
36276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng  std::string CPUName = CPU;
37276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng  if (CPUName.empty())
38ed2a7d2780399cb2b4fce1e44994949895f6af49Akira Hatanaka    CPUName = "mips32";
39972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes
40972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes  // Parse features string.
410ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng  ParseSubtargetFeatures(CPUName, FS);
4243d526d162c69f29a1cc6734014576eade49529bBruno Cardoso Lopes
4394214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng  // Initialize scheduling itinerary for the specified CPU.
4494214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng  InstrItins = getInstrItineraryForCPU(CPUName);
4594214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
468c1b4bf0669738ce96be541c3a08c0d9ff6dab91Akira Hatanaka  // Set MipsABI if it hasn't been set yet.
478c1b4bf0669738ce96be541c3a08c0d9ff6dab91Akira Hatanaka  if (MipsABI == UnknownABI)
48bb481f882093fb738d2bb15610c79364bada5496Jia Liu    MipsABI = hasMips64() ? N64 : O32;
498c1b4bf0669738ce96be541c3a08c0d9ff6dab91Akira Hatanaka
508c1b4bf0669738ce96be541c3a08c0d9ff6dab91Akira Hatanaka  // Check if Architecture and ABI are compatible.
518c1b4bf0669738ce96be541c3a08c0d9ff6dab91Akira Hatanaka  assert(((!hasMips64() && (isABI_O32() || isABI_EABI())) ||
528c1b4bf0669738ce96be541c3a08c0d9ff6dab91Akira Hatanaka          (hasMips64() && (isABI_N32() || isABI_N64()))) &&
538c1b4bf0669738ce96be541c3a08c0d9ff6dab91Akira Hatanaka         "Invalid  Arch & ABI pair.");
548c1b4bf0669738ce96be541c3a08c0d9ff6dab91Akira Hatanaka
5543d526d162c69f29a1cc6734014576eade49529bBruno Cardoso Lopes  // Is the target system Linux ?
5643d526d162c69f29a1cc6734014576eade49529bBruno Cardoso Lopes  if (TT.find("linux") == std::string::npos)
5743d526d162c69f29a1cc6734014576eade49529bBruno Cardoso Lopes    IsLinux = false;
58e7338cd550a4ccde6796d2987b482ea9f0e239efAkira Hatanaka
59e7338cd550a4ccde6796d2987b482ea9f0e239efAkira Hatanaka  // Set UseSmallSection.
60e7338cd550a4ccde6796d2987b482ea9f0e239efAkira Hatanaka  UseSmallSection = !IsLinux && (RM == Reloc::Static);
61972f5896e417d8e81cf400083fab15a37b6d4277Bruno Cardoso Lopes}
6281a424b3c5e7be03d66d5c7fd241f2aac47d1a2cAkira Hatanaka
6381a424b3c5e7be03d66d5c7fd241f2aac47d1a2cAkira Hatanakabool
6481a424b3c5e7be03d66d5c7fd241f2aac47d1a2cAkira HatanakaMipsSubtarget::enablePostRAScheduler(CodeGenOpt::Level OptLevel,
65864f66085cd9543070ef01b9f7371c110ecd7898Akira Hatanaka                                    TargetSubtargetInfo::AntiDepBreakMode &Mode,
66864f66085cd9543070ef01b9f7371c110ecd7898Akira Hatanaka                                     RegClassVector &CriticalPathRCs) const {
6724d86e0ca90a9697b5ad6673b5aa51a1ac59c266Akira Hatanaka  Mode = TargetSubtargetInfo::ANTIDEP_NONE;
6881a424b3c5e7be03d66d5c7fd241f2aac47d1a2cAkira Hatanaka  CriticalPathRCs.clear();
6981a424b3c5e7be03d66d5c7fd241f2aac47d1a2cAkira Hatanaka  CriticalPathRCs.push_back(hasMips64() ?
7081a424b3c5e7be03d66d5c7fd241f2aac47d1a2cAkira Hatanaka                            &Mips::CPU64RegsRegClass : &Mips::CPURegsRegClass);
715ca6b02d22442a8b55a523d42981e026b3b07dcbAkira Hatanaka  return OptLevel >= CodeGenOpt::Aggressive;
7281a424b3c5e7be03d66d5c7fd241f2aac47d1a2cAkira Hatanaka}
73