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