xref: /freebsd/contrib/llvm-project/llvm/lib/Target/M68k/M68kSubtarget.h (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
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 
21 #include "llvm/CodeGen/GlobalISel/CallLowering.h"
22 #include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
23 #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
24 #include "llvm/CodeGen/RegisterBankInfo.h"
25 #include "llvm/CodeGen/SelectionDAGTargetInfo.h"
26 #include "llvm/CodeGen/TargetSubtargetInfo.h"
27 #include "llvm/IR/DataLayout.h"
28 #include "llvm/MC/MCInstrItineraries.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 
44 class M68kSubtarget : public M68kGenSubtargetInfo {
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 };
52   SubtargetEnum SubtargetKind = M00;
53 
54   enum FPKindEnum { M881, M882 };
55   std::optional<FPKindEnum> FPUKind;
56 
57   std::bitset<M68k::NUM_TARGET_REGS> UserReservedRegister;
58 
59   InstrItineraryData InstrItins;
60 
61   /// Small section is used.
62   bool UseSmallSection = true;
63 
64   const M68kTargetMachine &TM;
65 
66   SelectionDAGTargetInfo TSInfo;
67   M68kInstrInfo InstrInfo;
68   M68kFrameLowering FrameLowering;
69   M68kTargetLowering TLInfo;
70 
71   /// The minimum alignment known to hold of the stack frame on
72   /// entry to the function and which must be maintained by every function.
73   unsigned stackAlignment = 8;
74 
75   Triple TargetTriple;
76 
77 public:
78   /// This constructor initializes the data members to match that
79   /// of the specified triple.
80   M68kSubtarget(const Triple &TT, StringRef CPU, StringRef FS,
81                 const M68kTargetMachine &_TM);
82 
83   /// Parses features string setting specified subtarget options.  Definition
84   /// of function is auto generated by tblgen.
85   void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);
86 
atLeastM68000()87   bool atLeastM68000() const { return SubtargetKind >= M00; }
atLeastM68010()88   bool atLeastM68010() const { return SubtargetKind >= M10; }
atLeastM68020()89   bool atLeastM68020() const { return SubtargetKind >= M20; }
atLeastM68030()90   bool atLeastM68030() const { return SubtargetKind >= M30; }
atLeastM68040()91   bool atLeastM68040() const { return SubtargetKind >= M40; }
atLeastM68060()92   bool atLeastM68060() const { return SubtargetKind >= M60; }
93 
94   /// Floating point support
hasFPU()95   bool hasFPU() const { return FPUKind.has_value(); }
atLeastM68881()96   bool atLeastM68881() const { return hasFPU() && *FPUKind >= M881; }
atLeastM68882()97   bool atLeastM68882() const { return hasFPU() && *FPUKind >= M882; }
98 
useSmallSection()99   bool useSmallSection() const { return UseSmallSection; }
100 
getTargetTriple()101   const Triple &getTargetTriple() const { return TargetTriple; }
102 
isTargetELF()103   bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); }
104 
105   /// Return true if the subtarget allows calls to immediate address.
106   bool isLegalToCallImmediateAddr() const;
107 
108   bool isPositionIndependent() const;
109 
isRegisterReservedByUser(Register R)110   bool isRegisterReservedByUser(Register R) const {
111     assert(R < M68k::NUM_TARGET_REGS && "Register out of range");
112     return UserReservedRegister[R];
113   }
114 
115   /// Classify a global variable reference for the current subtarget according
116   /// to how we should reference it in a non-pcrel context.
117   unsigned char classifyLocalReference(const GlobalValue *GV) const;
118 
119   /// Classify a global variable reference for the current subtarget according
120   /// to how we should reference it in a non-pcrel context.
121   unsigned char classifyGlobalReference(const GlobalValue *GV,
122                                         const Module &M) const;
123   unsigned char classifyGlobalReference(const GlobalValue *GV) const;
124 
125   /// Classify a external variable reference for the current subtarget according
126   /// to how we should reference it in a non-pcrel context.
127   unsigned char classifyExternalReference(const Module &M) const;
128 
129   /// Classify a global function reference for the current subtarget.
130   unsigned char classifyGlobalFunctionReference(const GlobalValue *GV,
131                                                 const Module &M) const;
132   unsigned char
133   classifyGlobalFunctionReference(const GlobalValue *GV) const override;
134 
135   /// Classify a blockaddress reference for the current subtarget according to
136   /// how we should reference it in a non-pcrel context.
137   unsigned char classifyBlockAddressReference() const;
138 
139   unsigned getJumpTableEncoding() const;
140 
141   /// TODO this must be controlled by options like -malign-int and -mshort
getStackAlignment()142   Align getStackAlignment() const { return Align(stackAlignment); }
143 
144   /// getSlotSize - Stack slot size in bytes.
getSlotSize()145   unsigned getSlotSize() const { return 4; }
146 
147   M68kSubtarget &initializeSubtargetDependencies(StringRef CPU, Triple TT,
148                                                  StringRef FS,
149                                                  const M68kTargetMachine &TM);
150 
getSelectionDAGInfo()151   const SelectionDAGTargetInfo *getSelectionDAGInfo() const override {
152     return &TSInfo;
153   }
154 
getInstrInfo()155   const M68kInstrInfo *getInstrInfo() const override { return &InstrInfo; }
156 
getFrameLowering()157   const M68kFrameLowering *getFrameLowering() const override {
158     return &FrameLowering;
159   }
160 
getRegisterInfo()161   const M68kRegisterInfo *getRegisterInfo() const override {
162     return &InstrInfo.getRegisterInfo();
163   }
164 
getTargetLowering()165   const M68kTargetLowering *getTargetLowering() const override {
166     return &TLInfo;
167   }
168 
getInstrItineraryData()169   const InstrItineraryData *getInstrItineraryData() const override {
170     return &InstrItins;
171   }
172 
173 protected:
174   // GlobalISel related APIs.
175   std::unique_ptr<CallLowering> CallLoweringInfo;
176   std::unique_ptr<InstructionSelector> InstSelector;
177   std::unique_ptr<LegalizerInfo> Legalizer;
178   std::unique_ptr<RegisterBankInfo> RegBankInfo;
179 
180 public:
181   const CallLowering *getCallLowering() const override;
182   InstructionSelector *getInstructionSelector() const override;
183   const LegalizerInfo *getLegalizerInfo() const override;
184   const RegisterBankInfo *getRegBankInfo() const override;
185 };
186 } // namespace llvm
187 
188 #endif // LLVM_LIB_TARGET_M68K_M68KSUBTARGET_H
189