1dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//===--- AArch64Subtarget.h - Define Subtarget for the AArch64 -*- C++ -*--===// 272062f5744557e270a38192554c3126ea5f97434Tim Northover// 372062f5744557e270a38192554c3126ea5f97434Tim Northover// The LLVM Compiler Infrastructure 472062f5744557e270a38192554c3126ea5f97434Tim Northover// 572062f5744557e270a38192554c3126ea5f97434Tim Northover// This file is distributed under the University of Illinois Open Source 672062f5744557e270a38192554c3126ea5f97434Tim Northover// License. See LICENSE.TXT for details. 772062f5744557e270a38192554c3126ea5f97434Tim Northover// 872062f5744557e270a38192554c3126ea5f97434Tim Northover//===----------------------------------------------------------------------===// 972062f5744557e270a38192554c3126ea5f97434Tim Northover// 10dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// This file declares the AArch64 specific subclass of TargetSubtarget. 1172062f5744557e270a38192554c3126ea5f97434Tim Northover// 1272062f5744557e270a38192554c3126ea5f97434Tim Northover//===----------------------------------------------------------------------===// 1372062f5744557e270a38192554c3126ea5f97434Tim Northover 14dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#ifndef AArch64SUBTARGET_H 15dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define AArch64SUBTARGET_H 1672062f5744557e270a38192554c3126ea5f97434Tim Northover 17cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "AArch64InstrInfo.h" 18cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "AArch64FrameLowering.h" 19cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "AArch64ISelLowering.h" 20dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "AArch64RegisterInfo.h" 21cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "AArch64SelectionDAGInfo.h" 22cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/IR/DataLayout.h" 23cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/Target/TargetSubtargetInfo.h" 24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include <string> 2572062f5744557e270a38192554c3126ea5f97434Tim Northover 2672062f5744557e270a38192554c3126ea5f97434Tim Northover#define GET_SUBTARGETINFO_HEADER 2772062f5744557e270a38192554c3126ea5f97434Tim Northover#include "AArch64GenSubtargetInfo.inc" 2872062f5744557e270a38192554c3126ea5f97434Tim Northover 2972062f5744557e270a38192554c3126ea5f97434Tim Northovernamespace llvm { 3072062f5744557e270a38192554c3126ea5f97434Tim Northoverclass GlobalValue; 31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesclass StringRef; 3272062f5744557e270a38192554c3126ea5f97434Tim Northover 3372062f5744557e270a38192554c3126ea5f97434Tim Northoverclass AArch64Subtarget : public AArch64GenSubtargetInfo { 3472062f5744557e270a38192554c3126ea5f97434Tim Northoverprotected: 35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines enum ARMProcFamilyEnum {Others, CortexA53, CortexA57, Cyclone}; 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// ARMProcFamily - ARM processor family: Cortex-A53, Cortex-A57, and others. 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ARMProcFamilyEnum ARMProcFamily; 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 40c2884320feebc543d2ce51151d5418dfc18da9e4Amara Emerson bool HasFPARMv8; 4172062f5744557e270a38192554c3126ea5f97434Tim Northover bool HasNEON; 4272062f5744557e270a38192554c3126ea5f97434Tim Northover bool HasCrypto; 43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool HasCRC; 4472062f5744557e270a38192554c3126ea5f97434Tim Northover 45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // HasZeroCycleRegMove - Has zero-cycle register mov instructions. 46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool HasZeroCycleRegMove; 47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // HasZeroCycleZeroing - Has zero-cycle zeroing instructions. 49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool HasZeroCycleZeroing; 50c2884320feebc543d2ce51151d5418dfc18da9e4Amara Emerson 51c2884320feebc543d2ce51151d5418dfc18da9e4Amara Emerson /// CPUString - String name of used CPU. 52c2884320feebc543d2ce51151d5418dfc18da9e4Amara Emerson std::string CPUString; 53c2884320feebc543d2ce51151d5418dfc18da9e4Amara Emerson 54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// TargetTriple - What processor and OS we're targeting. 55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Triple TargetTriple; 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 57cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const DataLayout DL; 58cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines AArch64FrameLowering FrameLowering; 59cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines AArch64InstrInfo InstrInfo; 60cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines AArch64SelectionDAGInfo TSInfo; 61cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines AArch64TargetLowering TLInfo; 62cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesprivate: 63cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// initializeSubtargetDependencies - Initializes using CPUString and the 64cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// passed in feature string so that we can use initializer lists for 65cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// subtarget initialization. 66cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines AArch64Subtarget &initializeSubtargetDependencies(StringRef FS); 67c2884320feebc543d2ce51151d5418dfc18da9e4Amara Emerson 6872062f5744557e270a38192554c3126ea5f97434Tim Northoverpublic: 6972062f5744557e270a38192554c3126ea5f97434Tim Northover /// This constructor initializes the data members to match that 7072062f5744557e270a38192554c3126ea5f97434Tim Northover /// of the specified triple. 71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AArch64Subtarget(const std::string &TT, const std::string &CPU, 72cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const std::string &FS, TargetMachine &TM, bool LittleEndian); 73cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 74cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const AArch64SelectionDAGInfo *getSelectionDAGInfo() const { return &TSInfo; } 75cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const AArch64FrameLowering *getFrameLowering() const { 76cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return &FrameLowering; 77cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 78cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const AArch64TargetLowering *getTargetLowering() const { 79cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return &TLInfo; 80cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 81cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const AArch64InstrInfo *getInstrInfo() const { return &InstrInfo; } 82cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const DataLayout *getDataLayout() const { return &DL; } 83dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool enableMachineScheduler() const override { return true; } 8472062f5744557e270a38192554c3126ea5f97434Tim Northover 85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool hasZeroCycleRegMove() const { return HasZeroCycleRegMove; } 8672062f5744557e270a38192554c3126ea5f97434Tim Northover 87dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool hasZeroCycleZeroing() const { return HasZeroCycleZeroing; } 8872062f5744557e270a38192554c3126ea5f97434Tim Northover 89c2884320feebc543d2ce51151d5418dfc18da9e4Amara Emerson bool hasFPARMv8() const { return HasFPARMv8; } 9087773c318fcee853fb34a80a10c4347d523bdafbTim Northover bool hasNEON() const { return HasNEON; } 9187773c318fcee853fb34a80a10c4347d523bdafbTim Northover bool hasCrypto() const { return HasCrypto; } 92dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool hasCRC() const { return HasCRC; } 93dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 94cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines bool isLittleEndian() const { return DL.isLittleEndian(); } 95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isTargetDarwin() const { return TargetTriple.isOSDarwin(); } 97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 98dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); } 99dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isTargetMachO() const { return TargetTriple.isOSBinFormatMachO(); } 101dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isCyclone() const { return CPUString == "cyclone"; } 10322c310d78ce9630af15b0de94c18a409705b7496Tim Murray bool isCortexA57() const { return CPUString == "cortex-a57"; } 10422c310d78ce9630af15b0de94c18a409705b7496Tim Murray bool isCortexA53() const { return CPUString == "cortex-a53"; } 105dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 106dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size 107dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// that still makes it profitable to inline the call. 108dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned getMaxInlineSizeThreshold() const { return 64; } 109dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 110dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// ParseSubtargetFeatures - Parses features string setting specified 111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// subtarget options. Definition of function is auto generated by tblgen. 112dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void ParseSubtargetFeatures(StringRef CPU, StringRef FS); 113dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 114dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// ClassifyGlobalReference - Find the target operand flags that describe 115dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// how a global value should be referenced for the current subtarget. 116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned char ClassifyGlobalReference(const GlobalValue *GV, 117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const TargetMachine &TM) const; 118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// This function returns the name of a function which has an interface 120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// like the non-standard bzero function, if such a function exists on 121dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// the current subtarget and it is considered prefereable over 122dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// memset with zero passed as the second argument. Otherwise it 123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// returns null. 124dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const char *getBZeroEntry() const; 125c2884320feebc543d2ce51151d5418dfc18da9e4Amara Emerson 126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void overrideSchedPolicy(MachineSchedPolicy &Policy, MachineInstr *begin, 127dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MachineInstr *end, 128dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned NumRegionInstrs) const override; 12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 130dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool enableEarlyIfConversion() const override; 13172062f5744557e270a38192554c3126ea5f97434Tim Northover}; 13272062f5744557e270a38192554c3126ea5f97434Tim Northover} // End llvm namespace 13372062f5744557e270a38192554c3126ea5f97434Tim Northover 134dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#endif // AArch64SUBTARGET_H 135