104eeddc0SDimitry Andric //===-- M68kSubtarget.h - Define Subtarget for the M68k ---------*- C++ -*-===// 2fe6060f1SDimitry Andric // 3fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6fe6060f1SDimitry Andric // 7fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 8fe6060f1SDimitry Andric /// 9fe6060f1SDimitry Andric /// \file 10fe6060f1SDimitry Andric /// This file declares the M68k specific subclass of TargetSubtargetInfo. 11fe6060f1SDimitry Andric /// 12fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 13fe6060f1SDimitry Andric 1404eeddc0SDimitry Andric #ifndef LLVM_LIB_TARGET_M68K_M68KSUBTARGET_H 1504eeddc0SDimitry Andric #define LLVM_LIB_TARGET_M68K_M68KSUBTARGET_H 16fe6060f1SDimitry Andric 17fe6060f1SDimitry Andric #include "M68kFrameLowering.h" 18fe6060f1SDimitry Andric #include "M68kISelLowering.h" 19fe6060f1SDimitry Andric #include "M68kInstrInfo.h" 20fe6060f1SDimitry Andric 21fe6060f1SDimitry Andric #include "llvm/CodeGen/GlobalISel/CallLowering.h" 22fe6060f1SDimitry Andric #include "llvm/CodeGen/GlobalISel/InstructionSelector.h" 23fe6060f1SDimitry Andric #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h" 2481ad6265SDimitry Andric #include "llvm/CodeGen/RegisterBankInfo.h" 25fe6060f1SDimitry Andric #include "llvm/CodeGen/SelectionDAGTargetInfo.h" 26fe6060f1SDimitry Andric #include "llvm/CodeGen/TargetSubtargetInfo.h" 27fe6060f1SDimitry Andric #include "llvm/IR/DataLayout.h" 28fe6060f1SDimitry Andric #include "llvm/MC/MCInstrItineraries.h" 29fe6060f1SDimitry Andric #include "llvm/Support/Alignment.h" 30fe6060f1SDimitry Andric 31fe6060f1SDimitry Andric #include <string> 32fe6060f1SDimitry Andric 33fe6060f1SDimitry Andric #define GET_SUBTARGETINFO_HEADER 34fe6060f1SDimitry Andric #include "M68kGenSubtargetInfo.inc" 35fe6060f1SDimitry Andric 36fe6060f1SDimitry Andric extern bool M68kReserveGP; 37fe6060f1SDimitry Andric extern bool M68kNoCpload; 38fe6060f1SDimitry Andric 39fe6060f1SDimitry Andric namespace llvm { 40fe6060f1SDimitry Andric class StringRef; 41fe6060f1SDimitry Andric 42fe6060f1SDimitry Andric class M68kTargetMachine; 43fe6060f1SDimitry Andric 44fe6060f1SDimitry Andric class M68kSubtarget : public M68kGenSubtargetInfo { 45fe6060f1SDimitry Andric virtual void anchor(); 46fe6060f1SDimitry Andric 47fe6060f1SDimitry Andric protected: 48fe6060f1SDimitry Andric // These define which ISA is supported. Since each Motorola M68k ISA is 49fe6060f1SDimitry Andric // built on top of the previous one whenever an ISA is selected the previous 50fe6060f1SDimitry Andric // selected as well. 51fe6060f1SDimitry Andric enum SubtargetEnum { M00, M10, M20, M30, M40, M60 }; 52fe6060f1SDimitry Andric SubtargetEnum SubtargetKind = M00; 53fe6060f1SDimitry Andric 54*bdd1243dSDimitry Andric std::bitset<M68k::NUM_TARGET_REGS> UserReservedRegister; 55fe6060f1SDimitry Andric 56fe6060f1SDimitry Andric InstrItineraryData InstrItins; 57fe6060f1SDimitry Andric 58fe6060f1SDimitry Andric /// Small section is used. 59fe6060f1SDimitry Andric bool UseSmallSection = true; 60fe6060f1SDimitry Andric 61fe6060f1SDimitry Andric const M68kTargetMachine &TM; 62fe6060f1SDimitry Andric 63fe6060f1SDimitry Andric SelectionDAGTargetInfo TSInfo; 64fe6060f1SDimitry Andric M68kInstrInfo InstrInfo; 65fe6060f1SDimitry Andric M68kFrameLowering FrameLowering; 66fe6060f1SDimitry Andric M68kTargetLowering TLInfo; 67fe6060f1SDimitry Andric 68fe6060f1SDimitry Andric /// The minimum alignment known to hold of the stack frame on 69fe6060f1SDimitry Andric /// entry to the function and which must be maintained by every function. 70fe6060f1SDimitry Andric unsigned stackAlignment = 8; 71fe6060f1SDimitry Andric 72fe6060f1SDimitry Andric Triple TargetTriple; 73fe6060f1SDimitry Andric 74fe6060f1SDimitry Andric public: 75fe6060f1SDimitry Andric /// This constructor initializes the data members to match that 76fe6060f1SDimitry Andric /// of the specified triple. 77fe6060f1SDimitry Andric M68kSubtarget(const Triple &TT, StringRef CPU, StringRef FS, 78fe6060f1SDimitry Andric const M68kTargetMachine &_TM); 79fe6060f1SDimitry Andric 80fe6060f1SDimitry Andric /// Parses features string setting specified subtarget options. Definition 81fe6060f1SDimitry Andric /// of function is auto generated by tblgen. 82fe6060f1SDimitry Andric void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS); 83fe6060f1SDimitry Andric 84fe6060f1SDimitry Andric bool atLeastM68000() const { return SubtargetKind >= M00; } 85fe6060f1SDimitry Andric bool atLeastM68010() const { return SubtargetKind >= M10; } 86fe6060f1SDimitry Andric bool atLeastM68020() const { return SubtargetKind >= M20; } 87fe6060f1SDimitry Andric bool atLeastM68030() const { return SubtargetKind >= M30; } 88fe6060f1SDimitry Andric bool atLeastM68040() const { return SubtargetKind >= M40; } 89fe6060f1SDimitry Andric bool atLeastM68060() const { return SubtargetKind >= M60; } 90fe6060f1SDimitry Andric 91fe6060f1SDimitry Andric bool useSmallSection() const { return UseSmallSection; } 92fe6060f1SDimitry Andric 93fe6060f1SDimitry Andric bool abiUsesSoftFloat() const; 94fe6060f1SDimitry Andric 95fe6060f1SDimitry Andric const Triple &getTargetTriple() const { return TargetTriple; } 96fe6060f1SDimitry Andric 97fe6060f1SDimitry Andric bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); } 98fe6060f1SDimitry Andric 99fe6060f1SDimitry Andric /// Return true if the subtarget allows calls to immediate address. 100fe6060f1SDimitry Andric bool isLegalToCallImmediateAddr() const; 101fe6060f1SDimitry Andric 102fe6060f1SDimitry Andric bool isPositionIndependent() const; 103fe6060f1SDimitry Andric 104fe6060f1SDimitry Andric bool isRegisterReservedByUser(Register R) const { 105fe6060f1SDimitry Andric assert(R < M68k::NUM_TARGET_REGS && "Register out of range"); 106fe6060f1SDimitry Andric return UserReservedRegister[R]; 107fe6060f1SDimitry Andric } 108fe6060f1SDimitry Andric 109fe6060f1SDimitry Andric /// Classify a global variable reference for the current subtarget according 110fe6060f1SDimitry Andric /// to how we should reference it in a non-pcrel context. 111fe6060f1SDimitry Andric unsigned char classifyLocalReference(const GlobalValue *GV) const; 112fe6060f1SDimitry Andric 113fe6060f1SDimitry Andric /// Classify a global variable reference for the current subtarget according 114fe6060f1SDimitry Andric /// to how we should reference it in a non-pcrel context. 115fe6060f1SDimitry Andric unsigned char classifyGlobalReference(const GlobalValue *GV, 116fe6060f1SDimitry Andric const Module &M) const; 117fe6060f1SDimitry Andric unsigned char classifyGlobalReference(const GlobalValue *GV) const; 118fe6060f1SDimitry Andric 119fe6060f1SDimitry Andric /// Classify a external variable reference for the current subtarget according 120fe6060f1SDimitry Andric /// to how we should reference it in a non-pcrel context. 121fe6060f1SDimitry Andric unsigned char classifyExternalReference(const Module &M) const; 122fe6060f1SDimitry Andric 123fe6060f1SDimitry Andric /// Classify a global function reference for the current subtarget. 124fe6060f1SDimitry Andric unsigned char classifyGlobalFunctionReference(const GlobalValue *GV, 125fe6060f1SDimitry Andric const Module &M) const; 126*bdd1243dSDimitry Andric unsigned char 127*bdd1243dSDimitry Andric classifyGlobalFunctionReference(const GlobalValue *GV) const override; 128fe6060f1SDimitry Andric 129fe6060f1SDimitry Andric /// Classify a blockaddress reference for the current subtarget according to 130fe6060f1SDimitry Andric /// how we should reference it in a non-pcrel context. 131fe6060f1SDimitry Andric unsigned char classifyBlockAddressReference() const; 132fe6060f1SDimitry Andric 133fe6060f1SDimitry Andric unsigned getJumpTableEncoding() const; 134fe6060f1SDimitry Andric 135fe6060f1SDimitry Andric /// TODO this must be controlled by options like -malign-int and -mshort 136fe6060f1SDimitry Andric Align getStackAlignment() const { return Align(stackAlignment); } 137fe6060f1SDimitry Andric 138fe6060f1SDimitry Andric /// getSlotSize - Stack slot size in bytes. 139fe6060f1SDimitry Andric unsigned getSlotSize() const { return 4; } 140fe6060f1SDimitry Andric 141fe6060f1SDimitry Andric M68kSubtarget &initializeSubtargetDependencies(StringRef CPU, Triple TT, 142fe6060f1SDimitry Andric StringRef FS, 143fe6060f1SDimitry Andric const M68kTargetMachine &TM); 144fe6060f1SDimitry Andric 145fe6060f1SDimitry Andric const SelectionDAGTargetInfo *getSelectionDAGInfo() const override { 146fe6060f1SDimitry Andric return &TSInfo; 147fe6060f1SDimitry Andric } 148fe6060f1SDimitry Andric 149fe6060f1SDimitry Andric const M68kInstrInfo *getInstrInfo() const override { return &InstrInfo; } 150fe6060f1SDimitry Andric 151fe6060f1SDimitry Andric const M68kFrameLowering *getFrameLowering() const override { 152fe6060f1SDimitry Andric return &FrameLowering; 153fe6060f1SDimitry Andric } 154fe6060f1SDimitry Andric 155fe6060f1SDimitry Andric const M68kRegisterInfo *getRegisterInfo() const override { 156fe6060f1SDimitry Andric return &InstrInfo.getRegisterInfo(); 157fe6060f1SDimitry Andric } 158fe6060f1SDimitry Andric 159fe6060f1SDimitry Andric const M68kTargetLowering *getTargetLowering() const override { 160fe6060f1SDimitry Andric return &TLInfo; 161fe6060f1SDimitry Andric } 162fe6060f1SDimitry Andric 163fe6060f1SDimitry Andric const InstrItineraryData *getInstrItineraryData() const override { 164fe6060f1SDimitry Andric return &InstrItins; 165fe6060f1SDimitry Andric } 166fe6060f1SDimitry Andric 167fe6060f1SDimitry Andric protected: 168fe6060f1SDimitry Andric // GlobalISel related APIs. 169fe6060f1SDimitry Andric std::unique_ptr<CallLowering> CallLoweringInfo; 170fe6060f1SDimitry Andric std::unique_ptr<InstructionSelector> InstSelector; 171fe6060f1SDimitry Andric std::unique_ptr<LegalizerInfo> Legalizer; 172fe6060f1SDimitry Andric std::unique_ptr<RegisterBankInfo> RegBankInfo; 173fe6060f1SDimitry Andric 174fe6060f1SDimitry Andric public: 175fe6060f1SDimitry Andric const CallLowering *getCallLowering() const override; 176fe6060f1SDimitry Andric InstructionSelector *getInstructionSelector() const override; 177fe6060f1SDimitry Andric const LegalizerInfo *getLegalizerInfo() const override; 178fe6060f1SDimitry Andric const RegisterBankInfo *getRegBankInfo() const override; 179fe6060f1SDimitry Andric }; 180fe6060f1SDimitry Andric } // namespace llvm 181fe6060f1SDimitry Andric 18204eeddc0SDimitry Andric #endif // LLVM_LIB_TARGET_M68K_M68KSUBTARGET_H 183