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 21b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#define GET_SUBTARGETINFO_CTOR 22b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#define GET_SUBTARGETINFO_TARGET_DESC 23b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum#include "HexagonGenSubtargetInfo.inc" 24b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 25b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumstatic cl::opt<bool> 26b4b54153ad760c69a00a08531abef4ed434a5092Tony LinthicumEnableV3("enable-hexagon-v3", cl::Hidden, 27b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum cl::desc("Enable Hexagon V3 instructions.")); 28b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 29b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicumstatic cl::opt<bool> 30b4b54153ad760c69a00a08531abef4ed434a5092Tony LinthicumEnableMemOps( 31b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum "enable-hexagon-memops", 3297e602b574b38d57384f0f877700357531a3d23eJyotsna Verma cl::Hidden, cl::ZeroOrMore, cl::ValueDisallowed, cl::init(true), 3397e602b574b38d57384f0f877700357531a3d23eJyotsna Verma cl::desc( 3497e602b574b38d57384f0f877700357531a3d23eJyotsna Verma "Generate V4 MEMOP in code generation for Hexagon target")); 3597e602b574b38d57384f0f877700357531a3d23eJyotsna Verma 3697e602b574b38d57384f0f877700357531a3d23eJyotsna Vermastatic cl::opt<bool> 3797e602b574b38d57384f0f877700357531a3d23eJyotsna VermaDisableMemOps( 3897e602b574b38d57384f0f877700357531a3d23eJyotsna Verma "disable-hexagon-memops", 3997e602b574b38d57384f0f877700357531a3d23eJyotsna Verma cl::Hidden, cl::ZeroOrMore, cl::ValueDisallowed, cl::init(false), 4097e602b574b38d57384f0f877700357531a3d23eJyotsna Verma cl::desc( 4197e602b574b38d57384f0f877700357531a3d23eJyotsna Verma "Do not generate V4 MEMOP in code generation for Hexagon target")); 427517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande 437517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pandestatic cl::opt<bool> 447517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish PandeEnableIEEERndNear( 457517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande "enable-hexagon-ieee-rnd-near", 467517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande cl::Hidden, cl::ZeroOrMore, cl::init(false), 477517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande cl::desc("Generate non-chopped conversion from fp to int.")); 48b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 49b4b54153ad760c69a00a08531abef4ed434a5092Tony LinthicumHexagonSubtarget::HexagonSubtarget(StringRef TT, StringRef CPU, StringRef FS): 50b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum HexagonGenSubtargetInfo(TT, CPU, FS), 51b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum CPUString(CPU.str()) { 52b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 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); 71b72a939d8d01ed4ab2f86cf868a3833c7cea8428Sebastian Pop 72b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum // Initialize scheduling itinerary for the specified CPU. 73b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum InstrItins = getInstrItineraryForCPU(CPUString); 74b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum 7597e602b574b38d57384f0f877700357531a3d23eJyotsna Verma // UseMemOps on by default unless disabled explicitly 7697e602b574b38d57384f0f877700357531a3d23eJyotsna Verma if (DisableMemOps) 7797e602b574b38d57384f0f877700357531a3d23eJyotsna Verma UseMemOps = false; 7897e602b574b38d57384f0f877700357531a3d23eJyotsna Verma else if (EnableMemOps) 79b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum UseMemOps = true; 80b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum else 81b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum UseMemOps = false; 827517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande 837517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande if (EnableIEEERndNear) 847517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande ModeIEEERndNear = true; 857517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande else 867517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande ModeIEEERndNear = false; 87b4b54153ad760c69a00a08531abef4ed434a5092Tony Linthicum} 887517bbc91ae1c60d3c7df8b11642c7a5bb3d5a71Sirish Pande 89