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