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 classifyGlobalFunctionReference(const GlobalValue *GV) const;
127 
128  /// Classify a blockaddress reference for the current subtarget according to
129  /// how we should reference it in a non-pcrel context.
130  unsigned char classifyBlockAddressReference() const;
131 
132  unsigned getJumpTableEncoding() const;
133 
134  /// TODO this must be controlled by options like -malign-int and -mshort
136 
137  /// getSlotSize - Stack slot size in bytes.
138  unsigned getSlotSize() const { return 4; }
139 
141  StringRef FS,
142  const M68kTargetMachine &TM);
143 
144  const SelectionDAGTargetInfo *getSelectionDAGInfo() const override {
145  return &TSInfo;
146  }
147 
148  const M68kInstrInfo *getInstrInfo() const override { return &InstrInfo; }
149 
150  const M68kFrameLowering *getFrameLowering() const override {
151  return &FrameLowering;
152  }
153 
154  const M68kRegisterInfo *getRegisterInfo() const override {
155  return &InstrInfo.getRegisterInfo();
156  }
157 
158  const M68kTargetLowering *getTargetLowering() const override {
159  return &TLInfo;
160  }
161 
162  const InstrItineraryData *getInstrItineraryData() const override {
163  return &InstrItins;
164  }
165 
166 protected:
167  // GlobalISel related APIs.
168  std::unique_ptr<CallLowering> CallLoweringInfo;
169  std::unique_ptr<InstructionSelector> InstSelector;
170  std::unique_ptr<LegalizerInfo> Legalizer;
171  std::unique_ptr<RegisterBankInfo> RegBankInfo;
172 
173 public:
174  const CallLowering *getCallLowering() const override;
176  const LegalizerInfo *getLegalizerInfo() const override;
177  const RegisterBankInfo *getRegBankInfo() const override;
178 };
179 } // namespace llvm
180 
181 #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::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:158
llvm::M68kSubtarget::getRegisterInfo
const M68kRegisterInfo * getRegisterInfo() const override
Definition: M68kSubtarget.h:154
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:663
llvm::M68kSubtarget::getInstrInfo
const M68kInstrInfo * getInstrInfo() const override
Definition: M68kSubtarget.h:148
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:162
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:171
llvm::M68kSubtarget::getSelectionDAGInfo
const SelectionDAGTargetInfo * getSelectionDAGInfo() const override
Definition: M68kSubtarget.h:144
llvm::M68kSubtarget::getStackAlignment
Align getStackAlignment() const
TODO this must be controlled by options like -malign-int and -mshort.
Definition: M68kSubtarget.h:135
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:150
assert
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
llvm::M68kSubtarget::InstSelector
std::unique_ptr< InstructionSelector > InstSelector
Definition: M68kSubtarget.h:169
llvm::X86AS::FS
@ FS
Definition: X86.h:200
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:138
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:168
llvm::M68kSubtarget::Legalizer
std::unique_ptr< LegalizerInfo > Legalizer
Definition: M68kSubtarget.h:170
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