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