mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
900cbf02d0
Wiring up GlobalISel for the M68k backend Differential Revision: https://reviews.llvm.org/D101819
183 lines
6.2 KiB
C++
183 lines
6.2 KiB
C++
//===-- M68kSubtarget.h - Define Subtarget for the M68k -----*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \file
|
|
/// This file declares the M68k specific subclass of TargetSubtargetInfo.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_CPU0_M68KSUBTARGET_H
|
|
#define LLVM_LIB_TARGET_CPU0_M68KSUBTARGET_H
|
|
|
|
#include "M68kFrameLowering.h"
|
|
#include "M68kISelLowering.h"
|
|
#include "M68kInstrInfo.h"
|
|
|
|
#include "llvm/ADT/BitVector.h"
|
|
#include "llvm/CodeGen/GlobalISel/CallLowering.h"
|
|
#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
|
|
#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
|
|
#include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
|
|
#include "llvm/CodeGen/SelectionDAGTargetInfo.h"
|
|
#include "llvm/CodeGen/TargetSubtargetInfo.h"
|
|
#include "llvm/IR/DataLayout.h"
|
|
#include "llvm/MC/MCInstrItineraries.h"
|
|
#include "llvm/Support/Alignment.h"
|
|
|
|
#include <string>
|
|
|
|
#define GET_SUBTARGETINFO_HEADER
|
|
#include "M68kGenSubtargetInfo.inc"
|
|
|
|
extern bool M68kReserveGP;
|
|
extern bool M68kNoCpload;
|
|
|
|
namespace llvm {
|
|
class StringRef;
|
|
|
|
class M68kTargetMachine;
|
|
|
|
class M68kSubtarget : public M68kGenSubtargetInfo {
|
|
virtual void anchor();
|
|
|
|
protected:
|
|
// These define which ISA is supported. Since each Motorola M68k ISA is
|
|
// built on top of the previous one whenever an ISA is selected the previous
|
|
// selected as well.
|
|
enum SubtargetEnum { M00, M10, M20, M30, M40, M60 };
|
|
SubtargetEnum SubtargetKind = M00;
|
|
|
|
BitVector UserReservedRegister;
|
|
|
|
InstrItineraryData InstrItins;
|
|
|
|
/// Small section is used.
|
|
bool UseSmallSection = true;
|
|
|
|
const M68kTargetMachine &TM;
|
|
|
|
SelectionDAGTargetInfo TSInfo;
|
|
M68kInstrInfo InstrInfo;
|
|
M68kFrameLowering FrameLowering;
|
|
M68kTargetLowering TLInfo;
|
|
|
|
/// The minimum alignment known to hold of the stack frame on
|
|
/// entry to the function and which must be maintained by every function.
|
|
unsigned stackAlignment = 8;
|
|
|
|
Triple TargetTriple;
|
|
|
|
public:
|
|
/// This constructor initializes the data members to match that
|
|
/// of the specified triple.
|
|
M68kSubtarget(const Triple &TT, StringRef CPU, StringRef FS,
|
|
const M68kTargetMachine &_TM);
|
|
|
|
/// Parses features string setting specified subtarget options. Definition
|
|
/// of function is auto generated by tblgen.
|
|
void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);
|
|
|
|
bool atLeastM68000() const { return SubtargetKind >= M00; }
|
|
bool atLeastM68010() const { return SubtargetKind >= M10; }
|
|
bool atLeastM68020() const { return SubtargetKind >= M20; }
|
|
bool atLeastM68030() const { return SubtargetKind >= M30; }
|
|
bool atLeastM68040() const { return SubtargetKind >= M40; }
|
|
bool atLeastM68060() const { return SubtargetKind >= M60; }
|
|
|
|
bool useSmallSection() const { return UseSmallSection; }
|
|
|
|
bool abiUsesSoftFloat() const;
|
|
|
|
const Triple &getTargetTriple() const { return TargetTriple; }
|
|
|
|
bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); }
|
|
|
|
/// Return true if the subtarget allows calls to immediate address.
|
|
bool isLegalToCallImmediateAddr() const;
|
|
|
|
bool isPositionIndependent() const;
|
|
|
|
bool isRegisterReservedByUser(Register R) const {
|
|
assert(R < M68k::NUM_TARGET_REGS && "Register out of range");
|
|
return UserReservedRegister[R];
|
|
}
|
|
|
|
/// Classify a global variable reference for the current subtarget according
|
|
/// to how we should reference it in a non-pcrel context.
|
|
unsigned char classifyLocalReference(const GlobalValue *GV) const;
|
|
|
|
/// Classify a global variable reference for the current subtarget according
|
|
/// to how we should reference it in a non-pcrel context.
|
|
unsigned char classifyGlobalReference(const GlobalValue *GV,
|
|
const Module &M) const;
|
|
unsigned char classifyGlobalReference(const GlobalValue *GV) const;
|
|
|
|
/// Classify a external variable reference for the current subtarget according
|
|
/// to how we should reference it in a non-pcrel context.
|
|
unsigned char classifyExternalReference(const Module &M) const;
|
|
|
|
/// Classify a global function reference for the current subtarget.
|
|
unsigned char classifyGlobalFunctionReference(const GlobalValue *GV,
|
|
const Module &M) const;
|
|
unsigned char classifyGlobalFunctionReference(const GlobalValue *GV) const;
|
|
|
|
/// Classify a blockaddress reference for the current subtarget according to
|
|
/// how we should reference it in a non-pcrel context.
|
|
unsigned char classifyBlockAddressReference() const;
|
|
|
|
unsigned getJumpTableEncoding() const;
|
|
|
|
/// TODO this must be controlled by options like -malign-int and -mshort
|
|
Align getStackAlignment() const { return Align(stackAlignment); }
|
|
|
|
/// getSlotSize - Stack slot size in bytes.
|
|
unsigned getSlotSize() const { return 4; }
|
|
|
|
M68kSubtarget &initializeSubtargetDependencies(StringRef CPU, Triple TT,
|
|
StringRef FS,
|
|
const M68kTargetMachine &TM);
|
|
|
|
const SelectionDAGTargetInfo *getSelectionDAGInfo() const override {
|
|
return &TSInfo;
|
|
}
|
|
|
|
const M68kInstrInfo *getInstrInfo() const override { return &InstrInfo; }
|
|
|
|
const M68kFrameLowering *getFrameLowering() const override {
|
|
return &FrameLowering;
|
|
}
|
|
|
|
const M68kRegisterInfo *getRegisterInfo() const override {
|
|
return &InstrInfo.getRegisterInfo();
|
|
}
|
|
|
|
const M68kTargetLowering *getTargetLowering() const override {
|
|
return &TLInfo;
|
|
}
|
|
|
|
const InstrItineraryData *getInstrItineraryData() const override {
|
|
return &InstrItins;
|
|
}
|
|
|
|
protected:
|
|
// GlobalISel related APIs.
|
|
std::unique_ptr<CallLowering> CallLoweringInfo;
|
|
std::unique_ptr<InstructionSelector> InstSelector;
|
|
std::unique_ptr<LegalizerInfo> Legalizer;
|
|
std::unique_ptr<RegisterBankInfo> RegBankInfo;
|
|
|
|
public:
|
|
const CallLowering *getCallLowering() const override;
|
|
InstructionSelector *getInstructionSelector() const override;
|
|
const LegalizerInfo *getLegalizerInfo() const override;
|
|
const RegisterBankInfo *getRegBankInfo() const override;
|
|
};
|
|
} // namespace llvm
|
|
|
|
#endif
|