//===-- CSKYSubtarget.h - Define Subtarget for the CSKY----------*- 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 CSKY specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIB_TARGET_CSKY_CSKYSUBTARGET_H
#define LLVM_LIB_TARGET_CSKY_CSKYSUBTARGET_H

#include "CSKYFrameLowering.h"
#include "CSKYISelLowering.h"
#include "CSKYInstrInfo.h"
#include "CSKYRegisterInfo.h"
#include "llvm/CodeGen/SelectionDAGTargetInfo.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/Target/TargetMachine.h"

#define GET_SUBTARGETINFO_HEADER
#include "CSKYGenSubtargetInfo.inc"

namespace llvm {
class StringRef;

class CSKYSubtarget : public CSKYGenSubtargetInfo {
  virtual void anchor();

  CSKYFrameLowering FrameLowering;
  CSKYInstrInfo InstrInfo;
  CSKYRegisterInfo RegInfo;
  CSKYTargetLowering TLInfo;
  SelectionDAGTargetInfo TSInfo;

  enum CSKYProcFamilyEnum {
    Others,

    CK801,
    CK802,
    CK803,
    CK803S,
    CK804,
    CK805,
    CK807,
    CK810,
    CK810V,
    CK860,
    CK860V
  };

  /// CSKYProcFamily - CSKY processor family: CK801, CK802, and others.
  CSKYProcFamilyEnum CSKYProcFamily = Others;

  bool UseHardFloat;
  bool UseHardFloatABI;
  bool HasFPUv2SingleFloat;
  bool HasFPUv2DoubleFloat;
  bool HasFPUv3HalfWord;
  bool HasFPUv3HalfFloat;
  bool HasFPUv3SingleFloat;
  bool HasFPUv3DoubleFloat;
  bool HasFdivdu;
  bool HasFLOATE1;
  bool HasFLOAT1E2;
  bool HasFLOAT1E3;
  bool HasFLOAT3E4;
  bool HasFLOAT7E60;
  bool HasBTST16;
  bool HasExtendLrw;
  bool HasTrust;
  bool HasJAVA;
  bool HasCache;
  bool HasNVIC;
  bool HasDSP;
  bool HasDSP1E2;
  bool HasDSPE60;
  bool HasDSPV2;
  bool HasDSP_Silan;
  bool HasDoloop;
  bool HasHardwareDivide;
  bool HasHighRegisters;
  bool HasVDSPV2;
  bool HasVDSP2E3;
  bool HasVDSP2E60F;
  bool ReadTPHard;
  bool HasVDSPV1_128;
  bool UseCCRT;
  bool DumpConstPool;
  bool EnableInterruptAttribute;
  bool HasPushPop;
  bool HasSTM;
  bool SmartMode;
  bool EnableStackSize;

  bool HasE1;
  bool HasE2;
  bool Has2E3;
  bool HasMP;
  bool Has3E3r1;
  bool Has3r1E3r2;
  bool Has3r2E3r3;
  bool Has3E7;
  bool HasMP1E2;
  bool Has7E10;
  bool Has10E60;

public:
  CSKYSubtarget(const Triple &TT, StringRef CPU, StringRef TuneCPU,
                StringRef FS, const TargetMachine &TM);

  const CSKYFrameLowering *getFrameLowering() const override {
    return &FrameLowering;
  }
  const CSKYInstrInfo *getInstrInfo() const override { return &InstrInfo; }
  const CSKYRegisterInfo *getRegisterInfo() const override { return &RegInfo; }
  const CSKYTargetLowering *getTargetLowering() const override {
    return &TLInfo;
  }
  const SelectionDAGTargetInfo *getSelectionDAGInfo() const override {
    return &TSInfo;
  }

  /// Initializes using the passed in CPU and feature strings so that we can
  /// use initializer lists for subtarget initialization.
  CSKYSubtarget &initializeSubtargetDependencies(const Triple &TT,
                                                 StringRef CPU,
                                                 StringRef TuneCPU,
                                                 StringRef FS);

  // Generated by inc file
  void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);

  bool useHardFloatABI() const;
  bool useHardFloat() const { return UseHardFloat; }
  bool hasFPUv2SingleFloat() const { return HasFPUv2SingleFloat; }
  bool hasFPUv2DoubleFloat() const { return HasFPUv2DoubleFloat; }
  bool hasFPUv2() const { return HasFPUv2SingleFloat || HasFPUv2DoubleFloat; }
  bool hasFPUv3HalfWord() const { return HasFPUv3HalfWord; }
  bool hasFPUv3HalfFloat() const { return HasFPUv3HalfFloat; }
  bool hasFPUv3SingleFloat() const { return HasFPUv3SingleFloat; }
  bool hasFPUv3DoubleFloat() const { return HasFPUv3DoubleFloat; }
  bool hasFPUv3() const {
    return HasFPUv3HalfFloat || HasFPUv3SingleFloat || HasFPUv3DoubleFloat;
  }
  bool hasAnyFloatExt() const { return hasFPUv2() || hasFPUv3(); };
  bool hasFdivdu() const { return HasFdivdu; }
  bool hasFLOATE1() const { return HasFLOATE1; }
  bool hasFLOAT1E2() const { return HasFLOAT1E2; }
  bool hasFLOAT1E3() const { return HasFLOAT1E3; }
  bool hasFLOAT3E4() const { return HasFLOAT3E4; }
  bool hasFLOAT7E60() const { return HasFLOAT7E60; }
  bool hasExtendLrw() const { return HasExtendLrw; }
  bool hasBTST16() const { return HasBTST16; }
  bool hasTrust() const { return HasTrust; }
  bool hasJAVA() const { return HasJAVA; }
  bool hasCache() const { return HasCache; }
  bool hasNVIC() const { return HasNVIC; }
  bool hasDSP() const { return HasDSP; }
  bool hasDSP1E2() const { return HasDSP1E2; }
  bool hasDSPE60() const { return HasDSPE60; }
  bool hasDSPV2() const { return HasDSPV2; }
  bool hasDSP_Silan() const { return HasDSP_Silan; }
  bool hasDoloop() const { return HasDoloop; }
  bool hasHighRegisters() const { return HasHighRegisters; }
  bool hasVDSPV2() const { return HasVDSPV2; }
  bool hasVDSPV2_FLOAT() const { return HasVDSPV2 && UseHardFloat; }
  bool hasVDSPV2_HALF() const {
    return HasVDSPV2 && UseHardFloat && HasFPUv3HalfFloat;
  }
  bool hasVDSP2E3() const { return HasVDSP2E3; }
  bool hasVDSP2E60F() const { return HasVDSP2E60F; }
  bool readTPHard() const { return ReadTPHard; }
  bool hasVDSPV1_128() const { return HasVDSPV1_128; }
  bool useCCRT() const { return UseCCRT; }
  bool dumpConstPool() const { return DumpConstPool; }
  bool enableInterruptAttribute() const { return EnableInterruptAttribute; }
  bool hasPushPop() const { return HasPushPop; }
  bool hasSTM() const { return HasSTM; }
  bool smartMode() const { return SmartMode; }
  bool enableStackSize() const { return EnableStackSize; }

  bool hasE1() const { return HasE1; }
  bool hasE2() const { return HasE2; }
  bool has2E3() const { return Has2E3; }
  bool has3r1E3r2() const { return Has3r1E3r2; }
  bool has3r2E3r3() const { return Has3r2E3r3; }
  bool has3E3r1() const { return Has3E3r1; }
  bool has3E7() const { return Has3E7; }
  bool hasMP() const { return HasMP; }
  bool hasMP1E2() const { return HasMP1E2; }
  bool has7E10() const { return Has7E10; }
  bool has10E60() const { return Has10E60; }

  bool isCK801() const { return CSKYProcFamily == CK801; }
  bool isCK802() const { return CSKYProcFamily == CK802; }
  bool isCK803() const { return CSKYProcFamily == CK803; }
  bool isCK803S() const { return CSKYProcFamily == CK803S; }
  bool isCK804() const { return CSKYProcFamily == CK804; }
  bool isCK805() const { return CSKYProcFamily == CK805; }
  bool isCK807() const { return CSKYProcFamily == CK807; }
  bool isCK810() const { return CSKYProcFamily == CK810; }
  bool isCK810V() const { return CSKYProcFamily == CK810V; }
  bool isCK860() const { return CSKYProcFamily == CK860; }
  bool isCK860V() const { return CSKYProcFamily == CK860V; }
};
} // namespace llvm

#endif // LLVM_LIB_TARGET_CSKY_CSKYSUBTARGET_H
