diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2022-07-03 14:10:23 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2022-07-03 14:10:23 +0000 |
commit | 145449b1e420787bb99721a429341fa6be3adfb6 (patch) | |
tree | 1d56ae694a6de602e348dd80165cf881a36600ed /llvm/lib/Target/LoongArch/LoongArchInstrInfo.cpp | |
parent | ecbca9f5fb7d7613d2b94982c4825eb0d33d6842 (diff) | |
download | src-145449b1e420787bb99721a429341fa6be3adfb6.tar.gz src-145449b1e420787bb99721a429341fa6be3adfb6.zip |
Diffstat (limited to 'llvm/lib/Target/LoongArch/LoongArchInstrInfo.cpp')
-rw-r--r-- | llvm/lib/Target/LoongArch/LoongArchInstrInfo.cpp | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/llvm/lib/Target/LoongArch/LoongArchInstrInfo.cpp b/llvm/lib/Target/LoongArch/LoongArchInstrInfo.cpp new file mode 100644 index 000000000000..146ef53befd5 --- /dev/null +++ b/llvm/lib/Target/LoongArch/LoongArchInstrInfo.cpp @@ -0,0 +1,49 @@ +//=- LoongArchInstrInfo.cpp - LoongArch Instruction Information -*- 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 +// +//===----------------------------------------------------------------------===// +// +// This file contains the LoongArch implementation of the TargetInstrInfo class. +// +//===----------------------------------------------------------------------===// + +#include "LoongArchInstrInfo.h" +#include "LoongArch.h" + +using namespace llvm; + +#define GET_INSTRINFO_CTOR_DTOR +#include "LoongArchGenInstrInfo.inc" + +LoongArchInstrInfo::LoongArchInstrInfo(LoongArchSubtarget &STI) + // FIXME: add CFSetup and CFDestroy Inst when we implement function call. + : LoongArchGenInstrInfo() {} + +void LoongArchInstrInfo::copyPhysReg(MachineBasicBlock &MBB, + MachineBasicBlock::iterator MBBI, + const DebugLoc &DL, MCRegister DstReg, + MCRegister SrcReg, bool KillSrc) const { + if (LoongArch::GPRRegClass.contains(DstReg, SrcReg)) { + BuildMI(MBB, MBBI, DL, get(LoongArch::OR), DstReg) + .addReg(SrcReg, getKillRegState(KillSrc)) + .addReg(LoongArch::R0); + return; + } + + // FPR->FPR copies. + unsigned Opc; + if (LoongArch::FPR32RegClass.contains(DstReg, SrcReg)) { + Opc = LoongArch::FMOV_S; + } else if (LoongArch::FPR64RegClass.contains(DstReg, SrcReg)) { + Opc = LoongArch::FMOV_D; + } else { + // TODO: support other copies. + llvm_unreachable("Impossible reg-to-reg copy"); + } + + BuildMI(MBB, MBBI, DL, get(Opc), DstReg) + .addReg(SrcReg, getKillRegState(KillSrc)); +} |