Index: llvm/lib/Target/M68k/CMakeLists.txt =================================================================== --- llvm/lib/Target/M68k/CMakeLists.txt +++ llvm/lib/Target/M68k/CMakeLists.txt @@ -6,7 +6,9 @@ tablegen(LLVM M68kGenInstrInfo.inc -gen-instr-info) tablegen(LLVM M68kGenSubtargetInfo.inc -gen-subtarget) tablegen(LLVM M68kGenMCCodeBeads.inc -gen-code-beads) +tablegen(LLVM M68kGenGlobalISel.inc -gen-global-isel) tablegen(LLVM M68kGenMCPseudoLowering.inc -gen-pseudo-lowering) +tablegen(LLVM M68kGenRegisterBank.inc -gen-register-bank) tablegen(LLVM M68kGenDAGISel.inc -gen-dag-isel) tablegen(LLVM M68kGenCallingConv.inc -gen-callingconv) tablegen(LLVM M68kGenAsmWriter.inc -gen-asm-writer) @@ -16,20 +18,25 @@ add_llvm_target(M68kCodeGen M68kAsmPrinter.cpp + M68kCallLowering.cpp M68kCollapseMOVEMPass.cpp M68kExpandPseudo.cpp M68kFrameLowering.cpp M68kInstrInfo.cpp + M68kInstructionSelector.cpp M68kISelLowering.cpp + M68kLegalizerInfo.cpp M68kISelDAGToDAG.cpp M68kMachineFunction.cpp M68kMCInstLower.cpp + M68kRegisterBankInfo.cpp M68kRegisterInfo.cpp M68kSubtarget.cpp M68kTargetMachine.cpp M68kTargetObjectFile.cpp LINK_COMPONENTS + GlobalISel Analysis AsmPrinter CodeGen @@ -40,7 +47,7 @@ Target M68kDesc M68kInfo - + ADD_TO_COMPONENT M68k ) Index: llvm/lib/Target/M68k/M68k.h =================================================================== --- llvm/lib/Target/M68k/M68k.h +++ llvm/lib/Target/M68k/M68k.h @@ -17,7 +17,10 @@ namespace llvm { +class M68kRegisterBankInfo; +class M68kSubtarget; class FunctionPass; +class InstructionSelector; class M68kTargetMachine; /// This pass converts a legalized DAG into a M68k-specific DAG, ready for @@ -45,6 +48,10 @@ /// so that all possible MOVEs are present. FunctionPass *createM68kConvertMOVToMOVMPass(); +InstructionSelector *createM68kInstructionSelector(const M68kTargetMachine &, + M68kSubtarget &, + M68kRegisterBankInfo &); + } // namespace llvm #endif Index: llvm/lib/Target/M68k/M68kCallLowering.h =================================================================== --- /dev/null +++ llvm/lib/Target/M68k/M68kCallLowering.h @@ -0,0 +1,44 @@ +//===-- M68kCallLowering.h - Call lowering ---------------------*- 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 describes how to lower LLVM calls to machine code calls. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_TARGET_M68K_M68KCALLLOWERING_H +#define LLVM_LIB_TARGET_M68K_M68KCALLLOWERING_H + +#include "llvm/CodeGen/CallingConvLower.h" +#include "llvm/CodeGen/GlobalISel/CallLowering.h" +#include "llvm/CodeGen/ValueTypes.h" + +namespace llvm { + +class M68kTargetLowering; + +class M68kCallLowering : public CallLowering { + +public: + M68kCallLowering(const M68kTargetLowering &TLI); + + bool lowerReturn(MachineIRBuilder &MIRBuilder, const Value *Val, + ArrayRef VRegs, FunctionLoweringInfo &FLI, + Register SwiftErrorVReg) const override; + + bool lowerFormalArguments(MachineIRBuilder &MIRBuilder, const Function &F, + ArrayRef> VRegs, + FunctionLoweringInfo &FLI) const override; + + bool lowerCall(MachineIRBuilder &MIRBuilder, + CallLoweringInfo &Info) const override; +}; + +} // end namespace llvm + +#endif // LLVM_LIB_TARGET_M68k_M68kCALLLOWERING_H \ No newline at end of file Index: llvm/lib/Target/M68k/M68kCallLowering.cpp =================================================================== --- /dev/null +++ llvm/lib/Target/M68k/M68kCallLowering.cpp @@ -0,0 +1,51 @@ +//===-- M68kCallLowering.cpp - Call lowering -------------------*- 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 implements the lowering of LLVM calls to machine code calls for +/// GlobalISel. +// +//===----------------------------------------------------------------------===// + +#include "M68kCallLowering.h" +#include "M68kISelLowering.h" +#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" + +using namespace llvm; + +M68kCallLowering::M68kCallLowering(const M68kTargetLowering &TLI) + : CallLowering(&TLI) {} + +bool M68kCallLowering::lowerReturn(MachineIRBuilder &MIRBuilder, + const Value *Val, + ArrayRef VRegs, + Register SwiftErrorVReg) const { + + MachineInstrBuilder Ret = MIRBuilder.buildInstrNoInsert(M68k::RET); + + if (Val != nullptr) { + return false; + } + MIRBuilder.insertInstr(Ret); + return true; +} + +bool M68kCallLowering::lowerFormalArguments( + MachineIRBuilder &MIRBuilder, const Function &F, + ArrayRef> VRegs,FunctionLoweringInfo &FLI) const { + + if (F.arg_empty()) + return true; + + return false; +} + +bool M68kCallLowering::lowerCall(MachineIRBuilder &MIRBuilder, + CallLoweringInfo &Info) const { + return false; +} \ No newline at end of file Index: llvm/lib/Target/M68k/M68kSubtarget.cpp =================================================================== --- llvm/lib/Target/M68k/M68kSubtarget.cpp +++ llvm/lib/Target/M68k/M68kSubtarget.cpp @@ -14,6 +14,10 @@ #include "M68kSubtarget.h" #include "M68k.h" +#include "M68kCallLowering.h" +#include "M68kFrameLowering.h" +#include "M68kLegalizerInfo.h" +#include "M68kRegisterBankInfo.h" #include "M68kMachineFunction.h" #include "M68kRegisterInfo.h" #include "M68kTargetMachine.h" @@ -212,6 +216,22 @@ return classifyGlobalFunctionReference(GV, *GV->getParent()); } +const CallLowering *M68kSubtarget::getCallLowering() const { + return CallLoweringInfo.get(); +} + +InstructionSelector *M68kSubtarget::getInstructionSelector() const { + return InstSelector.get(); +} + +const LegalizerInfo *M68kSubtarget::getLegalizerInfo() const { + return Legalizer.get(); +} + +const RegisterBankInfo *M68kSubtarget::getRegBankInfo() const { + return RegBankInfo.get(); +} + unsigned char M68kSubtarget::classifyGlobalFunctionReference(const GlobalValue *GV, const Module &M) const { Index: llvm/lib/Target/M68k/M68kTargetMachine.cpp =================================================================== --- llvm/lib/Target/M68k/M68kTargetMachine.cpp +++ llvm/lib/Target/M68k/M68kTargetMachine.cpp @@ -14,7 +14,10 @@ #include "M68kTargetMachine.h" #include "M68k.h" #include "TargetInfo/M68kTargetInfo.h" - +#include "llvm/CodeGen/GlobalISel/IRTranslator.h" +#include "llvm/CodeGen/GlobalISel/InstructionSelect.h" +#include "llvm/CodeGen/GlobalISel/Legalizer.h" +#include "llvm/CodeGen/GlobalISel/RegBankSelect.h" #include "M68kSubtarget.h" #include "M68kTargetObjectFile.h" @@ -30,6 +33,8 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeM68kTarget() { RegisterTargetMachine X(getTheM68kTarget()); + auto *PR = PassRegistry::getPassRegistry(); + initializeGlobalISel(*PR); } namespace { @@ -135,6 +140,10 @@ return *getM68kTargetMachine().getSubtargetImpl(); } + bool addIRTranslator() override; + bool addLegalizeMachineIR() override; + bool addRegBankSelect() override; + bool addGlobalInstructionSelect() override; bool addInstSelector() override; void addPreSched2() override; void addPreEmitPass() override;