//===-- VESubtarget.h - Define Subtarget for the VE -------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file declares the VE specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIB_TARGET_VE_VESUBTARGET_H
#define LLVM_LIB_TARGET_VE_VESUBTARGET_H

#include "VEFrameLowering.h"
#include "VEISelLowering.h"
#include "VEInstrInfo.h"
#include "llvm/CodeGen/SelectionDAGTargetInfo.h"
#include "llvm/CodeGen/TargetFrameLowering.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/DataLayout.h"
#include <string>

#define GET_SUBTARGETINFO_HEADER
#include "VEGenSubtargetInfo.inc"

namespace llvm {
class StringRef;

class VESubtarget : public VEGenSubtargetInfo {
  Triple TargetTriple;
  virtual void anchor();

  /// Features {

  // Emit VPU instructions
  bool EnableVPU;

  /// } Features

  VEInstrInfo InstrInfo;
  VETargetLowering TLInfo;
  SelectionDAGTargetInfo TSInfo;
  VEFrameLowering FrameLowering;

public:
  VESubtarget(const Triple &TT, const std::string &CPU, const std::string &FS,
              const TargetMachine &TM);

  const VEInstrInfo *getInstrInfo() const override { return &InstrInfo; }
  const VEFrameLowering *getFrameLowering() const override {
    return &FrameLowering;
  }
  const VERegisterInfo *getRegisterInfo() const override {
    return &InstrInfo.getRegisterInfo();
  }
  const VETargetLowering *getTargetLowering() const override { return &TLInfo; }
  const SelectionDAGTargetInfo *getSelectionDAGInfo() const override {
    return &TSInfo;
  }

  bool enableMachineScheduler() const override;

  bool enableVPU() const { return EnableVPU; }

  /// ParseSubtargetFeatures - Parses features string setting specified
  /// subtarget options.  Definition of function is auto generated by tblgen.
  void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);
  VESubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS);

  /// Given a actual stack size as determined by FrameInfo, this function
  /// returns adjusted framesize which includes space for RSA, return
  /// address, and frame poitner.
  uint64_t getAdjustedFrameSize(uint64_t FrameSize) const;

  /// Get the size of RSA, return address, and frame pointer as described
  /// in VEFrameLowering.cpp.
  unsigned getRsaSize(void) const { return 176; };

  bool isTargetLinux() const { return TargetTriple.isOSLinux(); }
};

} // namespace llvm

#endif
