blob: f8815524e0f32157729ad7832e56d3a3195c056f [file] [log] [blame]
Ulrich Weigand5f613df2013-05-06 16:15:19 +00001//===-- SystemZSubtarget.h - SystemZ subtarget information -----*- C++ -*--===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file declares the SystemZ specific subclass of TargetSubtargetInfo.
11//
12//===----------------------------------------------------------------------===//
13
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000014#ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZSUBTARGET_H
15#define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZSUBTARGET_H
Ulrich Weigand5f613df2013-05-06 16:15:19 +000016
Eric Christopher52349952014-07-01 20:19:02 +000017#include "SystemZFrameLowering.h"
18#include "SystemZISelLowering.h"
19#include "SystemZInstrInfo.h"
20#include "SystemZRegisterInfo.h"
21#include "SystemZSelectionDAGInfo.h"
22#include "llvm/IR/DataLayout.h"
Ulrich Weigand5f613df2013-05-06 16:15:19 +000023#include "llvm/ADT/Triple.h"
24#include "llvm/Target/TargetSubtargetInfo.h"
25#include <string>
26
27#define GET_SUBTARGETINFO_HEADER
28#include "SystemZGenSubtargetInfo.inc"
29
30namespace llvm {
31class GlobalValue;
32class StringRef;
33
34class SystemZSubtarget : public SystemZGenSubtargetInfo {
Juergen Ributzkad12ccbd2013-11-19 00:57:56 +000035 virtual void anchor();
Richard Sandiford27d1cfe2013-07-19 16:09:03 +000036protected:
37 bool HasDistinctOps;
Richard Sandiforda68e6f52013-07-25 08:57:02 +000038 bool HasLoadStoreOnCond;
Richard Sandiford6cf80b32013-07-31 11:17:35 +000039 bool HasHighWord;
Richard Sandiford8e92c382013-08-21 08:58:08 +000040 bool HasFPExtension;
Richard Sandiford9afe6132013-12-10 10:36:34 +000041 bool HasFastSerialization;
Richard Sandiford45645a22013-12-24 15:14:05 +000042 bool HasInterlockedAccess1;
Richard Sandiford27d1cfe2013-07-19 16:09:03 +000043
Ulrich Weigand5f613df2013-05-06 16:15:19 +000044private:
45 Triple TargetTriple;
Eric Christopher52349952014-07-01 20:19:02 +000046 const DataLayout DL;
47 SystemZInstrInfo InstrInfo;
48 SystemZTargetLowering TLInfo;
49 SystemZSelectionDAGInfo TSInfo;
50 SystemZFrameLowering FrameLowering;
Ulrich Weigand5f613df2013-05-06 16:15:19 +000051
Eric Christopher52349952014-07-01 20:19:02 +000052 SystemZSubtarget &initializeSubtargetDependencies(StringRef CPU,
53 StringRef FS);
Ulrich Weigand5f613df2013-05-06 16:15:19 +000054public:
55 SystemZSubtarget(const std::string &TT, const std::string &CPU,
Eric Christopher52349952014-07-01 20:19:02 +000056 const std::string &FS, const TargetMachine &TM);
57
Eric Christopherd9134482014-08-04 21:25:23 +000058 const TargetFrameLowering *getFrameLowering() const override {
59 return &FrameLowering;
60 }
61 const SystemZInstrInfo *getInstrInfo() const override { return &InstrInfo; }
62 const DataLayout *getDataLayout() const override { return &DL; }
63 const SystemZRegisterInfo *getRegisterInfo() const override {
Eric Christopher52349952014-07-01 20:19:02 +000064 return &InstrInfo.getRegisterInfo();
65 }
Eric Christopherd9134482014-08-04 21:25:23 +000066 const SystemZTargetLowering *getTargetLowering() const override {
67 return &TLInfo;
68 }
69 const TargetSelectionDAGInfo *getSelectionDAGInfo() const override {
70 return &TSInfo;
71 }
Ulrich Weigand5f613df2013-05-06 16:15:19 +000072
Richard Sandiford094e6092013-10-28 13:53:37 +000073 // This is important for reducing register pressure in vector code.
Richard Sandifordb4d67b52014-03-06 12:03:36 +000074 bool useAA() const override { return true; }
Richard Sandiford094e6092013-10-28 13:53:37 +000075
Ulrich Weigand5f613df2013-05-06 16:15:19 +000076 // Automatically generated by tblgen.
77 void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
78
Richard Sandiford27d1cfe2013-07-19 16:09:03 +000079 // Return true if the target has the distinct-operands facility.
80 bool hasDistinctOps() const { return HasDistinctOps; }
81
Richard Sandiforda68e6f52013-07-25 08:57:02 +000082 // Return true if the target has the load/store-on-condition facility.
83 bool hasLoadStoreOnCond() const { return HasLoadStoreOnCond; }
84
Richard Sandiford6cf80b32013-07-31 11:17:35 +000085 // Return true if the target has the high-word facility.
86 bool hasHighWord() const { return HasHighWord; }
87
Richard Sandiford8e92c382013-08-21 08:58:08 +000088 // Return true if the target has the floating-point extension facility.
89 bool hasFPExtension() const { return HasFPExtension; }
90
Richard Sandiford9afe6132013-12-10 10:36:34 +000091 // Return true if the target has the fast-serialization facility.
92 bool hasFastSerialization() const { return HasFastSerialization; }
93
Richard Sandiford45645a22013-12-24 15:14:05 +000094 // Return true if the target has interlocked-access facility 1.
95 bool hasInterlockedAccess1() const { return HasInterlockedAccess1; }
96
Ulrich Weigand5f613df2013-05-06 16:15:19 +000097 // Return true if GV can be accessed using LARL for reloc model RM
98 // and code model CM.
99 bool isPC32DBLSymbol(const GlobalValue *GV, Reloc::Model RM,
100 CodeModel::Model CM) const;
101
102 bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); }
103};
104} // end namespace llvm
105
106#endif