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