HexagonSubtarget.cpp revision cd81d94322a39503e4a3e87b6ee03d4fcb3465fb
12f1efd639c8659582d0df2b8f927a018b057037fJeffrey Yasskin//===-- HexagonSubtarget.cpp - Hexagon Subtarget Information --------------===// 22bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// 32bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// The LLVM Compiler Infrastructure 42bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// 52bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// This file is distributed under the University of Illinois Open Source 62bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// License. See LICENSE.TXT for details. 72bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson// 82bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson//===----------------------------------------------------------------------===// 95217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson// 105217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson// This file implements the Hexagon specific subclass of TargetSubtarget. 115217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson// 125217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson//===----------------------------------------------------------------------===// 135217007006e91fa4bbfe88fde5149f5db293b247Owen Anderson 142bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson#include "HexagonSubtarget.h" 152bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson#include "Hexagon.h" 162bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson#include "HexagonRegisterInfo.h" 172bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson#include "llvm/Support/CommandLine.h" 181afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner#include "llvm/Support/ErrorHandling.h" 1948b2f3e4850cd27d54224cd42da8a160d6b95984Owen Andersonusing namespace llvm; 20c34ebf65af0139eaf5cb0969fabcd32c0b6e1710Owen Anderson 21eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson#define DEBUG_TYPE "hexagon-subtarget" 22f53c371983908f02678b0e12c5d18466dcc70ffdOwen Anderson 23b4cc66d7b71357d379257930f96929e26697805dJeffrey Yasskin#define GET_SUBTARGETINFO_CTOR 24081134741b40b342fb2f85722c9cea5d412489a8Chris Lattner#define GET_SUBTARGETINFO_TARGET_DESC 25914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson#include "HexagonGenSubtargetInfo.inc" 26001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson 272a4a6fecf0b8c92223f8fdf19545b564b7d3fcdeJay Foadstatic cl::opt<bool> 28001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen AndersonEnableV3("enable-hexagon-v3", cl::Hidden, 29ce032b483ca96093b84f69178cdb2d047e124332Owen Anderson cl::desc("Enable Hexagon V3 instructions.")); 30ad715f86c90b06cc4ab9e1336d1bc3bf13ecb16dJeffrey Yasskin 31aad3fb7362aff151e97ad457005ea3f2872fe868Owen Andersonstatic cl::opt<bool> 32006c77df8cc7f6a9dac575600b797b8ba32b29ebOwen AndersonEnableMemOps( 3316e298f98024bcff5c7219a96cac216114c30dadOwen Anderson "enable-hexagon-memops", 342bc29dc0bcb3c1441477a062e4a5cffff175c8caOwen Anderson cl::Hidden, cl::ZeroOrMore, cl::ValueDisallowed, cl::init(true), 35eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson cl::desc( 36001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson "Generate V4 MEMOP in code generation for Hexagon target")); 37914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson 3812ddd409535b52a7fa5157ded9a4cedd161fedb6Benjamin Kramerstatic cl::opt<bool> 39001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen AndersonDisableMemOps( 40ce032b483ca96093b84f69178cdb2d047e124332Owen Anderson "disable-hexagon-memops", 41001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson cl::Hidden, cl::ZeroOrMore, cl::ValueDisallowed, cl::init(false), 42001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson cl::desc( 43001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson "Do not generate V4 MEMOP in code generation for Hexagon target")); 44001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson 45db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattnerstatic cl::opt<bool> 46db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris LattnerEnableIEEERndNear( 47001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson "enable-hexagon-ieee-rnd-near", 48001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson cl::Hidden, cl::ZeroOrMore, cl::init(false), 49001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson cl::desc("Generate non-chopped conversion from fp to int.")); 50001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson 51001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen AndersonHexagonSubtarget & 52001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen AndersonHexagonSubtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS) { 53001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson // If the programmer has not specified a Hexagon version, default to -mv4. 54001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson if (CPUString.empty()) 55001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson CPUString = "hexagonv4"; 56001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson 57001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson if (CPUString == "hexagonv2") { 58001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson HexagonArchVersion = V2; 59001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson } else if (CPUString == "hexagonv3") { 60001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson EnableV3 = true; 61001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson HexagonArchVersion = V3; 62001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson } else if (CPUString == "hexagonv4") { 63001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson HexagonArchVersion = V4; 64001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson } else if (CPUString == "hexagonv5") { 65001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson HexagonArchVersion = V5; 66914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson } else { 67914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson llvm_unreachable("Unrecognized Hexagon processor version"); 68914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson } 69914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson 70914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson ParseSubtargetFeatures(CPUString, FS); 71914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson return *this; 72914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson} 73914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson 74914e50c841bbc248ab94144c11813b5785b1292dOwen AndersonHexagonSubtarget::HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS, 75914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson const TargetMachine &TM) 76914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson : HexagonGenSubtargetInfo(TT, CPU, FS), CPUString(CPU.str()), 77914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson DL("e-m:e-p:32:32-i1:32-i64:64-a:0-n32"), 78914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson InstrInfo(initializeSubtargetDependencies(CPU, FS)), TLInfo(TM), 79914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson TSInfo(DL), FrameLowering() { 80914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson 81914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson // Initialize scheduling itinerary for the specified CPU. 82914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson InstrItins = getInstrItineraryForCPU(CPUString); 83914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson 84914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson // UseMemOps on by default unless disabled explicitly 85914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson if (DisableMemOps) 86914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson UseMemOps = false; 87914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson else if (EnableMemOps) 88914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson UseMemOps = true; 89914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson else 90914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson UseMemOps = false; 91914e50c841bbc248ab94144c11813b5785b1292dOwen Anderson 92b227925fa313428045f554187b0136d084d723f6Chris Lattner if (EnableIEEERndNear) 93b227925fa313428045f554187b0136d084d723f6Chris Lattner ModeIEEERndNear = true; 94b227925fa313428045f554187b0136d084d723f6Chris Lattner else 95b227925fa313428045f554187b0136d084d723f6Chris Lattner ModeIEEERndNear = false; 96b227925fa313428045f554187b0136d084d723f6Chris Lattner} 97b227925fa313428045f554187b0136d084d723f6Chris Lattner 98b227925fa313428045f554187b0136d084d723f6Chris Lattner// Pin the vtable to this file. 99b227925fa313428045f554187b0136d084d723f6Chris Lattnervoid HexagonSubtarget::anchor() {} 100b227925fa313428045f554187b0136d084d723f6Chris Lattner