Path: blob/main/contrib/llvm-project/llvm/lib/Target/M68k/GISel/M68kRegisterBankInfo.cpp
96383 views
//===-- M68kRegisterBankInfo.cpp --------------------------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7/// \file8/// This file implements the targeting of the RegisterBankInfo class for M68k.9/// \todo This should be generated by TableGen.10//===----------------------------------------------------------------------===//1112#include "M68kRegisterBankInfo.h"13#include "M68kInstrInfo.h" // For the register classes14#include "M68kSubtarget.h"15#include "llvm/CodeGen/MachineRegisterInfo.h"16#include "llvm/CodeGen/RegisterBank.h"17#include "llvm/CodeGen/RegisterBankInfo.h"18#include "llvm/CodeGen/TargetRegisterInfo.h"1920#define GET_TARGET_REGBANK_IMPL21#include "M68kGenRegisterBank.inc"2223using namespace llvm;2425// FIXME: TableGen this.26// If it grows too much and TableGen still isn't ready to do the job, extract it27// into an M68kGenRegisterBankInfo.def (similar to AArch64).28namespace llvm {29namespace M68k {30enum PartialMappingIdx {31PMI_GPR,32PMI_Min = PMI_GPR,33};3435const RegisterBankInfo::PartialMapping PartMappings[]{36// GPR Partial Mapping37{0, 32, GPRRegBank},38};3940enum ValueMappingIdx {41InvalidIdx = 0,42GPR3OpsIdx = 1,43};4445const RegisterBankInfo::ValueMapping ValueMappings[] = {46// invalid47{nullptr, 0},48// 3 operands in GPRs49{&PartMappings[PMI_GPR - PMI_Min], 1},50{&PartMappings[PMI_GPR - PMI_Min], 1},51{&PartMappings[PMI_GPR - PMI_Min], 1},5253};54} // end namespace M68k55} // end namespace llvm5657M68kRegisterBankInfo::M68kRegisterBankInfo(const TargetRegisterInfo &TRI)58: M68kGenRegisterBankInfo() {}5960const RegisterBank &61M68kRegisterBankInfo::getRegBankFromRegClass(const TargetRegisterClass &RC,62LLT) const {63return getRegBank(M68k::GPRRegBankID);64}6566const RegisterBankInfo::InstructionMapping &67M68kRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {68auto Opc = MI.getOpcode();6970if (!isPreISelGenericOpcode(Opc)) {71const InstructionMapping &Mapping = getInstrMappingImpl(MI);72if (Mapping.isValid())73return Mapping;74}7576using namespace TargetOpcode;7778unsigned NumOperands = MI.getNumOperands();79const ValueMapping *OperandsMapping = &M68k::ValueMappings[M68k::GPR3OpsIdx];8081switch (Opc) {82case G_ADD:83case G_SUB:84case G_MUL:85case G_SDIV:86case G_UDIV:87case G_LOAD:88case G_STORE: {89OperandsMapping = &M68k::ValueMappings[M68k::GPR3OpsIdx];90break;91}9293case G_CONSTANT:94case G_FRAME_INDEX:95OperandsMapping =96getOperandsMapping({&M68k::ValueMappings[M68k::GPR3OpsIdx], nullptr});97break;98default:99return getInvalidInstructionMapping();100}101102return getInstructionMapping(DefaultMappingID, /*Cost=*/1, OperandsMapping,103NumOperands);104}105106107