1*da58b97aSjoerg //===-- VESubtarget.h - Define Subtarget for the VE -------------*- C++ -*-===// 2*da58b97aSjoerg // 3*da58b97aSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*da58b97aSjoerg // See https://llvm.org/LICENSE.txt for license information. 5*da58b97aSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*da58b97aSjoerg // 7*da58b97aSjoerg //===----------------------------------------------------------------------===// 8*da58b97aSjoerg // 9*da58b97aSjoerg // This file declares the VE specific subclass of TargetSubtargetInfo. 10*da58b97aSjoerg // 11*da58b97aSjoerg //===----------------------------------------------------------------------===// 12*da58b97aSjoerg 13*da58b97aSjoerg #ifndef LLVM_LIB_TARGET_VE_VESUBTARGET_H 14*da58b97aSjoerg #define LLVM_LIB_TARGET_VE_VESUBTARGET_H 15*da58b97aSjoerg 16*da58b97aSjoerg #include "VEFrameLowering.h" 17*da58b97aSjoerg #include "VEISelLowering.h" 18*da58b97aSjoerg #include "VEInstrInfo.h" 19*da58b97aSjoerg #include "llvm/CodeGen/SelectionDAGTargetInfo.h" 20*da58b97aSjoerg #include "llvm/CodeGen/TargetFrameLowering.h" 21*da58b97aSjoerg #include "llvm/CodeGen/TargetSubtargetInfo.h" 22*da58b97aSjoerg #include "llvm/IR/DataLayout.h" 23*da58b97aSjoerg #include <string> 24*da58b97aSjoerg 25*da58b97aSjoerg #define GET_SUBTARGETINFO_HEADER 26*da58b97aSjoerg #include "VEGenSubtargetInfo.inc" 27*da58b97aSjoerg 28*da58b97aSjoerg namespace llvm { 29*da58b97aSjoerg class StringRef; 30*da58b97aSjoerg 31*da58b97aSjoerg class VESubtarget : public VEGenSubtargetInfo { 32*da58b97aSjoerg Triple TargetTriple; 33*da58b97aSjoerg virtual void anchor(); 34*da58b97aSjoerg 35*da58b97aSjoerg /// Features { 36*da58b97aSjoerg 37*da58b97aSjoerg // Emit VPU instructions 38*da58b97aSjoerg bool EnableVPU; 39*da58b97aSjoerg 40*da58b97aSjoerg /// } Features 41*da58b97aSjoerg 42*da58b97aSjoerg VEInstrInfo InstrInfo; 43*da58b97aSjoerg VETargetLowering TLInfo; 44*da58b97aSjoerg SelectionDAGTargetInfo TSInfo; 45*da58b97aSjoerg VEFrameLowering FrameLowering; 46*da58b97aSjoerg 47*da58b97aSjoerg public: 48*da58b97aSjoerg VESubtarget(const Triple &TT, const std::string &CPU, const std::string &FS, 49*da58b97aSjoerg const TargetMachine &TM); 50*da58b97aSjoerg getInstrInfo()51*da58b97aSjoerg const VEInstrInfo *getInstrInfo() const override { return &InstrInfo; } getFrameLowering()52*da58b97aSjoerg const VEFrameLowering *getFrameLowering() const override { 53*da58b97aSjoerg return &FrameLowering; 54*da58b97aSjoerg } getRegisterInfo()55*da58b97aSjoerg const VERegisterInfo *getRegisterInfo() const override { 56*da58b97aSjoerg return &InstrInfo.getRegisterInfo(); 57*da58b97aSjoerg } getTargetLowering()58*da58b97aSjoerg const VETargetLowering *getTargetLowering() const override { return &TLInfo; } getSelectionDAGInfo()59*da58b97aSjoerg const SelectionDAGTargetInfo *getSelectionDAGInfo() const override { 60*da58b97aSjoerg return &TSInfo; 61*da58b97aSjoerg } 62*da58b97aSjoerg 63*da58b97aSjoerg bool enableMachineScheduler() const override; 64*da58b97aSjoerg enableVPU()65*da58b97aSjoerg bool enableVPU() const { return EnableVPU; } 66*da58b97aSjoerg 67*da58b97aSjoerg /// ParseSubtargetFeatures - Parses features string setting specified 68*da58b97aSjoerg /// subtarget options. Definition of function is auto generated by tblgen. 69*da58b97aSjoerg void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS); 70*da58b97aSjoerg VESubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS); 71*da58b97aSjoerg 72*da58b97aSjoerg /// Given a actual stack size as determined by FrameInfo, this function 73*da58b97aSjoerg /// returns adjusted framesize which includes space for RSA, return 74*da58b97aSjoerg /// address, and frame poitner. 75*da58b97aSjoerg uint64_t getAdjustedFrameSize(uint64_t FrameSize) const; 76*da58b97aSjoerg 77*da58b97aSjoerg /// Get the size of RSA, return address, and frame pointer as described 78*da58b97aSjoerg /// in VEFrameLowering.cpp. getRsaSize(void)79*da58b97aSjoerg unsigned getRsaSize(void) const { return 176; }; 80*da58b97aSjoerg isTargetLinux()81*da58b97aSjoerg bool isTargetLinux() const { return TargetTriple.isOSLinux(); } 82*da58b97aSjoerg }; 83*da58b97aSjoerg 84*da58b97aSjoerg } // namespace llvm 85*da58b97aSjoerg 86*da58b97aSjoerg #endif 87