11d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===-- SystemZSubtarget.h - SystemZ subtarget information -----*- C++ -*--===//
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// This file declares the SystemZ specific subclass of TargetSubtargetInfo.
111d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===----------------------------------------------------------------------===//
131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZSUBTARGET_H
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZSUBTARGET_H
161d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
17c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "SystemZFrameLowering.h"
18c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "SystemZISelLowering.h"
19c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "SystemZInstrInfo.h"
20c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "SystemZRegisterInfo.h"
21c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "SystemZSelectionDAGInfo.h"
22c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "llvm/IR/DataLayout.h"
231d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/ADT/Triple.h"
241d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/Target/TargetSubtargetInfo.h"
251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include <string>
261d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
271d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#define GET_SUBTARGETINFO_HEADER
281d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "SystemZGenSubtargetInfo.inc"
291d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
301d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandnamespace llvm {
311d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandclass GlobalValue;
321d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandclass StringRef;
331d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
341d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandclass SystemZSubtarget : public SystemZGenSubtargetInfo {
35354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka  virtual void anchor();
36eddfaad1ef9a208a8a9ee23c26fac4d980caa99aRichard Sandifordprotected:
37eddfaad1ef9a208a8a9ee23c26fac4d980caa99aRichard Sandiford  bool HasDistinctOps;
38b284e1bf08d24deb20b7deab71fce6f3034cc89aRichard Sandiford  bool HasLoadStoreOnCond;
39f3068d02e5f55d7e69134c8f14aa21c4b9fde91aRichard Sandiford  bool HasHighWord;
40d954716e7567282ff6f3d25b4f404bae006eed04Richard Sandiford  bool HasFPExtension;
412c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  bool HasPopulationCount;
4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool HasFastSerialization;
4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool HasInterlockedAccess1;
442c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  bool HasMiscellaneousExtensions;
452c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  bool HasTransactionalExecution;
462c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  bool HasProcessorAssist;
47eddfaad1ef9a208a8a9ee23c26fac4d980caa99aRichard Sandiford
481d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandprivate:
491d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  Triple TargetTriple;
50c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  SystemZInstrInfo InstrInfo;
51c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  SystemZTargetLowering TLInfo;
52c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  SystemZSelectionDAGInfo TSInfo;
53c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  SystemZFrameLowering FrameLowering;
541d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
55c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  SystemZSubtarget &initializeSubtargetDependencies(StringRef CPU,
56c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                                                    StringRef FS);
571d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandpublic:
581d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SystemZSubtarget(const std::string &TT, const std::string &CPU,
59c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                   const std::string &FS, const TargetMachine &TM);
60c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
6137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const TargetFrameLowering *getFrameLowering() const override {
6237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return &FrameLowering;
6337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
6437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const SystemZInstrInfo *getInstrInfo() const override { return &InstrInfo; }
6537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const SystemZRegisterInfo *getRegisterInfo() const override {
66c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines    return &InstrInfo.getRegisterInfo();
67c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  }
6837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const SystemZTargetLowering *getTargetLowering() const override {
6937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return &TLInfo;
7037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
7137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const TargetSelectionDAGInfo *getSelectionDAGInfo() const override {
7237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return &TSInfo;
7337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
741d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
75349baa60393c637f479ee31b25c65555b095a2efRichard Sandiford  // This is important for reducing register pressure in vector code.
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool useAA() const override { return true; }
77349baa60393c637f479ee31b25c65555b095a2efRichard Sandiford
781d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  // Automatically generated by tblgen.
791d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
801d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
81eddfaad1ef9a208a8a9ee23c26fac4d980caa99aRichard Sandiford  // Return true if the target has the distinct-operands facility.
82eddfaad1ef9a208a8a9ee23c26fac4d980caa99aRichard Sandiford  bool hasDistinctOps() const { return HasDistinctOps; }
83eddfaad1ef9a208a8a9ee23c26fac4d980caa99aRichard Sandiford
84b284e1bf08d24deb20b7deab71fce6f3034cc89aRichard Sandiford  // Return true if the target has the load/store-on-condition facility.
85b284e1bf08d24deb20b7deab71fce6f3034cc89aRichard Sandiford  bool hasLoadStoreOnCond() const { return HasLoadStoreOnCond; }
86b284e1bf08d24deb20b7deab71fce6f3034cc89aRichard Sandiford
87f3068d02e5f55d7e69134c8f14aa21c4b9fde91aRichard Sandiford  // Return true if the target has the high-word facility.
88f3068d02e5f55d7e69134c8f14aa21c4b9fde91aRichard Sandiford  bool hasHighWord() const { return HasHighWord; }
89f3068d02e5f55d7e69134c8f14aa21c4b9fde91aRichard Sandiford
90d954716e7567282ff6f3d25b4f404bae006eed04Richard Sandiford  // Return true if the target has the floating-point extension facility.
91d954716e7567282ff6f3d25b4f404bae006eed04Richard Sandiford  bool hasFPExtension() const { return HasFPExtension; }
92d954716e7567282ff6f3d25b4f404bae006eed04Richard Sandiford
932c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  // Return true if the target has the population-count facility.
942c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  bool hasPopulationCount() const { return HasPopulationCount; }
952c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Return true if the target has the fast-serialization facility.
9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool hasFastSerialization() const { return HasFastSerialization; }
9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Return true if the target has interlocked-access facility 1.
10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool hasInterlockedAccess1() const { return HasInterlockedAccess1; }
10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1022c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  // Return true if the target has the miscellaneous-extensions facility.
1032c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  bool hasMiscellaneousExtensions() const {
1042c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    return HasMiscellaneousExtensions;
1052c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  }
1062c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
1072c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  // Return true if the target has the transactional-execution facility.
1082c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  bool hasTransactionalExecution() const { return HasTransactionalExecution; }
1092c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
1102c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  // Return true if the target has the processor-assist facility.
1112c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar  bool hasProcessorAssist() const { return HasProcessorAssist; }
1122c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar
1131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  // Return true if GV can be accessed using LARL for reloc model RM
1141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  // and code model CM.
1151d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  bool isPC32DBLSymbol(const GlobalValue *GV, Reloc::Model RM,
1161d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                       CodeModel::Model CM) const;
1171d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
1181d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); }
1191d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand};
1201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} // end namespace llvm
1211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
1221d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#endif
123