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