10b57cec5SDimitry Andric //===-- MSP430Subtarget.h - Define Subtarget for the MSP430 ----*- C++ -*--===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file declares the MSP430 specific subclass of TargetSubtargetInfo. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_MSP430_MSP430SUBTARGET_H 140b57cec5SDimitry Andric #define LLVM_LIB_TARGET_MSP430_MSP430SUBTARGET_H 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric #include "MSP430FrameLowering.h" 170b57cec5SDimitry Andric #include "MSP430ISelLowering.h" 180b57cec5SDimitry Andric #include "MSP430InstrInfo.h" 190b57cec5SDimitry Andric #include "MSP430RegisterInfo.h" 200b57cec5SDimitry Andric #include "llvm/CodeGen/SelectionDAGTargetInfo.h" 210b57cec5SDimitry Andric #include "llvm/CodeGen/TargetSubtargetInfo.h" 220b57cec5SDimitry Andric #include "llvm/IR/DataLayout.h" 230b57cec5SDimitry Andric #include <string> 240b57cec5SDimitry Andric 250b57cec5SDimitry Andric #define GET_SUBTARGETINFO_HEADER 260b57cec5SDimitry Andric #include "MSP430GenSubtargetInfo.inc" 270b57cec5SDimitry Andric 280b57cec5SDimitry Andric namespace llvm { 290b57cec5SDimitry Andric class StringRef; 300b57cec5SDimitry Andric 310b57cec5SDimitry Andric class MSP430Subtarget : public MSP430GenSubtargetInfo { 320b57cec5SDimitry Andric public: 330b57cec5SDimitry Andric enum HWMultEnum { 340b57cec5SDimitry Andric NoHWMult, HWMult16, HWMult32, HWMultF5 350b57cec5SDimitry Andric }; 360b57cec5SDimitry Andric 370b57cec5SDimitry Andric private: 380b57cec5SDimitry Andric virtual void anchor(); 39480093f4SDimitry Andric bool ExtendedInsts = false; 40480093f4SDimitry Andric HWMultEnum HWMultMode = NoHWMult; 410b57cec5SDimitry Andric MSP430InstrInfo InstrInfo; 420b57cec5SDimitry Andric MSP430TargetLowering TLInfo; 430b57cec5SDimitry Andric SelectionDAGTargetInfo TSInfo; 44*06c3fb27SDimitry Andric MSP430FrameLowering FrameLowering; 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric public: 470b57cec5SDimitry Andric /// This constructor initializes the data members to match that 480b57cec5SDimitry Andric /// of the specified triple. 490b57cec5SDimitry Andric /// 500b57cec5SDimitry Andric MSP430Subtarget(const Triple &TT, const std::string &CPU, 510b57cec5SDimitry Andric const std::string &FS, const TargetMachine &TM); 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric MSP430Subtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS); 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric /// ParseSubtargetFeatures - Parses features string setting specified 560b57cec5SDimitry Andric /// subtarget options. Definition of function is auto generated by tblgen. 57e8d8bef9SDimitry Andric void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS); 580b57cec5SDimitry Andric hasHWMult16()590b57cec5SDimitry Andric bool hasHWMult16() const { return HWMultMode == HWMult16; } hasHWMult32()600b57cec5SDimitry Andric bool hasHWMult32() const { return HWMultMode == HWMult32; } hasHWMultF5()610b57cec5SDimitry Andric bool hasHWMultF5() const { return HWMultMode == HWMultF5; } 620b57cec5SDimitry Andric getFrameLowering()630b57cec5SDimitry Andric const TargetFrameLowering *getFrameLowering() const override { 640b57cec5SDimitry Andric return &FrameLowering; 650b57cec5SDimitry Andric } getInstrInfo()660b57cec5SDimitry Andric const MSP430InstrInfo *getInstrInfo() const override { return &InstrInfo; } getRegisterInfo()67*06c3fb27SDimitry Andric const MSP430RegisterInfo *getRegisterInfo() const override { 68*06c3fb27SDimitry Andric return &getInstrInfo()->getRegisterInfo(); 690b57cec5SDimitry Andric } 70*06c3fb27SDimitry Andric getTargetLowering()710b57cec5SDimitry Andric const MSP430TargetLowering *getTargetLowering() const override { 720b57cec5SDimitry Andric return &TLInfo; 730b57cec5SDimitry Andric } getSelectionDAGInfo()740b57cec5SDimitry Andric const SelectionDAGTargetInfo *getSelectionDAGInfo() const override { 750b57cec5SDimitry Andric return &TSInfo; 760b57cec5SDimitry Andric } 770b57cec5SDimitry Andric }; 780b57cec5SDimitry Andric } // End llvm namespace 790b57cec5SDimitry Andric 800b57cec5SDimitry Andric #endif // LLVM_TARGET_MSP430_SUBTARGET_H 81