SystemZSubtarget.h revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
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
141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#ifndef SYSTEMZSUBTARGET_H
151d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#define SYSTEMZSUBTARGET_H
161d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
171d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/ADT/Triple.h"
181d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/Target/TargetSubtargetInfo.h"
191d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include <string>
201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#define GET_SUBTARGETINFO_HEADER
221d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "SystemZGenSubtargetInfo.inc"
231d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
241d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandnamespace llvm {
251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandclass GlobalValue;
261d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandclass StringRef;
271d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
281d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandclass SystemZSubtarget : public SystemZGenSubtargetInfo {
29354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka  virtual void anchor();
30eddfaad1ef9a208a8a9ee23c26fac4d980caa99aRichard Sandifordprotected:
31eddfaad1ef9a208a8a9ee23c26fac4d980caa99aRichard Sandiford  bool HasDistinctOps;
32b284e1bf08d24deb20b7deab71fce6f3034cc89aRichard Sandiford  bool HasLoadStoreOnCond;
33f3068d02e5f55d7e69134c8f14aa21c4b9fde91aRichard Sandiford  bool HasHighWord;
34d954716e7567282ff6f3d25b4f404bae006eed04Richard Sandiford  bool HasFPExtension;
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool HasFastSerialization;
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool HasInterlockedAccess1;
37eddfaad1ef9a208a8a9ee23c26fac4d980caa99aRichard Sandiford
381d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandprivate:
391d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  Triple TargetTriple;
401d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
411d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandpublic:
421d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SystemZSubtarget(const std::string &TT, const std::string &CPU,
431d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                   const std::string &FS);
441d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
45349baa60393c637f479ee31b25c65555b095a2efRichard Sandiford  // This is important for reducing register pressure in vector code.
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool useAA() const override { return true; }
47349baa60393c637f479ee31b25c65555b095a2efRichard Sandiford
481d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  // Automatically generated by tblgen.
491d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
501d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
51eddfaad1ef9a208a8a9ee23c26fac4d980caa99aRichard Sandiford  // Return true if the target has the distinct-operands facility.
52eddfaad1ef9a208a8a9ee23c26fac4d980caa99aRichard Sandiford  bool hasDistinctOps() const { return HasDistinctOps; }
53eddfaad1ef9a208a8a9ee23c26fac4d980caa99aRichard Sandiford
54b284e1bf08d24deb20b7deab71fce6f3034cc89aRichard Sandiford  // Return true if the target has the load/store-on-condition facility.
55b284e1bf08d24deb20b7deab71fce6f3034cc89aRichard Sandiford  bool hasLoadStoreOnCond() const { return HasLoadStoreOnCond; }
56b284e1bf08d24deb20b7deab71fce6f3034cc89aRichard Sandiford
57f3068d02e5f55d7e69134c8f14aa21c4b9fde91aRichard Sandiford  // Return true if the target has the high-word facility.
58f3068d02e5f55d7e69134c8f14aa21c4b9fde91aRichard Sandiford  bool hasHighWord() const { return HasHighWord; }
59f3068d02e5f55d7e69134c8f14aa21c4b9fde91aRichard Sandiford
60d954716e7567282ff6f3d25b4f404bae006eed04Richard Sandiford  // Return true if the target has the floating-point extension facility.
61d954716e7567282ff6f3d25b4f404bae006eed04Richard Sandiford  bool hasFPExtension() const { return HasFPExtension; }
62d954716e7567282ff6f3d25b4f404bae006eed04Richard Sandiford
6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Return true if the target has the fast-serialization facility.
6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool hasFastSerialization() const { return HasFastSerialization; }
6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Return true if the target has interlocked-access facility 1.
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool hasInterlockedAccess1() const { return HasInterlockedAccess1; }
6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
691d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  // Return true if GV can be accessed using LARL for reloc model RM
701d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  // and code model CM.
711d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  bool isPC32DBLSymbol(const GlobalValue *GV, Reloc::Model RM,
721d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                       CodeModel::Model CM) const;
731d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
741d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); }
751d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand};
761d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand} // end namespace llvm
771d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
781d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#endif
79