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