1 //===-- SystemZSubtarget.cpp - SystemZ subtarget information --------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "SystemZSubtarget.h"
10 #include "MCTargetDesc/SystemZMCTargetDesc.h"
11 #include "llvm/IR/GlobalValue.h"
12 #include "llvm/Target/TargetMachine.h"
13 
14 using namespace llvm;
15 
16 #define DEBUG_TYPE "systemz-subtarget"
17 
18 #define GET_SUBTARGETINFO_TARGET_DESC
19 #define GET_SUBTARGETINFO_CTOR
20 #include "SystemZGenSubtargetInfo.inc"
21 
22 static cl::opt<bool> UseSubRegLiveness(
23     "systemz-subreg-liveness",
24     cl::desc("Enable subregister liveness tracking for SystemZ (experimental)"),
25     cl::Hidden);
26 
27 // Pin the vtable to this file.
28 void SystemZSubtarget::anchor() {}
29 
30 SystemZSubtarget &SystemZSubtarget::initializeSubtargetDependencies(
31     StringRef CPU, StringRef TuneCPU, StringRef FS) {
32   if (CPU.empty())
33     CPU = "generic";
34   if (TuneCPU.empty())
35     TuneCPU = CPU;
36   // Parse features string.
37   ParseSubtargetFeatures(CPU, TuneCPU, FS);
38 
39   // -msoft-float implies -mno-vx.
40   if (HasSoftFloat)
41     HasVector = false;
42 
43   // -mno-vx implicitly disables all vector-related features.
44   if (!HasVector) {
45     HasVectorEnhancements1 = false;
46     HasVectorEnhancements2 = false;
47     HasVectorPackedDecimal = false;
48     HasVectorPackedDecimalEnhancement = false;
49     HasVectorPackedDecimalEnhancement2 = false;
50   }
51 
52   return *this;
53 }
54 
55 SystemZCallingConventionRegisters *
56 SystemZSubtarget::initializeSpecialRegisters() {
57   if (isTargetXPLINK64())
58     return new SystemZXPLINK64Registers;
59   else if (isTargetELF())
60     return new SystemZELFRegisters;
61   else {
62     llvm_unreachable("Invalid Calling Convention. Cannot initialize Special "
63                      "Call Registers!");
64   }
65 }
66 
67 SystemZSubtarget::SystemZSubtarget(const Triple &TT, const std::string &CPU,
68                                    const std::string &TuneCPU,
69                                    const std::string &FS,
70                                    const TargetMachine &TM)
71     : SystemZGenSubtargetInfo(TT, CPU, TuneCPU, FS), TargetTriple(TT),
72       SpecialRegisters(initializeSpecialRegisters()),
73       InstrInfo(initializeSubtargetDependencies(CPU, TuneCPU, FS)),
74       TLInfo(TM, *this), FrameLowering(SystemZFrameLowering::create(*this)) {}
75 
76 bool SystemZSubtarget::enableSubRegLiveness() const {
77   return UseSubRegLiveness;
78 }
79 
80 bool SystemZSubtarget::isPC32DBLSymbol(const GlobalValue *GV,
81                                        CodeModel::Model CM) const {
82   // PC32DBL accesses require the low bit to be clear.
83   //
84   // FIXME: Explicitly check for functions: the datalayout is currently
85   // missing information about function pointers.
86   const DataLayout &DL = GV->getParent()->getDataLayout();
87   if (GV->getPointerAlignment(DL) == 1 && !GV->getValueType()->isFunctionTy())
88     return false;
89 
90   // For the small model, all locally-binding symbols are in range.
91   if (CM == CodeModel::Small)
92     return TLInfo.getTargetMachine().shouldAssumeDSOLocal(*GV->getParent(), GV);
93 
94   // For Medium and above, assume that the symbol is not within the 4GB range.
95   // Taking the address of locally-defined text would be OK, but that
96   // case isn't easy to detect.
97   return false;
98 }
99