11d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===-- SystemZSubtarget.cpp - SystemZ subtarget information --------------===// 21d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// 31d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// The LLVM Compiler Infrastructure 41d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// 51d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// This file is distributed under the University of Illinois Open Source 61d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// License. See LICENSE.TXT for details. 71d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// 81d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===----------------------------------------------------------------------===// 91d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 101d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "SystemZSubtarget.h" 1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "MCTargetDesc/SystemZMCTargetDesc.h" 121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/IR/GlobalValue.h" 131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 14dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesusing namespace llvm; 15dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 16dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "systemz-subtarget" 17dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 181d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#define GET_SUBTARGETINFO_TARGET_DESC 191d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#define GET_SUBTARGETINFO_CTOR 201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "SystemZGenSubtargetInfo.inc" 211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 22c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines// Pin the vtable to this file. 23354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzkavoid SystemZSubtarget::anchor() {} 24354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka 25c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen HinesSystemZSubtarget & 26c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen HinesSystemZSubtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS) { 271d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand std::string CPUName = CPU; 281d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand if (CPUName.empty()) 29793ce99ea79b2a51a9ace18adcae60678efaae9eRichard Sandiford CPUName = "generic"; 301d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Parse features string. 311d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand ParseSubtargetFeatures(CPUName, FS); 32c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines return *this; 331d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} 341d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 35c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen HinesSystemZSubtarget::SystemZSubtarget(const std::string &TT, 36c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const std::string &CPU, 37c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const std::string &FS, 38c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const TargetMachine &TM) 39c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines : SystemZGenSubtargetInfo(TT, CPU, FS), HasDistinctOps(false), 40c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines HasLoadStoreOnCond(false), HasHighWord(false), HasFPExtension(false), 412c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar HasPopulationCount(false), HasFastSerialization(false), 422c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar HasInterlockedAccess1(false), HasMiscellaneousExtensions(false), 432c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar HasTransactionalExecution(false), HasProcessorAssist(false), 44ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines TargetTriple(TT), InstrInfo(initializeSubtargetDependencies(CPU, FS)), 45ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines TLInfo(TM, *this), TSInfo(*TM.getDataLayout()), FrameLowering() {} 46c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 471d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// Return true if GV binds locally under reloc model RM. 481d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandstatic bool bindsLocally(const GlobalValue *GV, Reloc::Model RM) { 491d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // For non-PIC, all symbols bind locally. 501d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand if (RM == Reloc::Static) 511d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand return true; 521d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 531d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand return GV->hasLocalLinkage() || !GV->hasDefaultVisibility(); 541d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} 551d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 561d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandbool SystemZSubtarget::isPC32DBLSymbol(const GlobalValue *GV, 571d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand Reloc::Model RM, 581d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand CodeModel::Model CM) const { 591d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // PC32DBL accesses require the low bit to be clear. Note that a zero 601d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // value selects the default alignment and is therefore OK. 611d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand if (GV->getAlignment() == 1) 621d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand return false; 631d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 641d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // For the small model, all locally-binding symbols are in range. 651d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand if (CM == CodeModel::Small) 661d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand return bindsLocally(GV, RM); 671d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 681d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // For Medium and above, assume that the symbol is not within the 4GB range. 691d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Taking the address of locally-defined text would be OK, but that 701d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // case isn't easy to detect. 711d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand return false; 721d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} 73