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