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 356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarSystemZSubtarget::SystemZSubtarget(const Triple &TT, const std::string &CPU, 36c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const std::string &FS, 37c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines const TargetMachine &TM) 38c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines : SystemZGenSubtargetInfo(TT, CPU, FS), HasDistinctOps(false), 39c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines HasLoadStoreOnCond(false), HasHighWord(false), HasFPExtension(false), 400c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar HasPopulationCount(false), HasFastSerialization(false), 410c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar HasInterlockedAccess1(false), HasMiscellaneousExtensions(false), 420c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar HasTransactionalExecution(false), HasProcessorAssist(false), 43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar HasVector(false), HasLoadStoreOnCond2(false), TargetTriple(TT), 446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar InstrInfo(initializeSubtargetDependencies(CPU, FS)), TLInfo(TM, *this), 45f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar TSInfo(), FrameLowering() {} 46c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines 471d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandbool SystemZSubtarget::isPC32DBLSymbol(const GlobalValue *GV, 481d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand CodeModel::Model CM) const { 491d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // PC32DBL accesses require the low bit to be clear. Note that a zero 501d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // value selects the default alignment and is therefore OK. 511d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand if (GV->getAlignment() == 1) 521d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand return false; 531d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 541d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // For the small model, all locally-binding symbols are in range. 551d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand if (CM == CodeModel::Small) 56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return TLInfo.getTargetMachine().shouldAssumeDSOLocal(*GV->getParent(), GV); 571d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand 581d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // For Medium and above, assume that the symbol is not within the 4GB range. 591d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // Taking the address of locally-defined text would be OK, but that 601d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand // case isn't easy to detect. 611d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand return false; 621d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} 63