LLVM 17.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"
30
31#include <string>
32
33#define GET_SUBTARGETINFO_HEADER
34#include "M68kGenSubtargetInfo.inc"
35
36extern bool M68kReserveGP;
37extern bool M68kNoCpload;
38
39namespace llvm {
40class StringRef;
41
42class M68kTargetMachine;
43
45 virtual void anchor();
46
47protected:
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.
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
74public:
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
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
164 return &InstrItins;
165 }
166
167protected:
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
174public:
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
This file describes how to lower LLVM calls to machine code calls.
Interface for Targets to specify which operations they can successfully select and how the others sho...
This file contains the M68k declaration of TargetFrameLowering class.
This file defines the interfaces that M68k uses to lower LLVM code into a selection DAG.
This file contains the M68k implementation of the TargetInstrInfo class.
bool M68kReserveGP
bool M68kNoCpload
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
Itinerary data supplied by a subtarget to be used by a target.
Provides the logic to select generic machine instructions.
const M68kRegisterInfo & getRegisterInfo() const
TargetInstrInfo is a superset of MRegister info.
Align getStackAlignment() const
TODO this must be controlled by options like -malign-int and -mshort.
unsigned char classifyExternalReference(const Module &M) const
Classify a external variable reference for the current subtarget according to how we should reference...
InstrItineraryData InstrItins
Definition: M68kSubtarget.h:56
const M68kTargetLowering * getTargetLowering() const override
bool atLeastM68060() const
Definition: M68kSubtarget.h:89
SubtargetEnum SubtargetKind
Definition: M68kSubtarget.h:52
bool atLeastM68040() const
Definition: M68kSubtarget.h:88
unsigned char classifyBlockAddressReference() const
Classify a blockaddress reference for the current subtarget according to how we should reference it i...
const LegalizerInfo * getLegalizerInfo() const override
M68kInstrInfo InstrInfo
Definition: M68kSubtarget.h:64
const InstrItineraryData * getInstrItineraryData() const override
std::bitset< M68k::NUM_TARGET_REGS > UserReservedRegister
Definition: M68kSubtarget.h:54
const RegisterBankInfo * getRegBankInfo() const override
bool UseSmallSection
Small section is used.
Definition: M68kSubtarget.h:59
bool isLegalToCallImmediateAddr() const
Return true if the subtarget allows calls to immediate address.
std::unique_ptr< CallLowering > CallLoweringInfo
void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS)
Parses features string setting specified subtarget options.
const M68kTargetMachine & TM
Definition: M68kSubtarget.h:61
unsigned getSlotSize() const
getSlotSize - Stack slot size in bytes.
const Triple & getTargetTriple() const
Definition: M68kSubtarget.h:95
M68kTargetLowering TLInfo
Definition: M68kSubtarget.h:66
SelectionDAGTargetInfo TSInfo
Definition: M68kSubtarget.h:63
bool isRegisterReservedByUser(Register R) const
const M68kInstrInfo * getInstrInfo() const override
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...
bool atLeastM68000() const
Definition: M68kSubtarget.h:84
const CallLowering * getCallLowering() const override
const SelectionDAGTargetInfo * getSelectionDAGInfo() const override
unsigned getJumpTableEncoding() const
InstructionSelector * getInstructionSelector() const override
bool useSmallSection() const
Definition: M68kSubtarget.h:91
bool atLeastM68010() const
Definition: M68kSubtarget.h:85
std::unique_ptr< RegisterBankInfo > RegBankInfo
unsigned char classifyLocalReference(const GlobalValue *GV) const
Classify a global variable reference for the current subtarget according to how we should reference i...
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
const M68kRegisterInfo * getRegisterInfo() const override
bool abiUsesSoftFloat() const
std::unique_ptr< LegalizerInfo > Legalizer
bool atLeastM68020() const
Definition: M68kSubtarget.h:86
bool isPositionIndependent() const
M68kSubtarget & initializeSubtargetDependencies(StringRef CPU, Triple TT, StringRef FS, const M68kTargetMachine &TM)
M68kFrameLowering FrameLowering
Definition: M68kSubtarget.h:65
bool atLeastM68030() const
Definition: M68kSubtarget.h:87
unsigned char classifyGlobalFunctionReference(const GlobalValue *GV, const Module &M) const
Classify a global function reference for the current subtarget.
bool isTargetELF() const
Definition: M68kSubtarget.h:97
std::unique_ptr< InstructionSelector > InstSelector
const M68kFrameLowering * getFrameLowering() const override
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
Holds all the information related to register banks.
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
Targets can subclass this to parameterize the SelectionDAG lowering and instruction selection process...
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
Definition: Triple.h:674
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39