131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- HexagonSubtarget.cpp - Hexagon Subtarget Information --------------===// 2b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 3b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// The LLVM Compiler Infrastructure 4b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 5b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// This file is distributed under the University of Illinois Open Source 6b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// License. See LICENSE.TXT for details. 7b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 8b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===// 9b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 10b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// This file implements the Hexagon specific subclass of TargetSubtarget. 11b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum// 12b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum//===----------------------------------------------------------------------===// 13b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 14b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "HexagonSubtarget.h" 15b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "Hexagon.h" 167517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande#include "HexagonRegisterInfo.h" 17b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Support/CommandLine.h" 18b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "llvm/Support/ErrorHandling.h" 19b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumusing namespace llvm; 20b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "hexagon-subtarget" 22dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 23b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#define GET_SUBTARGETINFO_CTOR 24b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#define GET_SUBTARGETINFO_TARGET_DESC 25b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "HexagonGenSubtargetInfo.inc" 26b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 27b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumstatic cl::opt<bool> 28b4b54153ad760c69a00a08531abef4ed434a5092Tony LinthicumEnableV3("enable-hexagon-v3", cl::Hidden, 29b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum cl::desc("Enable Hexagon V3 instructions.")); 30b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 31b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumstatic cl::opt<bool> 32b4b54153ad760c69a00a08531abef4ed434a5092Tony LinthicumEnableMemOps( 33b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum "enable-hexagon-memops", 3497e602b574b38d57384f0f877700357531a3d23eJyotsna Verma cl::Hidden, cl::ZeroOrMore, cl::ValueDisallowed, cl::init(true), 3597e602b574b38d57384f0f877700357531a3d23eJyotsna Verma cl::desc( 3697e602b574b38d57384f0f877700357531a3d23eJyotsna Verma "Generate V4 MEMOP in code generation for Hexagon target")); 3797e602b574b38d57384f0f877700357531a3d23eJyotsna Verma 3897e602b574b38d57384f0f877700357531a3d23eJyotsna Vermastatic cl::opt<bool> 3997e602b574b38d57384f0f877700357531a3d23eJyotsna VermaDisableMemOps( 4097e602b574b38d57384f0f877700357531a3d23eJyotsna Verma "disable-hexagon-memops", 4197e602b574b38d57384f0f877700357531a3d23eJyotsna Verma cl::Hidden, cl::ZeroOrMore, cl::ValueDisallowed, cl::init(false), 4297e602b574b38d57384f0f877700357531a3d23eJyotsna Verma cl::desc( 4397e602b574b38d57384f0f877700357531a3d23eJyotsna Verma "Do not generate V4 MEMOP in code generation for Hexagon target")); 447517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande 457517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pandestatic cl::opt<bool> 467517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish PandeEnableIEEERndNear( 477517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande "enable-hexagon-ieee-rnd-near", 487517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande cl::Hidden, cl::ZeroOrMore, cl::init(false), 497517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande cl::desc("Generate non-chopped conversion from fp to int.")); 50b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesHexagonSubtarget & 52cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesHexagonSubtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS) { 53b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop // If the programmer has not specified a Hexagon version, default to -mv4. 54b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop if (CPUString.empty()) 55e88ed0934637a21f02ef5dc8b01075c0f8870d11Sebastian Pop CPUString = "hexagonv4"; 56b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop 57b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop if (CPUString == "hexagonv2") { 58b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop HexagonArchVersion = V2; 59b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop } else if (CPUString == "hexagonv3") { 60b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop EnableV3 = true; 61b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop HexagonArchVersion = V3; 62b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop } else if (CPUString == "hexagonv4") { 63b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop HexagonArchVersion = V4; 64b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop } else if (CPUString == "hexagonv5") { 65b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop HexagonArchVersion = V5; 66b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop } else { 67b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop llvm_unreachable("Unrecognized Hexagon processor version"); 68b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum } 69b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 70b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop ParseSubtargetFeatures(CPUString, FS); 71cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return *this; 72cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 73cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 74cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesHexagonSubtarget::HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS, 75cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const TargetMachine &TM) 76cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines : HexagonGenSubtargetInfo(TT, CPU, FS), CPUString(CPU.str()), 77cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines DL("e-m:e-p:32:32-i1:32-i64:64-a:0-n32"), 78cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines InstrInfo(initializeSubtargetDependencies(CPU, FS)), TLInfo(TM), 79cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines TSInfo(DL), FrameLowering() { 80b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop 81b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Initialize scheduling itinerary for the specified CPU. 82b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum InstrItins = getInstrItineraryForCPU(CPUString); 83b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 8497e602b574b38d57384f0f877700357531a3d23eJyotsna Verma // UseMemOps on by default unless disabled explicitly 8597e602b574b38d57384f0f877700357531a3d23eJyotsna Verma if (DisableMemOps) 8697e602b574b38d57384f0f877700357531a3d23eJyotsna Verma UseMemOps = false; 8797e602b574b38d57384f0f877700357531a3d23eJyotsna Verma else if (EnableMemOps) 88b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum UseMemOps = true; 89b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum else 90b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum UseMemOps = false; 917517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande 927517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande if (EnableIEEERndNear) 937517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande ModeIEEERndNear = true; 947517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande else 957517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande ModeIEEERndNear = false; 96b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 977517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande 98354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka// Pin the vtable to this file. 99354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzkavoid HexagonSubtarget::anchor() {} 100