1 //=- LoongArchInstrInfo.cpp - LoongArch Instruction Information -*- 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 // This file contains the LoongArch implementation of the TargetInstrInfo class.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "LoongArchInstrInfo.h"
14 #include "LoongArch.h"
15 
16 using namespace llvm;
17 
18 #define GET_INSTRINFO_CTOR_DTOR
19 #include "LoongArchGenInstrInfo.inc"
20 
21 LoongArchInstrInfo::LoongArchInstrInfo(LoongArchSubtarget &STI)
22     // FIXME: add CFSetup and CFDestroy Inst when we implement function call.
23     : LoongArchGenInstrInfo() {}
24 
25 void LoongArchInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
26                                      MachineBasicBlock::iterator MBBI,
27                                      const DebugLoc &DL, MCRegister DstReg,
28                                      MCRegister SrcReg, bool KillSrc) const {
29   if (LoongArch::GPRRegClass.contains(DstReg, SrcReg)) {
30     BuildMI(MBB, MBBI, DL, get(LoongArch::OR), DstReg)
31         .addReg(SrcReg, getKillRegState(KillSrc))
32         .addReg(LoongArch::R0);
33     return;
34   }
35 
36   // FPR->FPR copies.
37   unsigned Opc;
38   if (LoongArch::FPR32RegClass.contains(DstReg, SrcReg)) {
39     Opc = LoongArch::FMOV_S;
40   } else if (LoongArch::FPR64RegClass.contains(DstReg, SrcReg)) {
41     Opc = LoongArch::FMOV_D;
42   } else {
43     // TODO: support other copies.
44     llvm_unreachable("Impossible reg-to-reg copy");
45   }
46 
47   BuildMI(MBB, MBBI, DL, get(Opc), DstReg)
48       .addReg(SrcReg, getKillRegState(KillSrc));
49 }
50