blob: be480f03c5724ae9ab29497818c2827b95f5c9c8 [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"
Ulrich Weigand5f613df2013-05-06 16:15:19 +000022#include "llvm/ADT/Triple.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000023#include "llvm/IR/DataLayout.h"
Ulrich Weigand5f613df2013-05-06 16:15:19 +000024#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;
Ulrich Weigandb4012182015-03-31 12:56:33 +000041 bool HasPopulationCount;
Ulrich Weigand33a441a2017-05-10 12:42:00 +000042 bool HasMessageSecurityAssist4;
Richard Sandiford9afe6132013-12-10 10:36:34 +000043 bool HasFastSerialization;
Richard Sandiford45645a22013-12-24 15:14:05 +000044 bool HasInterlockedAccess1;
Ulrich Weigand371d10a2015-03-31 12:58:17 +000045 bool HasMiscellaneousExtensions;
Ulrich Weigand84404f32016-11-28 14:01:51 +000046 bool HasExecutionHint;
Ulrich Weigand2d9e3d92016-11-28 13:59:22 +000047 bool HasLoadAndTrap;
Ulrich Weigand57c85f52015-04-01 12:51:43 +000048 bool HasTransactionalExecution;
49 bool HasProcessorAssist;
Ulrich Weigand3f484e62017-05-30 10:15:16 +000050 bool HasDFPZonedConversion;
Ulrich Weiganda8b04e12015-05-05 19:23:40 +000051 bool HasVector;
Zhan Jun Liaudef708a2016-07-11 18:45:03 +000052 bool HasLoadStoreOnCond2;
Ulrich Weigand92c2c672016-11-11 12:46:28 +000053 bool HasLoadAndZeroRightmostByte;
Ulrich Weigand33a441a2017-05-10 12:42:00 +000054 bool HasMessageSecurityAssist5;
Ulrich Weigand3f484e62017-05-30 10:15:16 +000055 bool HasDFPPackedConversion;
Richard Sandiford27d1cfe2013-07-19 16:09:03 +000056
Ulrich Weigand5f613df2013-05-06 16:15:19 +000057private:
58 Triple TargetTriple;
Eric Christopher52349952014-07-01 20:19:02 +000059 SystemZInstrInfo InstrInfo;
60 SystemZTargetLowering TLInfo;
61 SystemZSelectionDAGInfo TSInfo;
62 SystemZFrameLowering FrameLowering;
Ulrich Weigand5f613df2013-05-06 16:15:19 +000063
Eric Christopher52349952014-07-01 20:19:02 +000064 SystemZSubtarget &initializeSubtargetDependencies(StringRef CPU,
65 StringRef FS);
Ulrich Weigand5f613df2013-05-06 16:15:19 +000066public:
Daniel Sandersa73f1fd2015-06-10 12:11:26 +000067 SystemZSubtarget(const Triple &TT, const std::string &CPU,
Eric Christopher52349952014-07-01 20:19:02 +000068 const std::string &FS, const TargetMachine &TM);
69
Eric Christopherd9134482014-08-04 21:25:23 +000070 const TargetFrameLowering *getFrameLowering() const override {
71 return &FrameLowering;
72 }
73 const SystemZInstrInfo *getInstrInfo() const override { return &InstrInfo; }
Eric Christopherd9134482014-08-04 21:25:23 +000074 const SystemZRegisterInfo *getRegisterInfo() const override {
Eric Christopher52349952014-07-01 20:19:02 +000075 return &InstrInfo.getRegisterInfo();
76 }
Eric Christopherd9134482014-08-04 21:25:23 +000077 const SystemZTargetLowering *getTargetLowering() const override {
78 return &TLInfo;
79 }
Benjamin Kramerf9172fd42016-01-27 16:32:26 +000080 const SelectionDAGTargetInfo *getSelectionDAGInfo() const override {
Eric Christopherd9134482014-08-04 21:25:23 +000081 return &TSInfo;
82 }
Ulrich Weigand5f613df2013-05-06 16:15:19 +000083
Richard Sandiford094e6092013-10-28 13:53:37 +000084 // This is important for reducing register pressure in vector code.
Richard Sandifordb4d67b52014-03-06 12:03:36 +000085 bool useAA() const override { return true; }
Richard Sandiford094e6092013-10-28 13:53:37 +000086
Ulrich Weigand524f2762016-11-28 13:34:08 +000087 // Always enable the early if-conversion pass.
88 bool enableEarlyIfConversion() const override { return true; }
89
Ulrich Weigand5f613df2013-05-06 16:15:19 +000090 // Automatically generated by tblgen.
91 void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
92
Richard Sandiford27d1cfe2013-07-19 16:09:03 +000093 // Return true if the target has the distinct-operands facility.
94 bool hasDistinctOps() const { return HasDistinctOps; }
95
Richard Sandiforda68e6f52013-07-25 08:57:02 +000096 // Return true if the target has the load/store-on-condition facility.
97 bool hasLoadStoreOnCond() const { return HasLoadStoreOnCond; }
98
Zhan Jun Liaudef708a2016-07-11 18:45:03 +000099 // Return true if the target has the load/store-on-condition facility 2.
100 bool hasLoadStoreOnCond2() const { return HasLoadStoreOnCond2; }
101
Richard Sandiford6cf80b32013-07-31 11:17:35 +0000102 // Return true if the target has the high-word facility.
103 bool hasHighWord() const { return HasHighWord; }
104
Richard Sandiford8e92c382013-08-21 08:58:08 +0000105 // Return true if the target has the floating-point extension facility.
106 bool hasFPExtension() const { return HasFPExtension; }
107
Ulrich Weigandb4012182015-03-31 12:56:33 +0000108 // Return true if the target has the population-count facility.
109 bool hasPopulationCount() const { return HasPopulationCount; }
110
Ulrich Weigand33a441a2017-05-10 12:42:00 +0000111 // Return true if the target has the message-security-assist
112 // extension facility 4.
113 bool hasMessageSecurityAssist4() const { return HasMessageSecurityAssist4; }
114
Richard Sandiford9afe6132013-12-10 10:36:34 +0000115 // Return true if the target has the fast-serialization facility.
116 bool hasFastSerialization() const { return HasFastSerialization; }
117
Richard Sandiford45645a22013-12-24 15:14:05 +0000118 // Return true if the target has interlocked-access facility 1.
119 bool hasInterlockedAccess1() const { return HasInterlockedAccess1; }
120
Ulrich Weigand371d10a2015-03-31 12:58:17 +0000121 // Return true if the target has the miscellaneous-extensions facility.
122 bool hasMiscellaneousExtensions() const {
123 return HasMiscellaneousExtensions;
124 }
125
Ulrich Weigand84404f32016-11-28 14:01:51 +0000126 // Return true if the target has the execution-hint facility.
127 bool hasExecutionHint() const { return HasExecutionHint; }
128
Ulrich Weigand2d9e3d92016-11-28 13:59:22 +0000129 // Return true if the target has the load-and-trap facility.
130 bool hasLoadAndTrap() const { return HasLoadAndTrap; }
131
Ulrich Weigand57c85f52015-04-01 12:51:43 +0000132 // Return true if the target has the transactional-execution facility.
133 bool hasTransactionalExecution() const { return HasTransactionalExecution; }
134
135 // Return true if the target has the processor-assist facility.
136 bool hasProcessorAssist() const { return HasProcessorAssist; }
137
Ulrich Weigand3f484e62017-05-30 10:15:16 +0000138 // Return true if the target has the DFP zoned-conversion facility.
139 bool hasDFPZonedConversion() const { return HasDFPZonedConversion; }
140
Ulrich Weigand92c2c672016-11-11 12:46:28 +0000141 // Return true if the target has the load-and-zero-rightmost-byte facility.
142 bool hasLoadAndZeroRightmostByte() const {
143 return HasLoadAndZeroRightmostByte;
144 }
145
Ulrich Weigand33a441a2017-05-10 12:42:00 +0000146 // Return true if the target has the message-security-assist
147 // extension facility 5.
148 bool hasMessageSecurityAssist5() const { return HasMessageSecurityAssist5; }
149
Ulrich Weigand3f484e62017-05-30 10:15:16 +0000150 // Return true if the target has the DFP packed-conversion facility.
151 bool hasDFPPackedConversion() const { return HasDFPPackedConversion; }
152
Ulrich Weiganda8b04e12015-05-05 19:23:40 +0000153 // Return true if the target has the vector facility.
154 bool hasVector() const { return HasVector; }
155
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000156 // Return true if GV can be accessed using LARL for reloc model RM
157 // and code model CM.
Rafael Espindola3beef8d2016-06-27 23:15:57 +0000158 bool isPC32DBLSymbol(const GlobalValue *GV, CodeModel::Model CM) const;
Ulrich Weigand5f613df2013-05-06 16:15:19 +0000159
160 bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); }
161};
162} // end namespace llvm
163
164#endif